Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud)

80349: MNT-11779 Cannot create dynamic transformer transformer.complex.JodConverter... ERRORs in log
      - Allow Enterprise or AMP specific transformers to be ignored.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@82735 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Will Abson
2014-09-03 15:26:04 +00:00
parent d588638ae9
commit 10ff05205d
6 changed files with 190 additions and 33 deletions

View File

@@ -25,6 +25,12 @@
<property name="globalProperties">
<ref bean="global-properties" />
</property>
<property name="moduleService">
<ref bean="ModuleService" />
</property>
<property name="descriptorService">
<ref bean="descriptorComponent" />
</property>
</bean>
<!-- Selects the transformer to be used -->

View File

@@ -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 <sub> 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

View File

@@ -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.
*/

View File

@@ -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<String> SUFFIXES = Arrays.asList(new String [] {
FAILOVER,
PIPELINE,
AVAILABLE
AVAILABLE,
EDITION,
AMP
});
Map<TransformerSourceTargetSuffixKey, TransformerSourceTargetSuffixValue>
@@ -82,7 +89,24 @@ public class TransformerConfigDynamicTransformers extends TransformerPropertyNam
{
try
{
String availableStr = getProperty(property.transformerName, null, null, AVAILABLE, null, transformerSourceTargetSuffixValues);
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)
@@ -95,6 +119,7 @@ public class TransformerConfigDynamicTransformers extends TransformerPropertyNam
dynamicTransformers.add(transformer);
logger.debug(property.transformerName+" added");
}
}
catch (IllegalArgumentException e)
{
// Thrown if unknown sub transformer name - it might be dynamic
@@ -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,

View File

@@ -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);

View File

@@ -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());
}
}