diff --git a/config/alfresco/thumbnail-service-context.xml b/config/alfresco/thumbnail-service-context.xml index c8853a7348..cbaabb26e7 100644 --- a/config/alfresco/thumbnail-service-context.xml +++ b/config/alfresco/thumbnail-service-context.xml @@ -46,11 +46,12 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -88,7 +89,7 @@ - + @@ -99,7 +100,7 @@ - + diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 3f35fa18eb..bcd46cc6a4 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -44,7 +44,7 @@ import org.alfresco.repo.content.transform.magick.ImageTransformationOptions; import org.alfresco.repo.search.QueryParameterDefImpl; import org.alfresco.repo.tagging.script.TagScope; import org.alfresco.repo.thumbnail.CreateThumbnailActionExecuter; -import org.alfresco.repo.thumbnail.ThumbnailDetails; +import org.alfresco.repo.thumbnail.ThumbnailDefinition; import org.alfresco.repo.thumbnail.ThumbnailRegistry; import org.alfresco.repo.thumbnail.script.ScriptThumbnail; import org.alfresco.repo.version.VersionModel; @@ -72,6 +72,7 @@ import org.alfresco.service.cmr.search.QueryParameterDefinition; import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.thumbnail.ThumbnailService; import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionHistory; import org.alfresco.service.cmr.version.VersionType; @@ -2036,7 +2037,7 @@ public class ScriptNode implements Serializable, Scopeable // Use the thumbnail registy to get the details of the thumbail ThumbnailRegistry registry = this.services.getThumbnailService().getThumbnailRegistry(); - ThumbnailDetails details = registry.getThumbnailDetails(thumbnailName); + ThumbnailDefinition details = registry.getThumbnailDefinition(thumbnailName); if (details == null) { // Throw exception @@ -2109,6 +2110,38 @@ public class ScriptNode implements Serializable, Scopeable return (ScriptThumbnail[])result.toArray(new ScriptThumbnail[result.size()]); } + /** + * Returns the names of the thumbnail defintions that can be applied to the content property of + * this node. + *

