Einige weitere Informationen über die Mitglieder in den XML-Output übernommen (Rolle und Status, auf Anregung ITB)

git-svn-id: https://svn.libreccm.org/ccm/trunk@2347 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-10-10 17:33:39 +00:00
parent db34c28bde
commit 3707fe7e0a
1 changed files with 101 additions and 41 deletions

View File

@ -2,6 +2,7 @@ package com.arsdigita.cms.contenttypes.ui;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.RelationAttributeCollection;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit;
import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.GenericPerson;
import com.arsdigita.cms.contenttypes.SciDepartment; import com.arsdigita.cms.contenttypes.SciDepartment;
@ -10,13 +11,17 @@ import com.arsdigita.cms.contenttypes.ui.panels.Paginator;
import com.arsdigita.cms.contenttypes.ui.panels.TextFilter; import com.arsdigita.cms.contenttypes.ui.panels.TextFilter;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator; import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.globalization.Globalization; import com.arsdigita.globalization.Globalization;
import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataQuery; import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.SessionManager; import com.arsdigita.persistence.SessionManager;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -63,7 +68,7 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
&& orgaunit.getPersons().size() > 0) { && orgaunit.getPersons().size() > 0) {
return true; return true;
} else if (config.isMergingMembers()) { } else if (config.isMergingMembers()) {
final DataQuery persons = getData(orgaunit, state); final DataQuery persons = getData(orgaunit, state).getMembers();
return (persons != null) && persons.isEmpty(); return (persons != null) && persons.isEmpty();
} else { } else {
return false; return false;
@ -74,10 +79,13 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
public void generateXml(final GenericOrganizationalUnit orgaunit, public void generateXml(final GenericOrganizationalUnit orgaunit,
final Element parent, final Element parent,
final PageState state) { final PageState state) {
final long start = System.currentTimeMillis(); //final DataCollection persons = getData(orgaunit, state);
final DataCollection persons = getData(orgaunit, state); final MembersData membersData = getData(orgaunit, state);
final DataCollection persons = membersData.getMembers();
final Map<String, String> membersRoles = membersData.getMembersRoles();
final Map<String, String> membersStatus = membersData.getMembersStatus();
final HttpServletRequest request = state.getRequest(); final HttpServletRequest request = state.getRequest();
applySurnameFilter(persons, request); applySurnameFilter(persons, request);
final Element depMembersElem = parent.newChildElement( final Element depMembersElem = parent.newChildElement(
@ -97,6 +105,22 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
return; return;
} }
final RelationAttributeCollection roles = new RelationAttributeCollection(
SciDepartment.ROLE_ENUM_NAME);
roles.addLanguageFilter(GlobalizationHelper.getNegotiatedLocale().getLanguage());
final Element rolesElem = depMembersElem.newChildElement("roles");
while (roles.next()) {
generateRoleValueElem(rolesElem, roles.getKey(), roles.getName());
}
final RelationAttributeCollection statusValues = new RelationAttributeCollection(
"GenericOrganizationalUnitMemberStatus");
statusValues.addLanguageFilter(GlobalizationHelper.getNegotiatedLocale().getLanguage());
final Element statusValuesElem = depMembersElem.newChildElement("statusValues");
while (statusValues.next()) {
generateStatusValueElem(statusValuesElem, statusValues.getKey(), statusValues.getName());
}
final Paginator paginator = new Paginator(request, final Paginator paginator = new Paginator(request,
(int) persons.size(), (int) persons.size(),
config.getPageSize()); config.getPageSize());
@ -111,21 +135,55 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
paginator.generateXml(depMembersElem); paginator.generateXml(depMembersElem);
while (persons.next()) { while (persons.next()) {
generateMemberXml(new GenericPerson(persons.getDataObject()), final GenericPerson person = new GenericPerson(persons.getDataObject());
generateMemberXml(person,
membersRoles.get(person.getContentBundle().getID().toString()),
membersStatus.get(person.getContentBundle().getID().toString()),
depMembersElem, depMembersElem,
state); state);
} }
logger.debug(String.format("Generated members list of department '%s' "
+ "in %d ms.",
orgaunit.getName(),
System.currentTimeMillis() - start));
} }
protected DataCollection getData(final GenericOrganizationalUnit orgaunit, private void generateRoleValueElem(final Element parent, final String key, final String value) {
final PageState state) { final Element roleValueElem = parent.newChildElement("role");
final long start = System.currentTimeMillis(); roleValueElem.addAttribute("key", key);
roleValueElem.setText(value);
}
private void generateStatusValueElem(final Element parent, final String key, final String value) {
final Element statusValueElem = parent.newChildElement("status");
statusValueElem.addAttribute("key", key);
statusValueElem.setText(value);
}
protected class MembersData {
private final DataCollection members;
private final Map<String, String> membersRoles;
private final Map<String, String> membersStatus;
public MembersData(final DataCollection members,
final Map<String, String> membersRoles,
final Map<String, String> membersStatus) {
this.members = members;
this.membersRoles = membersRoles;
this.membersStatus = membersStatus;
}
public DataCollection getMembers() {
return members;
}
public Map<String, String> getMembersRoles() {
return Collections.unmodifiableMap(membersRoles);
}
public Map<String, String> getMembersStatus() {
return Collections.unmodifiableMap(membersStatus);
}
}
protected MembersData getData(final GenericOrganizationalUnit orgaunit,
final PageState state) {
if (!(orgaunit instanceof SciDepartment)) { if (!(orgaunit instanceof SciDepartment)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"This tab can only process instances of " "This tab can only process instances of "
@ -158,32 +216,34 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
personBundlesQuery.setParameter("orgaunitIds", orgaUnitIds); personBundlesQuery.setParameter("orgaunitIds", orgaUnitIds);
applyStatusFilter(personBundlesQuery, state.getRequest()); applyStatusFilter(personBundlesQuery, state.getRequest());
final Map<String, String> membersRoles = new HashMap<String, String>();
final Map<String, String> membersStatus = new HashMap<String, String>();
final StringBuilder filterBuilder = new StringBuilder(); final StringBuilder filterBuilder = new StringBuilder();
while (personBundlesQuery.next()) { while (personBundlesQuery.next()) {
if (filterBuilder.length() > 0) { if (filterBuilder.length() > 0) {
filterBuilder.append(','); filterBuilder.append(',');
} }
filterBuilder.append(personBundlesQuery.get("memberId").toString()); final String memberId = personBundlesQuery.get("memberId").toString();
filterBuilder.append(memberId);
membersRoles.put(memberId, (String) personBundlesQuery.get("roleName"));
membersStatus.put(memberId, (String) personBundlesQuery.get("status"));
} }
final DataCollection membersQuery = SessionManager.getSession().retrieve(GenericPerson.BASE_DATA_OBJECT_TYPE); final DataCollection membersQuery = SessionManager.getSession().retrieve(
GenericPerson.BASE_DATA_OBJECT_TYPE);
if (filterBuilder.length() == 0) { if (filterBuilder.length() == 0) {
//No member return null to indicate //No member return null to indicate
return null; return null;
} }
membersQuery.addFilter(String.format("parent.id in (%s)", filterBuilder.toString())); membersQuery.addFilter(String.format("parent.id in (%s)", filterBuilder.toString()));
membersQuery.addOrder(GenericPerson.SURNAME); membersQuery.addOrder(GenericPerson.SURNAME);
membersQuery.addOrder(GenericPerson.GIVENNAME); membersQuery.addOrder(GenericPerson.GIVENNAME);
logger.debug(String.format( //return membersQuery;
"Got members of department '%s'" return new MembersData(membersQuery, membersRoles, membersStatus);
+ "in '%d ms'. MergeMembers is set to '%b'.",
orgaunit.getName(),
System.currentTimeMillis() - start,
config.isMergingMembers()));
return membersQuery;
} }
private void applyStatusFilter(final DataQuery persons, private void applyStatusFilter(final DataQuery persons,
@ -214,30 +274,30 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab {
} }
} }
protected void generateMemberXml(final BigDecimal memberId, // protected void generateMemberXml(final BigDecimal memberId,
final Element parent, // final Element parent,
final PageState state) { // final PageState state) {
final long start = System.currentTimeMillis(); // final long start = System.currentTimeMillis();
final GenericPerson member = new GenericPerson(memberId); // final GenericPerson member = new GenericPerson(memberId);
logger.debug(String.format("Got domain object for member '%s' " // logger.debug(String.format("Got domain object for member '%s' "
+ "in %d ms.", // + "in %d ms.",
member.getFullName(), // member.getFullName(),
System.currentTimeMillis() - start)); // System.currentTimeMillis() - start));
generateMemberXml(member, parent, state); // generateMemberXml(member, parent, state);
} // }
protected void generateMemberXml(final GenericPerson member, protected void generateMemberXml(final GenericPerson member,
final String role,
final String status,
final Element parent, final Element parent,
final PageState state) { final PageState state) {
final long start = System.currentTimeMillis();
final XmlGenerator generator = new XmlGenerator(member); final XmlGenerator generator = new XmlGenerator(member);
//generator.setUseExtraXml(false); //generator.setUseExtraXml(false);
//generator.setListMode(true); //generator.setListMode(true);
generator.setItemElemName("member", ""); generator.setItemElemName("member", "");
generator.addItemAttribute("role", role);
generator.addItemAttribute("status", status);
generator.generateXML(state, parent, ""); generator.generateXML(state, parent, "");
logger.debug(String.format("Generated XML for member '%s' in %d ms.",
member.getFullName(),
System.currentTimeMillis() - start));
} }
private class XmlGenerator extends SimpleXMLGenerator { private class XmlGenerator extends SimpleXMLGenerator {