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/10/19 17:22:37 UTC

svn commit: r1400131 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src: main/java/org/apache/chemistry/opencmis/inmemory/server/ main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ main/resourc...

Author: jens
Date: Fri Oct 19 15:22:36 2012
New Revision: 1400131

URL: http://svn.apache.org/viewvc?rev=1400131&view=rev
Log:
Add basic rendition support for InMemory server (standard icons for office formats)

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-msword.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-pdf.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-excel.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-powerpoint.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/audio-x-generic.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/folder.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/image-x-generic.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-html.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-x-generic.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/video-x-generic.png   (with props)
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java
    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/impl/DocumentImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java
    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/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/StoredObjectImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/AbstractServiceTest.java
    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-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.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/AtomLinkInfoProvider.java?rev=1400131&r1=1400130&r2=1400131&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/server/AtomLinkInfoProvider.java Fri Oct 19 15:22:36 2012
@@ -18,6 +18,7 @@
  */
 package org.apache.chemistry.opencmis.inmemory.server;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.chemistry.opencmis.commons.data.ObjectData;
@@ -26,10 +27,13 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
 import org.apache.chemistry.opencmis.commons.data.ObjectList;
 import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
+import org.apache.chemistry.opencmis.commons.impl.server.RenditionInfoImpl;
 import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
+import org.apache.chemistry.opencmis.commons.server.RenditionInfo;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Content;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
 import org.apache.chemistry.opencmis.inmemory.storedobj.api.Filing;
@@ -125,7 +129,22 @@ public class AtomLinkInfoProvider {
         }
 
         // Renditions, currently not supported by in-memory provider
-        objInfo.setRenditionInfos(null);
+        List<RenditionData> renditions = so.getRenditions("*", 0, 0);
+        if (renditions == null || renditions.size() == 0)
+            objInfo.setRenditionInfos(null);
+        else {
+            List<RenditionInfo> infos = new ArrayList<RenditionInfo>();
+            for (RenditionData rendition : renditions) {
+                RenditionInfoImpl info = new RenditionInfoImpl();
+                info.setKind(rendition.getKind());
+                info.setId(rendition.getStreamId());
+                info.setContentType(rendition.getMimeType());
+                info.setLength(rendition.getBigLength());
+                info.setTitle(rendition.getTitle());
+                infos.add(info);
+            }
+            objInfo.setRenditionInfos(infos);
+        }
 
         // Relationships, currently not supported by in-memory provider
         objInfo.setSupportsRelationships(false);

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=1400131&r1=1400130&r2=1400131&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 Fri Oct 19 15:22:36 2012
@@ -342,7 +342,7 @@ public class InMemoryObjectServiceImpl e
             throw new CmisObjectNotFoundException("Unknown object id: " + objectId);
         }
 
