Dave Ward ebb756825e Merged V4.0-BUG-FIX to HEAD
37121: ALF-12796: Ensure that only visible nodes are shown via Category search in Repository view when libraryRoot is changed from company home.
   37124: ALF-14220: Parallel reviews now takes into account maximum percentage of approval rate possible when deciding to add new task
   37128: Fixes: ALF-14322. Translation update from Gloria
   37135: Fix for ALF-13993 It fails to find documents whose tag is longer than 255 characters
   - TAGS are truncated as QNAMES - default to 255.
   - TAGS longer then 255 characters can be created.
   - TAGS equal in the first 255 characters can not be created (as they would be treated as duplicates by search)
   37181: Merged V3.4-BUG-FIX to V4.0-BUG-FIX
     Merge HEAD to V3.4-BUG-FIX
      33880: ALF-12777 / ALF-14259: MMT should not install AMPs which override pre-existing files in the war file, unless -force is provided. The MMT is moving toward more of a validation phase (checks things, calculate changes) then an execution phase (makes the changes).
   37192: Merged V3.4-BUG-FIX to V4.0-BUG-FIX
      37081: ALF-13054 Rule action "Transform and copy image" fails if transformation cannot be performed by transformer.ImageMagick
         - (Problem 3 only) - TransformerDebug is now issued from ContentService.isTransformable(...) and ImageTransformActionExecuter.doTransform(...)
      37088: ALF-10217: Updated parse-args.lib.js to support sites having two parent nodes.
      37143: Fixes: ALF-14322: Translation update from Gloria.
      37145: ALF-14303 Alfresco crashes when viewing doclib / previewing - PDF with CMap 
         Adding temporary workaround:
            Modified fail over transformers for PDF to PNG to be PDFRenderer, ImageMagick (new) and the PDFBox. If Ghostscript is installed on the server,
            ImageMagick will be able to perform the transformation. If not installed, it fails with an unsupported transformation and fails over to PDFBox as it
            does today and will encounter this issue if the supplied PDF. If this issues takes place, install Ghostscript. 
      37190: Merged PATCHES/V3.4.6 to V3.4-BUG-FIX
         37189: ALF-13404: Performance: 'Content I'm Editing' dashlet is slow to render when there is lots of data/sites
            - Additional query improvement by Pavel
      37191: ALF-13379: Fix IsImmutableProperty to react to locks again and stop unit test from confusing a lock with a checkout
   37193: Merged V4.0 to V4.0-BUG-FIX
      37070: ALF-14310: alfresco-enterprise-webeditor-4.0.2.zip fails with HTTP Status 500
      - Due to more incomplete dependency updates
      37146: (RECORD ONLY) ALF-13745: Merged V3.4-BUG-FIX (3.4.10) to V4.0 (4.0.2)
         37145: ALF-14303 Alfresco crashes when viewing doclib / previewing - PDF with CMap 
            Adding temporary workaround:
               Modified fail over transformers for PDF to PNG to be PDFRenderer, ImageMagick (new) and the PDFBox. If Ghostscript is installed on the server,
               ImageMagick will be able to perform the transformation. If not installed, it fails with an unsupported transformation and fails over to PDFBox as it
               does today and will encounter this issue if the supplied PDF. If this issues takes place, install Ghostscript. 


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@37196 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2012-05-30 08:27:10 +00:00

374 lines
14 KiB
Java

