You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2012/09/24 23:00:16 UTC

svn commit: r1389574 - in /chemistry/opencmis/trunk: chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/ chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/ chemistry-opencmis-server/ch...

Author: jens
Date: Mon Sep 24 21:00:15 2012
New Revision: 1389574

URL: http://svn.apache.org/viewvc?rev=1389574&view=rev
Log:
InMemory: start with rendition support (not yet working)

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/resources/image.jpg   (with props)
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/repository.properties
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/log4j.properties
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/repository.properties
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/repository.properties?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/repository.properties (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-bridge/chemistry-opencmis-bridge/src/main/webapp/WEB-INF/classes/repository.properties Mon Sep 24 21:00:15 2012
@@ -53,7 +53,7 @@ service.class=org.apache.chemistry.openc
 #
 ###########################################################
 
-forwarding.binding.org.apache.chemistry.opencmis.binding.spi.type=atompub
-forwarding.binding.org.apache.chemistry.opencmis.binding.atompub.url=http://cmis.alfresco.com/cmisatom
+forwarding.binding.org.apache.chemistry.opencmis.binding.spi.type=browser
+forwarding.binding.org.apache.chemistry.opencmis.binding.browser.url=http://localhost:8080/inmemory/browser
 forwarding.binding.org.apache.chemistry.opencmis.binding.compression=true
 forwarding.binding.org.apache.chemistry.opencmis.binding.cookies=true

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml Mon Sep 24 21:00:15 2012
@@ -118,10 +118,18 @@
 		<servlet-class>org.apache.chemistry.opencmis.server.impl.browser.CmisBrowserBindingServlet</servlet-class>
 		<init-param>
 			<param-name>callContextHandler</param-name>
-			<param-value>org.apache.chemistry.opencmis.server.impl.browser.token.TokenCallContextHandler</param-value>
+			<param-value>org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler</param-value>
+			
 		</init-param>
 		<load-on-startup>2</load-on-startup>
 	</servlet>
+	<servlet>
+		<description>
+		</description>
+		<display-name>FilterBridgeServlet</display-name>
+		<servlet-name>FilterBridgeServlet</servlet-name>
+		<servlet-class>org.apache.chemistry.opencmis.filterbridge.FilterBridgeServlet</servlet-class>
+	</servlet>
 
 	<servlet-mapping>
 		<servlet-name>cmisws</servlet-name>
@@ -137,7 +145,6 @@
 		<servlet-name>cmisbrowser</servlet-name>
 		<url-pattern>/browser/*</url-pattern>
 	</servlet-mapping>
-
 	<session-config>
 		<session-timeout>60</session-timeout>
 	</session-config>

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/InMemoryObjectServiceImpl.java Mon Sep 24 21:00:15 2012
@@ -448,12 +448,16 @@ public class InMemoryObjectServiceImpl e
     public List<RenditionData> getRenditions(CallContext context, String repositoryId, String objectId,
             String renditionFilter, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
 
-        // TODO to be completed if renditions are implemented
         LOG.debug("start getRenditions()");
-        validator.getRenditions(context, repositoryId, objectId, extension);
+        StoredObject so = validator.getRenditions(context, repositoryId, objectId, extension);
 
+        if (so == null) {
+            throw new CmisObjectNotFoundException("Unknown object id: " + objectId);
+        }
+
+        List<RenditionData> renditions = so.getRenditions(renditionFilter, maxItems==null ? 0 : maxItems.longValue(), skipCount==null ? 0: skipCount.longValue());
         LOG.debug("stop getRenditions()");
-        return null;
+        return renditions;
     }
 
     public ObjectData moveObject(CallContext context, String repositoryId, Holder<String> objectId,
@@ -1010,12 +1014,17 @@ public class InMemoryObjectServiceImpl e
     }
 
     private static ContentStream getContentStream(StoredObject so, String streamId, BigInteger offset, BigInteger length) {
-        if (streamId != null) {
-            return null;
-        }
+        ContentStream csd = null;
         long lOffset = offset == null ? 0 : offset.longValue();
         long lLength = length == null ? -1 : length.longValue();
-        ContentStream csd = ((Content) so).getContent(lOffset, lLength);
+        
+        if (streamId == null) {
+            csd = ((Content) so).getContent(lOffset, lLength);
+            return csd;
+        } else if (streamId.endsWith("-rendition")) {
+            csd = so.getRenditionContent(streamId, lOffset, lLength);
+        }
+        
         return csd;
     }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/api/StoredObject.java Mon Sep 24 21:00:15 2012
@@ -25,9 +25,11 @@ import java.util.Map;
 
 import org.apache.chemistry.opencmis.commons.data.Acl;
 import org.apache.chemistry.opencmis.commons.data.AllowableActions;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
 import org.apache.chemistry.opencmis.commons.data.ObjectList;
 import org.apache.chemistry.opencmis.commons.data.PropertyData;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 
@@ -40,6 +42,18 @@ import org.apache.chemistry.opencmis.com
  * @author Jens
  */
 
+/**
+ * @author d058463
+ *
+ */
+/**
+ * @author d058463
+ *
+ */
+/**
+ * @author d058463
+ *
+ */
 public interface StoredObject {
 
     /**
@@ -268,5 +282,32 @@ public interface StoredObject {
      * get the allowable actions  of the object
      */
 	AllowableActions getAllowableActions(String user);
+	
+    /**
+     * get the rendition this objects supports
+     * 
+     * @param renditionFilter
+     * @param maxItems
+     * @param skipCount
+     * @param extension
+     * @return
+     *      List of renditions or null if no renditions are available for this object
+     */
+    public List<RenditionData> getRenditions(String renditionFilter,
+            long maxItems, long skipCount);
+    
+    /**
+     * get the rendition of this object
+     * 
+     * @param streamId
+     *      stream if of rendition
+     * @param offset
+     *      offset in rendition content
+     * @param length
+     *      length of rendition content
+     * @return
+     *     ContentStream containing the rendition
+     */
+    public ContentStream getRenditionContent(String streamId, long offset, long length);
 
 }
\ No newline at end of file

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentImpl.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/DocumentImpl.java Mon Sep 24 21:00:15 2012
@@ -20,12 +20,16 @@ package org.apache.chemistry.opencmis.in
 
 import java.io.IOException;
 import java.math.BigInteger;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
 import org.apache.chemistry.opencmis.commons.data.PropertyData;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.RenditionDataImpl;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 import org.apache.chemistry.opencmis.inmemory.ConfigConstants;
 import org.apache.chemistry.opencmis.inmemory.ConfigurationSettings;
@@ -48,6 +52,12 @@ public class DocumentImpl extends Abstra
     private static final Logger LOG = LoggerFactory.getLogger(AbstractSingleFilingImpl.class.getName());
     private final Long MAX_CONTENT_SIZE_KB = ConfigurationSettings.getConfigurationValueAsLong(ConfigConstants.MAX_CONTENT_SIZE_KB);
 
+    public static final int IMG_HEIGHT = 100;
+    public static final int IMG_WIDTH = 100;
+    public static final String RENDITION_MIME_TYPE = "image/jpeg";
+    public static final String RENDITION_SUFFIX = "-rendition"
+            ;
+
     DocumentImpl(ObjectStoreImpl objStore) { // visibility should be package
         super(objStore);
     }
@@ -165,4 +175,48 @@ public class DocumentImpl extends Abstra
         return null != fContent;
     }
 