-        if (!(so instanceof Content)) {
+        if (!(so instanceof Content) && objectId.endsWith("-rendition")) {
             throw new CmisConstraintException("Id" + objectId
                     + " does not refer to a document or version, but only those can have content");
         }

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=1400131&r1=1400130&r2=1400131&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 Fri Oct 19 15:22:36 2012
@@ -18,7 +18,10 @@
  */
 package org.apache.chemistry.opencmis.inmemory.storedobj.impl;
 
+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.List;
@@ -29,6 +32,7 @@ import org.apache.chemistry.opencmis.com
 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.exceptions.CmisRuntimeException;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.RenditionDataImpl;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 import org.apache.chemistry.opencmis.inmemory.ConfigConstants;
@@ -49,14 +53,10 @@ import org.slf4j.LoggerFactory;
 public class DocumentImpl extends AbstractMultiFilingImpl implements Document {
     private ContentStreamDataImpl fContent;
 
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractSingleFilingImpl.class.getName());
+    private static final Logger LOG = LoggerFactory.getLogger(DocumentImpl.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"
-            ;
+    public static final int THUMBNAIL_SIZE = 100;
 
     DocumentImpl(ObjectStoreImpl objStore) { // visibility should be package
         super(objStore);
@@ -184,16 +184,25 @@ public class DocumentImpl extends Abstra
             renditionFilter = "*";
         String[] formats = renditionFilter.split(tokenizer);
         boolean isImageRendition = testRenditionFilterForImage(formats);
+
         if (isImageRendition && fContent != null && hasRendition(null)) {
             List<RenditionData> renditions = new ArrayList<RenditionData>(1);
+            String mimeType = fContent.getMimeType();
             RenditionDataImpl rendition = new RenditionDataImpl();
-            rendition.setBigHeight(BigInteger.valueOf(IMG_HEIGHT));
-            rendition.setBigWidth(BigInteger.valueOf(IMG_WIDTH));
+            if (mimeType.equals("image/jpeg")) {
+                rendition.setBigHeight(BigInteger.valueOf(THUMBNAIL_SIZE));
+                rendition.setBigWidth(BigInteger.valueOf(THUMBNAIL_SIZE));
+                rendition.setMimeType(RENDITION_MIME_TYPE_JPEG);
+            } else {
+                rendition.setBigHeight(BigInteger.valueOf(ICON_SIZE));
+                rendition.setBigWidth(BigInteger.valueOf(ICON_SIZE));
+                rendition.setMimeType(RENDITION_MIME_TYPE_PNG);
+            }
             rendition.setKind("cmis:thumbnail");
-            rendition.setMimeType(RENDITION_MIME_TYPE);
             rendition.setRenditionDocumentId(getId());
             rendition.setStreamId(getId() + RENDITION_SUFFIX);
             rendition.setBigLength(BigInteger.valueOf(-1L));
+            rendition.setTitle(getName());
             renditions.add(rendition);
             return renditions;
         } else {
@@ -202,32 +211,105 @@ public class DocumentImpl extends Abstra
     }
 
     @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);
+    public ContentStream getRenditionContent(String streamId, long offset, long length) {     
+        if (null == fContent)
+            return null;
+        
+        String mimeType = fContent.getMimeType();
+        
+        try {
+            if (isImage(mimeType)) {
+                ImageThumbnailGenerator generator = new ImageThumbnailGenerator(getContent(0L, -1L).getStream());
+                return generator.getRendition(THUMBNAIL_SIZE, 0);
+            } else if (isAudio(mimeType)) {
+                return getIconFromResourceDir("/audio-x-generic.png");
+            } else if (isVideo(mimeType)) {
+                return getIconFromResourceDir("/video-x-generic.png");
+            } else if (isPDF(mimeType)) {
+                return getIconFromResourceDir("/application-pdf.png");
+            } else if (isWord(mimeType)) {
+                return getIconFromResourceDir("/application-msword.png");
+            } else if (isPowerpoint(mimeType)) {
+                return getIconFromResourceDir("/application-vnd.ms-powerpoint.png");
+            } else if (isExcel(mimeType)) {
+                return getIconFromResourceDir("/application-vnd.ms-excel.png");
+            } else if (isHtml(mimeType)) {
+                return getIconFromResourceDir("/text-html.png");
+            } else if (isPlainText(mimeType)) {
+                return getIconFromResourceDir("/text-x-generic.png");
+            } else
+                return null;
+        } catch (IOException e) {
+            LOG.error("Failed to generate rendition: ", e);
+            throw new CmisRuntimeException("Failed to generate rendition: " + e);
+        }
     }
     
     @Override
     public boolean hasRendition(String user) {
-        return null != fContent && fContent.getMimeType().startsWith("image/");
+        if (null == fContent)
+            return false;
+        
+        String mimeType = fContent.getMimeType();
+        
+        if (isImage(mimeType))
+            return true;
+        else if (isAudio(mimeType))
+            return true;
+        else if (isVideo(mimeType))
+            return true;
+        else if (isPDF(mimeType))
+            return true;
+        else if (isPowerpoint(mimeType))
+            return true;
+        else if (isExcel(mimeType))
+            return true;
+        else if (isWord(mimeType))
+            return true;
+        else if (isHtml(mimeType))
+            return true;
+        else if (isPlainText(mimeType))
+            return true;
+        else
+            return false;
     }
 
 
-    protected boolean testRenditionFilterForImage(String[] formats) {
-        if (formats.length == 1 && null != formats[0] && formats[0].equals("cmis:none"))
-            return false;
-        else
-            return arrayContainsString(formats, "*")  || arrayContainsString(formats, "image/*") 
-                || arrayContainsString(formats, "image/jpeg") ;
+    private boolean isImage(String mimeType) {
+        return mimeType.startsWith("image/");
     }
 
-    private boolean arrayContainsString(String[] formats, String val) {
-        for (String s : formats) {
-            if (val.equals(s))
-                return true;            
-        }
-        return false;
+    private boolean isWord(String mimeType) {
+        return mimeType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
     }
 
+    private boolean isExcel(String mimeType) {
+        return mimeType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+    }
+    
+    private boolean isPowerpoint(String mimeType) {
+        return mimeType.equals("application/vnd.openxmlformats-officedocument.presentationml.slideshow") ||
+        mimeType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation");
+    }
+    
+    private boolean isPDF(String mimeType) {
+        return mimeType.equals("application/pdf");
+    }
+    
+    private boolean isHtml(String mimeType) {
+       return mimeType.equals("text/html");
+    }
+    
+    private boolean isAudio(String mimeType) {
+        return mimeType.startsWith("audio/");
+    }
 
-}
+    private boolean isVideo(String mimeType) {
+        return mimeType.startsWith("video/");
+    }
+    
+    private boolean isPlainText(String mimeType) {
+        return mimeType.equals("text/plain");
+    }
+    
+ }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.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/FolderImpl.java?rev=1400131&r1=1400130&r2=1400131&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/FolderImpl.java Fri Oct 19 15:22:36 2012
@@ -21,6 +21,8 @@ package org.apache.chemistry.opencmis.in
  */
 
 
+import java.io.IOException;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -28,9 +30,13 @@ 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.PropertyData;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisNameConstraintViolationException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.RenditionDataImpl;
 import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
 import org.apache.chemistry.opencmis.inmemory.FilterParser;
 import org.apache.chemistry.opencmis.inmemory.NameValidator;
@@ -256,4 +262,42 @@ public class FolderImpl extends Abstract
         return null;
     }
 
+    public List<RenditionData> getRenditions(String renditionFilter, long maxItems, long skipCount) {
+        if (null==renditionFilter)
+            renditionFilter = "*";
+        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(ICON_SIZE));
+            rendition.setBigWidth(BigInteger.valueOf(ICON_SIZE));
+            rendition.setKind("cmis:thumbnail");
+            rendition.setMimeType(RENDITION_MIME_TYPE_PNG);
+            rendition.setRenditionDocumentId(getId());
+            rendition.setStreamId(getId() + RENDITION_SUFFIX);
+            rendition.setBigLength(BigInteger.valueOf(-1L));
+            rendition.setTitle(getName());
+            rendition.setRenditionDocumentId(getId());
+            renditions.add(rendition);
+            return renditions;
+        } else {
+            return null;
+        }
+    }
+
+    public ContentStream getRenditionContent(String streamId, long offset, long length) {
+        try {
+            return getIconFromResourceDir("/folder.png");
+        } catch (IOException e) {
+            LOG.error("Failed to generate rendition: ", e);
+            throw new CmisRuntimeException("Failed to generate rendition: " + e);
+        }
+    }
+
+    public boolean hasRendition(String user) {
+        return true;
+    }
 }