/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.cmis.renditions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.alfresco.cmis.CMISRendition;
import org.alfresco.cmis.mapping.BaseCMISTest;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.transform.magick.ImageTransformationOptions;
import org.alfresco.repo.thumbnail.ThumbnailDefinition;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NoTransformerException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.TransformationOptions;
/**
* @author Stas Sokolovsky
*/
public class CMISRenditionServiceTest extends BaseCMISTest
{
private static final String[] THUMBNAIL_NAMES = new String[] { "doclib", "webpreview", "imgpreview" };
private static final String[] THUMBNAIL_KINDS = new String[] { "cmis:thumbnail", "alf:webpreview", "alf:webpreview" };
private NodeRef document;
private List<CMISRendition> documentRenditions = new ArrayList<CMISRendition>();
private CMISRendition icon16Rendition = new CMISRenditionImpl(null, "alf:icon16", "image/gif", "alf:icon16", 16, 16, null, null, null);
private CMISRendition icon32Rendition = new CMISRenditionImpl(null, "alf:icon32", "image/gif", "alf:icon32", 32, 32, null, null, null);
public void setUp() throws Exception
{
super.setUp();
String documentName = "TestDocument" + System.currentTimeMillis();
document = createDocument(documentName, "Test Content", MimetypeMap.MIMETYPE_PDF);
documentRenditions = new ArrayList<CMISRendition>();
for (int i = 0; i < THUMBNAIL_NAMES.length; ++i)
{
documentRenditions.add(createRendition(document, THUMBNAIL_NAMES[i], THUMBNAIL_KINDS[i]));
}
}
public void testGetAllRenditions() throws Exception
{
List<CMISRendition> receivedRenditions = cmisRenditionService.getRenditions(document, "*");
List<CMISRendition> expectedRenditions = new ArrayList<CMISRendition>();
expectedRenditions.addAll(documentRenditions);
expectedRenditions.add(icon16Rendition);
expectedRenditions.add(icon32Rendition);
assertRendiions(receivedRenditions, expectedRenditions);
}
public void testGetRenditionsByKind() throws Exception
{
testGetRenditionsByKind("cmis:thumbnail");
testGetRenditionsByKind("alf:webpreview");
testGetRenditionsByKind("alf:icon16");
testGetRenditionsByKind("alf:icon32");
testGetRenditionsByKind("alf:webpreview", "alf:icon32");
testGetRenditionsByKind("cmis:thumbnail", "alf:webpreview", "alf:icon16", "alf:icon32");
}
public void testGetRenditionsByMimetype() throws Exception
{
for (CMISRendition rendition : documentRenditions)
{
testGetRenditionsByMimetype(rendition.getMimeType());
}
testGetRenditionsByMimetype(icon16Rendition.getMimeType());
testGetRenditionsByMimetype(icon32Rendition.getMimeType());
String[] mimetypes = getDifferentMimetypes();
testGetRenditionsByMimetype(mimetypes);
}
public void testEmptyFilter() throws Exception
{
List<CMISRendition> receivedRenditions = cmisRenditionService.getRenditions(document, null);
assertTrue(receivedRenditions == null || receivedRenditions.size() == 0);
receivedRenditions = cmisRenditionService.getRenditions(document, "cmis:none");
assertTrue(receivedRenditions == null || receivedRenditions.size() == 0);
}
public void testRenditionsByBaseMimetype() throws Exception
{
String[] mimetypes = getDifferentMimetypes();
List<String> baseMimetypeFilters = new ArrayList<String>();
for (String mimetype : mimetypes)
{
String baseMimetype = getBaseType(mimetype);
String filter = baseMimetype + "/*";
baseMimetypeFilters.add(filter);
testGetRenditionsByMimetype(filter);
}
testGetRenditionsByMimetype(baseMimetypeFilters.toArray(new String[0]));
}
public void testMixedFilter() throws Exception
{
String[] mimetypes = getDifferentMimetypes();
testGetRenditions(THUMBNAIL_KINDS, mimetypes);
}
private void testGetRenditionsByMimetype(String... mimetypes) throws Exception
{
testGetRenditions(null, mimetypes);
}
private void testGetRenditionsByKind(String... kinds) throws Exception
{
testGetRenditions(kinds, null);
}
private void testGetRenditions(String[] kinds, String[] mimetypes) throws Exception
{
String filter = createFilter(kinds, mimetypes);
List<CMISRendition> receivedRenditions = cmisRenditionService.getRenditions(document, filter);
List<CMISRendition> expectedRenditions = new ArrayList<CMISRendition>();
if (kinds != null)
{
for (String kind : kinds)
{
expectedRenditions.addAll(getRenditionsByKind(kind));
}
}
if (mimetypes != null)
{
for (String mimetype : mimetypes)
{
expectedRenditions.addAll(getRenditionsByMimetype(mimetype));
}
}
assertRendiions(receivedRenditions, expectedRenditions);
}
protected void tearDown() throws Exception
{
fileFolderService.delete(document);
super.tearDown();
}
private CMISRendition createRendition(NodeRef nodeRef, String thumbnailName, String kind)
{
ThumbnailDefinition details = thumbnailService.getThumbnailRegistry().getThumbnailDefinition(thumbnailName);
NodeRef thumbnailNodeRef = thumbnailService.createThumbnail(nodeRef, ContentModel.PROP_CONTENT, details.getMimetype(), details.getTransformationOptions(), details
.getName());
CMISRenditionImpl rendition = new CMISRenditionImpl();
rendition.setStreamId(thumbnailNodeRef.toString());
rendition.setKind(kind);
rendition.setMimeType(details.getMimetype());
if (details.getTransformationOptions() instanceof ImageTransformationOptions)
{
ImageTransformationOptions imageOptions = (ImageTransformationOptions) details.getTransformationOptions();
rendition.setWidth(imageOptions.getResizeOptions().getWidth());
rendition.setHeight(imageOptions.getResizeOptions().getHeight());
}
return rendition;
}
private NodeRef createDocument(String documentName, String documentContent, String mimetype)
{
NodeRef textDocument = fileFolderService.create(rootNodeRef, "TEXT" + documentName, ContentModel.TYPE_CONTENT).getNodeRef();
ContentWriter contentWriter = fileFolderService.getWriter(textDocument);
contentWriter.setEncoding("UTF-8");
contentWriter.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
contentWriter.setLocale(Locale.ENGLISH);
contentWriter.putContent(documentContent);
ContentReader contentReader = fileFolderService.getReader(textDocument);
// contentReader will not be null as an exception will have been thrown if there was a problem
NodeRef document = fileFolderService.create(rootNodeRef, documentName, ContentModel.TYPE_CONTENT).getNodeRef();
contentWriter = fileFolderService.getWriter(document);
contentWriter.setEncoding("UTF-8");
contentWriter.setMimetype(mimetype);
contentWriter.setLocale(Locale.ENGLISH);
TransformationOptions options = new TransformationOptions();
options.setSourceNodeRef(textDocument);
try
{
contentService.transform(contentReader, contentWriter, options);
}
catch (NoTransformerException e)
{
// ignore
}
fileFolderService.delete(textDocument);
return document;
}
private void assertRendiions(List<CMISRendition> receivedRenditions, List<CMISRendition> expectedRenditions)
{
assertNotNull(receivedRenditions);
expectedRenditions = removeReplication(expectedRenditions);
assertTrue(receivedRenditions.size() == expectedRenditions.size());
for (CMISRendition rendition : receivedRenditions)
{
assertNotNull(rendition);
assertNotNull(rendition.getStreamId());
}
Collections.sort(receivedRenditions, renditionsComparator);
Collections.sort(expectedRenditions, renditionsComparator);
for (int i = 0; i < expectedRenditions.size(); ++i)
{
assertRendition(receivedRenditions.get(i), expectedRenditions.get(i));
}
}
private void assertRendition(CMISRendition receivedRendition, CMISRendition expectedRendition)
{
assertEquals(expectedRendition.getStreamId(), receivedRendition.getStreamId());
assertEquals(expectedRendition.getKind(), receivedRendition.getKind());
assertEquals(expectedRendition.getMimeType(), receivedRendition.getMimeType());
assertEquals(expectedRendition.getWidth(), receivedRendition.getWidth());
assertEquals(expectedRendition.getHeight(), receivedRendition.getHeight());
}
private List<CMISRendition> removeReplication(List<CMISRendition> renditions)
{
return new ArrayList<CMISRendition>(new HashSet<CMISRendition>(renditions));
}
private Comparator<CMISRendition> renditionsComparator = new Comparator<CMISRendition>()
{
public int compare(CMISRendition rendition1, CMISRendition rendition2)
{
return rendition1.getStreamId().compareTo(rendition2.getStreamId());
}
};
private List<CMISRendition> getRenditionsByKind(String kind)
{
return getRenditions(kind, null);
}
private List<CMISRendition> getRenditionsByMimetype(String mimetype)
{
return getRenditions(null, mimetype);
}
private List<CMISRendition> getRenditions(String kind, String mimetype)
{
List<CMISRendition> result = new ArrayList<CMISRendition>();
List<CMISRendition> allRenditions = new ArrayList<CMISRendition>(documentRenditions);
allRenditions.add(icon16Rendition);
allRenditions.add(icon32Rendition);
for (CMISRendition rendition : allRenditions)
{
if (isRenditionSatisfyConditions(rendition, kind, mimetype))
{
result.add(rendition);
}
}
return result;
}
private boolean isRenditionSatisfyConditions(CMISRendition rendition, String kind, String mimetype)
{
if (kind != null)
{
if (!kind.equals(rendition.getKind()))
{
return false;
}
}
if (mimetype != null)
{
if (mimetype.endsWith("/*"))
{
String baseMimetype = getBaseType(mimetype);
if (!rendition.getMimeType().startsWith(baseMimetype))
{
return false;
}
}
else if (!mimetype.equals(rendition.getMimeType()))
{
return false;
}
}
return true;
}
private String[] getDifferentMimetypes()
{
List<CMISRendition> allRenditions = new ArrayList<CMISRendition>(documentRenditions);
allRenditions.add(icon16Rendition);
allRenditions.add(icon32Rendition);
Set<String> mimetypes = new HashSet<String>();
for (CMISRendition rendition : allRenditions)
{
mimetypes.add(rendition.getMimeType());
}
return mimetypes.toArray(new String[0]);
}
private String getBaseType(String mimetype)
{
String baseMymetype = mimetype;
int subTypeIndex = mimetype.indexOf("/");
if (subTypeIndex > 0 || subTypeIndex < mimetype.length())
{
baseMymetype = mimetype.substring(0, subTypeIndex);
}
return baseMymetype;
}
private String createFilter(String[] kinds, String[] mimetypes)
{
StringBuilder filter = new StringBuilder();
if (kinds != null)
{
for (String kind : kinds)
{
filter.append(kind);
filter.append(",");
}
}
if (mimetypes != null)
{
for (String mimetype : mimetypes)
{
filter.append(mimetype);
filter.append(",");
}
}
filter.delete(filter.length() - 1, filter.length());
return filter.toString();
}
}