Verschiedene Ergänzungen und Korrekturen

git-svn-id: https://svn.libreccm.org/ccm/trunk@1517 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2012-02-19 15:11:36 +00:00
parent 280e924978
commit e3ff2038c7
6 changed files with 229 additions and 160 deletions

View File

@ -7,7 +7,6 @@ import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection;
import com.arsdigita.cms.contenttypes.GenericPerson;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.xml.Element;
import java.math.BigDecimal;
import java.util.List;
@ -53,7 +52,10 @@ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab {
}
while (persons.next()) {
generatePersonXml((BigDecimal) persons.get("memberId"),
/*generatePersonXml((BigDecimal) persons.get("memberId"),
parent,
state);*/
generatePersonXml(((GenericOrganizationalUnitPersonCollection) persons).getPerson().getID(),
parent,
state);
}
@ -90,7 +92,9 @@ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab {
}
protected DataQuery getData(final GenericOrganizationalUnit orgaunit) {
final long start = System.currentTimeMillis();
return orgaunit.getPersons();
/*final long start = System.currentTimeMillis();
final DataQuery personsQuery = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getIdsOfMembersOfOrgaUnits");
@ -159,7 +163,7 @@ public abstract class GenericOrgaUnitMembersTab implements GenericOrgaUnitTab {
orgaunit.getName(),
System.currentTimeMillis() - start,
isMergingMembers()));
return personsQuery;
return personsQuery;*/
}
/**

View File

@ -13,42 +13,30 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
/**
* <p>
* An object list variant which can be filtered and sorted by the visitor of
* <p> An object list variant which can be filtered and sorted by the visitor of
* the website. The available filters and sort options are added in a JSP
* template. There are three kinds of filters yet:
* </p>
* <dl>
* <dt><code>TextFilter</code></dt>
* template. There are three kinds of filters yet: </p> <dl> <dt><code>TextFilter</code></dt>
* <dd>This filter filters the object list using a user provided string, which
* is put into the <code>WHERE</code> clause with <code>LIKE</code> operator.
* You might use this filter to allow the visitor to filter an object list for
* items with a specific name.</dd>
* <dt><code>SelectFilter</code></dt>
* is put into the
* <code>WHERE</code> clause with
* <code>LIKE</code> operator. You might use this filter to allow the visitor to
* filter an object list for items with a specific name.</dd> <dt><code>SelectFilter</code></dt>
* <dd>This filter traverses through the objects displayed by the list and
* determines all distinct values of a property. The visitor can choose one
* of this values, and the displayed list will only contain items which where
* the property has the selected value.</dd>
* <dt><code>CompareFilter</code></dt>
* <dd>This filter also provides selectable options. But these options
* can be configured by the developer in the template.</dd>
* </dl>
* <p>
* If there is more than one filter, the values of all filters are combined
* using <code>AND</code>.
* </p>
* <p>
* This object list class was developed for displaying list of items from
* the Sci modules (SciPublications and SciOrganization). For example, we use
* this list to provide lists of publications which be filtered for publications
* from a specific year, for a specific author and for a specific title. The
* list can be sorted by the titles of the publications, the years of the
* publications and the (surnames of the) authors of the publications.
* </p>
* <p>
* As an example how to use this object list in a JSP template here are the
* relevant parts from the template for the publication list:
* </p>
* determines all distinct values of a property. The visitor can choose one of
* this values, and the displayed list will only contain items which where the
* property has the selected value.</dd> <dt><code>CompareFilter</code></dt>
* <dd>This filter also provides selectable options. But these options can be
* configured by the developer in the template.</dd> </dl> <p> If there is more
* than one filter, the values of all filters are combined using
* <code>AND</code>. </p> <p> This object list class was developed for
* displaying list of items from the Sci modules (SciPublications and
* SciOrganization). For example, we use this list to provide lists of
* publications which be filtered for publications from a specific year, for a
* specific author and for a specific title. The list can be sorted by the
* titles of the publications, the years of the publications and the (surnames
* of the) authors of the publications. </p> <p> As an example how to use this
* object list in a JSP template here are the relevant parts from the template
* for the publication list: </p>
* <pre>
* {@code
* ...
@ -56,35 +44,35 @@ import org.apache.log4j.Logger;
* classname="com.arsdigita.navigation.ui.object.CustomizableObjectList"/>
* ...
* <jsp:scriptlet>
CustomizableObjectList objList = (CustomizableObjectList) itemList;
objList.setDefinition(new CMSDataCollectionDefinition());
objList.setRenderer(new CMSDataCollectionRenderer());
objList.getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Publication");
objList.getDefinition().setDescendCategories(false);
objList.addTextFilter("title", "title");
objList.addTextFilter("authors.surname", "author");
objList.addSelectFilter("yearOfPublication", "year", true, true, true, true);
objList.addSortField("title", "title asc");
objList.addSortField("yearAsc", "yearOfPublication asc");
objList.addSortField("yearDesc", "yearOfPublication desc");
objList.addSortField("authors", "authors.surname asc, authors.givenname asc");
objList.getDefinition().addOrder(objList.getOrder(request.getParameter("sort")));
objList.getRenderer().setPageSize(20);
objList.getRenderer().setSpecializeObjects(true);
</jsp:scriptlet>
* CustomizableObjectList objList = (CustomizableObjectList) itemList;
* objList.setDefinition(new CMSDataCollectionDefinition());
* objList.setRenderer(new CMSDataCollectionRenderer());
* objList.getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Publication");
* objList.getDefinition().setDescendCategories(false);
* objList.addTextFilter("title", "title");
* objList.addTextFilter("authors.surname", "author");
* objList.addSelectFilter("yearOfPublication", "year", true, true, true, true);
* objList.addSortField("title", "title asc");
* objList.addSortField("yearAsc", "yearOfPublication asc");
* objList.addSortField("yearDesc", "yearOfPublication desc");
* objList.addSortField("authors", "authors.surname asc, authors.givenname asc");
* objList.getDefinition().addOrder(objList.getOrder(request.getParameter("sort")));
*
* objList.getRenderer().setPageSize(20);
* objList.getRenderer().setSpecializeObjects(true);
*
* </jsp:scriptlet>
* ...
* }
* </pre>
* <p>
* You may notice the line
* </pre> <p> You may notice the line
* <code>objList.getDefinition().addOrder(objList.getOrder(request.getParameter("sort")));</code>.
* This line may looks a bit weird to you. The reason is that it is not possible
* to access the <code>DataCollectionDefinition</code> from the methods in this
* class. If you try call the <code>addOrder()</code> from within this class
* you will cause an locking error.
* </p>
* to access the
* <code>DataCollectionDefinition</code> from the methods in this class. If you
* try call the
* <code>addOrder()</code> from within this class you will cause an locking
* error. </p>
*
* @author Jens Pelzetter
* @version $Id$
* @see Filter
@ -133,11 +121,11 @@ public class CustomizableObjectList extends ComplexObjectList {
* @param allOption Add an <em>all</em> option to the filter.
* @param allOptionIsDefault Is the all option the default?
* @param propertyIsNumeric Is the property to filter numeric?
* @return The new filter. Options can be added to the filter by calling
* the {@link CompareFilter#addOption(java.lang.String, java.lang.String)} or
* the {@link CompareFilter#addOption(java.lang.String, com.arsdigita.navigation.ui.object.CompareFilter.Operators, java.lang.String)}
* @return The new filter. Options can be added to the filter by calling the {@link CompareFilter#addOption(java.lang.String, java.lang.String)}
* or the {@link CompareFilter#addOption(java.lang.String, com.arsdigita.navigation.ui.object.CompareFilter.Operators, java.lang.String)}
* method.
* @see CompareFilter#CompareFilter(java.lang.String, java.lang.String, boolean, boolean, boolean)
* @see CompareFilter#CompareFilter(java.lang.String, java.lang.String,
* boolean, boolean, boolean)
*
*/
public CompareFilter addCompareFilter(final String property,
@ -166,7 +154,9 @@ public class CustomizableObjectList extends ComplexObjectList {
* @param allOption Add an all option?
* @param allOptionIsDefault Is the all option the default.
* @param propertyIsNumeric Is the property numeric?
* @see SelectFilter#SelectFilter(java.lang.String, java.lang.String, com.arsdigita.navigation.ui.object.CustomizableObjectList, boolean, boolean, boolean, boolean)
* @see SelectFilter#SelectFilter(java.lang.String, java.lang.String,
* com.arsdigita.navigation.ui.object.CustomizableObjectList, boolean,
* boolean, boolean, boolean)
*/
public void addSelectFilter(final String property,
final String label,
@ -211,9 +201,10 @@ public class CustomizableObjectList extends ComplexObjectList {
}
/**
* This overwritten version of the <code>getObjects</code> method evaluates
* the parameters in HTTP request for the filters and creates an
* appropriate SQL filter and sets this filter.
* This overwritten version of the
* <code>getObjects</code> method evaluates the parameters in HTTP request
* for the filters and creates an appropriate SQL filter and sets this
* filter.
*
* @param request
* @param response
@ -247,16 +238,12 @@ public class CustomizableObjectList extends ComplexObjectList {
}
/**
* <p>
* Generates the XML for the list. The root element for the list is
* <code>customizableObjectList</code>. The available filters are
* put into a <code>filters</code> element.
* </p>
* <p>
* The available sort fields are put into a <code>sortFields</code> element.
* This element has also an attribute indicating the current selected sort
* field.
* </p>
* <p> Generates the XML for the list. The root element for the list is
* <code>customizableObjectList</code>. The available filters are put into a
* <code>filters</code> element. </p> <p> The available sort fields are put
* into a
* <code>sortFields</code> element. This element has also an attribute
* indicating the current selected sort field. </p>
*
* @param request
* @param response
@ -283,12 +270,14 @@ public class CustomizableObjectList extends ComplexObjectList {
//- The HttpRequest is available here.
//So we use the HTTP request directly, which allows use to use a
//dedicated parameter for each of the filters.
/*if (request.getCharacterEncoding() == null) {*/
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException ex) {
logger.error(ex);
}
/*
* if (request.getCharacterEncoding() == null) {
*/
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException ex) {
logger.error(ex);
}
//}
for (Map.Entry<String, Filter> filterEntry : filters.entrySet()) {
@ -299,14 +288,6 @@ public class CustomizableObjectList extends ComplexObjectList {
}
}
//Look for a sort parameter. If one is found, use one to sort the data
//collection (if it is a valid value). If no sort parameter is found,
//use the first sort field as default.
String sortByKey = request.getParameter("sort");
if (!sortFields.containsKey(sortByKey)) {
sortByKey = new ArrayList<String>(sortFields.keySet()).get(0);
}
Element controls = content.newChildElement("filterControls");
controls.addAttribute("customName", m_customName);
@ -315,11 +296,22 @@ public class CustomizableObjectList extends ComplexObjectList {
filterElems.addContent(filterEntry.getValue().getXml());
}
Element sortFieldElems = controls.newChildElement("sortFields");
sortFieldElems.addAttribute("sortBy", sortByKey);
for (Map.Entry<String, String> sortField : sortFields.entrySet()) {
Element sortFieldElem = sortFieldElems.newChildElement("sortField");
sortFieldElem.addAttribute("label", sortField.getKey());
if (sortFields.size() > 0) {
//Look for a sort parameter. If one is found, use one to sort the data
//collection (if it is a valid value). If no sort parameter is found,
//use the first sort field as default.
String sortByKey = request.getParameter("sort");
if (!sortFields.containsKey(sortByKey)) {
sortByKey = new ArrayList<String>(sortFields.keySet()).get(0);
}
Element sortFieldElems = controls.newChildElement("sortFields");
sortFieldElems.addAttribute("sortBy", sortByKey);
for (Map.Entry<String, String> sortField : sortFields.entrySet()) {
Element sortFieldElem = sortFieldElems.newChildElement(
"sortField");
sortFieldElem.addAttribute("label", sortField.getKey());
}
}
//Add object list

View File

@ -62,4 +62,11 @@ public class SciMember extends GenericPerson {
return generators;
}
@Override
public List<ExtraXMLGenerator> getExtraListXMLGenerators() {
final List<ExtraXMLGenerator> generators = super.getExtraListXMLGenerators();
generators.add(new SciMemberExtraXmlGenerator());
return generators;
}
}

View File

@ -2,6 +2,7 @@ package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ExtraXMLGenerator;
import com.arsdigita.cms.contenttypes.ui.SciProjectExtraXmlGenerator;
import com.arsdigita.cms.contenttypes.ui.SciProjectListExtraXmlGenerator;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
@ -367,6 +368,13 @@ public class SciProject extends GenericOrganizationalUnit {
return generators;
}
@Override
public List<ExtraXMLGenerator> getExtraListXMLGenerators() {
final List<ExtraXMLGenerator> generators = super.getExtraListXMLGenerators();
generators.add(new SciProjectListExtraXmlGenerator());
return generators;
}
@Override
public String getSearchSummary() {
return getProjectShortDescription();

View File

@ -0,0 +1,61 @@
package com.arsdigita.cms.contenttypes.ui;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ExtraXMLGenerator;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection;
import com.arsdigita.cms.contenttypes.GenericPerson;
import com.arsdigita.cms.contenttypes.SciProject;
import com.arsdigita.xml.Element;
/**
*
* @author Jens Pelzetter
* @version $Id$
*/
public class SciProjectListExtraXmlGenerator implements ExtraXMLGenerator {
public void generateXML(final ContentItem item,
final Element element,
final PageState state) {
if (!(item instanceof SciProject)) {
throw new IllegalArgumentException(
"This ExtraXMLGenerator supports items of type "
+ "'com.arsdigita.cms.contenttypes.SciProject' only.");
}
final SciProject project = (SciProject) item;
final GenericOrganizationalUnitPersonCollection members = project.
getPersons();
final Element membersElem = element.newChildElement("members");
while (members.next()) {
generateMemberXml(membersElem,
members.getPerson(),
members.getRoleName());
}
}
public void addGlobalStateParams(final Page page) {
//Nothing for now
}
private void generateMemberXml(final Element membersElem,
final GenericPerson member,
final String roleName) {
final Element memberElem = membersElem.newChildElement("member");
memberElem.addAttribute("role", roleName);
final Element surnameElem = memberElem.newChildElement("surname");
surnameElem.setText(member.getSurname());
final Element givenNameElem = memberElem.newChildElement("givenName");
givenNameElem.setText(member.getGivenName());
final Element titlePreElem = memberElem.newChildElement("titlePre");
titlePreElem.setText(member.getTitlePre());
final Element titlePostElem = memberElem.newChildElement("titlePost");
titlePostElem.setText(member.getTitlePost());
}
}

View File

@ -94,6 +94,7 @@ public class SciProjectSummaryTab implements GenericOrgaUnitTab {
/**
* Generates the XML for the basic data (addendum, begin, end, shortDesc)
*
* @param project
* @param parent
*/
@ -194,57 +195,50 @@ public class SciProjectSummaryTab implements GenericOrgaUnitTab {
final Element membersElem = parent.newChildElement("members");
if (config.isMergingMembers()) {
final DataQuery subProjectsQuery =
SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getIdsOfSubordinateOrgaUnitsRecursivlyWithAssocType");
subProjectsQuery.setParameter("orgaunitId",
project.getID().toString());
subProjectsQuery.setParameter("assocType",
SciProjectSubProjectsStep.ASSOC_TYPE);
final GenericOrganizationalUnitPersonCollection members = project.
getPersons();
final DataQuery personsQuery = SessionManager.getSession().
retrieveQuery(
"com.arsdigita.cms.contenttypes.getIdsOfMembersOfOrgaUnits");
//final StringBuffer personsFilter = new StringBuffer();
final List<String> projectIds = new ArrayList<String>();
while (subProjectsQuery.next()) {
/*if (personsFilter.length() > 0) {
personsFilter.append(" or ");
}
personsFilter.append(String.format("orgaunitId = %s",
subProjectsQuery.get(
"orgaunitId").toString()));*/
projectIds.add(subProjectsQuery.get("orgaunitId").toString());
}
//personsQuery.addFilter(personsFilter.toString());
personsQuery.setParameter("orgaunitIds", projectIds);
personsQuery.addOrder(GenericPerson.SURNAME);
personsQuery.addOrder(GenericPerson.GIVENNAME);
while (personsQuery.next()) {
generateMemberXml((BigDecimal) personsQuery.get("memberId"),
membersElem,
(String) personsQuery.get("roleName"),
state);
}
} else {
final GenericOrganizationalUnitPersonCollection members = project.
getPersons();
members.addOrder("surname");
members.addOrder("givenname");
while (members.next()) {
generateMemberXml(members.getPerson(),
membersElem,
members.getRoleName(),
state);
}
while (members.next()) {
generateMemberXml(members.getPerson(),
membersElem,
members.getRoleName(),
state);
}
/*
* if (config.isMergingMembers()) { final DataQuery subProjectsQuery =
* SessionManager.getSession().retrieveQuery(
* "com.arsdigita.cms.contenttypes.getIdsOfSubordinateOrgaUnitsRecursivlyWithAssocType");
* subProjectsQuery.setParameter("orgaunitId",
* project.getID().toString());
* subProjectsQuery.setParameter("assocType",
* SciProjectSubProjectsStep.ASSOC_TYPE);
*
* final DataQuery personsQuery = SessionManager.getSession().
* retrieveQuery(
* "com.arsdigita.cms.contenttypes.getIdsOfMembersOfOrgaUnits");
*
* final List<String> projectIds = new ArrayList<String>(); while
* (subProjectsQuery.next()) {
* projectIds.add(subProjectsQuery.get("orgaunitId").toString()); }
* personsQuery.setParameter("orgaunitIds", projectIds);
*
* personsQuery.addOrder(GenericPerson.SURNAME);
* personsQuery.addOrder(GenericPerson.GIVENNAME);
*
* while (personsQuery.next()) { generateMemberXml((BigDecimal)
* personsQuery.get("memberId"), membersElem, (String)
* personsQuery.get("roleName"), state); } } else { final
* GenericOrganizationalUnitPersonCollection members = project.
* getPersons();
*
* members.addOrder("surname"); members.addOrder("givenname");
*
* while (members.next()) { generateMemberXml(members.getPerson(),
* membersElem, members.getRoleName(), state); }
}
*/
logger.debug(String.format("Generated members XML for project '%s'"
+ "in '%d ms'. MergeMembers is set to '%b'.",
project.getName(),
@ -428,9 +422,12 @@ public class SciProjectSummaryTab implements GenericOrgaUnitTab {
final XmlGenerator generator = new XmlGenerator(subProject);
generator.setUseExtraXml(false);
generator.generateXML(state, parent, "");
/*final Element subProjectElem = parent.newChildElement("subProject");
final Element subProjectTitle = subProjectElem.newChildElement("title");
subProjectTitle.setText(subProject.getTitle());*/
/*
* final Element subProjectElem = parent.newChildElement("subProject");
* final Element subProjectTitle =
* subProjectElem.newChildElement("title");
subProjectTitle.setText(subProject.getTitle());
*/
logger.debug(String.format("Generated XML for subproject '%s' in"
+ "%d ms",
subProject.getName(),