diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml index 2e400fca26..86222040db 100644 --- a/config/alfresco/action-services-context.xml +++ b/config/alfresco/action-services-context.xml @@ -198,7 +198,7 @@ - + @@ -292,7 +292,7 @@ - + diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml index 35806d09ea..2ce23d8ae0 100644 --- a/config/alfresco/content-services-context.xml +++ b/config/alfresco/content-services-context.xml @@ -6,132 +6,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - application/pdf - - - - - - - - - - - - - - - imconvert ${source} ${options} ${target} - - - imconvert "${source}" ${options} "${target}" - - - - - - - - - - - - - - - - - - - - - - application/msword - text/plain - - - - application/pdf - text/plain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -159,5 +33,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + application/pdf + text/plain + + + + + + + + + + + + application/msword + text/plain + + + + + + + + + + + + + + + + + + + application/pdf + + + + + + + + + + + + + imconvert ${source} ${options} ${target} + + + imconvert "${source}" ${options} "${target}" + + + + + + + + + + + diff --git a/config/alfresco/model-specific-services-context.xml b/config/alfresco/model-specific-services-context.xml index 782558cf1b..b55ab6cb26 100644 --- a/config/alfresco/model-specific-services-context.xml +++ b/config/alfresco/model-specific-services-context.xml @@ -11,7 +11,7 @@ - + diff --git a/config/alfresco/network-protocol-context.xml b/config/alfresco/network-protocol-context.xml index 0a685d6f07..a2f313d211 100644 --- a/config/alfresco/network-protocol-context.xml +++ b/config/alfresco/network-protocol-context.xml @@ -67,7 +67,7 @@ - + diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 9f3bdd6a54..84b5a132f0 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -234,10 +234,9 @@ org.alfresco.service.cmr.repository.MimetypeService - + - @@ -245,17 +244,6 @@ - - - - - - - ${server.transaction.mode.default} - - - - org.alfresco.service.cmr.repository.MimetypeService diff --git a/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer.java b/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer.java index b5f8cd3c2d..40e9d18ba3 100644 --- a/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/AbstractContentTransformer.java @@ -17,6 +17,7 @@ package org.alfresco.repo.content.transform; import java.util.Collections; +import java.util.List; import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; @@ -42,6 +43,8 @@ public abstract class AbstractContentTransformer implements ContentTransformer private static final Log logger = LogFactory.getLog(AbstractContentTransformer.class); private MimetypeService mimetypeService; + private ContentTransformerRegistry registry; + private List explicitTransformations; private double averageTime = 0.0; private long count = 0L; @@ -52,7 +55,17 @@ public abstract class AbstractContentTransformer implements ContentTransformer { averageTime = 0.0; } - + + /** + * The registry to auto-register with + * + * @param registry the transformer registry + */ + public void setRegistry(ContentTransformerRegistry registry) + { + this.registry = registry; + } + /** * Helper setter of the mimetype service. This is not always required. * @@ -71,6 +84,17 @@ public abstract class AbstractContentTransformer implements ContentTransformer return mimetypeService; } + /** + * Set the transformations that this transformer can do regardless of what it returns + * via the {@link ContentTransformer#getReliability(String, String) reliability check}. + * + * @param explicitTransformations explicit key mappings + */ + public void setExplicitTransformations(List explicitTransformations) + { + this.explicitTransformations = explicitTransformations; + } + @Override public String toString() { @@ -81,6 +105,32 @@ public abstract class AbstractContentTransformer implements ContentTransformer return sb.toString(); } + /** + * Registers this instance with the {@link #setRegistry(ContentTransformerRegistry) registry} + * if it is present. + */ + public void register() + { + if (registry == null) + { + if (logger.isDebugEnabled()) + { + logger.debug("No registry assigned. Ignoring auto-registration."); + } + return; + } + // first register any explicit transformations + if (explicitTransformations != null) + { + for (ContentTransformerRegistry.TransformationKey key : explicitTransformations) + { + registry.addExplicitTransformer(key, this); + } + } + // register this instance for the fallback case + registry.addTransformer(this); + } + /** * Convenience to fetch and check the mimetype for the given content * diff --git a/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistry.java b/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistry.java index d46e3a6c2e..5b9ccca560 100644 --- a/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistry.java +++ b/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistry.java @@ -64,7 +64,7 @@ public class ContentTransformerRegistry Assert.notNull(mimetypeMap, "The MimetypeMap is mandatory"); this.mimetypeMap = mimetypeMap; - this.transformers = Collections.emptyList(); // just in case it isn't set + this.transformers = new ArrayList(10); transformationCache = new HashMap>(17); accessCount = 0; @@ -75,50 +75,38 @@ public class ContentTransformerRegistry } /** - * Provides a list of explicit transformers to use. + * Register an individual transformer against a specific transformation. This transformation + * will take precedence over any of the generally-registered transformers. * - * @param transformations list of ( list of ( (from-mimetype)(to-mimetype)(transformer) ) ) + * @param key the mapping from one mimetype to the next + * @param transformer the content transformer */ - public void setExplicitTransformations(List> transformations) + public void addExplicitTransformer(TransformationKey key, ContentTransformer transformer) { - for (List list : transformations) + transformationCache.put(key, Collections.singletonList(transformer)); + // done + if (logger.isDebugEnabled()) { - if (list.size() != 3) - { - throw new AlfrescoRuntimeException( - "Explicit transformation is 'from-mimetype', 'to-mimetype' and 'transformer': \n" + - " list: " + list); - } - try - { - String sourceMimetype = (String) list.get(0); - String targetMimetype = (String) list.get(1); - ContentTransformer transformer = (ContentTransformer) list.get(2); - // create the transformation - TransformationKey key = new TransformationKey(sourceMimetype, targetMimetype); - // bypass all discovery and plug this directly into the cache - transformationCache.put(key, Collections.singletonList(transformer)); - } - catch (ClassCastException e) - { - throw new AlfrescoRuntimeException( - "Explicit transformation is 'from-mimetype', 'to-mimetype' and 'transformer': \n" + - " list: " + list); - } + logger.debug("Registered explicit transformation: \n" + + " key: " + key + "\n" + + " transformer: " + transformer); } } /** - * Provides a list of self-discovering transformers that the registry will fall - * back on if a transformation is not available from the explicitly set - * transformations. - * - * @param transformers all the available transformers that the registry can - * work with + * Registers an individual transformer that can be queried to check for applicability. + * + * @param transformer a content transformer */ - public void setTransformers(List transformers) + public void addTransformer(ContentTransformer transformer) { - this.transformers = transformers; + transformers.add(transformer); + // done + if (logger.isDebugEnabled()) + { + logger.debug("Registered general transformer: \n" + + " transformer: " + transformer); + } } /** diff --git a/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistryTest.java b/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistryTest.java index 7f24ac2155..0b0ac21f98 100644 --- a/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistryTest.java +++ b/source/java/org/alfresco/repo/content/transform/ContentTransformerRegistryTest.java @@ -16,9 +16,7 @@ */ package org.alfresco.repo.content.transform; -import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Map; import org.alfresco.repo.content.MimetypeMap; @@ -26,6 +24,7 @@ import org.alfresco.repo.content.filestore.FileContentReader; import org.alfresco.repo.content.filestore.FileContentWriter; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.util.TempFileProvider; /** @@ -69,22 +68,20 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe { bytes[i] = (byte)i; } - List transformers = new ArrayList(5); - // create some dummy transformers for reliability tests - transformers.add(new DummyTransformer(A, B, 0.3, 10L)); - transformers.add(new DummyTransformer(A, B, 0.6, 10L)); - transformers.add(new DummyTransformer(A, C, 0.5, 10L)); - transformers.add(new DummyTransformer(A, C, 1.0, 10L)); - transformers.add(new DummyTransformer(B, C, 0.2, 10L)); - // create some dummy transformers for speed tests - transformers.add(new DummyTransformer(A, D, 1.0, 20L)); - transformers.add(new DummyTransformer(A, D, 1.0, 20L)); - transformers.add(new DummyTransformer(A, D, 1.0, 10L)); // the fast one - transformers.add(new DummyTransformer(A, D, 1.0, 20L)); - transformers.add(new DummyTransformer(A, D, 1.0, 20L)); // create the dummyRegistry dummyRegistry = new ContentTransformerRegistry(mimetypeMap); - dummyRegistry.setTransformers(transformers); + // create some dummy transformers for reliability tests + new DummyTransformer(mimetypeMap, dummyRegistry, A, B, 0.3, 10L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, B, 0.6, 10L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, C, 0.5, 10L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, C, 1.0, 10L); + new DummyTransformer(mimetypeMap, dummyRegistry, B, C, 0.2, 10L); + // create some dummy transformers for speed tests + new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 10L); // the fast one + new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); + new DummyTransformer(mimetypeMap, dummyRegistry, A, D, 1.0, 20L); } /** @@ -161,17 +158,18 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe */ public void testExplicitTransformation() { - ContentTransformer dummyTransformer = new DummyTransformer( - MimetypeMap.MIMETYPE_FLASH, MimetypeMap.MIMETYPE_EXCEL, 1.0, 12345); - - List transform = new ArrayList(3); - transform.add(MimetypeMap.MIMETYPE_FLASH); - transform.add(MimetypeMap.MIMETYPE_EXCEL); - transform.add(dummyTransformer); - - List> explicitTransformers = Collections.singletonList(transform); - // add it to the registry - dummyRegistry.setExplicitTransformations(explicitTransformers); + AbstractContentTransformer dummyTransformer = new DummyTransformer( + mimetypeMap, + dummyRegistry, + MimetypeMap.MIMETYPE_FLASH, MimetypeMap.MIMETYPE_EXCEL, + 1.0, 12345); + // set an explicit transformation + ContentTransformerRegistry.TransformationKey key = + new ContentTransformerRegistry.TransformationKey( + MimetypeMap.MIMETYPE_FLASH, MimetypeMap.MIMETYPE_EXCEL); + dummyTransformer.setExplicitTransformations(Collections.singletonList(key)); + // register again + dummyTransformer.register(); // get the appropriate transformer for the bizarre mapping ContentTransformer checkTransformer = dummyRegistry.getTransformer( @@ -192,13 +190,20 @@ public class ContentTransformerRegistryTest extends AbstractContentTransformerTe private double reliability; private long transformationTime; - public DummyTransformer(String sourceMimetype, String targetMimetype, + public DummyTransformer( + MimetypeService mimetypeService, + ContentTransformerRegistry registry, + String sourceMimetype, String targetMimetype, double reliability, long transformationTime) { + super.setMimetypeService(mimetypeService); + super.setRegistry(registry); this.sourceMimetype = sourceMimetype; this.targetMimetype = targetMimetype; this.reliability = reliability; this.transformationTime = transformationTime; + // register + register(); } public double getReliability(String sourceMimetype, String targetMimetype) diff --git a/source/java/org/alfresco/repo/content/transform/UnoContentTransformer.java b/source/java/org/alfresco/repo/content/transform/UnoContentTransformer.java index a5fe2d017a..bc9f06b6ff 100644 --- a/source/java/org/alfresco/repo/content/transform/UnoContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/UnoContentTransformer.java @@ -137,7 +137,8 @@ public class UnoContentTransformer extends AbstractContentTransformer } /** - * Perform bean initialization + * Connects to the OpenOffice server. If successful, then + * {@link AbstractContentTransformer#register() auto-registers}. */ public synchronized void init() { @@ -147,6 +148,8 @@ public class UnoContentTransformer extends AbstractContentTransformer { connection.connect(); isConnected = true; + // register + super.register(); } catch (ConnectException e) { diff --git a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java index 8407ef9162..e28139a6d6 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java +++ b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformer.java @@ -44,7 +44,6 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont private static final Log logger = LogFactory.getLog(AbstractImageMagickContentTransformer.class); - private MimetypeMap mimetypeMap; private boolean available; public AbstractImageMagickContentTransformer() @@ -52,16 +51,6 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont this.available = false; } - /** - * Set the mimetype map to resolve mimetypes to file extensions. - * - * @param mimetypeMap - */ - public void setMimetypeMap(MimetypeMap mimetypeMap) - { - this.mimetypeMap = mimetypeMap; - } - /** * @return Returns true if the transformer is functioning otherwise false */ @@ -82,11 +71,13 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont /** * Checks for the JMagick and ImageMagick dependencies, using the common * {@link #transformInternal(File, File) transformation method} to check - * that the sample image can be converted. + * that the sample image can be converted. + *

+ * If initialization is successful, then autoregistration takes place. */ public void init() { - if (mimetypeMap == null) + if (getMimetypeService() == null) { throw new AlfrescoRuntimeException("MimetypeMap not present"); } @@ -124,6 +115,9 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont } // we can be sure that it works setAvailable(true); + + // register + super.register(); } catch (Throwable e) { @@ -192,8 +186,8 @@ public abstract class AbstractImageMagickContentTransformer extends AbstractCont String targetMimetype = getMimetype(writer); // get the extensions to use - String sourceExtension = mimetypeMap.getExtension(sourceMimetype); - String targetExtension = mimetypeMap.getExtension(targetMimetype); + String sourceExtension = getMimetypeService().getExtension(sourceMimetype); + String targetExtension = getMimetypeService().getExtension(targetMimetype); if (sourceExtension == null || targetExtension == null) { throw new AlfrescoRuntimeException("Unknown extensions for mimetypes: \n" + diff --git a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java index 7d64dcbfec..bbd19dc185 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java +++ b/source/java/org/alfresco/repo/content/transform/magick/ImageMagickContentTransformerTest.java @@ -39,7 +39,7 @@ public class ImageMagickContentTransformerTest extends AbstractContentTransforme executer.setDefaultProperties(Collections.singletonMap("options", "")); transformer = new ImageMagickContentTransformer(); - transformer.setMimetypeMap(mimetypeMap); + transformer.setMimetypeService(mimetypeMap); transformer.setExecuter(executer); transformer.init(); } diff --git a/source/java/org/alfresco/repo/content/transform/magick/JMagickContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/magick/JMagickContentTransformerTest.java index dd386703d0..c78cdf9035 100644 --- a/source/java/org/alfresco/repo/content/transform/magick/JMagickContentTransformerTest.java +++ b/source/java/org/alfresco/repo/content/transform/magick/JMagickContentTransformerTest.java @@ -36,7 +36,7 @@ public class JMagickContentTransformerTest extends AbstractContentTransformerTes public void onSetUpInTransaction() throws Exception { transformer = new JMagickContentTransformer(); - transformer.setMimetypeMap(mimetypeMap); + transformer.setMimetypeService(mimetypeMap); transformer.init(); }