From b6f6ad912727ca80c12d465bbf9bde2653860851 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 1 Oct 2011 18:17:04 +0000 Subject: [PATCH] =?UTF-8?q?-=20Publikationslisten-Generator=20f=C3=BCr=20p?= =?UTF-8?q?ers=C3=B6nliche=20Profile:=20Funktioniert=20soweit,=20Unterst?= =?UTF-8?q?=C3=BCtzung=20in=20Mandalay=20fehlt=20noch=20-=20Einige=20klein?= =?UTF-8?q?ere=20Bug-Fixes=20und=20Formatierungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/trunk@1127 8810af33-2d31-482b-a856-94f89814c4df --- ...ublicPersonalProfileExtraXmlGenerator.java | 5 +- .../ContentGenerator.java | 3 +- .../ExampleGenerator.java | 4 +- .../PublicPersonalProfilesServlet.java | 10 +- .../cms/contenttypes/ui/panels/SortField.java | 3 +- ccm-sci-personalpublications/application.xml | 4 +- .../src/ccm-sci-personalpublications.config | 2 +- .../PersonalPublications.java | 109 ++++++++++++++++-- .../PersonalPublicationsConfig.java | 47 +++++++- ...nalPublicationsConfig_parameter.properties | 14 +++ ...alPublicationsConfig_parameters.properties | 4 - 11 files changed, 174 insertions(+), 31 deletions(-) create mode 100644 ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameter.properties delete mode 100644 ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameters.properties 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 0e6040180..a4d9c5a8a 100644 --- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java +++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/contenttypes/PublicPersonalProfileExtraXmlGenerator.java @@ -77,8 +77,9 @@ public class PublicPersonalProfileExtraXmlGenerator implements ExtraXMLGenerator final ContentGenerator generator = (ContentGenerator) generatorObj; - generator.generateContent(profileContent, profile. - getOwner()); + generator.generateContent(profileContent, + profile.getOwner(), + state); } else { throw new UncheckedWrapperException(String.format( diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ContentGenerator.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ContentGenerator.java index c89658bf7..6527fabb2 100644 --- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ContentGenerator.java +++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ContentGenerator.java @@ -1,5 +1,6 @@ package com.arsdigita.cms.publicpersonalprofile; +import com.arsdigita.bebop.PageState; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.xml.Element; @@ -10,6 +11,6 @@ import com.arsdigita.xml.Element; */ public interface ContentGenerator { - void generateContent(Element parent, GenericPerson person); + void generateContent(Element parent, GenericPerson person, PageState state); } diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ExampleGenerator.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ExampleGenerator.java index de7703b50..f8a6aeacc 100644 --- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ExampleGenerator.java +++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/ExampleGenerator.java @@ -1,5 +1,6 @@ package com.arsdigita.cms.publicpersonalprofile; +import com.arsdigita.bebop.PageState; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.xml.Element; @@ -12,7 +13,8 @@ import com.arsdigita.xml.Element; public class ExampleGenerator implements ContentGenerator { public void generateContent(final Element parent, - final GenericPerson person) { + final GenericPerson person, + final PageState state) { Element message = parent.newChildElement("message"); message.setText("Hello World!"); diff --git a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java index 02fe34adb..6a70285f5 100644 --- a/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java +++ b/ccm-cms-publicpersonalprofile/src/com/arsdigita/cms/publicpersonalprofile/PublicPersonalProfilesServlet.java @@ -37,7 +37,6 @@ import com.arsdigita.xml.Element; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; -import java.rmi.ServerException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -179,10 +178,11 @@ public class PublicPersonalProfilesServlet extends BaseApplicationServlet { Element profileOwnerName = profileElem.newChildElement( "ppp:ownerName", PPP_NS); profileOwnerName.setText(owner.getFullName()); - + final PublicPersonalProfileXmlUtil util = new PublicPersonalProfileXmlUtil(); - String prefix = DispatcherHelper.getDispatcherPrefix(request); + String prefix = + DispatcherHelper.getDispatcherPrefix(request); if (prefix == null) { prefix = ""; } @@ -246,7 +246,9 @@ public class PublicPersonalProfilesServlet extends BaseApplicationServlet { final ContentGenerator generator = (ContentGenerator) generatorObj; - generator.generateContent(root, owner); + generator.generateContent(root, + owner, + state); } else { throw new ServletException(String.format( diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/SortField.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/SortField.java index dcd8d1646..08d0318f0 100644 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/SortField.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/ui/panels/SortField.java @@ -1,6 +1,5 @@ package com.arsdigita.cms.contenttypes.ui.panels; -import com.arsdigita.cms.ContentItem; import com.arsdigita.xml.Element; import java.util.Comparator; @@ -9,7 +8,7 @@ import java.util.Comparator; * @param * @author Jens Pelzetter */ -public class SortField { +public class SortField { private String label; private Comparator comparator; diff --git a/ccm-sci-personalpublications/application.xml b/ccm-sci-personalpublications/application.xml index aeff43938..f389f991f 100644 --- a/ccm-sci-personalpublications/application.xml +++ b/ccm-sci-personalpublications/application.xml @@ -11,9 +11,7 @@ - - - + diff --git a/ccm-sci-personalpublications/src/ccm-sci-personalpublications.config b/ccm-sci-personalpublications/src/ccm-sci-personalpublications.config index 1b5a291f9..0bfd7b0df 100644 --- a/ccm-sci-personalpublications/src/ccm-sci-personalpublications.config +++ b/ccm-sci-personalpublications/src/ccm-sci-personalpublications.config @@ -1,5 +1,5 @@ \ No newline at end of file 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 e996c5672..89e94538a 100644 --- a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java +++ b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java @@ -1,5 +1,6 @@ package com.arsdigita.cms.publicpersonalprofile; +import com.arsdigita.bebop.PageState; import com.arsdigita.cms.contenttypes.AuthorshipCollection; import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.Publication; @@ -14,6 +15,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; /** @@ -34,7 +36,8 @@ public class PersonalPublications implements ContentGenerator { } public void generateContent(final Element parent, - final GenericPerson person) { + final GenericPerson person, + final PageState state) { DataCollection publications = (DataCollection) person.get("publication"); if ((publications == null) || publications.size() == 0) { @@ -47,9 +50,9 @@ public class PersonalPublications implements ContentGenerator { final Map> groupedPublications = processPublications( publications); - + generateGroupsXml(parent, groupedPublications); - generatePublicationsXml(parent, groupedPublications); + generatePublicationsXml(parent, groupedPublications, state); } } @@ -127,14 +130,102 @@ public class PersonalPublications implements ContentGenerator { 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 generatePublicationsXml(final Element parent, - final Map> publications) { + private void createAvailablePublicationGroupXml(final Element parent, + final String name) { + final Element group = + parent.newChildElement("availablePublicationGroup"); + group.addAttribute("name", name); } - private void generatePublicationXml(final Element publicationsElem, - final Publication publication) { + private void generatePublicationsXml( + final Element parent, + final Map> publications, + final PageState state) { + final Element publicationsElem = parent.newChildElement("publications"); + + int numberOfPubs = 0; + 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, ""); } /** @@ -167,7 +258,7 @@ public class PersonalPublications implements ContentGenerator { for (String groupToken : groupTokens) { groupTokenSplit = groupToken.split(":"); if (groupTokenSplit.length != 2) { - logger.debug(String.format( + logger.warn(String.format( "Invalid entry in publication group config: '%s'. " + "Ignoring.", groupToken)); @@ -213,7 +304,7 @@ public class PersonalPublications implements ContentGenerator { } authors2 = publication2.getAuthors(); while (authors2.next()) { - author = authors1.getAuthor(); + author = authors2.getAuthor(); authors2Buffer.append(author.getSurname()); authors2Buffer.append(author.getGivenName()); } diff --git a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig.java b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig.java index 3de1a3f1e..f7435b1ac 100644 --- a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig.java +++ b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig.java @@ -1,6 +1,7 @@ package com.arsdigita.cms.publicpersonalprofile; import com.arsdigita.runtime.AbstractConfig; +import com.arsdigita.util.parameter.IntegerParameter; import com.arsdigita.util.parameter.Parameter; import com.arsdigita.util.parameter.StringParameter; @@ -16,6 +17,24 @@ public class PersonalPublicationsConfig extends AbstractConfig { * explanation. */ private final Parameter publicationGroups; + /** + * If a person has more ({@code >=}) publications then this number, only one + * group of publications will be shown. If a person has less publications, + * all groups are shown. + */ + private final Parameter groupSplit; + /** + * The group of publications to show if no group has been requested or the + * requested group is invalid. The values of this parameter + * must be a group defined in the {@code publicationGroups} + * parameter. Otherwise, the {@link PersonalPublications} generator may + * crashes! The parameter accepts a comma separated list of groups which + * will used in order. If a person has no publications of the first group, + * the {@link PersonalPublications} generator will try the next entry in + * this list, then the third etc. The predefined group {@code misc} can also + * be used here. + */ + private final Parameter defaultGroup; public PersonalPublicationsConfig() { publicationGroups = @@ -25,15 +44,35 @@ public class PersonalPublicationsConfig extends AbstractConfig { "monographs:com.arsdigita.cms.contenttypes.Monograph;" + "collectedVolumeArticles:com.arsdigita.cms.contenttypes.ArticleInCollectedVolume;" + "journalArticles:com.arsdigita.cms.contenttypes.ArticleInJournal;" - + "journalArticlesRef:com.arsdigita.cms.contenttypes.ArticleInJournal_ref" + + "journalArticlesRef:com.arsdigita.cms.contenttypes.ArticleInJournal_ref;" + "collectedVolumes:com.arsdigita.cms.contenttypes.CollectedVolume"); - + + groupSplit = new IntegerParameter( + "com.arsdigita.cms.publicpersonlprofile.publications.groupSplit", + Parameter.REQUIRED, + 32); + + defaultGroup = new StringParameter( + "com.arsdigita.cms.publicpersonalprofile.publications.defaultGroup", + Parameter.REQUIRED, + "monographs,journalArticlesRef,journalArticles,misc"); + register(publicationGroups); - + register(groupSplit); + register(defaultGroup); + loadInfo(); } - + public final String getPublictionGroups() { return (String) get(publicationGroups); } + + public final Integer getGroupSplit() { + return (Integer) get(groupSplit); + } + + public final String getDefaultGroup() { + return (String) get(defaultGroup); + } } diff --git a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameter.properties b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameter.properties new file mode 100644 index 000000000..4eb84afd0 --- /dev/null +++ b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameter.properties @@ -0,0 +1,14 @@ +com.arsdigita.cms.publicpersonalprofile.publications.groups.title = Groups of publications +com.arsdigita.cms.publicpersonalprofile.publications.groups.purpose = Groups the publications of a person by their Type and optional the Property "Referenced". See the JavaDoc of com.arsdigita.cms.publicpersonalprofile.PersonalPublications for a detailed explanation of the syntax of this parameter +com.arsdigita.cms.publicpersonalprofile.publications.groups.example = monographs:com.arsdigita.cms.contenttypes.Monograph;collectedVolumeArticles:com.arsdigita.cms.contenttypes.ArticleInCollectedVolume;journalArticles:com.arsdigita.cms.contenttypes.ArticleInJournal;journalArticlesRef:com.arsdigita.cms.contenttypes.ArticleInJournal_ref;collectedVolumes:com.arsdigita.cms.contenttypes.CollectedVolume +com.arsdigita.cms.publicpersonalprofile.publications.groups.format = [String] + +com.arsdigita.cms.publicpersonlprofile.publications.groupSplit.title = Group Split +com.arsdigita.cms.publicpersonlprofile.publications.groupSplit.purpose = If a person has more ({@code >=}) publications then this number, only one group of publications will be shown. If a person has less publications, all groups are shown. +com.arsdigita.cms.publicpersonlprofile.publications.groupSplit.example = 32 +com.arsdigita.cms.publicpersonlprofile.publications.groupSplit.format = [Integer] + +com.arsdigita.cms.publicpersonlprofile.publications.defaultGroup.title = Default Group +com.arsdigita.cms.publicpersonlprofile.publications.defaultGroup.purpose = Default group to show +com.arsdigita.cms.publicpersonlprofile.publications.defaultGroup.example = monographs,journalArticlesRef,journalArticles,misc +com.arsdigita.cms.publicpersonlprofile.publications.defaultGroup.format = [String] \ No newline at end of file diff --git a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameters.properties b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameters.properties deleted file mode 100644 index a7f4ac0be..000000000 --- a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublicationsConfig_parameters.properties +++ /dev/null @@ -1,4 +0,0 @@ -com.arsdigita.cms.publicpersonalprofile.publications.groups.title = Groups of publications -com.arsdigita.cms.publicpersonalprofile.publications.groups.purpose = Groups the publications of a person by their Type and optional the Property "Referenced". See the JavaDoc of com.arsdigita.cms.publicpersonalprofile.PersonalPublications for a detailed explanation of the syntax of this parameter -com.arsdigita.cms.publicpersonalprofile.publications.groups.example = monographs:com.arsdigita.cms.contenttypes.Monograph;collectedVolumeArticles:com.arsdigita.cms.contenttypes.ArticleInCollectedVolume;journalArticles:com.arsdigita.cms.contenttypes.ArticleInJournal;journalArticlesRef:com.arsdigita.cms.contenttypes.ArticleInJournal_ref;collectedVolumes:com.arsdigita.cms.contenttypes.CollectedVolume -com.arsdigita.cms.publicpersonalprofile.publications.groups.format = [String] \ No newline at end of file