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();