/*
* (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Florent Guillaume
*/
package org.nuxeo.ecm.core.opencmis.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import org.apache.chemistry.opencmis.commons.data.CacheHeaderContentStream;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.RenditionData;
import org.apache.chemistry.opencmis.commons.impl.Constants;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoCmisService;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
@RunWith(FeaturesRunner.class)
@Features({ CmisFeature.class, CmisFeatureConfiguration.class })
@RepositoryConfig(cleanup = Granularity.METHOD)
public class TestCmisBindingRenditions extends TestCmisBindingBase {
private static final int THUMBNAIL_SIZE = 394;
@Inject
protected CoreSession coreSession;
@Before
public void setUp() throws Exception {
setUpBinding(coreSession);
setUpData(coreSession);
}
@After
public void tearDown() {
tearDownBinding();
}
protected ObjectData getObjectByPath(String path) {
return objService.getObjectByPath(repositoryId, path, null, null, null, null, null, null, null);
}
public static final Comparator<RenditionData> RENDITION_CMP = new Comparator<RenditionData>() {
@Override
public int compare(RenditionData a, RenditionData b) {
return a.getStreamId().compareTo(b.getStreamId());
};
};
@Test
public void testRenditions() throws Exception {
ObjectData ob = getObjectByPath("/testfolder1/testfile1");
// list renditions
List<RenditionData> renditions = objService.getRenditions(repositoryId, ob.getId(), "*", null, null, null);
assertEquals(4, renditions.size());
Collections.sort(renditions, RENDITION_CMP);
RenditionData ren;
ren = renditions.get(0);
assertEquals("cmis:thumbnail", ren.getKind());
assertEquals("nuxeo:icon", ren.getStreamId());
assertEquals("image/png", ren.getMimeType());
assertTrue(ren.getTitle().endsWith(".png"));
ren = renditions.get(1);
assertEquals("nuxeo:rendition", ren.getKind());
assertEquals("nuxeo:rendition:pdf", ren.getStreamId());
assertEquals("application/pdf", ren.getMimeType());
assertEquals("label.rendition.pdf", ren.getTitle());
ContentStream cs;
cs = objService.getContentStream(repositoryId, ob.getId(), "nuxeo:icon", null, null, null);
assertEquals("image/png", cs.getMimeType());
assertEquals("test.png", cs.getFileName());
assertEquals(THUMBNAIL_SIZE, cs.getBigLength().longValue());
assertTrue(cs instanceof CacheHeaderContentStream);
CacheHeaderContentStream chcs;
chcs = (CacheHeaderContentStream) cs;
assertEquals(DigestUtils.md5Hex(chcs.getStream()), chcs.getETag());
cs = objService.getContentStream(repositoryId, ob.getId(), "nuxeo:rendition:pdf", null, null, null);
assertEquals("application/pdf", cs.getMimeType());
assertEquals("testfile.pdf", cs.getFileName());
assertTrue(cs instanceof CacheHeaderContentStream);
chcs = (CacheHeaderContentStream) cs;
assertEquals(DigestUtils.md5Hex(chcs.getStream()), chcs.getETag());
}
@Test
public void testRenditionFilter() throws Exception {
ObjectData ob = getObjectByPath("/testfolder1/testfile1");
// cmis:none
List<RenditionData> renditions = objService.getRenditions(repositoryId, ob.getId(), Constants.RENDITION_NONE,
null, null, null);
assertEquals(0, renditions.size());
// null is cmis:none
renditions = objService.getRenditions(repositoryId, ob.getId(), null, null, null, null);
assertEquals(0, renditions.size());
// specific kind
renditions = objService.getRenditions(repositoryId, ob.getId(), "cmis:thumbnail", null, null, null);
assertEquals(1, renditions.size());
assertEquals("nuxeo:icon", renditions.get(0).getStreamId());
// non-existent mimetype
renditions = objService.getRenditions(repositoryId, ob.getId(), "foo/bar", null, null, null);
assertEquals(0, renditions.size());
// specific mimetype
renditions = objService.getRenditions(repositoryId, ob.getId(), "application/pdf", null, null, null);
assertEquals(1, renditions.size());
assertEquals("nuxeo:rendition:pdf", renditions.get(0).getStreamId());
// wildcard mimetype
renditions = objService.getRenditions(repositoryId, ob.getId(), "application/*", null, null, null);
assertEquals(2, renditions.size());
assertEquals("nuxeo:rendition:pdf", renditions.get(0).getStreamId());
// several kind / mimetypes
renditions = objService.getRenditions(repositoryId, ob.getId(), "foo/*,foo/bar,foo", null, null, null);
assertEquals(0, renditions.size());
renditions = objService.getRenditions(repositoryId, ob.getId(), "application/*,foo/bar,foo", null, null, null);
assertEquals(2, renditions.size());
assertEquals("nuxeo:rendition:pdf", renditions.get(0).getStreamId());
renditions = objService.getRenditions(repositoryId, ob.getId(), "application/*,cmis:thumbnail", null, null,
null);
assertEquals(3, renditions.size());
}
}