diff --git a/ccm-ldn-terms/src/org/libreccm/categorization/DomainOwnershipsExporter.java b/ccm-ldn-terms/src/org/libreccm/categorization/DomainOwnershipsExporter.java
new file mode 100644
index 000000000..06b43e37b
--- /dev/null
+++ b/ccm-ldn-terms/src/org/libreccm/categorization/DomainOwnershipsExporter.java
@@ -0,0 +1,113 @@
+package org.libreccm.categorization;
+
+import com.arsdigita.domain.DomainCollection;
+import com.arsdigita.domain.DomainObject;
+import com.arsdigita.domain.DomainObjectFactory;
+import com.arsdigita.london.terms.Domain;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.web.WebConfig;
+
+import com.fasterxml.jackson.core.JsonEncoding;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import org.libreccm.export.AbstractDomainObjectsExporter;
+import org.libreccm.export.IdSequence;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class DomainOwnershipsExporter
+ extends AbstractDomainObjectsExporter {
+
+ @Override
+ public Class exportsType() {
+ return Domain.class;
+ }
+
+ @Override
+ public String exportsBaseDataObjectType() {
+ return Domain.BASE_DATA_OBJECT_TYPE;
+ }
+
+ @Override
+ public String convertsToType() {
+ return "org.libreccm.categorization.DomainOwnership";
+ }
+
+ @Override
+ protected List exportDomainObject(final Domain domainObject,
+ final Path targetDir) {
+
+ final DomainCollection useContexts = domainObject.getUseContexts();
+
+ final List uuids = new ArrayList<>();
+ while (useContexts.next()) {
+
+ final String uuid = generateDomainOwnership(useContexts
+ .getDomainObject(),
+ domainObject,
+ targetDir);
+ uuids.add(uuid);
+ }
+
+ return uuids;
+ }
+
+ private String generateDomainOwnership(final DomainObject useContext,
+ final Domain domain,
+ final Path targetDir) {
+
+ final DomainObject owner = DomainObjectFactory
+ .newInstance((DataObject) useContext.get("categoryOwner"));
+ final String context = (String) useContext.get("useContext");
+
+ final byte[] uuidSource = String.format(
+ "%s/%s-%s-%s",
+ WebConfig.getInstanceOf().getSiteName(),
+ owner.getOID().toString(),
+ useContext.getOID().toString(),
+ domain.getOID().toString())
+ .getBytes(StandardCharsets.UTF_8);
+ final String uuid = UUID.nameUUIDFromBytes(uuidSource).toString();
+ final Path targetFilePath = targetDir
+ .resolve("org.libreccm.categorization.Categorization")
+ .resolve(String.format("%s.json", uuid));
+ final File targetFile = targetFilePath.toFile();
+
+ final JsonFactory jsonFactory = new JsonFactory();
+ try (JsonGenerator jsonGenerator = jsonFactory
+ .createGenerator(targetFile, JsonEncoding.UTF8)) {
+
+ setPrettyPrinter(jsonGenerator);
+
+ jsonGenerator.writeStartObject();
+
+ jsonGenerator.writeNumberField("ownershipId",
+ IdSequence.getInstance().nextId());
+ jsonGenerator.writeStringField("uuid", uuid);
+
+ jsonGenerator.writeStringField("domain",
+ generateUuid(domain));
+ jsonGenerator.writeStringField("owner", generateUuid(owner));
+ jsonGenerator.writeStringField("context", context);
+
+ jsonGenerator.writeEndObject();
+ } catch(IOException ex) {
+ throw new UncheckedIOException(ex);
+ }
+
+ return uuid;
+ }
+
+}
diff --git a/ccm-ldn-terms/src/org/libreccm/categorization/DomainsExporter.java b/ccm-ldn-terms/src/org/libreccm/categorization/DomainsExporter.java
new file mode 100644
index 000000000..9cb1bba7c
--- /dev/null
+++ b/ccm-ldn-terms/src/org/libreccm/categorization/DomainsExporter.java
@@ -0,0 +1,89 @@
+package org.libreccm.categorization;
+
+import com.arsdigita.categorization.Category;
+import com.arsdigita.domain.DomainObjectFactory;
+import com.arsdigita.kernel.KernelConfig;
+import com.arsdigita.london.terms.Domain;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.util.UncheckedWrapperException;
+
+import com.fasterxml.jackson.core.JsonEncoding;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import org.libreccm.export.AbstractDomainObjectsExporter;
+import org.libreccm.export.IdSequence;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class DomainsExporter extends AbstractDomainObjectsExporter {
+
+ @Override
+ public Class exportsType() {
+ return Domain.class;
+ }
+
+ @Override
+ public String exportsBaseDataObjectType() {
+ return Domain.BASE_DATA_OBJECT_TYPE;
+ }
+
+ @Override
+ public String convertsToType() {
+ return "org.libreccm.categorization.Domain";
+ }
+
+ @Override
+ protected List exportDomainObject(final Domain domainObject,
+ final Path targetDir) {
+
+ final String uuid = generateUuid(domainObject);
+
+ final Path targetFilePath = targetDir
+ .resolve("org.libreccm.categorization.Categorization")
+ .resolve(String.format("%s.json", uuid));
+ final File targetFile = targetFilePath.toFile();
+
+ final JsonFactory jsonFactory = new JsonFactory();
+ try (JsonGenerator jsonGenerator = jsonFactory
+ .createGenerator(targetFile, JsonEncoding.UTF8)) {
+
+ setPrettyPrinter(jsonGenerator);
+
+ jsonGenerator.writeStartObject();
+
+ jsonGenerator.writeNumberField("objectId",
+ IdSequence.getInstance().nextId());
+ jsonGenerator.writeStringField("uuid", uuid);
+ jsonGenerator.writeStringField("domainKey", domainObject.getKey());
+ jsonGenerator.writeStringField("uri",
+ domainObject.getURL().toString());
+
+ jsonGenerator.writeObjectFieldStart("title");
+ jsonGenerator.writeStringField(
+ KernelConfig.getConfig().getDefaultLanguage(),
+ domainObject.getTitle());
+ jsonGenerator.writeEndObject();
+
+ final Category root = (Category) DomainObjectFactory
+ .newInstance((DataObject) domainObject.get("model"));
+ final String rootCategoryUuid = generateUuid(root);
+ jsonGenerator.writeStringField("rootCategory", rootCategoryUuid);
+
+ jsonGenerator.writeEndObject();
+
+ } catch (IOException ex) {
+ throw new UncheckedWrapperException(ex);
+ }
+
+ return Arrays.asList(new String[]{uuid});
+ }
+
+}
diff --git a/ccm-pages/pdl/org/libreccm/pagemodel/PageModel.pdl b/ccm-pages/pdl/org/libreccm/pagemodel/PageModel.pdl
index 88e2b217c..fd6fad87f 100644
--- a/ccm-pages/pdl/org/libreccm/pagemodel/PageModel.pdl
+++ b/ccm-pages/pdl/org/libreccm/pagemodel/PageModel.pdl
@@ -44,6 +44,9 @@ object type ContainerModel {
String[1..1] key = ccm_page_model_container_models.key VARCHAR(256);
+ PageModel[1..1] pageModel = join ccm_page_model_container_models.page_model_id
+ to ccm_page_models.page_model_id;
+
ComponentModel[0..n] componentModel = join ccm_page_model_container_models.container_model_id
to ccm_page_model_component_models.container_model_id;
diff --git a/ccm-pages/src/org/libreccm/pagemodel/CategorizedItemComponent.java b/ccm-pages/src/org/libreccm/pagemodel/CategorizedItemComponent.java
new file mode 100644
index 000000000..3cf6cfeaf
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/CategorizedItemComponent.java
@@ -0,0 +1,30 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class CategorizedItemComponent extends ContentItemComponent {
+
+ public static final String BASE_DATA_OBJECT_TYPE
+ = "org.libreccm.pagemodel.CategorizedItemComponent";
+
+ public CategorizedItemComponent(final DataObject dataObject) {
+
+ super(dataObject);
+ }
+
+ public CategorizedItemComponent(final OID oid) {
+ super(oid);
+ }
+
+ public CategorizedItemComponent(final BigDecimal componentModelId) {
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/CategoryTreeComponent.java b/ccm-pages/src/org/libreccm/pagemodel/CategoryTreeComponent.java
new file mode 100644
index 000000000..4cf86bcc9
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/CategoryTreeComponent.java
@@ -0,0 +1,43 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class CategoryTreeComponent extends ComponentModel {
+
+ public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.CategoryTreeComponent";
+
+ public static final String SHOW_FULL_TREE = "showFullTree";
+
+ public CategoryTreeComponent(final DataObject dataObject) {
+
+ super(dataObject);
+ }
+
+ public CategoryTreeComponent(final OID oid) {
+
+ super(oid);
+ }
+
+ public CategoryTreeComponent(final BigDecimal componentModelId) {
+
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+ public Boolean isShowFullTree() {
+
+ return (Boolean) get(SHOW_FULL_TREE);
+ }
+
+ public void setShowFullTree(final Boolean showFullTree) {
+
+ set(SHOW_FULL_TREE, showFullTree);
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/ComponentModel.java b/ccm-pages/src/org/libreccm/pagemodel/ComponentModel.java
new file mode 100644
index 000000000..655039e86
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/ComponentModel.java
@@ -0,0 +1,108 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.domain.DomainObject;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ComponentModel extends DomainObject {
+
+ public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ComponentModel";
+
+ public static final String COMPONENT_MODEL_ID = "componentModelId";
+
+ public static final String UUID = "uuid";
+
+ public static final String MODEL_UUID = "modelUuid";
+
+ public static final String ID_ATTRIBUTE = "idAttribute";
+
+ public static final String CLASS_ATTRIBUTE = "classAttribute";
+
+ public static final String STYLE_ATTRIBUTE = "styleAttribute";
+
+ public static final String KEY = "key";
+
+ public ComponentModel(final DataObject dataObject) {
+ super(dataObject);
+ }
+
+ public ComponentModel(final OID oid) {
+ super(oid);
+ }
+
+ public ComponentModel(final BigDecimal componentModelId) {
+
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+ public BigDecimal getComponentModelId() {
+ return (BigDecimal) get(COMPONENT_MODEL_ID);
+ }
+
+ protected void setComponentModelId(final BigDecimal componentModelId) {
+ set(COMPONENT_MODEL_ID, componentModelId);
+ }
+
+ public String getUuid() {
+ return (String) get(UUID);
+ }
+
+ protected void setUuid(final String uuid) {
+ set(UUID, uuid);
+ }
+
+ public String getModelUuid() {
+ return (String) get(MODEL_UUID);
+ }
+
+ protected void setModelUuid(final String modelUuid) {
+ set(MODEL_UUID, modelUuid);
+ }
+
+ public String getIdAttribute() {
+
+ return (String) get(ID_ATTRIBUTE);
+ }
+
+ public void setIdAttribute(final String idAttribute) {
+
+ set(ID_ATTRIBUTE, idAttribute);
+ }
+
+ public String getClassAttribute() {
+
+ return (String) get(CLASS_ATTRIBUTE);
+ }
+
+ public void setClassAttribute(final String classAttribute) {
+
+ set(CLASS_ATTRIBUTE, classAttribute);
+ }
+
+ public String getStyleAttribute(final String styleAttribute) {
+
+ return (String) get(STYLE_ATTRIBUTE);
+ }
+
+ public void setStyleAttribute(final String styleAttribute) {
+
+ set(STYLE_ATTRIBUTE, styleAttribute);
+ }
+
+ public String getKey() {
+
+ return (String) get(KEY);
+ }
+
+ public void setKey(final String key) {
+
+ set(KEY, key);
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/ComponentModelCollection.java b/ccm-pages/src/org/libreccm/pagemodel/ComponentModelCollection.java
new file mode 100644
index 000000000..e0747c861
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/ComponentModelCollection.java
@@ -0,0 +1,24 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.domain.DomainCollection;
+import com.arsdigita.domain.DomainObjectFactory;
+import com.arsdigita.persistence.DataCollection;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ComponentModelCollection extends DomainCollection {
+
+ public ComponentModelCollection(final DataCollection dataCollection) {
+
+ super(dataCollection);
+ }
+
+ public ComponentModel getComponentModel() {
+
+ return (ComponentModel) DomainObjectFactory
+ .newInstance(m_dataCollection.getDataObject());
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/ContainerModel.java b/ccm-pages/src/org/libreccm/pagemodel/ContainerModel.java
index 3cd4bb261..d5b90c3ad 100644
--- a/ccm-pages/src/org/libreccm/pagemodel/ContainerModel.java
+++ b/ccm-pages/src/org/libreccm/pagemodel/ContainerModel.java
@@ -6,6 +6,7 @@
package org.libreccm.pagemodel;
import com.arsdigita.domain.DomainObject;
+import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
@@ -19,6 +20,18 @@ public class ContainerModel extends DomainObject {
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ContainerModel";
+ public static final String CONTAINER_ID = "containerId";
+
+ public static final String UUID = "uuid";
+
+ public static final String CONTAINER_UUID = "containerUuid";
+
+ public static final String KEY = "key";
+
+ public static final String PAGE_MODEL = "pageModel";
+
+ public static final String COMPONENT_MODEL = "componentModel";
+
public ContainerModel(final DataObject dataObject) {
super(dataObject);
}
@@ -31,6 +44,70 @@ public class ContainerModel extends DomainObject {
this(new OID(BASE_DATA_OBJECT_TYPE, containerModelId));
}
+ public BigDecimal getContainerModelId() {
+ return (BigDecimal) get(CONTAINER_ID);
+ }
+ protected void setContainerModelId(final BigDecimal containerModelId) {
+
+ set(CONTAINER_ID, containerModelId);
+ }
+
+ public String getUuid() {
+ return (String) get(UUID);
+ }
+
+ protected void setUuid(final String uuid) {
+
+ set(UUID, uuid);
+ }
+
+ public String getContainerUuid() {
+
+ return (String) get(CONTAINER_UUID);
+ }
+
+ protected void setContainerUuid(final String containerUuid) {
+
+ set(CONTAINER_UUID, containerUuid);
+ }
+
+ public String getKey() {
+
+ return (String) get(KEY);
+ }
+
+ public void setKey(final String key) {
+
+ set(KEY, key);
+ }
+
+ public PageModel getPageModel() {
+
+ return (PageModel) get(PAGE_MODEL);
+ }
+
+ protected void setPageModel(final PageModel pageModel) {
+
+ setAssociation(PAGE_MODEL, pageModel);
+ }
+
+ public ComponentModelCollection getComponents() {
+
+ final DataCollection dataCollection = (DataCollection) get(
+ COMPONENT_MODEL);
+
+ return new ComponentModelCollection(dataCollection);
+ }
+
+ protected void addComponent(final ComponentModel component) {
+
+ add(COMPONENT_MODEL, component);
+ }
+
+ protected void removeComponent(final ComponentModel component) {
+
+ remove(COMPONENT_MODEL, component);
+ }
}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/ContentItemComponent.java b/ccm-pages/src/org/libreccm/pagemodel/ContentItemComponent.java
new file mode 100644
index 000000000..974a09080
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/ContentItemComponent.java
@@ -0,0 +1,43 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ContentItemComponent extends ComponentModel {
+
+ public static final String BASE_DATA_OBJECT_TYPE
+ = "org.libreccm.pagemodel.ContentItemComponent";
+
+ public static final String MODE = "mode";
+
+ public ContentItemComponent(final DataObject dataObject) {
+
+ super(dataObject);
+ }
+
+ public ContentItemComponent(final OID oid) {
+
+ super(oid);
+ }
+
+ public ContentItemComponent(final BigDecimal componentModelId) {
+
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+ public String getMode() {
+ return (String) get(MODE);
+ }
+
+ public void setMode(final String mode) {
+
+ set(MODE, mode);
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/GreetingItemComponent.java b/ccm-pages/src/org/libreccm/pagemodel/GreetingItemComponent.java
new file mode 100644
index 000000000..b250417a9
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/GreetingItemComponent.java
@@ -0,0 +1,30 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class GreetingItemComponent extends ContentItemComponent {
+
+ public static final String BASE_DATA_OBJECT_TYPE
+ = "org.libreccm.pagemodel.GreetingItemComponent";
+
+ public GreetingItemComponent(final DataObject dataObject) {
+
+ super(dataObject);
+ }
+
+ public GreetingItemComponent(final OID oid) {
+ super(oid);
+ }
+
+ public GreetingItemComponent(final BigDecimal componentModelId) {
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+}
diff --git a/ccm-pages/src/org/libreccm/pagemodel/ItemListComponent.java b/ccm-pages/src/org/libreccm/pagemodel/ItemListComponent.java
new file mode 100644
index 000000000..a5b9e235e
--- /dev/null
+++ b/ccm-pages/src/org/libreccm/pagemodel/ItemListComponent.java
@@ -0,0 +1,76 @@
+package org.libreccm.pagemodel;
+
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ItemListComponent extends ComponentModel {
+
+ public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ItemListComponent";
+
+ public static final String DESCENDING = "descending";
+
+ public static final String LIMIT_TO_TYPE = "limitToType";
+
+ public static final String PAGE_SIZE = "pageSize";
+
+ public static final String PROPERTIES = "properties";
+
+ public ItemListComponent(final DataObject dataObject) {
+ super(dataObject);
+ }
+
+ public ItemListComponent(final OID oid) {
+ super(oid);
+ }
+
+ public ItemListComponent(final BigDecimal componentModelId) {
+
+ this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
+ }
+
+ public Boolean isDescending() {
+
+ return (Boolean) get(DESCENDING);
+ }
+
+ public void setDescending(final Boolean descending) {
+
+ set(DESCENDING, descending);
+ }
+
+ public String getLimitToType() {
+
+ return (String) get(LIMIT_TO_TYPE);
+ }
+
+ public void setLimitToType(final String limitToType) {
+
+ set(LIMIT_TO_TYPE, limitToType);
+ }
+
+ public Integer getPageSize() {
+
+ return (Integer)get(PAGE_SIZE);
+ }
+
+ public void setPageSize(final Integer pageSize) {
+
+ set(PAGE_SIZE, pageSize);
+ }
+
+ public String getProperties() {
+
+ return (String) get(PROPERTIES);
+ }
+
+ public void setProperties(final String properties) {
+
+ set(PROPERTIES, properties);
+ }
+}