diff --git a/config/alfresco/subsystems/Transformers/default/transformers-context.xml b/config/alfresco/subsystems/Transformers/default/transformers-context.xml index 6600263a7e..b33fe1ceca 100644 --- a/config/alfresco/subsystems/Transformers/default/transformers-context.xml +++ b/config/alfresco/subsystems/Transformers/default/transformers-context.xml @@ -25,6 +25,12 @@ + + + + + + diff --git a/config/alfresco/subsystems/Transformers/default/transformers.properties b/config/alfresco/subsystems/Transformers/default/transformers.properties index 67e18cde0b..edd1f26cef 100644 --- a/config/alfresco/subsystems/Transformers/default/transformers.properties +++ b/config/alfresco/subsystems/Transformers/default/transformers.properties @@ -165,6 +165,7 @@ content.transformer.complex.PDF.Image.extensions.pdf.gif.priority=50 # JodConverter (OpenOffice should be the same) # -------------------------------------------- +content.transformer.JodConverter.edition=Enterprise content.transformer.JodConverter.priority=110 content.transformer.JodConverter.extensions.*.xlsm.supported=false content.transformer.JodConverter.extensions.*.pptm.supported=false @@ -212,6 +213,7 @@ content.transformer.JodConverter.extensions.doc.pdf.maxSourceSizeKBytes=10240 content.transformer.JodConverter.extensions.vsd.pdf.maxSourceSizeKBytes=4096 content.transformer.JodConverter.extensions.ppsx.pdf.maxSourceSizeKBytes=4096 +content.transformer.JodConverter.Html2Pdf.edition=Enterprise content.transformer.JodConverter.Html2Pdf.pipeline=JodConverter|odt|JodConverter content.transformer.JodConverter.Html2Pdf.extensions.html.pdf.supported=true content.transformer.JodConverter.Html2Pdf.extensions.html.pdf.priority=50 @@ -219,14 +221,17 @@ content.transformer.JodConverter.Html2Pdf.extensions.html.pdf.priority=50 # This transformer exists because OpenOffice and LibreOffice have a problem # going directly from HTML to PDF. Going via ODT appears a much better option. # For example tags hang the soffice process. ALF-14035 +content.transformer.JodConverter.2Pdf.edition=Enterprise content.transformer.JodConverter.2Pdf.available=false content.transformer.JodConverter.2Pdf.failover=JodConverter|JodConverter.Html2Pdf content.transformer.JodConverter.2Pdf.priority=150 content.transformer.JodConverter.2Pdf.extensions.*.pdf.supported=true +content.transformer.complex.JodConverter.Image.edition=Enterprise content.transformer.complex.JodConverter.Image.pipeline=JodConverter.2Pdf|pdf|complex.PDF.Image content.transformer.complex.JodConverter.Image.priority=250 +content.transformer.complex.JodConverter.PdfBox.edition=Enterprise content.transformer.complex.JodConverter.PdfBox.pipeline=JodConverter.2Pdf|pdf|PdfBox content.transformer.complex.JodConverter.PdfBox.priority=150 content.transformer.complex.JodConverter.PdfBox.extensions.xlsm.txt.supported=false @@ -253,6 +258,7 @@ content.transformer.complex.JodConverter.PdfBox.extensions.ppsx.txt.supported=fa content.transformer.complex.JodConverter.PdfBox.extensions.xlsb.txt.maxSourceSizeKBytes=1024 content.transformer.complex.JodConverter.PdfBox.extensions.potm.txt.maxSourceSizeKBytes=1024 +content.transformer.complex.JodConverter.Pdf2swf.edition=Enterprise content.transformer.complex.JodConverter.Pdf2swf.pipeline=JodConverter.2Pdf|pdf|Pdf2swf content.transformer.complex.JodConverter.Pdf2swf.priority=150 content.transformer.complex.JodConverter.Pdf2swf.extensions.xlsm.swf.maxSourceSizeKBytes=1024 diff --git a/source/java/org/alfresco/repo/content/transform/TransformerConfig.java b/source/java/org/alfresco/repo/content/transform/TransformerConfig.java index 044c355030..65d28e7552 100644 --- a/source/java/org/alfresco/repo/content/transform/TransformerConfig.java +++ b/source/java/org/alfresco/repo/content/transform/TransformerConfig.java @@ -121,6 +121,21 @@ public interface TransformerConfig */ static final String PRIORITY = ".priority"; + /** + * The suffix to property names to indicate which Alfresco version the transformer is + * available with. If not specified it is not restricted. So if set to "Enterprise" it + * is not available to Community. + * @see AMP + */ + static final String EDITION = ".edition"; + + /** + * The suffix to property names to indicate which Alfresco AMPs the transformer is + * available with. The value should be the AMP's ID. If not specified it is not restricted. + * @see #EDITION + */ + static final String AMP = ".amp"; + /** * The suffix to property names for the threshold count. */ diff --git a/source/java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformers.java b/source/java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformers.java index 43daede01f..3f7b7ac69d 100644 --- a/source/java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformers.java +++ b/source/java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformers.java @@ -18,7 +18,9 @@ */ package org.alfresco.repo.content.transform; +import static org.alfresco.repo.content.transform.TransformerConfig.AMP; import static org.alfresco.repo.content.transform.TransformerConfig.AVAILABLE; +import static org.alfresco.repo.content.transform.TransformerConfig.EDITION; import static org.alfresco.repo.content.transform.TransformerConfig.FAILOVER; import static org.alfresco.repo.content.transform.TransformerConfig.PIPE; import static org.alfresco.repo.content.transform.TransformerConfig.PIPELINE; @@ -31,8 +33,10 @@ import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.service.cmr.module.ModuleService; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.service.descriptor.DescriptorService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -49,19 +53,22 @@ public class TransformerConfigDynamicTransformers extends TransformerPropertyNam public TransformerConfigDynamicTransformers(TransformerConfig transformerConfig, TransformerProperties transformerProperties, MimetypeService mimetypeService, ContentService contentService, ContentTransformerRegistry transformerRegistry, - TransformerDebug transformerDebug) + TransformerDebug transformerDebug, ModuleService moduleService, DescriptorService descriptorService) { - createDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, transformerRegistry, transformerDebug); + createDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, + transformerRegistry, transformerDebug, moduleService, descriptorService); } private void createDynamicTransformers(TransformerConfig transformerConfig, TransformerProperties transformerProperties, MimetypeService mimetypeService, ContentService contentService, ContentTransformerRegistry transformerRegistry, - TransformerDebug transformerDebug) + TransformerDebug transformerDebug, ModuleService moduleService, DescriptorService descriptorService) { Collection SUFFIXES = Arrays.asList(new String [] { FAILOVER, PIPELINE, - AVAILABLE + AVAILABLE, + EDITION, + AMP }); Map @@ -82,18 +89,36 @@ public class TransformerConfigDynamicTransformers extends TransformerPropertyNam { try { - String availableStr = getProperty(property.transformerName, null, null, AVAILABLE, null, transformerSourceTargetSuffixValues); - boolean available = availableStr == null || "true".equalsIgnoreCase(availableStr); - - AbstractContentTransformer2 transformer = property.suffix.equals(PIPELINE) - ? createComplexTransformer(property, transformerConfig, mimetypeService, - contentService, transformerRegistry, transformerDebug, available) - : createFailoverTransformer(property, transformerConfig, mimetypeService, - contentService, transformerRegistry, transformerDebug, available); - transformer.register(); - processed.add(property); - dynamicTransformers.add(transformer); - logger.debug(property.transformerName+" added"); + String edition = getProperty(property.transformerName, null, null, EDITION, + null, transformerSourceTargetSuffixValues); + String moduleId = getProperty(property.transformerName, null, null, AMP, + null, transformerSourceTargetSuffixValues); + if (!supportedEdition(descriptorService, edition)) + { + processed.add(property); + logger.debug(property.transformerName+" ignored. As it is an "+edition+" only transformer."); + } + else if (!supportedModule(moduleService, moduleId)) + { + processed.add(property); + logger.debug(property.transformerName+" ignored. As the AMP "+moduleId+" is not installed."); + } + else + { + String availableStr = getProperty(property.transformerName, null, null, AVAILABLE, + null, transformerSourceTargetSuffixValues); + boolean available = availableStr == null || "true".equalsIgnoreCase(availableStr); + + AbstractContentTransformer2 transformer = property.suffix.equals(PIPELINE) + ? createComplexTransformer(property, transformerConfig, mimetypeService, + contentService, transformerRegistry, transformerDebug, available) + : createFailoverTransformer(property, transformerConfig, mimetypeService, + contentService, transformerRegistry, transformerDebug, available); + transformer.register(); + processed.add(property); + dynamicTransformers.add(transformer); + logger.debug(property.transformerName+" added"); + } } catch (IllegalArgumentException e) { @@ -120,6 +145,18 @@ public class TransformerConfigDynamicTransformers extends TransformerPropertyNam } } + private boolean supportedEdition(DescriptorService descriptorService, String edition) + { + return descriptorService == null || edition == null || + descriptorService.getServerDescriptor().getEdition().equals(edition); + } + + private boolean supportedModule(ModuleService moduleService, String moduleId) + { + return moduleService == null || moduleId == null || + moduleService.getModule(moduleId) != null; + } + private AbstractContentTransformer2 createComplexTransformer(TransformerSourceTargetSuffixValue property, TransformerConfig transformerConfig, MimetypeService mimetypeService, ContentService contentService, diff --git a/source/java/org/alfresco/repo/content/transform/TransformerConfigImpl.java b/source/java/org/alfresco/repo/content/transform/TransformerConfigImpl.java index f525246f01..9dcfa464f5 100644 --- a/source/java/org/alfresco/repo/content/transform/TransformerConfigImpl.java +++ b/source/java/org/alfresco/repo/content/transform/TransformerConfigImpl.java @@ -21,10 +21,13 @@ package org.alfresco.repo.content.transform; import java.util.Properties; import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory; +import org.alfresco.service.cmr.module.ModuleDetails; +import org.alfresco.service.cmr.module.ModuleService; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.TransformationOptionLimits; import org.alfresco.service.cmr.repository.TransformationOptions; +import org.alfresco.service.descriptor.DescriptorService; import org.springframework.context.ApplicationEvent; import org.springframework.extensions.surf.util.AbstractLifecycleBean; @@ -85,6 +88,10 @@ public class TransformerConfigImpl extends AbstractLifecycleBean implements Tran // Needed to read global properties. private Properties globalProperties; + private ModuleService moduleService; + + private DescriptorService descriptorService; + private TransformerProperties transformerProperties; private TransformerConfigDynamicTransformers dynamicTransformers; @@ -129,6 +136,16 @@ public class TransformerConfigImpl extends AbstractLifecycleBean implements Tran this.globalProperties = globalProperties; } + public void setModuleService(ModuleService moduleService) + { + this.moduleService = moduleService; + } + + public void setDescriptorService(DescriptorService descriptorService) + { + this.descriptorService = descriptorService; + } + /** * Called by spring after bean is initialised. */ @@ -138,7 +155,7 @@ public class TransformerConfigImpl extends AbstractLifecycleBean implements Tran transformerProperties = new TransformerProperties(subsystem, globalProperties); dynamicTransformers = new TransformerConfigDynamicTransformers(this, transformerProperties, mimetypeService, - contentService, transformerRegistry, transformerDebug); + contentService, transformerRegistry, transformerDebug, moduleService, descriptorService); statistics= new TransformerConfigStatistics(this, mimetypeService); limits = new TransformerConfigLimits(transformerProperties, mimetypeService); supported = new TransformerConfigSupported(transformerProperties, mimetypeService); diff --git a/source/test-java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformersTest.java b/source/test-java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformersTest.java index 4c616efd1e..1b1ba55b87 100644 --- a/source/test-java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformersTest.java +++ b/source/test-java/org/alfresco/repo/content/transform/TransformerConfigDynamicTransformersTest.java @@ -26,10 +26,14 @@ import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Date; +import org.alfresco.service.cmr.module.ModuleDetails; +import org.alfresco.service.cmr.module.ModuleService; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.TransformationOptionLimits; import org.alfresco.service.cmr.repository.TransformationOptions; +import org.alfresco.service.descriptor.Descriptor; +import org.alfresco.service.descriptor.DescriptorService; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; @@ -60,6 +64,18 @@ public class TransformerConfigDynamicTransformersTest @Mock private TransformerDebug transformerDebug; + @Mock + ModuleService moduleService; + + @Mock + ModuleDetails moduleDetails; + + @Mock + DescriptorService descriptorService; + + @Mock + Descriptor descriptor; + ContentTransformerRegistry transformerRegistry; private ContentTransformer transformer1; @@ -98,7 +114,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "transformer1|pdf|transformer2|png|transformer3"); assertEquals(0, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); assertEquals(4, transformerRegistry.getAllTransformers().size()); assertEquals(1, transformerRegistry.getTransformers().size()); @@ -129,7 +145,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "transformer1|pdf"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -140,7 +156,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "transformer1|pdf|transformer2|png"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -151,7 +167,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformer3.pipeline", "transformer1|pdf|transformer2"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -162,7 +178,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "transformer1|*|transformer2|png|transformer3"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); transformerRegistry.getTransformer("transformer.transformerA"); } @@ -175,7 +191,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "transformer1|pdf|*|png|transformer3"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); transformerRegistry.getTransformer("transformer.transformerA"); } @@ -188,7 +204,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.pipeline", "unknown1|pdf|unknown2|png|unknown3"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -200,7 +216,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.available", "false"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); assertEquals(4, transformerRegistry.getAllTransformers().size()); assertEquals(0, transformerRegistry.getTransformers().size()); // << note 0 rather than 1 @@ -218,7 +234,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.failover", "transformer1|transformer2|transformer3"); assertEquals(0, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); assertEquals(4, transformerRegistry.getAllTransformers().size()); assertEquals(1, transformerRegistry.getTransformers().size()); @@ -235,7 +251,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.failover", "transformer1"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -246,7 +262,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformer3.failover", "transformer1|transformer2"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -257,7 +273,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.failover", "transformer1|*|transformer3"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); transformerRegistry.getTransformer("transformer.transformerA"); } @@ -270,7 +286,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.failover", "unknown1|unknown2|unknown3"); assertEquals(1, new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug).getErrorCount()); + transformerRegistry, transformerDebug, null, null).getErrorCount()); } @Test @@ -282,7 +298,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerA.available", "false"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); assertEquals(4, transformerRegistry.getAllTransformers().size()); assertEquals(0, transformerRegistry.getTransformers().size()); // << note 0 rather than 1 @@ -302,7 +318,7 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerE.failover", "transformer1|transformer1"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); assertEquals(5, transformerRegistry.getTransformers().size()); @@ -321,10 +337,70 @@ public class TransformerConfigDynamicTransformersTest "content.transformer.transformerE.failover", "transformer1|transformerC"); new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, - transformerRegistry, transformerDebug); + transformerRegistry, transformerDebug, null, null); assertEquals(2, transformerRegistry.getTransformers().size()); transformerRegistry.getTransformer("transformer.transformerA"); } + + private void entrerpriseTransformer(String edition) + { + when(descriptorService.getServerDescriptor()).thenReturn(descriptor); + when(descriptor.getEdition()).thenReturn(edition); + + mockProperties(transformerProperties, + "content.transformer.transformerA.failover", "transformer1|transformer2|transformer3", + "content.transformer.transformerA.edition", "Enterprise"); + + new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, + transformerRegistry, transformerDebug, null, descriptorService); + } + + private void ampTransformer(String moduleId) + { + when(moduleService.getModule("testAmp")).thenReturn(moduleDetails); + + mockProperties(transformerProperties, + "content.transformer.transformerA.failover", "transformer1|transformer2|transformer3", + "content.transformer.transformerA.amp", moduleId); + + new TransformerConfigDynamicTransformers(transformerConfig, transformerProperties, mimetypeService, contentService, + transformerRegistry, transformerDebug, moduleService, null); + } + + @Test + // Test that enterprise transformers are not available to community. + public void communityTest() + { + entrerpriseTransformer("Community"); + + assertEquals(3, transformerRegistry.getAllTransformers().size()); + } + + @Test + // Test that enterprise transformers are available to enterprise. + public void enterpriseTest() + { + entrerpriseTransformer("Enterprise"); + + assertEquals(4, transformerRegistry.getAllTransformers().size()); + } + @Test + // Test that enterprise transformers are not available to community. + public void noAmpTest() + { + ampTransformer("AmpNotInstalled"); + + assertEquals(3, transformerRegistry.getAllTransformers().size()); + } + + @Test + // Test that enterprise transformers are available to enterprise. + public void ampTest() + { + ampTransformer("testAmp"); + + assertEquals(4, transformerRegistry.getAllTransformers().size()); + } }