Exporters for Images, some bug fixes

git-svn-id: https://svn.libreccm.org/ccm/trunk@5727 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2018-11-06 19:13:51 +00:00
parent a212bb7b37
commit 1594b79ce9
5 changed files with 362 additions and 130 deletions

View File

@ -29,15 +29,20 @@ import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.DataObject;
import com.arsdigita.runtime.DomainInitEvent; import com.arsdigita.runtime.DomainInitEvent;
import org.libreccm.export.ExportManager;
import org.librecms.assets.ImageAttachmentsExporter;
/** /**
* Initializes the imagestep content item asset. * Initializes the imagestep content item asset.
* *
* @version $Id: ItemImageAttachmentInitializer.java 287 2005-02-22 00:29:02Z sskracic $ * @version $Id: ItemImageAttachmentInitializer.java 287 2005-02-22 00:29:02Z
* sskracic $
*/ */
public class ItemImageAttachmentInitializer extends ContentAssetInitializer { public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
/** /**
* Constructor, sets its specific manifest file and delegates to super class. * Constructor, sets its specific manifest file and delegates to super
* class.
*/ */
public ItemImageAttachmentInitializer() { public ItemImageAttachmentInitializer() {
super("ccm-cms-assets-imagestep.pdl.mf"); super("ccm-cms-assets-imagestep.pdl.mf");
@ -55,6 +60,7 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
DomainObjectFactory.registerInstantiator( DomainObjectFactory.registerInstantiator(
ItemImageAttachment.BASE_DATA_OBJECT_TYPE, ItemImageAttachment.BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() { new DomainObjectInstantiator() {
@Override @Override
protected DomainObject doNewInstance(DataObject obj) { protected DomainObject doNewInstance(DataObject obj) {
return new ItemImageAttachment(obj); return new ItemImageAttachment(obj);
@ -70,11 +76,15 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
//register checker in ReusableImage //register checker in ReusableImage
ReusableImageAsset.registerImageInUseChecker(new ImageInUseCheck()); ReusableImageAsset.registerImageInUseChecker(new ImageInUseCheck());
ExportManager
.getInstance()
.registerExporter(new ImageAttachmentsExporter());
} }
/** /**
* The base type against which the asset is defined, * The base type against which the asset is defined, typically
* typically com.arsdigita.cms.ContentPage * com.arsdigita.cms.ContentPage
*/ */
@Override @Override
public String getBaseType() { public String getBaseType() {
@ -87,13 +97,13 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
*/ */
@Override @Override
public String getTraversalXML() { public String getTraversalXML() {
return "/WEB-INF/traversal-adapters/com/arsdigita/" + return "/WEB-INF/traversal-adapters/com/arsdigita/"
"cms/contentassets/ItemImageAttachment.xml"; + "cms/contentassets/ItemImageAttachment.xml";
} }
/** /**
* The name of the association between the item * The name of the association between the item and the asset, eg
* and the asset, eg 'fileAttachments'. * 'fileAttachments'.
*/ */
@Override @Override
public String getProperty() { public String getProperty() {
@ -113,7 +123,8 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
*/ */
@Override @Override
public GlobalizedMessage getAuthoringStepLabel() { public GlobalizedMessage getAuthoringStepLabel() {
return new GlobalizedMessage("com.arsdigita.cms.contentassets.image_step_label", return new GlobalizedMessage(
"com.arsdigita.cms.contentassets.image_step_label",
"com.arsdigita.cms.contentassets.ImageStepResources"); "com.arsdigita.cms.contentassets.ImageStepResources");
} }
@ -122,7 +133,8 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
*/ */
@Override @Override
public GlobalizedMessage getAuthoringStepDescription() { public GlobalizedMessage getAuthoringStepDescription() {
return new GlobalizedMessage("com.arsdigita.cms.contentassets.image_step_description", return new GlobalizedMessage(
"com.arsdigita.cms.contentassets.image_step_description",
"com.arsdigita.cms.contentassets.ImageStepResources"); "com.arsdigita.cms.contentassets.ImageStepResources");
} }

View File

@ -0,0 +1,129 @@
package org.librecms.assets;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ReusableImageAsset;
import com.arsdigita.cms.contentassets.ItemImageAttachment;
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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ImageAttachmentsExporter
extends AbstractDomainObjectsExporter<ContentItem> {
@Override
public Class<ContentItem> 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<String> exportDomainObject(
final ContentItem item, final Path targetDir) {
final String listUuid = AbstractAttachmentListsExporter
.generateListUuid(item, "images");
final List<String> attachmentsUuids = new ArrayList<>();
final DataCollection imageAttachments = ItemImageAttachment
.getImageAttachments(item);
long sortKey = 0;
while (imageAttachments.next()) {
sortKey++;
final String uuid = exportImageAttachment(imageAttachments
.getDataObject(),
listUuid,
sortKey,
targetDir);
attachmentsUuids.add(uuid);
}
return attachmentsUuids;
}
private String exportImageAttachment(final DataObject dataObj,
final String listUuid,
final long sortKey,
final Path targetDir) {
final ItemImageAttachment imageAttachment = new ItemImageAttachment(
dataObj);
final ReusableImageAsset imageAsset = imageAttachment.getImage();
final String imageAssetUuid = generateUuid(imageAsset);
final byte[] uuidSource = String.format(
"%s/images/%s",
WebConfig.getInstanceOf().getSiteName(),
imageAttachment.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", imageAssetUuid);
jsonGenerator.writeNumberField("sortKey", sortKey);
jsonGenerator.writeEndObject();
} catch (IOException ex) {
throw new UncheckedWrapperException(ex);
}
return uuid;
}
}

View File

@ -85,7 +85,14 @@ import com.arsdigita.xml.XML;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.libreccm.export.ExportManager; import org.libreccm.export.ExportManager;
import org.librecms.contentsection.AbstractAttachmentListsExporter; import org.librecms.assets.ImagesExporter;
import org.librecms.contentsection.ContentSectionsExporter;
import org.librecms.contentsection.ContentTypesExporter;
import org.librecms.contentsection.FoldersExporter;
import org.librecms.lifecycle.LifecycleDefinitionsExporter;
import org.librecms.lifecycle.LifecyclesExporter;
import org.librecms.lifecycle.PhaseDefinitionsExporter;
import org.librecms.lifecycle.PhasesExporter;
import org.librecms.workflow.CmsTasksExporter; import org.librecms.workflow.CmsTasksExporter;
/** /**
@ -97,9 +104,13 @@ import org.librecms.workflow.CmsTasksExporter;
*/ */
public class Initializer extends CompoundInitializer { public class Initializer extends CompoundInitializer {
/** Creates a s_logging category with name = to the full name of class */ /**
* Creates a s_logging category with name = to the full name of class
*/
private static Logger s_log = Logger.getLogger(Initializer.class); private static Logger s_log = Logger.getLogger(Initializer.class);
/** Configuration object for the CMS module */ /**
* Configuration object for the CMS module
*/
private static final CMSConfig s_conf = CMSConfig.getInstanceOf(); private static final CMSConfig s_conf = CMSConfig.getInstanceOf();
/** /**
@ -114,7 +125,8 @@ public class Initializer extends CompoundInitializer {
add(new PDLInitializer(new ManifestSource("ccm-cms.pdl.mf", add(new PDLInitializer(new ManifestSource("ccm-cms.pdl.mf",
new NameFilter(DbHelper new NameFilter(DbHelper
.getDatabaseSuffix(database), .getDatabaseSuffix(
database),
"pdl")))); "pdl"))));
add(new com.arsdigita.cms.contentsection.Initializer()); add(new com.arsdigita.cms.contentsection.Initializer());
@ -126,8 +138,8 @@ public class Initializer extends CompoundInitializer {
} }
/** /**
* Initializes domain-coupling machinery, usually consisting of * Initializes domain-coupling machinery, usually consisting of registering
* registering object instantiators and observers. * object instantiators and observers.
*/ */
@Override @Override
public void init(DomainInitEvent e) { public void init(DomainInitEvent e) {
@ -137,8 +149,10 @@ public class Initializer extends CompoundInitializer {
/* Register object instantiator for ContentCenter (Content Center) */ /* Register object instantiator for ContentCenter (Content Center) */
e.getFactory().registerInstantiator(ContentCenter.BASE_DATA_OBJECT_TYPE, e.getFactory().registerInstantiator(ContentCenter.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
@Override @Override
public DomainObject doNewInstance(DataObject dobj) { public DomainObject doNewInstance(
DataObject dobj) {
return new ContentCenter(dobj); return new ContentCenter(dobj);
} }
@ -150,8 +164,10 @@ public class Initializer extends CompoundInitializer {
/* Register object instantiator for CMS Service */ /* Register object instantiator for CMS Service */
e.getFactory().registerInstantiator(Service.BASE_DATA_OBJECT_TYPE, e.getFactory().registerInstantiator(Service.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
@Override @Override
public DomainObject doNewInstance(DataObject dobj) { public DomainObject doNewInstance(
DataObject dobj) {
return new Service(dobj); return new Service(dobj);
} }
@ -169,6 +185,7 @@ public class Initializer extends CompoundInitializer {
URLService.registerFinder( URLService.registerFinder(
Link.BASE_DATA_OBJECT_TYPE, Link.BASE_DATA_OBJECT_TYPE,
new URLFinder() { new URLFinder() {
public String find(OID oid, String context) public String find(OID oid, String context)
throws NoValidURLException { throws NoValidURLException {
@ -182,7 +199,8 @@ public class Initializer extends CompoundInitializer {
try { try {
link = (Link) DomainObjectFactory.newInstance(oid); link = (Link) DomainObjectFactory.newInstance(oid);
} catch (DataObjectNotFoundException ex) { } catch (DataObjectNotFoundException ex) {
throw new NoValidURLException("Cannot find an object with oid: " + oid); throw new NoValidURLException(
"Cannot find an object with oid: " + oid);
} }
if (Link.EXTERNAL_LINK.equals(link.getTargetType())) { if (Link.EXTERNAL_LINK.equals(link.getTargetType())) {
@ -224,12 +242,15 @@ public class Initializer extends CompoundInitializer {
// Just set the class implementing methods run when for publishing // Just set the class implementing methods run when for publishing
// or unpublishing to file. No initialisation of the class here. // or unpublishing to file. No initialisation of the class here.
try { try {
QueueManager.setListener((PublishToFileListener) ContentSection.getConfig() QueueManager.setListener((PublishToFileListener) ContentSection
.getConfig()
.getPublishToFileClass().newInstance()); .getPublishToFileClass().newInstance());
} catch (InstantiationException ex) { } catch (InstantiationException ex) {
throw new UncheckedWrapperException("Failed to instantiate the listener class", ex); throw new UncheckedWrapperException(
"Failed to instantiate the listener class", ex);
} catch (IllegalAccessException ex) { } catch (IllegalAccessException ex) {
throw new UncheckedWrapperException("Couldn't access the listener class", ex); throw new UncheckedWrapperException(
"Couldn't access the listener class", ex);
} }
MetadataProviderRegistry.registerAdapter( MetadataProviderRegistry.registerAdapter(
@ -245,16 +266,26 @@ public class Initializer extends CompoundInitializer {
AuthoringKitWizard.registerAssetStep( AuthoringKitWizard.registerAssetStep(
GenericPerson.BASE_DATA_OBJECT_TYPE, GenericPerson.BASE_DATA_OBJECT_TYPE,
GenericPersonOrgaUnitsStep.class, GenericPersonOrgaUnitsStep.class,
ContenttypesGlobalizationUtil.globalize("person.authoring.orgas.title"), ContenttypesGlobalizationUtil.globalize(
ContenttypesGlobalizationUtil.globalize("person.authoring.orgas.title"), "person.authoring.orgas.title"),
ContenttypesGlobalizationUtil.globalize(
"person.authoring.orgas.title"),
s_conf.getPersonOrgaUnitsStepSortKey()); s_conf.getPersonOrgaUnitsStepSortKey());
} }
ExportManager.getInstance().registerExporter(new CmsTasksExporter()); ExportManager.getInstance().registerExporter(new CmsTasksExporter());
// ExportManager ExportManager
// .getInstance() .getInstance()
// .registerExporter(new AbstractAttachmentListsExporter()); .registerExporter(new ContentSectionsExporter());
ExportManager.getInstance().registerExporter(new ContentTypesExporter());
ExportManager.getInstance().registerExporter(new FoldersExporter());
ExportManager.getInstance().registerExporter(new ImagesExporter());
ExportManager.getInstance().registerExporter(new LifecyclesExporter());
ExportManager.getInstance()
.registerExporter(new LifecycleDefinitionsExporter());
ExportManager.getInstance().registerExporter(
new PhaseDefinitionsExporter());
ExportManager.getInstance().registerExporter(new PhasesExporter());
s_log.debug("CMS.Initializer.init(DomainInitEvent) completed"); s_log.debug("CMS.Initializer.init(DomainInitEvent) completed");
} // END init(DomainInitEvent e) } // END init(DomainInitEvent e)
@ -279,22 +310,28 @@ public class Initializer extends CompoundInitializer {
// Register the CMSTaskInstaniator // Register the CMSTaskInstaniator
f.registerInstantiator(CMSTask.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(CMSTask.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
@Override @Override
public DomainObject doNewInstance(DataObject dataObject) { public DomainObject doNewInstance(
DataObject dataObject) {
return new CMSTask(dataObject); return new CMSTask(dataObject);
} }
}); });
f.registerInstantiator(CMSTaskType.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(CMSTaskType.BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() { new DomainObjectInstantiator() {
public DomainObject doNewInstance(DataObject dataObject) {
public DomainObject doNewInstance(
DataObject dataObject) {
return new CMSTaskType(dataObject); return new CMSTaskType(dataObject);
} }
}); });
f.registerInstantiator(TaskEventURLGenerator.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(TaskEventURLGenerator.BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() { new DomainObjectInstantiator() {
public DomainObject doNewInstance(DataObject dataObject) {
public DomainObject doNewInstance(
DataObject dataObject) {
return new TaskEventURLGenerator(dataObject); return new TaskEventURLGenerator(dataObject);
} }
@ -302,7 +339,9 @@ public class Initializer extends CompoundInitializer {
f.registerInstantiator(Workflow.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(Workflow.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
public DomainObject doNewInstance(DataObject dataObject) {
public DomainObject doNewInstance(
DataObject dataObject) {
return new Workflow(dataObject); return new Workflow(dataObject);
} }
@ -310,8 +349,10 @@ public class Initializer extends CompoundInitializer {
f.registerInstantiator(WorkflowTemplate.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(WorkflowTemplate.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
@Override @Override
public DomainObject doNewInstance(DataObject dataObject) { public DomainObject doNewInstance(
DataObject dataObject) {
return new WorkflowTemplate(dataObject); return new WorkflowTemplate(dataObject);
} }
@ -319,12 +360,15 @@ public class Initializer extends CompoundInitializer {
f.registerInstantiator(TemplateContext.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(TemplateContext.BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() { new DomainObjectInstantiator() {
public DomainObject doNewInstance(DataObject dataObject) {
public DomainObject doNewInstance(
DataObject dataObject) {
return new TemplateContext(dataObject); return new TemplateContext(dataObject);
} }
@Override @Override
public DomainObjectInstantiator resolveInstantiator(DataObject obj) { public DomainObjectInstantiator resolveInstantiator(
DataObject obj) {
return this; return this;
} }
@ -332,8 +376,10 @@ public class Initializer extends CompoundInitializer {
f.registerInstantiator(RelationAttribute.BASE_DATA_OBJECT_TYPE, f.registerInstantiator(RelationAttribute.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() { new ACSObjectInstantiator() {
@Override @Override
public DomainObject doNewInstance(DataObject dataObject) { public DomainObject doNewInstance(
DataObject dataObject) {
return new RelationAttribute(dataObject); return new RelationAttribute(dataObject);
} }

View File

@ -0,0 +1,44 @@
package org.librecms.assets;
import com.arsdigita.cms.ReusableImageAsset;
import com.fasterxml.jackson.core.JsonGenerator;
import org.librecms.contentsection.AbstractBinaryAssetsExporter;
import java.io.IOException;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ImagesExporter
extends AbstractBinaryAssetsExporter<ReusableImageAsset> {
@Override
protected void exportBinaryAssetProperties(
final ReusableImageAsset asset, final JsonGenerator jsonGenerator)
throws IOException {
jsonGenerator.writeNumberField("width", asset.getWidth());
jsonGenerator.writeNumberField("height", asset.getHeight());
}
@Override
public Class<ReusableImageAsset> exportsType() {
return ReusableImageAsset.class;
}
@Override
public String exportsBaseDataObjectType() {
return ReusableImageAsset.BASE_DATA_OBJECT_TYPE;
}
@Override
public String convertsToType() {
return "org.librecms.assets.Image";
}
}

View File

@ -27,7 +27,8 @@ import java.util.UUID;
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public class ContentTypesExporter extends AbstractDomainObjectsExporter<ContentType> { public class ContentTypesExporter
extends AbstractDomainObjectsExporter<ContentType> {
@Override @Override
public Class<ContentType> exportsType() { public Class<ContentType> exportsType() {