Modified: 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=1400131&r1=1400130&r2=1400131&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/storedobj/impl/ImageThumbnailGenerator.java Fri Oct 19 15:22:36 2012
@@ -38,10 +38,20 @@ public class ImageThumbnailGenerator {
 
     private static final String RENDITION_MIME_TYPE = "image/jpeg";;
     private InputStream image;
-
+    private int thumbWidth;
+    private int thumbHeight;
+    
     public ImageThumbnailGenerator(InputStream imageContent) {
         this.image = imageContent;
     }
+    
+    public int getWidth() {
+        return thumbWidth;
+    }
+    
+    public int getHeight() {
+        return thumbHeight;
+    }
 
     public ContentStream getRendition(int width, int height) {
         byte[] thumbnail;
@@ -58,10 +68,45 @@ public class ImageThumbnailGenerator {
         }
     }
 
+    
     private byte[] scaleImage(InputStream stream, int width, int height) throws IOException {
         
+        BufferedImage resizedImage;
         BufferedImage originalImage = ImageIO.read(stream);
 
+        if (width <= 0)
+            resizedImage = scaleLongerSideTo(originalImage, height);
+        else if (height <= 0)
+            resizedImage = scaleLongerSideTo(originalImage, width);
+        else
+            resizedImage = scaleImage(originalImage, width, height);
+        
+        thumbWidth = resizedImage.getWidth();
+        thumbHeight = resizedImage.getHeight();
+        
+        return storeImageinByteArray(resizedImage);
+    }
+    
+    private BufferedImage scaleLongerSideTo(BufferedImage bi, int longerSideLength) throws IOException {
+        int width, height;
+        
+        if (longerSideLength <= 0)
+            longerSideLength = 100;
+        
+        if (bi.getWidth() > bi.getHeight()) {
+            width = longerSideLength;
+            height = bi.getHeight() * longerSideLength / bi.getWidth();
+        } else {
+            height = longerSideLength;
+            width = bi.getWidth() * longerSideLength / bi.getHeight();
+        }
+                
+        BufferedImage resizedImage = scaleImage(bi, width, height);
+        return resizedImage;
+    }
+    
+    private BufferedImage scaleImage(BufferedImage originalImage, int width, int height) {
+        
         BufferedImage resizedImage = new BufferedImage(width, height, originalImage.getType()); 
         //        ColorSpace.TYPE_RGB);
         Graphics2D g = resizedImage.createGraphics();
@@ -74,8 +119,13 @@ public class ImageThumbnailGenerator {
         g.dispose();    
         g.setComposite(AlphaComposite.Src);
      
+        return resizedImage;
+    }
+    
+    private byte[] storeImageinByteArray(BufferedImage bi) throws IOException {
+        
         ByteArrayOutputStream os = new ByteArrayOutputStream();
-        boolean ok = ImageIO.write(resizedImage, "JPG", os);
+        boolean ok = ImageIO.write(bi, "JPG", os);
         if (ok)
             return os.toByteArray();
         else

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=1400131&r1=1400130&r2=1400131&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 Fri Oct 19 15:22:36 2012
@@ -18,6 +18,10 @@
  */
 package org.apache.chemistry.opencmis.inmemory.storedobj.impl;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigInteger;
 import java.util.Date;
 import java.util.GregorianCalendar;
@@ -49,6 +53,11 @@ import org.apache.chemistry.opencmis.inm
  */
 public class StoredObjectImpl implements StoredObject {
 
+    public static final String RENDITION_MIME_TYPE_JPEG = "image/jpeg";
+    public static final String RENDITION_MIME_TYPE_PNG = "image/png";
+    public static final String RENDITION_SUFFIX = "-rendition";
+    public static final int ICON_SIZE = 32;
+
     protected String fId;
     protected String fName;
     protected String fTypeId;
@@ -417,4 +426,43 @@ public class StoredObjectImpl implements
     public boolean hasRendition(String user) {
         return false;
     }
+    
+    protected  ContentStream getIconFromResourceDir(String name) throws IOException {
+        
+        InputStream imageStream = this.getClass().getResourceAsStream(name);
+        ContentStreamDataImpl content = new ContentStreamDataImpl(0);
+        content.setFileName(name);
+        content.setMimeType("image/png");
+
+        ByteArrayOutputStream ba = new ByteArrayOutputStream();
+        byte[] buffer = new byte [65536];
+        int noBytesRead = 0;
+
+        while ((noBytesRead = imageStream.read(buffer)) >=0 ) {
+            ba.write(buffer, 0, noBytesRead);
+        }
+        
+        content.setContent(new ByteArrayInputStream(ba.toByteArray()));
+        return content;
+    }
+    
+    protected boolean testRenditionFilterForImage(String[] formats) {
+        if (formats.length == 1 && null != formats[0] && formats[0].equals("cmis:none"))
+            return false;
+        else
+            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/resources/application-msword.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-msword.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-msword.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-pdf.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-pdf.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-pdf.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-excel.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-excel.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-excel.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-powerpoint.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-powerpoint.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/application-vnd.ms-powerpoint.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/audio-x-generic.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/audio-x-generic.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/audio-x-generic.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/folder.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/folder.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/folder.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/image-x-generic.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/image-x-generic.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/image-x-generic.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-html.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-html.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-html.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-x-generic.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-x-generic.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/text-x-generic.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/video-x-generic.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/video-x-generic.png?rev=1400131&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/resources/video-x-generic.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/AbstractServiceTest.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/AbstractServiceTest.java?rev=1400131&r1=1400130&r2=1400131&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/AbstractServiceTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/AbstractServiceTest.java Fri Oct 19 15:22:36 2012
@@ -236,13 +236,17 @@ public class AbstractServiceTest {
     }
 
     protected ContentStream createContent(int sizeInKB) {
-        return createContent(sizeInKB, 0);
+        return createContent(sizeInKB, 0, null);
     }
 
-    protected ContentStream createContent(int sizeInKB, long maxSizeInKB) {
+    protected ContentStream createContent(int sizeInKB, long maxSizeInKB, String mimeType) {
         ContentStreamDataImpl content = new ContentStreamDataImpl(maxSizeInKB);
         content.setFileName("data.txt");
-        content.setMimeType("text/plain");
+        
+        if (null == mimeType)
+            content.setMimeType("text/plain");
+        else
+            content.setMimeType(mimeType);
         int len = sizeInKB * 1024;
         byte[] b = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a,
                 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x0c, 0x0a }; // 32

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=1400131&r1=1400130&r2=1400131&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 Fri Oct 19 15:22:36 2012
@@ -111,7 +111,9 @@ public class ObjectServiceTest extends A
     private static final String FOLDER_ID = "Folder_1";
     private static final String MY_CUSTOM_NAME = "My Custom Document";
     private static final int MAX_SIZE = 100;
-
+    private static final String PNG = "image/png";
+    private static final String JPEG = "image/jpeg";
+    
     ObjectCreator fCreator;
 
     @Override
@@ -956,7 +958,7 @@ public class ObjectServiceTest extends A
     public void testMaxContentSize() {
         log.info("starting testMaxContentSize() ...");
         try {
-            createContent(MAX_SIZE + 1, MAX_SIZE);
+            createContent(MAX_SIZE + 1, MAX_SIZE, null);
             fail("createContent with exceeded content size should fail.");
         } catch (CmisInvalidArgumentException e) {
             log.debug("createDocument with exceeded failed as excpected.");
@@ -980,10 +982,9 @@ public class ObjectServiceTest extends A
     }
 
     @Test
-    public void testRendition() {
+    public void testRenditionImage() {
         // upload an image as JPEG picture
         log.info("starting testRendition() ...");
-        final String JPEG = "image/jpeg";
         
         try {
             InputStream imageStream = this.getClass().getResourceAsStream("/image.jpg");
@@ -1002,8 +1003,8 @@ public class ObjectServiceTest extends A
             assertEquals(id, rd.getRenditionDocumentId());
             assertNotNull(rd.getBigHeight());
             assertNotNull(rd.getBigWidth());
-            assertEquals(DocumentImpl.IMG_HEIGHT, rd.getBigHeight().longValue());
-            assertEquals(DocumentImpl.IMG_WIDTH, rd.getBigWidth().longValue());
+            assertEquals(DocumentImpl.THUMBNAIL_SIZE, rd.getBigHeight().longValue());
+            assertEquals(DocumentImpl.THUMBNAIL_SIZE, rd.getBigWidth().longValue());
             assertNotNull(rd.getStreamId());
             ContentStream renditionContent = fObjSvc.getContentStream(fRepositoryId, id, rd.getStreamId(), null, null, null);
             assertEquals(rd.getMimeType(), renditionContent.getMimeType());
@@ -1012,10 +1013,77 @@ public class ObjectServiceTest extends A
             log.error("testRendition failed with exception ", e);
             fail("testRendition failed with exceetion " + e);
         }
-        log.info("... testRendition finished.");
-   
+        log.info("... testRendition finished.");   
+    }
+    
+    @Test
+    public void testRenditionIcon() {
+        // fake an office document
+        log.info("starting testRendition() ...");
+        
+        try {
+            ContentStream content = createContent(4, 0, "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
+            Properties props = createDocumentProperties("TestJOffice", DOCUMENT_TYPE_ID);
+            String id = fObjSvc.createDocument(fRepositoryId, props, fRootFolderId, content, VersioningState.NONE,
+                    null, null, null, null);
+
+            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(PNG, rd.getMimeType());
+            assertEquals("cmis:thumbnail", rd.getKind());
+            assertEquals(id, rd.getRenditionDocumentId());
+            assertNotNull(rd.getBigHeight());
+            assertNotNull(rd.getBigWidth());
+            assertEquals(DocumentImpl.ICON_SIZE, rd.getBigHeight().longValue());
+            assertEquals(DocumentImpl.ICON_SIZE, 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.");   
     }
+    @Test
+    public void testFolderRendition() {
+        // upload an image as JPEG picture
+        log.info("starting testFolderRendition() ...");
+        
+        try {
+            InputStream imageStream = this.getClass().getResourceAsStream("/image.jpg");
+            assertNotNull("Test setup failure no 'image.jpg' in test resources, getResourceAsStream failed", imageStream);
+            String id = createFolder();           
 
+            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(PNG, rd.getMimeType());
+            assertEquals("cmis:thumbnail", rd.getKind());
+            assertEquals(id, rd.getRenditionDocumentId());
+            assertNotNull(rd.getBigHeight());
+            assertNotNull(rd.getBigWidth());
+            assertEquals(DocumentImpl.ICON_SIZE, rd.getBigHeight().longValue());
+            assertEquals(DocumentImpl.ICON_SIZE, 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("testFolderRendition failed with exception ", e);
+            fail("testFolderRendition failed with exceetion " + e);
+        }
+        log.info("... testFolderRendition finished.");
+   
+    }
     protected String createDocumentFromStream(String name, String folderId, String typeId, InputStream is,
             String contentType) throws IOException {