From 84502c8ddaebb058c81ac82776c4d8065e6d2b40 Mon Sep 17 00:00:00 2001 From: jensp Date: Thu, 1 Nov 2018 19:18:21 +0000 Subject: [PATCH] Exporters for FileAttachments git-svn-id: https://svn.libreccm.org/ccm/trunk@5720 8810af33-2d31-482b-a856-94f89814c4df --- .../FileAttachmentInitializer.java | 52 ++-- .../librecms/assets/FileAssetsExporter.java | 44 ++++ .../assets/FileAttachmentListsExporter.java | 32 +++ .../assets/FileAttachmentsExporter.java | 122 +++++++++ .../src/com/arsdigita/cms/Initializer.java | 4 + .../AbstractAttachmentListsExporter.java | 235 ++++++++++++++++++ .../core/AbstractCcmObjectsExporter.java | 2 +- .../export/AbstractDomainObjectsExporter.java | 42 ++-- .../workflow/TaskDependenciesExporter.java | 6 +- 9 files changed, 504 insertions(+), 35 deletions(-) create mode 100644 ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAssetsExporter.java create mode 100644 ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentListsExporter.java create mode 100644 ccm-cms-assets-fileattachment/src/org/librecms/assets/FileAttachmentsExporter.java create mode 100644 ccm-cms/src/org/librecms/contentsection/AbstractAttachmentListsExporter.java 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,