+    @Override
+    public List<RenditionData> getRenditions(String renditionFilter,
+            long maxItems, long skipCount) {
+
+        String tokenizer = "[\\s;]";                        
+        String[] formats = renditionFilter.split(tokenizer);
+        boolean isImageRendition = testRenditionFilterForImage(formats);
+        if (isImageRendition) {
+            List<RenditionData> renditions = new ArrayList<RenditionData>(1);
+            RenditionDataImpl rendition = new RenditionDataImpl();
+            rendition.setBigHeight(BigInteger.valueOf(IMG_HEIGHT));
+            rendition.setBigWidth(BigInteger.valueOf(IMG_WIDTH));
+            rendition.setKind("cmis:thumbnail");
+            rendition.setMimeType(RENDITION_MIME_TYPE);
+            rendition.setRenditionDocumentId(getId());
+            rendition.setStreamId(getId() + RENDITION_SUFFIX);
+            rendition.setBigLength(BigInteger.valueOf(-1L));
+            renditions.add(rendition);
+            return renditions;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public ContentStream getRenditionContent(String streamId, long offset, long length) {        
+        ImageThumbnailGenerator generator = new ImageThumbnailGenerator(getContent(0L, -1L).getStream());
+        return generator.getRendition(IMG_WIDTH, IMG_HEIGHT);
+    }
+
+    protected boolean testRenditionFilterForImage(String[] formats) {
+        return arrayContainsString(formats, "*")  || arrayContainsString(formats, "image/*") 
+                || arrayContainsString(formats, "image/jpeg") ;
+    }
+
+    private boolean arrayContainsString(String[] formats, String val) {
+        for (String s : formats) {
+            if (val.equals(s))
+                return true;            
+        }
+        return false;
+    }
+
+
 }

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java?rev=1389574&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java Mon Sep 24 21:00:15 2012
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.chemistry.opencmis.inmemory.storedobj.impl;
+
+import java.awt.AlphaComposite;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+
+import javax.imageio.ImageIO;
+
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
+
+public class ImageThumbnailGenerator {
+
+    private static final String RENDITION_MIME_TYPE = "image/jpeg";;
+    private InputStream image;
+
+    public ImageThumbnailGenerator(InputStream imageContent) {
+        this.image = imageContent;
+    }
+
+    public ContentStream getRendition(int width, int height) {
+        byte[] thumbnail;
+        try {
+            thumbnail = scaleImage(image, width, height);
+            ContentStreamImpl cs = new ContentStreamImpl();
+            cs.setFileName("thumbnail.jpg");
+            cs.setMimeType(RENDITION_MIME_TYPE);
+            cs.setStream(new ByteArrayInputStream(thumbnail));
+            cs.setLength(BigInteger.valueOf(thumbnail.length));
+            return cs;
+        } catch (IOException e) {
+            throw new CmisRuntimeException("Failed to generate thumbnail", e);
+        }
+    }
+
+    private byte[] scaleImage(InputStream stream, int width, int height) throws IOException {
+        
+        BufferedImage originalImage = ImageIO.read(stream);
+
+        BufferedImage resizedImage = new BufferedImage(width, height, originalImage.getType()); 
+        //        ColorSpace.TYPE_RGB);
+        Graphics2D g = resizedImage.createGraphics();
+
+        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+     
+        g.drawImage(originalImage, 0, 0, width, height, null);
+        g.dispose();    
+        g.setComposite(AlphaComposite.Src);
+     
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        boolean ok = ImageIO.write(resizedImage, "JPG", os);
+        if (ok)
+            return os.toByteArray();
+        else
+            return null;
+    }
+
+}

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoreManagerImpl.java Mon Sep 24 21:00:15 2012
@@ -353,7 +353,7 @@ public class StoreManagerImpl implements
         caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.ANYTIME);
         caps.setCapabilityJoin(CapabilityJoin.NONE);
         caps.setCapabilityQuery(CapabilityQuery.BOTHCOMBINED);
