diff --git a/ccm-cms-assets-fileattachment/src/com/arsdigita/cms/contentassets/FileAttachmentInitializer.java b/ccm-cms-assets-fileattachment/src/com/arsdigita/cms/contentassets/FileAttachmentInitializer.java
index 177721db9..86d9b2987 100755
--- a/ccm-cms-assets-fileattachment/src/com/arsdigita/cms/contentassets/FileAttachmentInitializer.java
+++ b/ccm-cms-assets-fileattachment/src/com/arsdigita/cms/contentassets/FileAttachmentInitializer.java
@@ -25,13 +25,20 @@ import com.arsdigita.search.MetadataProviderRegistry;
import com.arsdigita.util.StringUtils;
import com.arsdigita.xml.XML;
+import org.libreccm.export.ExportManager;
+import org.librecms.assets.FileAssetsExporter;
+import org.librecms.assets.FileAttachmentListsExporter;
+import org.librecms.assets.FileAttachmentsExporter;
+
/**
* Initializer
*
* @author Rafael H. Schloming <rhs@mit.edu>
* @version $Revision: 1.1 $ $Date: 2004/12/15 15:37:51 $
- * @version $Id: FileAttachmentInitializer.java 1262 2006-07-17 08:15:45Z cgyg9330 $
- **/
+ * @version $Id: FileAttachmentInitializer.java 1262 2006-07-17 08:15:45Z
+ * cgyg9330 $
+ *
+ */
public class FileAttachmentInitializer extends ContentAssetInitializer {
/**
@@ -44,9 +51,9 @@ public class FileAttachmentInitializer extends ContentAssetInitializer {
/**
* Initializes content asset by parsing traversal xml file and registering
* the specified steps in a transient storage which may be modified during
- * operation and has to be re-initialized each system startup).
- * Essential part of initializing the systems domain coupling machinery.
-
+ * operation and has to be re-initialized each system startup). Essential
+ * part of initializing the systems domain coupling machinery.
+ *
* @param evt
*/
@Override
@@ -75,24 +82,31 @@ public class FileAttachmentInitializer extends ContentAssetInitializer {
* chris.gilbert@westsussex.gov.uk
*/
MetadataProviderRegistry.registerAdapter(
- FileAttachment.BASE_DATA_OBJECT_TYPE,
- new FileAttachmentMetadataProvider());
-
+ FileAttachment.BASE_DATA_OBJECT_TYPE,
+ new FileAttachmentMetadataProvider());
+
XML.parseResource(
"/WEB-INF/traversal-adapters/com/arsdigita/cms/contentassets/"
- + "FileAttachment-search.xml",
+ + "FileAttachment-search.xml",
new TraversalHandler());
- final String traversal = getTraversalXML();
- if(!StringUtils.emptyString(traversal)) {
- XML.parseResource(traversal, new TraversalHandler());
- }
+ final String traversal = getTraversalXML();
+ if (!StringUtils.emptyString(traversal)) {
+ XML.parseResource(traversal, new TraversalHandler());
+ }
+
+ ExportManager.getInstance().registerExporter(new FileAssetsExporter());
+ ExportManager
+ .getInstance()
+ .registerExporter(new FileAttachmentListsExporter());
+ ExportManager
+ .getInstance()
+ .registerExporter(new FileAttachmentsExporter());
}
-
/**
- * The base type against which the asset is defined,
- * typically com.arsdigita.cms.ContentPage
+ * The base type against which the asset is defined, typically
+ * com.arsdigita.cms.ContentPage
*/
public String getBaseType() {
return ContentPage.BASE_DATA_OBJECT_TYPE;
@@ -104,12 +118,12 @@ public class FileAttachmentInitializer extends ContentAssetInitializer {
*/
public String getTraversalXML() {
return "/WEB-INF/traversal-adapters/com/arsdigita/"
- + "cms/contentassets/FileAttachment.xml";
+ + "cms/contentassets/FileAttachment.xml";
}
/**
- * The name of the association between the item
- * and the asset, eg 'fileAttachments'.
+ * The name of the association between the item and the asset, eg
+ * 'fileAttachments'.
*/
public String getProperty() {
return "fileAttachments";
diff --git a/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAssetsExporter.java b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAssetsExporter.java
new file mode 100644
index 000000000..4e45f664c
--- /dev/null
+++ b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAssetsExporter.java
@@ -0,0 +1,44 @@
+package org.librecms.assets;
+
+import com.arsdigita.cms.contentassets.FileAttachment;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import org.librecms.contentsection.AbstractBinaryAssetsExporter;
+
+import java.io.IOException;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class FileAssetsExporter
+ extends AbstractBinaryAssetsExporter {
+
+ @Override
+ protected void exportBinaryAssetProperties(
+ final FileAttachment asset,
+ final JsonGenerator jsonGenerator)
+ throws IOException {
+
+ // Nothing
+ }
+
+ @Override
+ public Class exportsType() {
+
+ return FileAttachment.class;
+ }
+
+ @Override
+ public String exportsBaseDataObjectType() {
+
+ return FileAttachment.BASE_DATA_OBJECT_TYPE;
+ }
+
+ @Override
+ public String convertsToType() {
+
+ return "org.librecms.assets.FileAsset";
+ }
+
+}
diff --git a/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentListsExporter.java b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentListsExporter.java
new file mode 100644
index 000000000..75a718056
--- /dev/null
+++ b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentListsExporter.java
@@ -0,0 +1,32 @@
+package org.librecms.assets;
+
+import com.arsdigita.cms.ContentItem;
+import com.arsdigita.cms.contentassets.FileAttachment;
+import com.arsdigita.persistence.DataCollection;
+
+import org.librecms.contentsection.AbstractAttachmentListsExporter;
+
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class FileAttachmentListsExporter
+ extends AbstractAttachmentListsExporter {
+
+ @Override
+ protected String getListName() {
+ return "files";
+ }
+
+ @Override
+ protected boolean hasList(final ContentItem item) {
+
+ final DataCollection attachments = FileAttachment.getAttachments(item);
+
+ final boolean result = attachments.next();
+ attachments.close();
+
+ return result;
+ }
+}
diff --git a/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentsExporter.java b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentsExporter.java
new file mode 100644
index 000000000..cbe4bbf0e
--- /dev/null
+++ b/ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentsExporter.java
@@ -0,0 +1,122 @@
+package org.librecms.assets;
+
+import com.arsdigita.cms.ContentItem;
+import com.arsdigita.cms.contentassets.FileAttachment;
+import com.arsdigita.persistence.DataCollection;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.util.UncheckedWrapperException;
+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 org.librecms.contentsection.AbstractAttachmentListsExporter;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class FileAttachmentsExporter
+ extends AbstractDomainObjectsExporter {
+
+ @Override
+ public Class exportsType() {
+ return ContentItem.class;
+ }
+
+ @Override
+ public String exportsBaseDataObjectType() {
+ return ContentItem.BASE_DATA_OBJECT_TYPE;
+ }
+
+ @Override
+ public String convertsToType() {
+ return "org.librecms.contentsection.ItemAttachment";
+ }
+
+ @Override
+ protected boolean includeSubTypes() {
+ return true;
+ }
+
+ @Override
+ protected List exportDomainObject(
+ final ContentItem item, final Path targetDir) {
+
+ final String listUuid = AbstractAttachmentListsExporter
+ .generateListUuid(item, "files");
+
+ final List attachmentUuids = new ArrayList<>();
+
+ final DataCollection fileAttachments = FileAttachment
+ .getAttachments(item);
+
+ long sortKey = 0;
+ while (fileAttachments.next()) {
+
+ sortKey++;
+ final String uuid = exportFileAttachment(fileAttachments
+ .getDataObject(),
+ listUuid,
+ sortKey,
+ targetDir);
+ attachmentUuids.add(uuid);
+ }
+
+ return attachmentUuids;
+ }
+
+ private String exportFileAttachment(final DataObject dataObj,
+ final String listUuid,
+ final long sortKey,
+ final Path targetDir) {
+
+ final FileAttachment fileAttachment = new FileAttachment(dataObj);
+ final String fileAssetUuid = generateUuid(fileAttachment);
+
+ final byte[] uuidSource = String.format(
+ "%s/files/%s",
+ WebConfig.getInstanceOf().getSiteName(),
+ fileAttachment.getOID().toString())
+ .getBytes(StandardCharsets.UTF_8);
+ final String uuid = UUID.nameUUIDFromBytes(uuidSource).toString();
+
+ final Path targetFilePath = generateTargetFilePath(targetDir, uuid);
+ final File targetFile = targetFilePath.toFile();
+
+ final JsonFactory jsonFactory = new JsonFactory();
+ try (JsonGenerator jsonGenerator = jsonFactory
+ .createGenerator(targetFile, JsonEncoding.UTF8)) {
+
+ jsonGenerator.writeStartObject();
+
+ jsonGenerator.writeNumberField("attachmentId",
+ IdSequence.getInstance().nextId());
+ jsonGenerator.writeStringField("uuid", uuid);
+
+ jsonGenerator.writeStringField("attachmentList", listUuid);
+ jsonGenerator.writeStringField("asset", fileAssetUuid);
+
+ jsonGenerator.writeNumberField("sortKey", sortKey);
+
+ jsonGenerator.writeEndObject();
+
+ return uuid;
+
+ } catch (IOException ex) {
+ throw new UncheckedWrapperException(ex);
+ }
+
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/Initializer.java b/ccm-cms/src/com/arsdigita/cms/Initializer.java
index 518a0999b..4ba63b0bc 100755
--- a/ccm-cms/src/com/arsdigita/cms/Initializer.java
+++ b/ccm-cms/src/com/arsdigita/cms/Initializer.java
@@ -85,6 +85,7 @@ import com.arsdigita.xml.XML;
import org.apache.log4j.Logger;
import org.libreccm.export.ExportManager;
+import org.librecms.contentsection.AbstractAttachmentListsExporter;
import org.librecms.workflow.CmsTasksExporter;
/**
@@ -250,6 +251,9 @@ public class Initializer extends CompoundInitializer {
}
ExportManager.getInstance().registerExporter(new CmsTasksExporter());
+// ExportManager
+// .getInstance()
+// .registerExporter(new AbstractAttachmentListsExporter());
s_log.debug("CMS.Initializer.init(DomainInitEvent) completed");
} // END init(DomainInitEvent e)
diff --git a/ccm-cms/src/org/librecms/contentsection/AbstractAttachmentListsExporter.java b/ccm-cms/src/org/librecms/contentsection/AbstractAttachmentListsExporter.java
new file mode 100644
index 000000000..2a1ca7f0e
--- /dev/null
+++ b/ccm-cms/src/org/librecms/contentsection/AbstractAttachmentListsExporter.java
@@ -0,0 +1,235 @@
+package org.librecms.contentsection;
+
+import com.arsdigita.cms.ContentItem;
+import com.arsdigita.util.UncheckedWrapperException;
+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.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public abstract class AbstractAttachmentListsExporter
+ extends AbstractDomainObjectsExporter {
+
+// public static String generateFileAttachmentsListUuid(
+// final ContentItem item) {
+//
+// return generateListUuid(item, "files");
+// }
+//
+// public static String generateImagesListUuid(
+// final ContentItem item) {
+//
+// return generateListUuid(item, "images");
+// }
+//
+// public static String generateLinksListUuid(
+// final ContentItem item) {
+//
+// return generateListUuid(item, "links");
+// }
+//
+// public static String generateSideNotesListUuid(
+// final ContentItem item) {
+//
+// return generateListUuid(item, "side-notes");
+// }
+
+ public final static String generateListUuid(final ContentItem item,
+ final String listName) {
+
+ final byte[] uuidSource = String.format(
+ "%s/%s-%s",
+ WebConfig.getInstanceOf().getSiteName(),
+ Objects.requireNonNull(item).getOID().toString(),
+ listName)
+ .getBytes(StandardCharsets.UTF_8);
+
+ return UUID.nameUUIDFromBytes(uuidSource).toString();
+ }
+
+ @Override
+ public Class exportsType() {
+ return ContentItem.class;
+ }
+
+ @Override
+ public String exportsBaseDataObjectType() {
+ return ContentItem.BASE_DATA_OBJECT_TYPE;
+ }
+
+ @Override
+ protected boolean includeSubTypes() {
+ return true;
+ }
+
+ @Override
+ public String convertsToType() {
+ return "org.librecms.contentsection.AttachmentList";
+ }
+
+ protected abstract String getListName();
+
+ protected abstract boolean hasList(ContentItem contentItem);
+
+ @Override
+ protected final List exportDomainObject(
+ final ContentItem contentItem, final Path targetDir) {
+
+ if (!hasList(contentItem)) {
+ return Collections.emptyList();
+ }
+
+ final String uuid = generateListUuid(contentItem, getListName());
+ final Path listTargetFilePath = generateTargetFilePath(targetDir, uuid);
+ final File listTargetFile = listTargetFilePath.toFile();
+
+ final JsonFactory jsonFactory = new JsonFactory();
+ try(JsonGenerator jsonGenerator = jsonFactory
+ .createGenerator(listTargetFile, JsonEncoding.UTF8)) {
+
+ jsonGenerator.writeStartObject();
+
+ jsonGenerator.writeNumberField("listId",
+ IdSequence.getInstance().nextId());
+ jsonGenerator.writeStringField("uuid", uuid);
+
+ jsonGenerator.writeStringField("contentItem", generateUuid(contentItem));
+
+ jsonGenerator.writeStringField("name", getListName());
+
+ jsonGenerator.writeNumberField("order", 1);
+
+ jsonGenerator.writeEndObject();
+
+ } catch(IOException ex) {
+ throw new UncheckedWrapperException(ex);
+ }
+
+ return Arrays.asList(new String[]{uuid});
+
+// final String fileAttachmentsListUuid = generateFileAttachmentsListUuid(
+// contentItem);
+// final String imagesListUuid = generateImagesListUuid(contentItem);
+// final String linksListUuid = generateLinksListUuid(contentItem);
+// final String sideNotesListUuid = generateSideNotesListUuid(contentItem);
+//
+// final Path filesListTargetFilePath = generateTargetFilePath(
+// targetDir, fileAttachmentsListUuid);
+// final Path imagesListTargetFilePath = generateTargetFilePath(
+// targetDir, imagesListUuid);
+// final Path linksListTargetFilePath = generateTargetFilePath(
+// targetDir, linksListUuid);
+// final Path sideNotesListTargetFilePath = generateTargetFilePath(
+// targetDir, sideNotesListUuid);
+//
+// final JsonFactory jsonFactory = new JsonFactory();
+//
+// final File filesListTargetFile = filesListTargetFilePath.toFile();
+// try (JsonGenerator jsonGenerator = jsonFactory
+// .createGenerator(filesListTargetFile, JsonEncoding.UTF8)) {
+//
+// writeAttachementsList(
+// fileAttachmentsListUuid,
+// "files",
+// 1,
+// jsonGenerator,
+// contentItem);
+//
+// } catch (IOException ex) {
+// throw new UncheckedWrapperException(ex);
+// }
+//
+// final File imagesListTargetFile = imagesListTargetFilePath.toFile();
+// try (JsonGenerator jsonGenerator = jsonFactory
+// .createGenerator(imagesListTargetFile, JsonEncoding.UTF8)) {
+//
+// writeAttachementsList(
+// imagesListUuid,
+// "images",
+// 1,
+// jsonGenerator,
+// contentItem);
+//
+// } catch (IOException ex) {
+// throw new UncheckedWrapperException(ex);
+// }
+//
+// final File linksListTargetFile = linksListTargetFilePath.toFile();
+// try (JsonGenerator jsonGenerator = jsonFactory
+// .createGenerator(linksListTargetFile, JsonEncoding.UTF8)) {
+//
+// writeAttachementsList(
+// linksListUuid,
+// "links",
+// 1,
+// jsonGenerator,
+// contentItem);
+//
+// } catch (IOException ex) {
+// throw new UncheckedWrapperException(ex);
+// }
+//
+// final File sideNotesListTargetFile = sideNotesListTargetFilePath
+// .toFile();
+// try (JsonGenerator jsonGenerator = jsonFactory
+// .createGenerator(sideNotesListTargetFile, JsonEncoding.UTF8)) {
+//
+// writeAttachementsList(
+// sideNotesListUuid,
+// "sideNotes",
+// 1,
+// jsonGenerator,
+// contentItem);
+//
+// } catch (IOException ex) {
+// throw new UncheckedWrapperException(ex);
+// }
+//
+// return Arrays.asList(new String[]{
+// fileAttachmentsListUuid,
+// imagesListUuid,
+// linksListUuid,
+// sideNotesListUuid
+// });
+ }
+
+// private void writeAttachementsList(final String listUuid,
+// final String name,
+// final long order,
+// final JsonGenerator jsonGenerator,
+// final ContentItem item)
+// throws IOException {
+//
+// jsonGenerator.writeStartObject();
+//
+// jsonGenerator.writeNumberField("listId",
+// IdSequence.getInstance().nextId());
+// jsonGenerator.writeStringField("uuid", listUuid);
+//
+// jsonGenerator.writeStringField("contentItem", generateUuid(item));
+//
+// jsonGenerator.writeStringField("name", name);
+//
+// jsonGenerator.writeNumberField("order", order);
+//
+// jsonGenerator.writeEndObject();
+// }
+
+}
diff --git a/ccm-core/src/org/libreccm/core/AbstractCcmObjectsExporter.java b/ccm-core/src/org/libreccm/core/AbstractCcmObjectsExporter.java
index a51967c7b..3ad255f15 100644
--- a/ccm-core/src/org/libreccm/core/AbstractCcmObjectsExporter.java
+++ b/ccm-core/src/org/libreccm/core/AbstractCcmObjectsExporter.java
@@ -49,7 +49,7 @@ public abstract class AbstractCcmObjectsExporter
final String uuid = generateUuid(domainObject);
final Path targetFilePath = generateTargetFilePath(
- targetDir, exportsType().getName(), uuid);
+ targetDir, convertsToType(), uuid);
final JsonFactory jsonFactory = new JsonFactory();
try (JsonGenerator jsonGenerator = jsonFactory
diff --git a/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java b/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java
index 5fa1d6732..162910ef8 100644
--- a/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java
+++ b/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java
@@ -45,6 +45,10 @@ public abstract class AbstractDomainObjectsExporter {
*/
public abstract String exportsBaseDataObjectType();
+ protected boolean includeSubTypes() {
+ return false;
+ }
+
/**
* Provides the fully qualified class name of the type to which the domain
* objects handled by the implementation are converted.
@@ -149,12 +153,12 @@ public abstract class AbstractDomainObjectsExporter {
final DataCollection dataCollection = session
.retrieve(exportsBaseDataObjectType());
- final List domainObjects = new ArrayList<>();
+// final List domainObjects = new ArrayList<>();
+ final List uuids = new ArrayList<>();
while (dataCollection.next()) {
- final DataObject dataObject = dataCollection.getDataObject();
- final DomainObject domainObject = DomainObjectFactory
- .newInstance(dataObject);
+ final DataObject dataObj = dataCollection.getDataObject();
+ final T domainObject = (T) DomainObjectFactory.newInstance(dataObj);
// if (!(exportsType().isAssignableFrom(domainObject.getClass()))) {
// throw new ExportException(String.format(
@@ -162,23 +166,33 @@ public abstract class AbstractDomainObjectsExporter {
// exportsType().getName(),
// domainObject.getClass().getName()));
// }
- if (!exportsType().equals(domainObject.getClass())) {
- // Is not exact type (sub class?). Skip.
- continue;
+ if (includeSubTypes()) {
+ if (!(exportsType().isAssignableFrom(domainObject.getClass()))) {
+ continue;
+ }
+ } else {
+ if (!exportsType().equals(domainObject.getClass())) {
+ // Is not exact type (sub class?). Skip.
+ continue;
+ }
}
- domainObjects.add((T) domainObject);
- }
-
- final List uuids = new ArrayList<>();
- for (final T domainObject : domainObjects) {
+// domainObjects.add((T) domainObject);
System.out.printf("Exporting domain object %s...%n",
domainObject.getOID().toString());
- final List createdUuids = exportDomainObject(domainObject,
- targetDir);
+ final List createdUuids = exportDomainObject(
+ domainObject,
+ targetDir);
uuids.addAll(createdUuids);
}
+// for (final T domainObject : domainObjects) {
+// System.out.printf("Exporting domain object %s...%n",
+// domainObject.getOID().toString());
+// final List createdUuids = exportDomainObject(domainObject,
+// targetDir);
+// uuids.addAll(createdUuids);
+// }
return uuids;
}
diff --git a/ccm-core/src/org/libreccm/workflow/TaskDependenciesExporter.java b/ccm-core/src/org/libreccm/workflow/TaskDependenciesExporter.java
index 8d4c4b7fe..4e2b91627 100644
--- a/ccm-core/src/org/libreccm/workflow/TaskDependenciesExporter.java
+++ b/ccm-core/src/org/libreccm/workflow/TaskDependenciesExporter.java
@@ -16,7 +16,6 @@ import java.io.IOException;
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;
@@ -41,6 +40,11 @@ public class TaskDependenciesExporter
public String convertsToType() {
return "org.libreccm.workflow.TaskDependency";
}
+
+ @Override
+ protected boolean includeSubTypes() {
+ return true;
+ }
@Override
protected List exportDomainObject(final Task domainObject,