+ * Thumbanil defintions only appear in this list if they can produce a thumbnail for the content + * found in the content property. This will be determined by looking at the mimetype of the content + * and the destinatino mimetype of the thumbnail. + * + * @return String[] array of thumbnail names that are valid for the current content type + */ + public String[] getThumbnailDefintions() + { + ContentService contentService = this.services.getContentService(); + ThumbnailService thumbnailService = this.services.getThumbnailService(); + + List result = new ArrayList(7); + + ContentReader contentReader = contentService.getReader(this.nodeRef, ContentModel.PROP_CONTENT); + if (contentReader != null) + { + String mimetype = contentReader.getMimetype(); + List thumbnailDefinitions = thumbnailService.getThumbnailRegistry().getThumnailDefintions(mimetype); + for (ThumbnailDefinition thumbnailDefinition : thumbnailDefinitions) + { + result.add(thumbnailDefinition.getName()); + } + } + + return (String[])result.toArray(new String[result.size()]); + } + + // ------------------------------------------------------------------------------ // Tag methods diff --git a/source/java/org/alfresco/repo/thumbnail/CreateThumbnailActionExecuter.java b/source/java/org/alfresco/repo/thumbnail/CreateThumbnailActionExecuter.java index f8a72ccf5f..91dc984a73 100644 --- a/source/java/org/alfresco/repo/thumbnail/CreateThumbnailActionExecuter.java +++ b/source/java/org/alfresco/repo/thumbnail/CreateThumbnailActionExecuter.java @@ -96,7 +96,7 @@ public class CreateThumbnailActionExecuter extends ActionExecuterAbstractBase // Get the details of the thumbnail ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry(); - ThumbnailDetails details = registry.getThumbnailDetails(thumbnailName); + ThumbnailDefinition details = registry.getThumbnailDefinition(thumbnailName); if (details == null) { // Throw exception diff --git a/source/java/org/alfresco/repo/thumbnail/ThumbnailDetails.java b/source/java/org/alfresco/repo/thumbnail/ThumbnailDefinition.java similarity index 88% rename from source/java/org/alfresco/repo/thumbnail/ThumbnailDetails.java rename to source/java/org/alfresco/repo/thumbnail/ThumbnailDefinition.java index 34b317798f..4707297792 100644 --- a/source/java/org/alfresco/repo/thumbnail/ThumbnailDetails.java +++ b/source/java/org/alfresco/repo/thumbnail/ThumbnailDefinition.java @@ -31,7 +31,7 @@ import org.alfresco.service.cmr.repository.TransformationOptions; * * @author Roy Wetherall */ -public class ThumbnailDetails +public class ThumbnailDefinition { /** Name of the thumbnail */ private String name; @@ -48,7 +48,7 @@ public class ThumbnailDetails /** * Default constructor */ - public ThumbnailDetails() + public ThumbnailDefinition() { } @@ -58,7 +58,7 @@ public class ThumbnailDetails * @param destinationMimetype * @param options */ - public ThumbnailDetails(String destinationMimetype, TransformationOptions options) + public ThumbnailDefinition(String destinationMimetype, TransformationOptions options) { this.mimetype = destinationMimetype; this.options = options; @@ -69,7 +69,7 @@ public class ThumbnailDetails * * @param thumbnailName the name of the thumbnail, can be null */ - public ThumbnailDetails(String mimetype, TransformationOptions options, String thumbnailName) + public ThumbnailDefinition(String mimetype, TransformationOptions options, String thumbnailName) { this(mimetype, options); this.name= thumbnailName; @@ -83,7 +83,7 @@ public class ThumbnailDetails * @param thumbnailName * @param placeHolderResourcePath */ - public ThumbnailDetails(String mimetype, TransformationOptions options, String thumbnailName, String placeHolderResourcePath) + public ThumbnailDefinition(String mimetype, TransformationOptions options, String thumbnailName, String placeHolderResourcePath) { this(mimetype, options, thumbnailName); this.placeHolderResourcePath = placeHolderResourcePath; diff --git a/source/java/org/alfresco/repo/thumbnail/ThumbnailRegistry.java b/source/java/org/alfresco/repo/thumbnail/ThumbnailRegistry.java index 2e2b9c9bef..ccd77adf46 100644 --- a/source/java/org/alfresco/repo/thumbnail/ThumbnailRegistry.java +++ b/source/java/org/alfresco/repo/thumbnail/ThumbnailRegistry.java @@ -24,39 +24,100 @@ */ package org.alfresco.repo.thumbnail; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.thumbnail.ThumbnailException; /** + * Registry of all the thumbnail details available + * * @author Roy Wetherall */ public class ThumbnailRegistry { - /** Map of thumbnail details */ - private Map thumbnailDetails = new HashMap(10); - + /** Content service */ + private ContentService contentService; + + /** Map of thumbnail defintion */ + private Map thumbnailDefinitions = new HashMap(7); + + /** Cache to store mimetype to thumbnailDefinition mapping */ + private Map> mimetypeMap = new HashMap>(17); + /** - * Add a number of thumbnail details + * Content service * - * @param thumbnailDetails list of thumbnail details + * @param contentService content service */ - public void setThumbnailDetails(List thumbnailDetails) + public void setContentService(ContentService contentService) { - for (ThumbnailDetails value : thumbnailDetails) + this.contentService = contentService; + } + + /** + * Add a number of thumbnail defintions + * + * @param thumbnailDefinitions list of thumbnail details + */ + public void setThumbnailDefinitions(List thumbnailDefinitions) + { + for (ThumbnailDefinition value : thumbnailDefinitions) { - addThumbnailDetails(value); + addThumbnailDefinition(value); } } + /** + * Get a list of all the thumbnail defintions + * + * @return Collection colleciton of thumbnail defintions + */ + public List getThumbnailDefinitions() + { + return new ArrayList(this.thumbnailDefinitions.values()); + } + + /** + * + * @param mimetype + * @return + */ + public List getThumnailDefintions(String mimetype) + { + List result = this.mimetypeMap.get(mimetype);; + + if (result == null) + { + result = new ArrayList(7); + + for (ThumbnailDefinition thumbnailDefinition : this.thumbnailDefinitions.values()) + { + if (this.contentService.getTransformer( + mimetype, + thumbnailDefinition.getMimetype(), + thumbnailDefinition.getTransformationOptions()) != null) + { + result.add(thumbnailDefinition); + } + } + + this.mimetypeMap.put(mimetype, result); + } + + return result; + } + /** * Add a thumnail details * * @param thumbnailDetails thumbnail details */ - public void addThumbnailDetails(ThumbnailDetails thumbnailDetails) + public void addThumbnailDefinition(ThumbnailDefinition thumbnailDetails) { String thumbnailName = thumbnailDetails.getName(); if (thumbnailName == null) @@ -64,17 +125,17 @@ public class ThumbnailRegistry throw new ThumbnailException("When adding a thumbnail details object make sure the name is set."); } - this.thumbnailDetails.put(thumbnailName, thumbnailDetails); + this.thumbnailDefinitions.put(thumbnailName, thumbnailDetails); } /** - * Get the details of a named thumbnail + * Get the definition of a named thumbnail * * @param thumbnailNam the thumbnail name * @return ThumbnailDetails the details of the thumbnail */ - public ThumbnailDetails getThumbnailDetails(String thumbnailName) + public ThumbnailDefinition getThumbnailDefinition(String thumbnailName) { - return this.thumbnailDetails.get(thumbnailName); + return this.thumbnailDefinitions.get(thumbnailName); } } diff --git a/source/java/org/alfresco/repo/thumbnail/ThumbnailServiceImplTest.java b/source/java/org/alfresco/repo/thumbnail/ThumbnailServiceImplTest.java index 6158b987c3..344fd54cde 100644 --- a/source/java/org/alfresco/repo/thumbnail/ThumbnailServiceImplTest.java +++ b/source/java/org/alfresco/repo/thumbnail/ThumbnailServiceImplTest.java @@ -322,7 +322,7 @@ public class ThumbnailServiceImplTest extends BaseAlfrescoSpringTest { final NodeRef jpgOrig = createOrigionalContent(this.folder, MimetypeMap.MIMETYPE_IMAGE_JPEG); - ThumbnailDetails details = this.thumbnailService.getThumbnailRegistry().getThumbnailDetails("medium"); + ThumbnailDefinition details = this.thumbnailService.getThumbnailRegistry().getThumbnailDefinition("medium"); final NodeRef thumbnail = this.thumbnailService.createThumbnail(jpgOrig, ContentModel.PROP_CONTENT, details.getMimetype(), details.getTransformationOptions(), details.getName()); setComplete(); @@ -342,8 +342,10 @@ public class ThumbnailServiceImplTest extends BaseAlfrescoSpringTest } }); - Thread.sleep(100000); + // TODO + // this test should wait for the async action to run .. will need to commit transaction for that thou! + //Thread.sleep(1000); } } @@ -353,10 +355,14 @@ public class ThumbnailServiceImplTest extends BaseAlfrescoSpringTest { NodeRef jpgOrig = createOrigionalContent(this.folder, MimetypeMap.MIMETYPE_IMAGE_JPEG); NodeRef gifOrig = createOrigionalContent(this.folder, MimetypeMap.MIMETYPE_IMAGE_GIF); + NodeRef pdfOrig = createOrigionalContent(this.folder, MimetypeMap.MIMETYPE_PDF); + NodeRef docOrig = createOrigionalContent(this.folder, MimetypeMap.MIMETYPE_WORD); Map model = new HashMap(2); model.put("jpgOrig", jpgOrig); model.put("gifOrig", gifOrig); + model.put("pdfOrig", pdfOrig); + model.put("docOrig", docOrig); ScriptLocation location = new ClasspathScriptLocation("org/alfresco/repo/thumbnail/script/test_thumbnailAPI.js"); this.scriptService.executeScript(location, model); diff --git a/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java b/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java index d09cce3b31..38d7919e21 100644 --- a/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java +++ b/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java @@ -90,7 +90,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase // Get the details of the thumbnail ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry(); - ThumbnailDetails details = registry.getThumbnailDetails(thumbnailName); + ThumbnailDefinition details = registry.getThumbnailDefinition(thumbnailName); if (details == null) { // Throw exception diff --git a/source/java/org/alfresco/repo/thumbnail/script/ScriptThumbnailService.java b/source/java/org/alfresco/repo/thumbnail/script/ScriptThumbnailService.java index 0d1f779382..e2f4e45a63 100644 --- a/source/java/org/alfresco/repo/thumbnail/script/ScriptThumbnailService.java +++ b/source/java/org/alfresco/repo/thumbnail/script/ScriptThumbnailService.java @@ -25,7 +25,7 @@ package org.alfresco.repo.thumbnail.script; import org.alfresco.repo.jscript.BaseScopableProcessorExtension; -import org.alfresco.repo.thumbnail.ThumbnailDetails; +import org.alfresco.repo.thumbnail.ThumbnailDefinition; import org.alfresco.service.ServiceRegistry; @@ -57,7 +57,7 @@ public class ScriptThumbnailService extends BaseScopableProcessorExtension */ public boolean isThumbnailNameRegistered(String thumbnailName) { - return (this.serviceRegistry.getThumbnailService().getThumbnailRegistry().getThumbnailDetails(thumbnailName) != null); + return (this.serviceRegistry.getThumbnailService().getThumbnailRegistry().getThumbnailDefinition(thumbnailName) != null); } /** @@ -71,7 +71,7 @@ public class ScriptThumbnailService extends BaseScopableProcessorExtension public String getPlaceHolderResourcePath(String thumbnailName) { String result = null; - ThumbnailDetails details = this.serviceRegistry.getThumbnailService().getThumbnailRegistry().getThumbnailDetails(thumbnailName); + ThumbnailDefinition details = this.serviceRegistry.getThumbnailService().getThumbnailRegistry().getThumbnailDefinition(thumbnailName); if (details != null) { result = details.getPlaceHolderResourcePath(); diff --git a/source/java/org/alfresco/repo/thumbnail/script/test_thumbnailAPI.js b/source/java/org/alfresco/repo/thumbnail/script/test_thumbnailAPI.js index c938a8d274..07aadeef6c 100644 --- a/source/java/org/alfresco/repo/thumbnail/script/test_thumbnailAPI.js +++ b/source/java/org/alfresco/repo/thumbnail/script/test_thumbnailAPI.js @@ -23,6 +23,18 @@ function testThumbnailService() test.assertNotNull(thumbnailService.getPlaceHolderResourcePath("medium")); } +function testGetThumbnailDefintions() +{ + var defs = jpgOrig.getThumbnailDefintions(); + //test.assertTrue(Array.contains(defs, "Medium")); + //test.assertFalse(Array.contains(defs, "WebPreview")); + + defs = pdfOrig.getThumbnailDefintions(); + //test.assertFalse(Array.contains(defs, "Medium")); + //test.assertTrue(Array.contains(defs, "WebPreview")); +} + // Execute the tests testCreateThumbnail(); -testThumbnailService(); \ No newline at end of file +testThumbnailService(); +testGetThumbnailDefintions(); \ No newline at end of file diff --git a/source/java/org/alfresco/service/cmr/thumbnail/ThumbnailService.java b/source/java/org/alfresco/service/cmr/thumbnail/ThumbnailService.java index 8b0b148689..5bc82730a6 100644 --- a/source/java/org/alfresco/service/cmr/thumbnail/ThumbnailService.java +++ b/source/java/org/alfresco/service/cmr/thumbnail/ThumbnailService.java @@ -63,7 +63,7 @@ public interface ThumbnailService * The returned node reference is to the 'tn:thumbnail' content node that contains * the thumnail content in the standard 'cm:content' property. * - * @see org.alfresco.service.cmr.thumnail.ThumbnailDetails + * @see org.alfresco.service.cmr.thumnail.ThumbnailDefinition * * @param node the source content node * @param contentProperty the content property