-        caps.setCapabilityRendition(CapabilityRenditions.NONE);
+        caps.setCapabilityRendition(CapabilityRenditions.READ);
         caps.setIsPwcSearchable(false);
         caps.setIsPwcUpdatable(true);
         caps.setSupportsGetDescendants(true);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java Mon Sep 24 21:00:15 2012
@@ -24,17 +24,17 @@ import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 import java.util.Map.Entry;
+import java.util.TimeZone;
 
 import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.data.Acl;
 import org.apache.chemistry.opencmis.commons.data.AllowableActions;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
 import org.apache.chemistry.opencmis.commons.data.ObjectList;
 import org.apache.chemistry.opencmis.commons.data.PropertyData;
-import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
-import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 import org.apache.chemistry.opencmis.inmemory.DataObjectCreator;
@@ -398,7 +398,6 @@ public class StoredObjectImpl implements
 			String filter, Boolean includeAllowableActions,
 			BigInteger maxItems, BigInteger skipCount,
 			ExtensionsData extension, String user) {
-		// TODO Auto-generated method stub
 		return null;
 	}
 
@@ -407,4 +406,11 @@ public class StoredObjectImpl implements
 		return actions;
 	}
 
+    public List<RenditionData> getRenditions(String renditionFilter, long maxItems, long skipCount) {
+        return null;
+    }
+
+    public ContentStream getRenditionContent(String streamId, long offset, long length) {
+        return null;
+    }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/log4j.properties
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/log4j.properties?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/log4j.properties (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/log4j.properties Mon Sep 24 21:00:15 2012
@@ -35,5 +35,5 @@ log4j.appender.O.layout=org.apache.log4j
 log4j.appender.R.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c: %m%n
 log4j.appender.O.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c: %m%n
 
-log4j.logger.org.apache.chemistry.opencmis.util=INFO
-log4j.logger.org.apache.chemistry.opencmis.server.support.filter=INFO
\ No newline at end of file
+# log4j.logger.org.apache.chemistry.opencmis.inmemory=DEBUG
+# log4j.logger.org.apache.chemistry.opencmis.server.support.filter=INFO
\ No newline at end of file

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java?rev=1389574&r1=1389573&r2=1389574&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/ObjectServiceTest.java Mon Sep 24 21:00:15 2012
@@ -25,6 +25,10 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -43,6 +47,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
 import org.apache.chemistry.opencmis.commons.data.Properties;
 import org.apache.chemistry.opencmis.commons.data.PropertyData;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.Action;
@@ -62,15 +67,17 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
 import org.apache.chemistry.opencmis.commons.spi.Holder;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.ContentStreamDataImpl;
+import org.apache.chemistry.opencmis.inmemory.storedobj.impl.DocumentImpl;
 import org.apache.chemistry.opencmis.inmemory.types.InMemoryDocumentTypeDefinition;
 import org.apache.chemistry.opencmis.inmemory.types.InMemoryFolderTypeDefinition;
 import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
 import org.apache.chemistry.opencmis.util.repository.ObjectGenerator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.omg.CORBA_2_3.portable.OutputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author Jens
@@ -972,7 +979,82 @@ public class ObjectServiceTest extends A
         }
     }
 
