diff --git a/ccm-sci-personalprojects/application.xml b/ccm-sci-personalprojects/application.xml new file mode 100644 index 000000000..85c026628 --- /dev/null +++ b/ccm-sci-personalprojects/application.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + Content generator creating a list of the projects a person is involved into. + + diff --git a/ccm-sci-personalprojects/src/ccm-sci-personalprojects.config b/ccm-sci-personalprojects/src/ccm-sci-personalprojects.config new file mode 100644 index 000000000..ac12feaf3 --- /dev/null +++ b/ccm-sci-personalprojects/src/ccm-sci-personalprojects.config @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/ccm-sci-personalprojects/src/ccm-sci-personalprojects.load b/ccm-sci-personalprojects/src/ccm-sci-personalprojects.load new file mode 100644 index 000000000..10420950d --- /dev/null +++ b/ccm-sci-personalprojects/src/ccm-sci-personalprojects.load @@ -0,0 +1,18 @@ + + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java new file mode 100644 index 000000000..4866ea0d3 --- /dev/null +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjects.java @@ -0,0 +1,224 @@ +package com.arsdigita.cms.publicpersonalprofile; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.cms.contenttypes.GenericPerson; +import com.arsdigita.cms.contenttypes.SciProject; +import com.arsdigita.domain.DomainObject; +import com.arsdigita.domain.DomainObjectFactory; +import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataObject; +import com.arsdigita.xml.Element; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter (jensp) + * @version $Id$ + */ +public class PersonalProjects implements ContentGenerator { + + private final static String CURRENT_PROJECTS = "currentProjects"; + private final static String FINISHED_PROJECTS = "finishedProjects"; + private final static PersonalProjectsConfig config = + new PersonalProjectsConfig(); + private final static Logger logger = + Logger.getLogger(PersonalProjects.class); + + static { + config.load(); + } + + public void generateContent(final Element parent, + final GenericPerson person, + final PageState state) { + final List projects = collectProjects(person); + + + if ((projects == null) || projects.size() == 0) { + final Element projectsElem = parent.newChildElement("projects"); + projectsElem.newChildElement("noProjects"); + + return; + } else { + final List currentProjects = new ArrayList(); + final List finishedProjects = + new ArrayList(); + + processProjects(projects, currentProjects, finishedProjects); + generateGroupsXml(parent, currentProjects, finishedProjects); + generateProjectsXml(parent, + currentProjects, + finishedProjects, + state); + } + } + + private List collectProjects(final GenericPerson person) { + final List projects = new ArrayList(); + + final DataCollection collection = (DataCollection) person.get( + "organizationalunit"); + DomainObject obj; + while (collection.next()) { + obj = DomainObjectFactory.newInstance(collection.getDataObject()); + if (obj instanceof SciProject) { + projects.add((SciProject) obj); + } + } + + if (person.getAlias() != null) { + collectProjects(person.getAlias(), projects); + + } + + + return projects; + } + + private void collectProjects(final GenericPerson alias, + final List projects) { + final DataCollection collection = (DataCollection) alias.get( + "organizationalunit"); + DomainObject obj; + while (collection.next()) { + obj = DomainObjectFactory.newInstance(collection.getDataObject()); + if (obj instanceof SciProject) { + projects.add((SciProject) obj); + } + } + + if (alias.getAlias() != null) { + collectProjects(alias.getAlias(), projects); + + } + } + + private void processProjects(final List projects, + final List currentProjects, + final List finishedProjects) { + final Calendar today = new GregorianCalendar(); + final Date todayDate = today.getTime(); + for(SciProject project : projects) { + if (project.getEnd().before(todayDate)) { + finishedProjects.add(project); + } else { + currentProjects.add(project); + } + } + + final ProjectComparator comparator = new ProjectComparator(); + Collections.sort(currentProjects, comparator); + Collections.sort(finishedProjects, comparator); + } + + private void generateGroupsXml(final Element parent, + final List currentProjects, + final List finishedProjects) { + final Element availableGroups = parent.newChildElement( + "availableProjectGroups"); + + if (currentProjects.size() > 0) { + createAvailableProjectGroupXml(availableGroups, CURRENT_PROJECTS); + } + + if (finishedProjects.size() > 0) { + createAvailableProjectGroupXml(availableGroups, FINISHED_PROJECTS); + } + } + + private void createAvailableProjectGroupXml(final Element parent, + final String name) { + final Element group = parent.newChildElement("availableProjectGroup"); + group.addAttribute("name", name); + } + + private void generateProjectsXml(final Element parent, + final List currentProjects, + final List finishedProjects, + final PageState state) { + final Element projectsElem = parent.newChildElement("projects"); + + final int numberOfProjects = currentProjects.size() + + finishedProjects.size(); + final int groupSplit = config.getGroupSplit(); + + if (numberOfProjects < groupSplit) { + projectsElem.addAttribute("all", "all"); + + generateProjectsGroupXml(projectsElem, + CURRENT_PROJECTS, + currentProjects, + state); + generateProjectsGroupXml(projectsElem, + FINISHED_PROJECTS, + finishedProjects, + state); + } else { + final HttpServletRequest request = state.getRequest(); + + String groupToShow = request.getParameter("group"); + if (groupToShow == null) { + groupToShow = CURRENT_PROJECTS; + } + + if (currentProjects.isEmpty() + && CURRENT_PROJECTS.equals(groupToShow)) { + groupToShow = FINISHED_PROJECTS; + } + + if (CURRENT_PROJECTS.equals(groupToShow)) { + generateProjectsGroupXml(projectsElem, + CURRENT_PROJECTS, + currentProjects, + state); + } else if (FINISHED_PROJECTS.equals(groupToShow)) { + generateProjectsGroupXml(projectsElem, + FINISHED_PROJECTS, + finishedProjects, + state); + } + } + + } + + private void generateProjectsGroupXml(final Element projectsElem, + final String groupName, + final List projects, + final PageState state) { + if (projects == null) { + return; + } + + final Element groupElem = projectsElem.newChildElement("projectGroup"); + groupElem.addAttribute("name", groupName); + + for (SciProject project : projects) { + generateProjectXml(groupElem, project, state); + } + } + + private void generateProjectXml(final Element projectGroupElem, + final SciProject project, + final PageState state) { + final PublicPersonalProfileXmlGenerator generator = + new PublicPersonalProfileXmlGenerator( + project); + generator.generateXML(state, projectGroupElem, ""); + } + + private class ProjectComparator implements Comparator { + + public int compare(final SciProject project1, + final SciProject project2) { + return project1.getTitle().compareTo(project2.getTitle()); + } + } +} diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig.java b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig.java new file mode 100644 index 000000000..b7cffe246 --- /dev/null +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig.java @@ -0,0 +1,32 @@ + +package com.arsdigita.cms.publicpersonalprofile; + +import com.arsdigita.runtime.AbstractConfig; +import com.arsdigita.util.parameter.IntegerParameter; +import com.arsdigita.util.parameter.Parameter; + +/** + * + * @author Jens Pelzetter (jensp) + * @version $Id$ + */ +public class PersonalProjectsConfig extends AbstractConfig { + + private final Parameter groupSplit; + + public PersonalProjectsConfig() { + groupSplit = new IntegerParameter( + "com.arsdigita.cms.publicpersonalprofile.projects.groupSplit", + Parameter.REQUIRED, + 16); + + register(groupSplit); + + loadInfo(); + } + + public final Integer getGroupSplit() { + return (Integer) get(groupSplit); + } + +} diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig_parameter.properties b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig_parameter.properties new file mode 100644 index 000000000..9cf13e353 --- /dev/null +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsConfig_parameter.properties @@ -0,0 +1,5 @@ +com.arsdigita.cms.publicpersonalprofile.projects.groupSplit.title = Group Split +com.arsdigita.cms.publicpersonalprofile.projects.groupSplit.purpose = If a person has more projects (>=) then this value, only the current or the finished projects are shown. Otherwise all projects are shown. +com.arsdigita.cms.publicpersonalprofile.projects.groupSplit.example = 16 +com.arsdigita.cms.publicpersonalprofile.projects.groupSplit.format = [Integer] + diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsInitializer.java b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsInitializer.java new file mode 100644 index 000000000..40ae58c0e --- /dev/null +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsInitializer.java @@ -0,0 +1,32 @@ +package com.arsdigita.cms.publicpersonalprofile; + +import com.arsdigita.db.DbHelper; +import com.arsdigita.persistence.pdl.ManifestSource; +import com.arsdigita.persistence.pdl.NameFilter; +import com.arsdigita.runtime.CompoundInitializer; +import com.arsdigita.runtime.DomainInitEvent; +import com.arsdigita.runtime.PDLInitializer; +import com.arsdigita.runtime.RuntimeConfig; + +/** + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class PersonalProjectsInitializer extends CompoundInitializer { + + public PersonalProjectsInitializer() { + + final String jdbcUrl = RuntimeConfig.getConfig().getJDBCURL(); + final int database = DbHelper.getDatabaseFromURL(jdbcUrl); + + add(new PDLInitializer(new ManifestSource("empty.pdl.mf", + new NameFilter(DbHelper.getDatabaseSuffix(database), "pdl")))); + } + + @Override + public void init(final DomainInitEvent event) { + super.init(event); + } + +} diff --git a/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsLoader.java b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsLoader.java new file mode 100644 index 000000000..f5a5e6b79 --- /dev/null +++ b/ccm-sci-personalprojects/src/com/arsdigita/cms/publicpersonalprofile/PersonalProjectsLoader.java @@ -0,0 +1,18 @@ +package com.arsdigita.cms.publicpersonalprofile; + +import com.arsdigita.loader.PackageLoader; +import com.arsdigita.runtime.ScriptContext; + +/** + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class PersonalProjectsLoader extends PackageLoader { + + @Override + public void run(final ScriptContext ctx) { + //Nothing to do. + } + +} diff --git a/ccm-sci-personalprojects/src/empty.pdl.mf b/ccm-sci-personalprojects/src/empty.pdl.mf new file mode 100644 index 000000000..e69de29bb 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 7089a9f01..15c36651c 100644 --- a/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java +++ b/ccm-sci-personalpublications/src/com/arsdigita/cms/publicpersonalprofile/PersonalPublications.java @@ -42,8 +42,8 @@ public class PersonalPublications implements ContentGenerator { public void generateContent(final Element parent, final GenericPerson person, final PageState state) { - DataCollection publications = (DataCollection) person.get("publication"); - + final List publications = collectPublications(person); + if ((publications == null) || publications.size() == 0) { final Element publicationsElem = parent.newChildElement( "publications"); @@ -59,6 +59,34 @@ public class PersonalPublications implements ContentGenerator { generatePublicationsXml(parent, groupedPublications, state); } } + + private List collectPublications(final GenericPerson person) { + 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); + } + + 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. @@ -69,7 +97,7 @@ public class PersonalPublications implements ContentGenerator { * as value. */ private Map> processPublications( - final DataCollection publications) { + final List publications) { final GroupConfig groupConfig = new GroupConfig(config. getPublictionGroups()); @@ -80,15 +108,13 @@ public class PersonalPublications implements ContentGenerator { initalizePubGroupMap(pubGroups, group); } initalizePubGroupMap(pubGroups, MISC); - - DataObject dobj; + Publication publication; String type; String groupName; Boolean reviewed; List group; - while (publications.next()) { - dobj = publications.getDataObject(); + for(DataObject dobj : publications) { publication = (Publication) DomainObjectFactory.newInstance(dobj); type = publication.getClass().getName(); @@ -160,7 +186,7 @@ public class PersonalPublications implements ContentGenerator { final Element publicationsElem = parent.newChildElement("publications"); int numberOfPubs = 0; - int groupSplit = config.getGroupSplit(); + final int groupSplit = config.getGroupSplit(); for (List list : publications.values()) { numberOfPubs += list.size();