From af807b85ff69e1f149cdbe726b346f5f1c81eae6 Mon Sep 17 00:00:00 2001 From: jensp Date: Sun, 22 Apr 2012 17:54:30 +0000 Subject: [PATCH] =?UTF-8?q?PublicPersonalProfile/PersonProjects=20und=20Pu?= =?UTF-8?q?blicPersonProfile/PersonalProjects=20sind=20jetzt=20kompatibel?= =?UTF-8?q?=20mit=20neuen=20Datenstrukturen=20f=C3=BCr=20Projekte=20und=20?= =?UTF-8?q?Publikationen.=20(Tickets=20#1215=20und=20#1216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/trunk@1610 8810af33-2d31-482b-a856-94f89814c4df --- ...ublicPersonalProfileExtraXmlGenerator.java | 2 + .../GenericOrganizationalUnit.pdl | 12 +- ...ganizationalUnitSubordinateCollection.java | 8 + .../ui/GenericOrgaUnitMembersTab.java | 213 +++--- ...zationalUnitSubordinateOrgaUnitsTable.java | 20 +- .../contenttypes/ui/panels/CompareFilter.java | 8 + .../cms/contenttypes/ui/panels/Paginator.java | 9 +- .../contenttypes/ui/panels/TextFilter.java | 4 + .../arsdigita/domain/DomainObjectFactory.java | 2 +- .../PersonalProjects.java | 238 +++--- .../PersonalPublications.java | 715 ++++-------------- .../cms/contenttypes/PublicationBundle.java | 8 + .../ui/SciDepartmentMembersTab.java | 160 ++-- .../ui/SciDepartmentMembersTabConfig.java | 2 +- .../arsdigita/cms/contenttypes/SciProject.xml | 2 +- .../cms/contenttypes/SciProjectBundle.java | 8 + 16 files changed, 509 insertions(+), 902 deletions(-) diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java index 3726abfc8..68370efee 100644 --- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java +++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java @@ -91,6 +91,8 @@ public class PublicPersonalProfileExtraXmlGenerator implements ExtraXMLGenerator new PublicPersonalProfileXmlGenerator( contacts.getContact()); cGenerator.setItemElemName("contact", ""); + cGenerator.addItemAttribute("contactType", + contacts.getContactType()); cGenerator.generateXML(state, contactsElem, ""); } diff --git a/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl b/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl index 26bf6ff75..c63d4a96f 100644 --- a/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl +++ b/ccm-cms/pdl/com/arsdigita/content-types/GenericOrganizationalUnit.pdl @@ -171,12 +171,12 @@ query getIdsOfMembersOfOrgaUnits { do { select distinct on (cms_persons.person_id) - cms_persons.person_id, - cms_persons.surname, - cms_persons.givenname, - cms_organizationalunits_person_map.organizationalunit_id, - cms_organizationalunits_person_map.role_name, - cms_organizationalunits_person_map.status + cms_persons.person_id, + cms_persons.surname, + cms_persons.givenname, + cms_organizationalunits_person_map.organizationalunit_id, + cms_organizationalunits_person_map.role_name, + cms_organizationalunits_person_map.status from cms_persons join cms_organizationalunits_person_map on cms_persons.person_id = cms_organizationalunits_person_map.person_id where cms_organizationalunits_person_map.organizationalunit_id in :orgaunitIds diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericOrganizationalUnitSubordinateCollection.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericOrganizationalUnitSubordinateCollection.java index 43fc42dce..2ac855903 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericOrganizationalUnitSubordinateCollection.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/GenericOrganizationalUnitSubordinateCollection.java @@ -157,6 +157,14 @@ public class GenericOrganizationalUnitSubordinateCollection extends DomainCollec return (GenericOrganizationalUnit) bundle.getPrimaryInstance(); } + + public GenericOrganizationalUnit getGenericOrganizationalUnit( + final String language) { + final ContentBundle bundle = (ContentBundle) DomainObjectFactory. + newInstance(m_dataCollection.getDataObject()); + + return (GenericOrganizationalUnit) bundle.getInstance(language); + } public BigDecimal getId() { return (BigDecimal) m_dataCollection.getDataObject().get(ACSObject.ID); diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrgaUnitMembersTab.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrgaUnitMembersTab.java index 06dd1899b..c5fdc1721 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrgaUnitMembersTab.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrgaUnitMembersTab.java @@ -4,11 +4,13 @@ import com.arsdigita.bebop.PageState; import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection; +import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitSubordinateCollection; import com.arsdigita.cms.contenttypes.GenericPerson; +import com.arsdigita.cms.contenttypes.ui.panels.Paginator; import com.arsdigita.cms.dispatcher.SimpleXMLGenerator; -import com.arsdigita.persistence.DataQuery; import com.arsdigita.xml.Element; import java.math.BigDecimal; +import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; @@ -18,130 +20,102 @@ import org.apache.log4j.Logger; * @version $Id$ */ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab { - + private final static Logger logger = Logger.getLogger(GenericOrgaUnitMembersTab.class); - + public boolean hasData(final GenericOrganizationalUnit orgaunit) { - final long start = System.currentTimeMillis(); - final boolean result = !getData(orgaunit).isEmpty(); - logger.debug(String.format( - "Needed %d ms to determine if " - + "organizational unit '%s' has members. Merge is set to '%b'.", - System.currentTimeMillis() - start, - orgaunit.getName(), - isMergingMembers())); - return result; + /*final long start = System.currentTimeMillis(); + final boolean result = !getData(orgaunit).isEmpty(); + logger.debug(String.format( + "Needed %d ms to determine if " + + "organizational unit '%s' has members. Merge is set to '%b'.", + System.currentTimeMillis() - start, + orgaunit.getName(), + isMergingMembers())); + return result;*/ + return !orgaunit.getPersons().isEmpty(); } - + public void generateXml(final GenericOrganizationalUnit orgaunit, final Element parent, final PageState state) { final long start = System.currentTimeMillis(); - - final DataQuery persons = getData(orgaunit, state); - + + List persons = getPersons(orgaunit, state); + final Element personsElem = parent.newChildElement(getXmlElementName()); - + if (getPageSize() != 0) { - final GenericOrgaUnitPaginator paginator = - new GenericOrgaUnitPaginator( - persons, state, getPageSize()); - paginator.setRange(persons); + final Paginator paginator = new Paginator( + state.getRequest(), persons.size(), getPageSize()); paginator.generateXml(personsElem); + if (paginator.getEnd() < persons.size()) { + persons = persons.subList(paginator.getBegin(), paginator.getEnd()); + } } - while (persons.next()) { - /*generatePersonXml((BigDecimal) persons.get("memberId"), - parent, - state);*/ - generatePersonXml(((GenericOrganizationalUnitPersonCollection) persons).getPerson().getID(), - parent, - state); + for(GenericPerson person : persons) { + generatePersonXml(person, personsElem, state); } + logger.debug(String.format("Generated member list of organizational " + "unit '%s' in %d ms.", orgaunit.getName(), System.currentTimeMillis() - start)); } - + private void generatePersonXml(final BigDecimal personId, final Element parent, final PageState state) { final GenericPerson person = new GenericPerson(personId); - + final XmlGenerator generator = new XmlGenerator(person); + generator.setItemElemName("person", ""); generator.generateXML(state, parent, ""); } - protected abstract String getXmlElementName(); - - protected abstract boolean isMergingMembers(); - - protected abstract List getAssocTypesToMerge(); - - protected abstract List getRolesToInclude(); - - protected abstract List getStatusesToInclude(); - - protected abstract int getPageSize(); - - protected DataQuery getData(final GenericOrganizationalUnit orgaunit, - final PageState state) { - return getData(orgaunit); + private void generatePersonXml(final GenericPerson person, + final Element parent, + final PageState state) { + final XmlGenerator generator = new XmlGenerator(person); + generator.generateXML(state, parent, ""); } - - protected DataQuery getData(final GenericOrganizationalUnit orgaunit) { - return orgaunit.getPersons(); - - /*final long start = System.currentTimeMillis(); - - final DataQuery personsQuery = SessionManager.getSession().retrieveQuery( - "com.arsdigita.cms.contenttypes.getIdsOfMembersOfOrgaUnits"); - - if (isMergingMembers()) { - final DataQuery subOrgaUnitsQuery = - SessionManager.getSession().retrieveQuery( - "com.arsdigita.cms.contenttypes.getIdsOfSubordinateOrgaUnitsRecursivly"); - subOrgaUnitsQuery.setParameter("orgaunitId", orgaunit.getID(). - toString()); - final StringBuffer assocTypeFilter = new StringBuffer(); - for (String assocType : getAssocTypesToMerge()) { - if (assocTypeFilter.length() > 0) { - assocTypeFilter.append(" or "); - } - assocTypeFilter.append(String.format("assocType = '%s'", - assocType)); - } - subOrgaUnitsQuery.addFilter(assocTypeFilter.toString()); - - final StringBuffer buffer = new StringBuffer(); - while (subOrgaUnitsQuery.next()) { - if (buffer.length() > 0) { - buffer.append(" or "); - } - buffer.append(String.format("orgaunitId = %s", - subOrgaUnitsQuery.get("orgaunitId"). - toString())); - } - - personsQuery.addFilter(buffer.toString()); - } else { - personsQuery.addFilter(String.format("orgaunitId = %s", - orgaunit.getID().toString())); - } - + + protected abstract String getXmlElementName(); + + protected abstract boolean isMergingMembers(); + + protected abstract List getAssocTypesToMerge(); + + protected abstract List getRolesToInclude(); + + protected abstract List getStatusesToInclude(); + + protected abstract int getPageSize(); + + protected List getPersons( + final GenericOrganizationalUnit orgaunit, + final PageState state) { + final long start = System.currentTimeMillis(); + + final List persons = new LinkedList(); + + final GenericOrganizationalUnitPersonCollection personColl = orgaunit. + getPersons(); + if ((getRolesToInclude() != null) && !getRolesToInclude().isEmpty()) { final StringBuffer roleFilter = new StringBuffer(); for (String role : getRolesToInclude()) { if (roleFilter.length() > 0) { roleFilter.append(" or "); } - roleFilter.append(String.format("roleName = '%s'", role)); + roleFilter.append(String.format("link.roleName = '%s'", + role)); } - personsQuery.addFilter(roleFilter.toString()); + personColl.addFilter(roleFilter.toString()); } - + if ((getStatusesToInclude() != null) && !getStatusesToInclude().isEmpty()) { final StringBuffer statusFilter = new StringBuffer(); @@ -149,21 +123,56 @@ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab { if (statusFilter.length() > 0) { statusFilter.append(" or "); } - statusFilter.append(String.format("status = '%s'", status)); + statusFilter.append(String.format("link.status = '%s'", status)); } - personsQuery.addFilter(statusFilter.toString()); + personColl.addFilter(statusFilter.toString()); } - - personsQuery.addOrder("surname"); - personsQuery.addOrder("givenname"); - + + while (personColl.next()) { + persons.add(personColl.getPerson()); + } + + if (isMergingMembers()) { + getPersonsFromSubordinateOrgaUnits(orgaunit, persons, state); + } + logger.debug(String.format( - "Got persons for organizational unit '%s'" - + "in %d ms. isMergingMembers is set to '%b'.", + "Got members of orgaunit '%s'" + + "in '%d ms'. MergeMembers is set to '%b'.", orgaunit.getName(), System.currentTimeMillis() - start, isMergingMembers())); - return personsQuery;*/ + return persons; + } + + protected void getPersonsFromSubordinateOrgaUnits( + final GenericOrganizationalUnit orgaunit, + final List persons, + final PageState state) { + final GenericOrganizationalUnitSubordinateCollection subOrgaUnits = + orgaunit. + getSubordinateOrgaUnits(); + final StringBuffer assocTypeFilter = new StringBuffer(); + for (String assocType : getAssocTypesToMerge()) { + if (assocTypeFilter.length() > 0) { + assocTypeFilter.append(" or "); + } + assocTypeFilter.append(String.format("assocType = '%s'", assocType)); + } + subOrgaUnits.addFilter(assocTypeFilter.toString()); + + while (subOrgaUnits.next()) { + getPersonsFromSubordinateOrgaUnit(orgaunit, persons, state); + } + } + + protected void getPersonsFromSubordinateOrgaUnit( + final GenericOrganizationalUnit subOrgaUnit, + final List persons, + final PageState state) { + final List subOrgaUnitMembers = getPersons(subOrgaUnit, + state); + persons.addAll(subOrgaUnitMembers); } /** @@ -194,16 +203,16 @@ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab { final PageState state) { //Nothing now } - + private class XmlGenerator extends SimpleXMLGenerator { - + private final GenericPerson person; - + public XmlGenerator(final GenericPerson person) { super(); this.person = person; } - + @Override protected ContentItem getContentItem(final PageState state) { return person; diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrganizationalUnitSubordinateOrgaUnitsTable.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrganizationalUnitSubordinateOrgaUnitsTable.java index 6f96350dd..619cc92e6 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrganizationalUnitSubordinateOrgaUnitsTable.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/GenericOrganizationalUnitSubordinateOrgaUnitsTable.java @@ -19,7 +19,7 @@ import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitSubordinateCollection; import com.arsdigita.cms.dispatcher.ItemResolver; -import com.arsdigita.cms.dispatcher.Utilities; +import com.arsdigita.globalization.GlobalizationHelper; import com.arsdigita.util.LockableImpl; import java.math.BigDecimal; import org.apache.log4j.Logger; @@ -152,7 +152,9 @@ public class GenericOrganizationalUnitSubordinateOrgaUnitsTable public Object getElementAt(final int columnIndex) { switch (columnIndex) { case 0: - return subordinateOrgaUnits.getTitle(); + return subordinateOrgaUnits.getGenericOrganizationalUnit( + GlobalizationHelper.getNegotiatedLocale(). + getLanguage()).getTitle(); case 1: return customizer.getDeleteLabel(); case 2: @@ -166,7 +168,9 @@ public class GenericOrganizationalUnitSubordinateOrgaUnitsTable @Override public Object getKeyAt(final int columnIndex) { - return subordinateOrgaUnits.getId(); + return subordinateOrgaUnits.getGenericOrganizationalUnit( + GlobalizationHelper.getNegotiatedLocale().getLanguage()). + getID(); } } @@ -182,7 +186,7 @@ public class GenericOrganizationalUnitSubordinateOrgaUnitsTable final Object key, final int row, final int column) { - final com.arsdigita.cms.SecurityManager securityManager = Utilities. + final com.arsdigita.cms.SecurityManager securityManager = CMS. getSecurityManager(state); final GenericOrganizationalUnit subordinateOrgaUnit = new GenericOrganizationalUnit( @@ -230,7 +234,7 @@ public class GenericOrganizationalUnitSubordinateOrgaUnitsTable final Object key, final int row, final int column) { - final com.arsdigita.cms.SecurityManager securityManager = Utilities. + final com.arsdigita.cms.SecurityManager securityManager = CMS. getSecurityManager(state); final GenericOrganizationalUnit orgaunit = (GenericOrganizationalUnit) itemModel. @@ -303,9 +307,9 @@ public class GenericOrganizationalUnitSubordinateOrgaUnitsTable } if ((customizer.getContentType() != null) && !(customizer.getContentType().isEmpty())) { - subOrgaUnits.addFilter(String.format("objectType = '%s'", - customizer. - getContentType())); + subOrgaUnits.addFilter( + String.format("objectType = '%s'", + customizer.getContentType())); } if ((subOrgaUnits.size() - 1) == row) { diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/CompareFilter.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/CompareFilter.java index 473c80ff4..c549a33d6 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/CompareFilter.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/CompareFilter.java @@ -135,6 +135,14 @@ public class CompareFilter implements Filter { return filter.toString(); } + + public String getValue() { + return value; + } + + public Operators getOperator() { + return options.get(value).getOperator(); + } public void generateXml(final Element parent) { Element filter; diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/Paginator.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/Paginator.java index 05d6e1e08..e8c326bc9 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/Paginator.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/Paginator.java @@ -6,6 +6,7 @@ import com.arsdigita.web.URL; import com.arsdigita.web.Web; import com.arsdigita.xml.Element; import java.util.Iterator; +import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; @@ -97,7 +98,7 @@ public class Paginator { getBegin(), getEnd())); query.setRange(getBegin(), getEnd() + 1); - } + } public int getPageCount() { return (int) Math.ceil((double) objectCount / (double) pageSize); @@ -122,7 +123,7 @@ public class Paginator { return num; } - private int getBegin() { + public int getBegin() { if (pageNumber == 1) { return 1; } else { @@ -130,11 +131,11 @@ public class Paginator { } } - private int getCount() { + public int getCount() { return Math.min(pageSize, (objectCount - getBegin() + 1)); } - private int getEnd() { + public int getEnd() { int paginatorEnd = getBegin() + getCount() - 1; if (paginatorEnd < 0) { paginatorEnd = 0; diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/TextFilter.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/TextFilter.java index 0a7961b19..71666fd73 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/TextFilter.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/TextFilter.java @@ -63,6 +63,10 @@ public class TextFilter implements Filter { } } + public String getValue() { + return value; + } + @Override public void setValue(final String value) { this.value = value; diff --git a/ccm-core/src/com/arsdigita/domain/DomainObjectFactory.java b/ccm-core/src/com/arsdigita/domain/DomainObjectFactory.java index 2cd200466..c34917505 100755 --- a/ccm-core/src/com/arsdigita/domain/DomainObjectFactory.java +++ b/ccm-core/src/com/arsdigita/domain/DomainObjectFactory.java @@ -238,7 +238,7 @@ public class DomainObjectFactory { */ public synchronized static DomainObjectInstantiator registerInstantiator( ObjectType dataObjectType, - DomainObjectInstantiator instantiator) { + DomainObjectInstantiator instantiator) { if (null == dataObjectType) { throw new InstantiatorRegistryException("null", instantiator); } diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java index f450c7331..31193a90c 100644 --- a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java @@ -1,6 +1,7 @@ package com.arsdigita.cms.publicpersonalprofile; import com.arsdigita.bebop.PageState; +import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.contenttypes.GenericAddress; import com.arsdigita.cms.contenttypes.GenericContactEntry; import com.arsdigita.cms.contenttypes.GenericContactEntryCollection; @@ -9,10 +10,11 @@ import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.GenericPersonContactCollection; import com.arsdigita.cms.contenttypes.SciProject; +import com.arsdigita.cms.contenttypes.SciProjectBundle; +import com.arsdigita.cms.dispatcher.SimpleXMLGenerator; import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.globalization.GlobalizationHelper; -import com.arsdigita.kernel.Kernel; import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.OID; import com.arsdigita.xml.Element; @@ -24,6 +26,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; @@ -57,18 +60,19 @@ public class PersonalProjects implements ContentGenerator { final GenericPerson person, final PageState state, final String profileLanguage) { - final List projects = collectProjects(person, - profileLanguage); + final List projects = collectProjects(person, + profileLanguage); final Element personalProjectsElem = parent.newChildElement( "personalProjects"); if ((projects == null) || projects.isEmpty()) { - personalProjectsElem.newChildElement("noProjects"); + personalProjectsElem.newChildElement("noProjects"); } else { - final List currentProjects = new ArrayList(); - final List finishedProjects = - new ArrayList(); + final List currentProjects = + new ArrayList(); + final List finishedProjects = + new ArrayList(); String sortBy = config.getSortBy(); String sortByParam = state.getRequest().getParameter("sortBy"); @@ -86,70 +90,20 @@ public class PersonalProjects implements ContentGenerator { } } - private List collectProjects(final GenericPerson person, - final String language) { - final List projects = new ArrayList(); - - /*final DataCollection collection = (DataCollection) person.get( - "organizationalunit"); - if (Kernel.getConfig().languageIndependentItems()) {*/ - /* FilterFactory ff = collection.getFilterFactory(); - Filter filter = ff.or().*/ - /*addFilter(ff.equals("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage())).*/ - /*addFilter(ff.equals("language", language)). - addFilter(ff.and(). - addFilter(ff.equals("language", - GlobalizationHelper.LANG_INDEPENDENT)). - addFilter(ff.notIn("parent", - "com.arsdigita.london.navigation.getParentIDsOfMatchedItems"). - set("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage()))); - collection.addFilter(filter);*/ - /*collection.addFilter( - String.format("(language = '%s' or language = '%s')", - language, - GlobalizationHelper.LANG_INDEPENDENT)); - } else { - /*collection.addEqualsFilter("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage());*/ - /* collection.addEqualsFilter("language", language); - }*/ - final List processed = new ArrayList(); - final DataCollection collection = (DataCollection) person.get( - "organizationalunit"); - collection.addFilter(String.format("language = '%s'", language)); + private List collectProjects(final GenericPerson person, + final String language) { + final List projects = + new LinkedList(); + final DataCollection collection = (DataCollection) person. + getGenericPersonBundle().get("organizationalunits"); DomainObject obj; while (collection.next()) { obj = DomainObjectFactory.newInstance(collection.getDataObject()); - if (obj instanceof SciProject) { - processed.add(((SciProject) obj).getParent().getID()); - projects.add((SciProject) obj); + if (obj instanceof SciProjectBundle) { + projects.add((SciProjectBundle) obj); } } - - if (Kernel.getConfig().languageIndependentItems()) { - final DataCollection collectionLi = (DataCollection) person.get( - "organizationalunit"); - collectionLi.addFilter( - String.format("language = '%s'", - GlobalizationHelper.LANG_INDEPENDENT)); - - while (collectionLi.next()) { - obj = - DomainObjectFactory.newInstance(collectionLi.getDataObject()); - if (obj instanceof SciProject) { - if (!(processed.contains(((SciProject) obj).getParent(). - getID()))) { - projects.add((SciProject) obj); - } - } - } - } - + if (person.getAlias() != null) { collectProjects(person.getAlias(), projects, language); @@ -158,63 +112,40 @@ public class PersonalProjects implements ContentGenerator { } private void collectProjects(final GenericPerson alias, - final List projects, + final List projects, final String language) { - final DataCollection collection = (DataCollection) alias.get( - "organizationalunit"); - final List processed = new ArrayList(); - collection.addFilter(String.format("language = '%s'", language)); + final DataCollection collection = (DataCollection) alias. + getGenericPersonBundle().get("organizationalunits"); DomainObject obj; while (collection.next()) { obj = DomainObjectFactory.newInstance(collection.getDataObject()); - if (obj instanceof SciProject) { - processed.add(((SciProject) obj).getParent().getID()); - projects.add((SciProject) obj); + if (obj instanceof SciProjectBundle) { + projects.add((SciProjectBundle) obj); } } - if (Kernel.getConfig().languageIndependentItems()) { - final DataCollection collectionLi = (DataCollection) alias.get( - "organizationalunit"); - collectionLi.addFilter( - String.format("language = '%s'", - GlobalizationHelper.LANG_INDEPENDENT)); - - while (collectionLi.next()) { - obj = - DomainObjectFactory.newInstance(collectionLi.getDataObject()); - if (obj instanceof SciProject) { - if (!(processed.contains(((SciProject) obj).getParent(). - getID()))) { - projects.add((SciProject) obj); - } - } - } - } - - if (alias.getAlias() != null) { collectProjects(alias.getAlias(), projects, language); } } - private void processProjects(final List projects, - final List currentProjects, - final List finishedProjects, + private void processProjects(final List projects, + final List currentProjects, + final List finishedProjects, final String sortBy) { final Calendar today = new GregorianCalendar(); final Date todayDate = today.getTime(); - for (SciProject project : projects) { - if ((project.getEnd() != null) - && project.getEnd().before(todayDate)) { + for (SciProjectBundle project : projects) { + if ((project.getProject().getEnd() != null) + && project.getProject().getEnd().before(todayDate)) { finishedProjects.add(project); } else { currentProjects.add(project); } } - Comparator comparator; + Comparator comparator; if ("date".equals(sortBy)) { comparator = new ProjectByDateComparator(); } else { @@ -226,8 +157,8 @@ public class PersonalProjects implements ContentGenerator { } private void generateGroupsXml(final Element parent, - final List currentProjects, - final List finishedProjects) { + final List currentProjects, + final List finishedProjects) { final Element availableGroups = parent.newChildElement( "availableProjectGroups"); @@ -247,8 +178,8 @@ public class PersonalProjects implements ContentGenerator { } private void generateProjectsXml(final Element parent, - final List currentProjects, - final List finishedProjects, + final List currentProjects, + final List finishedProjects, final PageState state) { final Element projectsElem = parent.newChildElement("projects"); @@ -297,7 +228,7 @@ public class PersonalProjects implements ContentGenerator { private void generateProjectsGroupXml(final Element projectsElem, final String groupName, - final List projects, + final List projects, final PageState state) { if (projects == null) { return; @@ -306,18 +237,17 @@ public class PersonalProjects implements ContentGenerator { final Element groupElem = projectsElem.newChildElement("projectGroup"); groupElem.addAttribute("name", groupName); - for (SciProject project : projects) { + for (SciProjectBundle project : projects) { generateProjectXml(groupElem, project, state); } } private void generateProjectXml(final Element projectGroupElem, - final SciProject project, + final SciProjectBundle projectBundle, final PageState state) { - /*final PublicPersonalProfileXmlGenerator generator = - new PublicPersonalProfileXmlGenerator( - project); - generator.generateXML(state, projectGroupElem, "");*/ + final SciProject project = projectBundle.getProject(GlobalizationHelper. + getNegotiatedLocale().getLanguage()); + Element projectElem = projectGroupElem.newChildElement("project"); projectElem.addAttribute("oid", project.getOID().toString()); @@ -380,7 +310,7 @@ public class PersonalProjects implements ContentGenerator { GenericOrganizationalUnitPersonCollection members; members = project.getPersons(); - members.addOrder("surname asc, givenname asc"); + //members.addOrder("surname asc, givenname asc"); if (members.size() > 0) { Element membersElem = projectElem.newChildElement("members"); @@ -444,7 +374,7 @@ public class PersonalProjects implements ContentGenerator { Element surname = memberElem.newChildElement("surname"); surname.setText(person.getSurname()); - Element givenName = memberElem.newChildElement("givenname"); + Element givenName = memberElem.newChildElement("givenName"); givenName.setText(person.getGivenName()); if ((person.getTitlePost() != null) @@ -578,8 +508,8 @@ public class PersonalProjects implements ContentGenerator { final String role, final String status) { /*this.member = member; - this.role = role; - this.status = status;*/ + this.role = role; + this.status = status;*/ this(member.getOID(), member.getSurname(), member.getGivenName(), @@ -616,8 +546,8 @@ public class PersonalProjects implements ContentGenerator { } /*public GenericPerson getMember() { - return member; - }*/ + return member; + }*/ public OID getOID() { return oid; } @@ -659,15 +589,15 @@ public class PersonalProjects implements ContentGenerator { } /*@Override - public boolean equals(Object obj) { - if (obj instanceof MemberListItem) { - MemberListItem other = (MemberListItem) obj; + public boolean equals(Object obj) { + if (obj instanceof MemberListItem) { + MemberListItem other = (MemberListItem) obj; - return member.equals(other.getMember()); - } else { - return false; - } - }*/ + return member.equals(other.getMember()); + } else { + return false; + } + }*/ @Override public boolean equals(Object obj) { if (obj == null) { @@ -714,9 +644,9 @@ public class PersonalProjects implements ContentGenerator { } /*@Override - public int hashCode() { - return member.hashCode(); - }*/ + public int hashCode() { + return member.hashCode(); + }*/ @Override public int hashCode() { int hash = 3; @@ -739,29 +669,38 @@ public class PersonalProjects implements ContentGenerator { } } - private class ProjectByTitleComparator implements Comparator { + private class ProjectByTitleComparator + implements Comparator { - public int compare(final SciProject project1, - final SciProject project2) { - return project1.getTitle().compareTo(project2.getTitle()); + public int compare(final SciProjectBundle project1, + final SciProjectBundle project2) { + return project1.getProject().getTitle().compareTo(project2. + getProject().getTitle()); } } - private class ProjectByDateComparator implements Comparator { + private class ProjectByDateComparator implements + Comparator { - public int compare(final SciProject project1, - final SciProject project2) { + public int compare(final SciProjectBundle project1, + final SciProjectBundle project2) { int ret = 0; - if ((project2.getBegin() != null) && (project1.getBegin() != null)) { - ret = project2.getBegin().compareTo(project1.getBegin()); + if ((project2.getProject().getBegin() != null) && (project1. + getProject(). + getBegin() + != null)) { + ret = project2.getProject().getBegin().compareTo(project1. + getProject().getBegin()); } if ((ret == 0) - && (project2.getEnd() != null) - && (project1.getEnd() != null)) { - ret = project2.getEnd().compareTo(project1.getBegin()); + && (project2.getProject().getEnd() != null) + && (project1.getProject().getEnd() != null)) { + ret = project2.getProject().getEnd().compareTo(project1. + getProject().getBegin()); } if (ret == 0) { - ret = project1.getTitle().compareTo(project2.getTitle()); + ret = project1.getProject().getTitle().compareTo(project2. + getProject().getTitle()); } return ret; @@ -802,4 +741,19 @@ public class PersonalProjects implements ContentGenerator { elem.addAttribute("longDate", longDateFormat.format(date)); elem.addAttribute("time", timeFormat.format(date)); } + + private class XmlGenerator extends SimpleXMLGenerator { + + private final ContentItem item; + + public XmlGenerator(final ContentItem item) { + super(); + this.item = item; + } + + @Override + protected ContentItem getContentItem(final PageState state) { + return item; + } + } } diff --git a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java index cc63db4ec..23aba402c 100644 --- a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java +++ b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java @@ -4,21 +4,19 @@ import com.arsdigita.bebop.PageState; import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.Publication; -import com.arsdigita.cms.contenttypes.ui.PublicationXmlHelper; +import com.arsdigita.cms.contenttypes.PublicationBundle; import com.arsdigita.cms.contenttypes.ui.panels.Paginator; import com.arsdigita.cms.dispatcher.SimpleXMLGenerator; +import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.globalization.GlobalizationHelper; -import com.arsdigita.kernel.Kernel; -import com.arsdigita.persistence.DataQuery; -import com.arsdigita.persistence.Filter; -import com.arsdigita.persistence.FilterFactory; -import com.arsdigita.persistence.OID; -import com.arsdigita.persistence.SessionManager; +import com.arsdigita.persistence.DataCollection; import com.arsdigita.xml.Element; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -52,136 +50,85 @@ public class PersonalPublications implements ContentGenerator { final String language) { final long start = System.currentTimeMillis(); - final DataQuery allQuery = SessionManager.getSession().retrieveQuery( - "com.arsdigita.cms.contenttypes.getPublicationsForAuthor"); - applyAuthorFilter(person, allQuery, true, language); + final List publications = + collectPublications(person, language); final Element personalPubsElem = parent.newChildElement( "personalPublications"); final long overallSize; - if (allQuery == null) { + if (publications == null) { overallSize = 0; } else { - overallSize = allQuery.size(); + overallSize = publications.size(); } if (overallSize <= 0) { personalPubsElem.newChildElement("noPublications"); return; } else { - logger.debug(String.format("1: %d ms until now...", System. - currentTimeMillis() - start)); + final Map> groupsConfig = getGroupsConfig(); + final Map> publicationsByGroup = + new HashMap>(); + + for (Map.Entry> entry : groupsConfig.entrySet()) { + filterPublicationsByGroup(entry.getKey(), + entry.getValue(), + publications, + publicationsByGroup); + } + + final List miscGroup = + filterPublicationsForMiscGroup( + publications, groupsConfig); + publicationsByGroup.put(MISC, miscGroup); + final Element availableGroupsElem = personalPubsElem.newChildElement( "availablePublicationGroups"); final Element publicationsElem = personalPubsElem.newChildElement( "publications"); - final Map> groupsConfig = getGroupsConfig(); - final Map groupQueries = - new LinkedHashMap(); - logger.debug(String.format("2: %d ms until now...", System. - currentTimeMillis() - start)); - for (Map.Entry> entry : groupsConfig.entrySet()) { - createGroupQuery(person, - entry.getKey(), - entry.getValue(), - groupQueries, - language); - logger.debug(String.format("3: %d ms until now...", System. - currentTimeMillis() - start)); - } - - final String miscFilter = generateFilterForMiscGroup(groupsConfig); - final DataQuery miscQuery = SessionManager.getSession(). - retrieveQuery( - "com.arsdigita.cms.contenttypes.getPublicationsForAuthor"); - applyAuthorFilter(person, miscQuery, true, language); - miscQuery.addFilter(miscFilter); - groupQueries.put(MISC, miscQuery); - logger.debug(String.format("4: %d ms until now...", System. - currentTimeMillis() - start)); - logger.debug(String.format("5: %d ms until now...", System. - currentTimeMillis() - start)); - if (overallSize < config.getGroupSplit()) { publicationsElem.addAttribute("all", "all"); - for (Map.Entry> entry : groupsConfig. - entrySet()) { - generateXmlForGroup(entry.getKey(), + for (Map.Entry> group : + publicationsByGroup.entrySet()) { + generateXmlForGroup(group.getKey(), availableGroupsElem, publicationsElem, - groupQueries.get(entry.getKey()), - state, + group.getValue(), false, - true); + true, + state); } - - generateXmlForGroup(MISC, - availableGroupsElem, - publicationsElem, - groupQueries.get(MISC), - state, - false, - true); } else { - - final List availableGroups = new ArrayList(); - logger.debug(String.format("6: %d ms until now...", System. - currentTimeMillis() - start)); + final List availableGroups = new LinkedList(); for (Map.Entry> entry : groupsConfig. entrySet()) { - if (!(groupQueries.get(entry.getKey()).isEmpty())) { + if (!(publicationsByGroup.get(entry.getKey()).isEmpty())) { generateAvailableForGroup(entry.getKey(), availableGroupsElem); availableGroups.add(entry.getKey()); } - logger.debug(String.format("7: %d ms until now...", System. - currentTimeMillis() - start)); } - logger.debug(String.format("8: %d ms until now...", System. - currentTimeMillis() - start)); - final long b1 = System.currentTimeMillis(); - if (!(groupQueries.get(MISC).isEmpty())) { - generateAvailableForGroup(MISC, - availableGroupsElem); + if (!(publicationsByGroup.get(MISC).isEmpty())) { + generateAvailableForGroup(MISC, availableGroupsElem); availableGroups.add(MISC); } - if (logger.isDebugEnabled()) { - logger.debug(String.format("9: %d ms until now...", System. - currentTimeMillis() - start)); - logger.debug(String.format( - "Determined if misc group is available in %d ms", - System.currentTimeMillis() - b1)); - logger.debug(String.format("Determined available groups " - + "in %d ms.", - System.currentTimeMillis() - - start)); - } final HttpServletRequest request = state.getRequest(); - String group = selectGroup(request, config.getDefaultGroup(), - availableGroups); - if (logger.isDebugEnabled()) { - logger.debug(String.format("Selected group: '%s'", group)); - } - logger.debug(String.format("10: %d ms until now...", System. - currentTimeMillis() - start)); + final String group = selectGroup(request, + config.getDefaultGroup(), + availableGroups); + generateXmlForGroup(group, availableGroupsElem, publicationsElem, - groupQueries.get(group), - state, + publicationsByGroup.get(group), true, - false); - logger.debug(String.format("11: %d ms until now...", System. - currentTimeMillis() - start)); + false, + state); } - - allQuery.close(); - logger.debug(String.format("12: %d ms until now...", System. - currentTimeMillis() - start)); } if (logger.isDebugEnabled()) { @@ -194,62 +141,45 @@ public class PersonalPublications implements ContentGenerator { } } - private void applyAuthorFilter(final GenericPerson person, - final DataQuery query, - final boolean addOrders, - final String language) { - final StringBuilder authorFilterBuilder = new StringBuilder(); - authorFilterBuilder.append('('); - authorFilterBuilder.append(String.format("authorId = %s", - person.getID().toString())); - if (person.getAlias() != null) { - addAliasToFilter(authorFilterBuilder, person.getAlias()); - } - - authorFilterBuilder.append(')'); - - query.addFilter(authorFilterBuilder.toString()); - - /*query.addFilter(String.format("authorId = %s", - person.getID().toString()));*/ - if (Kernel.getConfig().languageIndependentItems()) { - FilterFactory ff = query.getFilterFactory(); - Filter filter = ff.or(). - addFilter(ff.equals("language", language)). - addFilter(ff.and(). - addFilter(ff.equals("language", GlobalizationHelper.LANG_INDEPENDENT)). - addFilter(ff.notIn("parent", "com.arsdigita.navigation.getParentIDsOfMatchedItems") - .set("language", language))); - query.addFilter(filter); - /*query.addFilter( - String.format("(language = '%s' or language = '%s')", - GlobalizationHelper.getNegotiatedLocale(). - getLanguage(), - GlobalizationHelper.LANG_INDEPENDENT));*/ - /*query.addFilter(String.format("language = '%s' or language = '%s'", - language, - GlobalizationHelper.LANG_INDEPENDENT));*/ - } else { - /*query.addEqualsFilter("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage());*/ - query.addEqualsFilter("language", language); - } - if (addOrders) { - final String[] orders = config.getOrder().split(","); - for (String order : orders) { - query.addOrder(order); + private List collectPublications( + final GenericPerson author, + final String language) { + final List publications = + new LinkedList(); + final List processed = new ArrayList(); + final DataCollection collection = (DataCollection) author. + getGenericPersonBundle().get("publication"); + DomainObject obj; + while (collection.next()) { + obj = DomainObjectFactory.newInstance(collection.getDataObject()); + if (obj instanceof PublicationBundle) { + processed.add(((PublicationBundle) obj).getParent().getID()); + publications.add((PublicationBundle) obj); } } + + if (author.getAlias() != null) { + collectPublications(author.getAlias(), publications, language); + } + + return publications; } - private void addAliasToFilter(final StringBuilder builder, - final GenericPerson alias) { - builder.append(String.format("or authorId = %s", - alias.getID().toString())); + private void collectPublications(final GenericPerson alias, + final List publications, + final String language) { + final DataCollection collection = (DataCollection) alias. + getGenericPersonBundle().get("publication"); + DomainObject obj; + while (collection.next()) { + obj = DomainObjectFactory.newInstance(collection.getDataObject()); + if (obj instanceof PublicationBundle) { + publications.add((PublicationBundle) obj); + } + } if (alias.getAlias() != null) { - addAliasToFilter(builder, alias.getAlias()); + collectPublications(alias.getAlias(), publications, language); } } @@ -283,52 +213,6 @@ public class PersonalPublications implements ContentGenerator { groups.put(tokens[0], types); } - private String generateFilterForTypeToken(String typeToken) { - if (typeToken.endsWith("_reviewed")) { - return String.format("(objectType = '%s' and reviewed = 'true')", - typeToken.substring(0, typeToken.length() - 9)); - } else if (typeToken.endsWith("_notreviewed")) { - return String.format( - "(objectType = '%s' and (reviewed = 'false' or reviewed is null))", - typeToken.substring(0, typeToken.length() - 12)); - } else { - return String.format("(objectType = '%s')", typeToken); - } - } - - private String generateFilterForTypeTokens(final List typeTokens) { - final StringBuffer buffer = new StringBuffer(); - for (String typeToken : typeTokens) { - if (buffer.length() > 0) { - buffer.append(" or "); - } - buffer.append(generateFilterForTypeToken(typeToken)); - } - - return buffer.toString(); - } - - private String generateFilterForMiscGroup( - final Map> groups) { - final StringBuffer buffer = new StringBuffer(); - - for (Map.Entry> entry : groups.entrySet()) { - if (buffer.length() > 0) { - buffer.append(" and "); - } - buffer.append(String.format("not (%s)", - generateFilterForTypeTokens(entry. - getValue()))); - } - - return buffer.toString(); - } - - private void applyFiltersForTypeTokens(final List typeTokens, - final DataQuery query) { - query.addFilter(generateFilterForTypeTokens(typeTokens)); - } - private void generateAvailableForGroup(final String groupName, final Element availableGroupsElem) { final Element group = @@ -340,11 +224,13 @@ public class PersonalPublications implements ContentGenerator { private void generateXmlForGroup(final String groupName, final Element availableGroupsElem, final Element publicationsElem, - final DataQuery query, - final PageState state, + final List publications, final boolean withPaginator, - final boolean generateAvailable) { - if ((query == null) || query.isEmpty()) { + final boolean generateAvailable, + final PageState state) { + List publicationList = publications; + + if ((publications == null) || publications.isEmpty()) { return; } @@ -358,48 +244,28 @@ public class PersonalPublications implements ContentGenerator { if (withPaginator) { final Paginator paginator = new Paginator(state.getRequest(), - (int) query.size(), + publications.size(), config.getPageSize()); - paginator.applyLimits(query); + publicationList = publicationList.subList(paginator.getBegin(), + paginator.getEnd()); paginator.generateXml(groupElem); } - while (query.next()) { - generatePublicationXml((BigDecimal) query.get("publicationId"), - (String) query.get("objectType"), + for (PublicationBundle publication : publicationList) { + generatePublicationXml(publication.getPublication( + GlobalizationHelper.getNegotiatedLocale().getLanguage()), groupElem, state); } - } - private void generatePublicationXml(final BigDecimal publicationId, - final String objectType, + private void generatePublicationXml(final Publication publication, final Element parent, final PageState state) { - final long start = System.currentTimeMillis(); - final ContentItem publication = (ContentItem) DomainObjectFactory. - newInstance(new OID( - objectType, publicationId)); - if (logger.isDebugEnabled()) { - logger.debug(String.format("Got domain object for publication " - + "'%s' in %d ms.", - publication.getName(), - System.currentTimeMillis() - start)); - } - /*final XmlGenerator generator = new XmlGenerator(publication); + final XmlGenerator generator = new XmlGenerator(publication); generator.setItemElemName("publications", ""); - generator.generateXML(state, parent, "");*/ - final PublicationXmlHelper xmlHelper = - new PublicationXmlHelper(parent, - (Publication) publication); - xmlHelper.generateXml(); - if (logger.isDebugEnabled()) { - logger.debug(String.format("Generated XML for publication '%s' " - + "in %d ms.", - publication.getName(), - System.currentTimeMillis() - start)); - } + generator.setListMode(true); + generator.generateXML(null, parent, ""); } private class XmlGenerator extends SimpleXMLGenerator { @@ -437,362 +303,51 @@ public class PersonalPublications implements ContentGenerator { return group; } - private void createGroupQuery(final GenericPerson author, - final String groupName, - final List typeTokens, - final Map groupQueries, - final String language) { - final DataQuery query = SessionManager.getSession().retrieveQuery( - "com.arsdigita.cms.contenttypes.getPublicationsForAuthor"); - applyAuthorFilter(author, query, true, language); - applyFiltersForTypeTokens(typeTokens, query); + private void filterPublicationsByGroup( + final String groupName, + final List typeTokens, + final List publications, + final Map> publicationsByGroup) { + final List group = + new LinkedList(); - groupQueries.put(groupName, query); + for (PublicationBundle publication : publications) { + for (String typeToken : typeTokens) { + if (publication.getContentType().getAssociatedObjectType(). + equals( + typeToken)) { + group.add(publication); + break; + } + } + } + + if (group.size() > 0) { + publicationsByGroup.put(groupName, group); + } } - /* ------------ */ -// public void generateContentOld(final Element parent, -// final GenericPerson person, -// final PageState state) { -// final long start = System.currentTimeMillis(); -// final List publications = collectPublications(person); -// -// final Element personalPubsElem = parent.newChildElement( -// "personalPublications"); -// -// if ((publications == null) || publications.isEmpty()) { -// personalPubsElem.newChildElement("noPublications"); -// -// return; -// } else { -// final Map> groupedPublications = -// processPublications( -// publications); -// -// generateGroupsXml(personalPubsElem, groupedPublications); -// generatePublicationsXml(personalPubsElem, groupedPublications, state); -// } -// if (logger.isDebugEnabled()) { -// logger.debug(String.format("Generated publications of %d publications " -// + "for '%s' in %d ms.", -// publications.size(), -// person.getFullName(), -// System.currentTimeMillis() - start)); -// } -// } -// -// private List collectPublications(final GenericPerson person) { -// final long start = System.currentTimeMillis(); -// final List publications = new ArrayList(); -// final DataCollection collection = (DataCollection) person.get( -// "publication"); -// -// while (collection.next()) { -// publications.add(collection.getDataObject()); -// } -// -// if (person.getAlias() != null) { -// collectPublications(person, publications); -// } -// -// if (logger.isDebugEnabled()) { -// logger.debug(String.format( -// "Collected publications of '%s' in %d ms.", -// person.getFullName(), -// System.currentTimeMillis() - start)); -// } -// return publications; -// } -// -// private void collectPublications(final GenericPerson alias, -// final List publications) { -// final DataCollection collection = (DataCollection) alias.get( -// "publication"); -// -// while (collection.next()) { -// publications.add(collection.getDataObject()); -// } -// -// if (alias.getAlias() != null) { -// collectPublications(alias, publications); -// } -// } -// -// /** -// * Processes the publications and puts them into the groups. -// * -// * @param publications The publications to process -// * @param typeGroupMap The group-type map -// * @return A map with the group names as keys and a list of publications -// * as value. -// */ -// private Map> processPublications( -// final List publications) { -// -// final long start = System.currentTimeMillis(); -// final GroupConfig groupConfig = new GroupConfig(config. -// getPublictionGroups()); -// final Map> pubGroups = -// new LinkedHashMap>(); -// -// for (String group : groupConfig.getGroups()) { -// initalizePubGroupMap(pubGroups, group); -// } -// initalizePubGroupMap(pubGroups, MISC); -// -// Publication publication; -// String type; -// String groupName; -// Boolean reviewed; -// List group; -// int i = 1; -// for (DataObject dobj : publications) { -// if (logger.isDebugEnabled()) { -// logger.debug(String.format("Processing publications %d " -// + "of %d...", -// i, -// publications.size())); -// } -// i++; -// publication = (Publication) DomainObjectFactory.newInstance(dobj); -// type = publication.getClass().getName(); -// -// if (dobj.getObjectType().hasProperty("reviewed")) { -// reviewed = (Boolean) dobj.get("reviewed"); -// if (reviewed == null) { -// reviewed = Boolean.FALSE; -// } -// if (reviewed) { -// groupName = groupConfig.getTypeGroupMap().get(String.format( -// "%s_ref", type)); -// } else { -// groupName = groupConfig.getTypeGroupMap().get(String.format( -// "%s_noref", type)); -// } -// -// if (groupName == null) { -// groupName = groupConfig.getTypeGroupMap().get(type); -// } -// } else { -// groupName = groupConfig.getTypeGroupMap().get(type); -// } -// -// if (groupName == null) { -// groupName = MISC; -// } -// -// group = pubGroups.get(groupName); -// group.add(publication); -// } -// -// final PublicationGroupComparator comparator = -// new PublicationGroupComparator(); -// for (List currentGroup : pubGroups.values()) { -// Collections.sort(currentGroup, comparator); -// } -// -// if (logger.isDebugEnabled()) { -// logger.debug(String.format("Proceessed %d publications in %d ms.", -// publications.size(), -// System.currentTimeMillis() - start)); -// } -// return pubGroups; -// } -// -// private void initalizePubGroupMap( -// final Map> pubGroups, -// final String groupName) { -// pubGroups.put(groupName, new ArrayList()); -// } -// -// private void generateGroupsXml(final Element parent, -// final Map> publications) { -// final Element availableGroups = parent.newChildElement( -// "availablePublicationGroups"); -// -// for (Map.Entry> entry : -// publications.entrySet()) { -// if (!entry.getValue().isEmpty()) { -// createAvailablePublicationGroupXml(availableGroups, -// entry.getKey()); -// } -// } -// } -// -// private void createAvailablePublicationGroupXml(final Element parent, -// final String name) { -// final Element group = -// parent.newChildElement("availablePublicationGroup"); -// group.addAttribute("name", name); -// } -// -// private void generatePublicationsXml( -// final Element parent, -// final Map> publications, -// final PageState state) { -// final Element publicationsElem = parent.newChildElement("publications"); -// -// int numberOfPubs = 0; -// final int groupSplit = config.getGroupSplit(); -// -// for (List list : publications.values()) { -// numberOfPubs += list.size(); -// } -// -// if (numberOfPubs < groupSplit) { -// publicationsElem.addAttribute("all", "all"); -// -// for (Map.Entry> entry : publications. -// entrySet()) { -// if (entry.getValue().size() > 0) { -// generatePublicationGroupXml(publicationsElem, -// entry.getKey(), -// entry.getValue(), -// state); -// } -// } -// } else { -// final HttpServletRequest request = state.getRequest(); -// final String[] defaultGroup = config.getDefaultGroup().split(","); -// -// String groupToShow = request.getParameter("group"); -// if ((groupToShow == null) -// || groupToShow.isEmpty() -// || !(publications.containsKey(groupToShow))) { -// int i = 0; -// groupToShow = defaultGroup[i]; -// while ((publications.get(groupToShow).isEmpty()) -// && i < defaultGroup.length) { -// groupToShow = defaultGroup[i]; -// i++; -// } -// } -// -// if (groupToShow == null) { -// groupToShow = MISC; -// } -// -// generatePublicationGroupXml(publicationsElem, -// groupToShow, -// publications.get(groupToShow), -// state); -// } -// } -// -// private void generatePublicationGroupXml(final Element publicationsElem, -// final String groupName, -// final List publications, -// final PageState state) { -// if (publications == null) { -// return; -// } -// -// final Element groupElem = publicationsElem.newChildElement( -// "publicationGroup"); -// groupElem.addAttribute("name", groupName); -// -// for (Publication publication : publications) { -// generatePublicationXml(groupElem, publication, state); -// } -// } -// -// private void generatePublicationXml(final Element publicationGroupElem, -// final Publication publication, -// final PageState state) { -// /*final PublicPersonalProfileXmlGenerator generator = -// new PublicPersonalProfileXmlGenerator( -// publication); -// generator.generateXML(state, publicationGroupElem, "");*/ -// final PublicationXmlHelper xmlHelper = new PublicationXmlHelper( -// publicationGroupElem, publication); -// xmlHelper.generateXml(); -// } -// -// /** -// * Processes the publications and puts them into the groups. -// * -// * @param publications The publications to process -// * @param typeGroupMap The group-type map -// * @return A map with the group names as keys and a list of publications -// * as value. -// */ -// private class GroupConfig { -// -// private final Map typeGroupMap = -// new HashMap(); -// private final List groups = new ArrayList(); -// -// /** -// * Processes the configuration string and puts the result into the -// * collections. -// * -// * @param groupStr -// */ -// public GroupConfig(final String groupStr) { -// final String[] groupTokens = groupStr.split(";"); -// String[] groupTokenSplit; -// String groupName; -// String publicationTypeTokens; -// String[] publicationTypeTokensSplit; -// List types; -// for (String groupToken : groupTokens) { -// groupTokenSplit = groupToken.split(":"); -// if (groupTokenSplit.length != 2) { -// logger.warn(String.format( -// "Invalid entry in publication group config: '%s'. " -// + "Ignoring.", -// groupToken)); -// continue; -// } -// -// groupName = groupTokenSplit[0]; -// groups.add(groupName); -// publicationTypeTokens = groupTokenSplit[1]; -// publicationTypeTokensSplit = publicationTypeTokens.split(","); -// for (String publicationTypeToken : publicationTypeTokensSplit) { -// typeGroupMap.put(publicationTypeToken, groupName); -// } -// } -// } -// -// public Map getTypeGroupMap() { -// return Collections.unmodifiableMap(typeGroupMap); -// } -// -// public List getGroups() { -// return Collections.unmodifiableList(groups); -// } -// } -// -// private class PublicationGroupComparator implements Comparator { -// -// public int compare(final Publication publication1, -// final Publication publication2) { -// AuthorshipCollection authors1; -// AuthorshipCollection authors2; -// GenericPerson author; -// String authorsStr1; -// String authorsStr2; -// final StringBuffer authors1Buffer = new StringBuffer(); -// final StringBuffer authors2Buffer = new StringBuffer(); -// -// authors1 = publication1.getAuthors(); -// while (authors1.next()) { -// author = authors1.getAuthor(); -// authors1Buffer.append(author.getSurname()); -// authors1Buffer.append(author.getGivenName()); -// } -// authors2 = publication2.getAuthors(); -// while (authors2.next()) { -// author = authors2.getAuthor(); -// authors2Buffer.append(author.getSurname()); -// authors2Buffer.append(author.getGivenName()); -// } -// -// authorsStr1 = authors1Buffer.toString(); -// authorsStr2 = authors2Buffer.toString(); -// -// return authorsStr1.compareTo(authorsStr2); -// } -// } + private List filterPublicationsForMiscGroup( + final List publications, + final Map> groupsConfig) { + final List misc = new LinkedList(); + + boolean found = false; + for (PublicationBundle publication : publications) { + for (Map.Entry> entry : groupsConfig.entrySet()) { + for (String type : entry.getValue()) { + if (publication.getContentType().getAssociatedObjectType(). + equals(type)) { + found = true; + } + } + } + if (!found) { + misc.add(publication); + } + found = false; + } + + return misc; + } } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationBundle.java b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationBundle.java index 0766c7121..d9d7601d0 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationBundle.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationBundle.java @@ -336,4 +336,12 @@ public class PublicationBundle extends ContentBundle { remove(SERIES, series.getSeriesBundle()); } + + public Publication getPublication() { + return (Publication) getPrimaryInstance(); + } + + public Publication getPublication(final String language) { + return (Publication) getInstance(language); + } } diff --git a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTab.java b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTab.java index f44be1b32..3781ecd88 100644 --- a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTab.java +++ b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTab.java @@ -3,6 +3,8 @@ package com.arsdigita.cms.contenttypes.ui; import com.arsdigita.bebop.PageState; import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit; +import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection; +import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitSubordinateCollection; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.SciDepartment; import com.arsdigita.cms.contenttypes.ui.panels.CompareFilter; @@ -15,6 +17,9 @@ import com.arsdigita.persistence.SessionManager; import com.arsdigita.xml.Element; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; @@ -34,13 +39,13 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { private static final String SURNAME_PARAM = "memberSurname"; private final CompareFilter statusFilter = new CompareFilter( STATUS_PARAM, - "status", + "link.status", false, false, false); private final TextFilter surnameFilter = new TextFilter(SURNAME_PARAM, - GenericPerson.SURNAME); + "name"); static { config.load(); @@ -55,28 +60,29 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { } } + @Override public boolean hasData(final GenericOrganizationalUnit orgaunit) { - if ((orgaunit.getPersons() != null) - && orgaunit.getPersons().size() > 0) { - return true; - } else if (config.isMergingMembers()) { - final DataQuery persons = getData(orgaunit); - return persons.isEmpty(); - } else { - return false; - } +// if ((orgaunit.getPersons() != null) +// && orgaunit.getPersons().size() > 0) { +// return true; +// } else if (config.isMergingMembers()) { +// final DataQuery persons = getData(orgaunit); +// return persons.isEmpty(); +// } else { +// return false; +// } + + return !orgaunit.getPersons().isEmpty(); } + @Override public void generateXml(final GenericOrganizationalUnit orgaunit, final Element parent, final PageState state) { final long start = System.currentTimeMillis(); - final DataQuery persons = getData(orgaunit); + List members = getMembers(orgaunit, state); final HttpServletRequest request = state.getRequest(); - - applyStatusFilter(persons, request); - applySurnameFilter(persons, request); - + final Element depMembersElem = parent.newChildElement( "departmentMembers"); @@ -84,7 +90,8 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { statusFilter.generateXml(filtersElem); - if (persons.isEmpty()) { + if (members.isEmpty()) { + //if (persons.isEmpty()) { if ((surnameFilter != null) && (surnameFilter.getFilter() != null) && !(surnameFilter.getFilter().trim().isEmpty())) { @@ -94,8 +101,23 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { return; } + Collections.sort(members, new Comparator() { + + public int compare(final GenericPerson person1, + final GenericPerson person2) { + String name1 = String.format("%s %s", person1.getSurname(), + person1.getGivenName()); + String name2 = String.format("%s %s", person2.getSurname(), + person2.getGivenName()); + + return name1.compareTo(name2); + } + + }); + final Paginator paginator = new Paginator(request, - (int) persons.size(), + //(int) persons.size(), + members.size(), config.getPageSize()); if ((paginator.getPageCount() > config.getEnableSearchLimit()) @@ -104,11 +126,13 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { surnameFilter.generateXml(filtersElem); } - paginator.applyLimits(persons); paginator.generateXml(depMembersElem); + if (paginator.getEnd() < members.size()) { + members = members.subList(paginator.getBegin(), paginator.getEnd()); + } - while (persons.next()) { - generateMemberXml((BigDecimal) persons.get("memberId"), + for (GenericPerson member : members) { + generateMemberXml(member, depMembersElem, state); } @@ -119,6 +143,62 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { System.currentTimeMillis() - start)); } + protected List getMembers( + final GenericOrganizationalUnit orgaunit, + final PageState state) { + final long start = System.currentTimeMillis(); + + final List members = new LinkedList(); + + final GenericOrganizationalUnitPersonCollection persons = orgaunit. + getPersons(); + + if (state != null) { + applyStatusFilter(persons, state.getRequest()); + applySurnameFilter(persons, state.getRequest()); + } + + while (persons.next()) { + members.add(persons.getPerson()); + } + + if (config.isMergingMembers()) { + getMembersFromSubordinateOrgaUnits(orgaunit, members, state); + } + + logger.debug(String.format( + "Got members of department '%s'" + + "in '%d ms'. MergeMembers is set to '%b'.", + orgaunit.getName(), + System.currentTimeMillis() - start, + config.isMergingMembers())); + return members; + } + + protected void getMembersFromSubordinateOrgaUnits( + final GenericOrganizationalUnit orgaunit, + final List members, + final PageState state) { + final GenericOrganizationalUnitSubordinateCollection subDeps = orgaunit. + getSubordinateOrgaUnits(); + subDeps.addFilter( + "objecttype = 'com.arsdigita.cms.contenttypes.SciDepartment'"); + + while (subDeps.next()) { + getMembersFromSubordinateOrgaUnit( + subDeps.getGenericOrganizationalUnit(), members, state); + } + } + + protected void getMembersFromSubordinateOrgaUnit( + final GenericOrganizationalUnit subOrgaUnit, + final List members, + final PageState state) { + final List subOrgaUnitMembers = getMembers(subOrgaUnit, + state); + members.addAll(subOrgaUnitMembers); + } + protected DataQuery getData(final GenericOrganizationalUnit orgaunit) { final long start = System.currentTimeMillis(); @@ -133,7 +213,6 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { final DataQuery personsQuery = SessionManager.getSession(). retrieveQuery( "com.arsdigita.cms.contenttypes.getIdsOfMembersOfOrgaUnits"); - //final StringBuffer personsFilter = new StringBuffer(); final List orgaUnitIds = new ArrayList(); if (config.isMergingMembers()) { @@ -146,48 +225,14 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { SciDepartmentSubDepartmentsStep.ASSOC_TYPE); while (subDepartmentsQuery.next()) { - /*if (personsFilter.length() > 0) { - personsFilter.append(" or "); - } - personsFilter.append(String.format("orgaunitId = %s", - subDepartmentsQuery.get( - "orgaunitId").toString()));*/ orgaUnitIds.add(subDepartmentsQuery.get("orgaunitId").toString()); } } else { - /*personsFilter.append(String.format("orgaunitId = %s", - orgaunit.getID().toString()));*/ orgaUnitIds.add(orgaunit.getID().toString()); } - //personsQuery.addFilter(personsFilter.toString()); personsQuery.setParameter("orgaunitIds", orgaUnitIds); - /** - * Filter for language independent items - */ - /*if (Kernel.getConfig().languageIndependentItems()) { - FilterFactory ff = personsQuery.getFilterFactory(); - Filter filter = ff.or(). - addFilter(ff.equals("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage())). - addFilter(ff.and(). - addFilter(ff.equals("language", - GlobalizationHelper.LANG_INDEPENDENT)). - addFilter(ff.notIn("parentId", - "com.arsdigita.cms.contenttypes.getParentIDsOfMatchedItems"). - set("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage()))); - personsQuery.addFilter(filter); - } else { - personsQuery.addEqualsFilter("language", - com.arsdigita.globalization.GlobalizationHelper. - getNegotiatedLocale().getLanguage()); - }*/ - - personsQuery.addOrder(GenericPerson.SURNAME); personsQuery.addOrder(GenericPerson.GIVENNAME); @@ -245,7 +290,8 @@ public class SciDepartmentMembersTab implements GenericOrgaUnitTab { final PageState state) { final long start = System.currentTimeMillis(); final XmlGenerator generator = new XmlGenerator(member); - generator.setUseExtraXml(false); + //generator.setUseExtraXml(false); + //generator.setListMode(true); generator.setItemElemName("member", ""); generator.generateXML(state, parent, ""); logger.debug(String.format("Generated XML for member '%s' in %d ms.", diff --git a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTabConfig.java b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTabConfig.java index 813aa190a..42f6b8603 100644 --- a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTabConfig.java +++ b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentMembersTabConfig.java @@ -41,7 +41,7 @@ public class SciDepartmentMembersTabConfig extends AbstractConfig { new BooleanParameter( "com.arsdigita.cms.contenttypes.scidepartments.tabs.members.merge", Parameter.REQUIRED, - Boolean.TRUE); + Boolean.FALSE); register(statusValues); register(pageSize); diff --git a/ccm-sci-types-project/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/SciProject.xml b/ccm-sci-types-project/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/SciProject.xml index d2219ea64..891b9fed7 100644 --- a/ccm-sci-types-project/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/SciProject.xml +++ b/ccm-sci-types-project/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/SciProject.xml @@ -10,7 +10,7 @@ objectType="com.arsdigita.cms.contenttypes.SciProject" classname="com.arsdigita.cms.contenttypes.SciProject"> - +