+    @Test
+    public void testRendition() {
+        // upload an image as JPEG picture
+        log.info("starting testRendition() ...");
+        final String JPEG = "image/jpeg";
+        
+        try {
+            InputStream imageStream = this.getClass().getResourceAsStream("/image.jpg");
+            assertNotNull("Test setup failure no 'image.jpg' in test resources, getResourceAsStream failed", imageStream);
+            String id = createDocumentFromStream("TestJpegImage", fRootFolderId, DOCUMENT_TYPE_ID, imageStream,
+                    JPEG);            
+
+            assertNotNull (id);
+            String renditionFilter = "*";
+            List<RenditionData> renditions = fObjSvc.getRenditions(fRepositoryId, id, renditionFilter, null, null, null);
+            assertNotNull(renditions);
+            assertEquals(1, renditions.size());
+            RenditionData rd = renditions.get(0);
+            assertEquals(JPEG, rd.getMimeType());
+            assertEquals("cmis:thumbnail", rd.getKind());
+            assertEquals(id, rd.getRenditionDocumentId());
+            assertNotNull(rd.getBigHeight());
+            assertNotNull(rd.getBigWidth());
+            assertEquals(DocumentImpl.IMG_HEIGHT, rd.getBigHeight().longValue());
+            assertEquals(DocumentImpl.IMG_WIDTH, rd.getBigWidth().longValue());
+            assertNotNull(rd.getStreamId());
+            ContentStream renditionContent = fObjSvc.getContentStream(fRepositoryId, id, rd.getStreamId(), null, null, null);
+            assertEquals(rd.getMimeType(), renditionContent.getMimeType());
+            readThumbnailStream(renditionContent.getStream());
+        } catch (Exception e) {
+            log.error("testRendition failed with exception ", e);
+            fail("testRendition failed with exceetion " + e);
+        }
+        log.info("... testRendition finished.");
+   
+    }
+
+    protected String createDocumentFromStream(String name, String folderId, String typeId, InputStream is,
+            String contentType) throws IOException {
+
+        Properties props = createDocumentProperties(name, typeId);
+
+        ContentStreamDataImpl content = new ContentStreamDataImpl(0);
+        content.setFileName(name);
+        content.setMimeType(contentType);
+
+        ByteArrayOutputStream ba = new ByteArrayOutputStream();
+        byte[] buffer = new byte [65536];
+        int noBytesRead = 0;
+
+        while ((noBytesRead = is.read(buffer)) >=0 ) {
+            ba.write(buffer, 0, noBytesRead);
+        }
+        
+        content.setContent(new ByteArrayInputStream(ba.toByteArray()));
+
+        String id = fObjSvc.createDocument(fRepositoryId, props, folderId, content, VersioningState.NONE, null,
+                null, null, null);
+        return id;
+    }
 
+    private void readThumbnailStream(InputStream stream) {
+        
+        byte[] buffer = new byte [65536];
+        int noBytesRead = 0;
+        int count = 0;
+        try {
+            while ((noBytesRead = stream.read(buffer)) >=0 ) {
+                count += noBytesRead;
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail("Reading rendition stream failed with exception " + e);
+        }
+        assertTrue(count > 0);
+    }
 
     private static void verifyAllowableActionsDocument(Set<Action> actions, boolean isVersioned, boolean hasContent) {
         assertTrue(actions.contains(Action.CAN_DELETE_OBJECT));

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/resources/image.jpg
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/resources/image.jpg?rev=1389574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/resources/image.jpg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream