You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2009/07/16 16:40:14 UTC

svn commit: r794695 - in /incubator/chemistry/trunk/chemistry: chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/ chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/ chemistry-commons/src/main/...

Author: fguillaume
Date: Thu Jul 16 14:40:14 2009
New Revision: 794695

URL: http://svn.apache.org/viewvc?rev=794695&view=rev
Log:
CMIS-31: Implement getStream and getContentStream for AtomPub Document

Modified:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPDocument.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleDocument.java
    incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml
    incubator/chemistry/trunk/chemistry/chemistry-tests/pom.xml
    incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPDocument.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPDocument.java?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPDocument.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPDocument.java Thu Jul 16 14:40:14 2009
@@ -13,32 +13,133 @@
  *
  * Authors:
  *     Bogdan Stefanescu, Nuxeo
+ *     Emanuele Lombardi
+ *     Florent Guillaume, Nuxeo
  */
 package org.apache.chemistry.atompub.client;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Collection;
 
 import org.apache.chemistry.ContentStream;
 import org.apache.chemistry.Document;
+import org.apache.chemistry.Property;
 import org.apache.chemistry.Type;
+import org.apache.chemistry.atompub.CMIS;
+import org.apache.chemistry.atompub.client.connector.Connector;
+import org.apache.chemistry.atompub.client.connector.Request;
+import org.apache.chemistry.atompub.client.connector.Response;
 
 /**
  *
  */
 public class APPDocument extends APPObject implements Document {
 
+    protected static final String UNINITIALIZED_STRING = "__UNINITIALIZED__\0\0\0";
+
+    protected static final URI UNINITIALIZED_URI;
+    static {
+        try {
+            UNINITIALIZED_URI = new URI("http://__UNINITIALIZED__/%00%00%00");
+        } catch (URISyntaxException e) {
+            throw new ExceptionInInitializerError(e);
+        }
+    }
+
     public APPDocument(APPObjectEntry entry, Type type) {
         super(entry, type);
     }
 
     public ContentStream getContentStream() {
-        throw new UnsupportedOperationException("Not yet implemented");
+        String url = entry.getLink(CMIS.LINK_STREAM);
+        return url == null ? null : new APPContentStream(url);
+    }
+
+    /**
+     * ContentStream class that fetches a remote URL when needed.
+     */
+    public class APPContentStream implements ContentStream {
+
+        protected final Connector connector;
+
+        protected final String url;
+
+        protected String mimeType = UNINITIALIZED_STRING;
+
+        protected String filename = UNINITIALIZED_STRING;
+
+        protected URI uri = UNINITIALIZED_URI;
+
+        protected long length = -1;
+
+        public APPContentStream(String url) {
+            connector = APPDocument.this.entry.connection.connector;
+            this.url = url;
+        }
+
+        public String getMimeType() {
+            if (mimeType == UNINITIALIZED_STRING) {
+                mimeType = getString(Property.CONTENT_STREAM_MIME_TYPE);
+            }
+            return mimeType;
+        }
+
+        public String getFilename() {
+            if (filename == UNINITIALIZED_STRING) {
+                filename = getString(Property.CONTENT_STREAM_FILENAME);
+            }
+            return filename;
+        }
+
+        public URI getURI() {
+            if (uri == UNINITIALIZED_URI) {
+                uri = APPDocument.this.getURI(Property.CONTENT_STREAM_URI);
+            }
+            return uri;
+        }
+
+        public long getLength() {
+            if (length == -1) {
+                Integer value = getInteger(Property.CONTENT_STREAM_LENGTH);
+                return length = value == null ? -1 : value.longValue();
+            }
+            return length;
+        }
+
+        public InputStream getStream() throws IOException {
+            try {
+                Response resp = connector.get(new Request(url));
+                if (!resp.isOk()) {
+                    throw new IOException("Error: " + resp.getStatusCode()
+                            + " fetching: " + url);
+                }
+                if (length == -1) {
+                    // get the "official" length if available
+                    length = resp.getStreamLength();
+                }
+                return resp.getStream();
+            } catch (ContentManagerException e) {
+                throw (IOException) (new IOException(
+                        "Could not fetch stream from: " + url).initCause(e));
+            }
+        }
     }
 
     public InputStream getStream() throws IOException {
-        throw new UnsupportedOperationException("Not yet implemented");
+        String href = entry.getLink(CMIS.LINK_STREAM);
+        if (href == null) {
+            return null;
+        }
+        Response resp = entry.connection.connector.get(new Request(href));
+        if (!resp.isOk()) {
+            throw new ContentManagerException(
+                    "Remote server returned error code: "
+                            + resp.getStatusCode());
+        }
+        return resp.getStream();
     }
 
     public void setContentStream(ContentStream contentStream)

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java Thu Jul 16 14:40:14 2009
@@ -31,6 +31,7 @@
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpMethodBase;
 
 /**
  *
@@ -72,6 +73,13 @@
         }
     }
 
+    public long getStreamLength() {
+        if (method instanceof HttpMethodBase) {
+            return ((HttpMethodBase) method).getResponseContentLength();
+        }
+        return -1;
+    }
+
     public String getString() throws ContentManagerException {
         try {
             return method.getResponseBodyAsString();

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java Thu Jul 16 14:40:14 2009
@@ -37,6 +37,13 @@
 
     InputStream getStream() throws ContentManagerException;
 
+    /**
+     * Gets the stream length.
+     *
+     * @return the stream length, or -1 if not know
+     */
+    long getStreamLength() throws ContentManagerException;
+
     byte[] getBytes() throws ContentManagerException;
 
     String getString() throws ContentManagerException;

Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleDocument.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleDocument.java?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleDocument.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleDocument.java Thu Jul 16 14:40:14 2009
@@ -104,7 +104,8 @@
             entry.setValue(SimpleProperty.CONTENT_BYTES_KEY, null);
         } else {
             entry.setValue(Property.CONTENT_STREAM_LENGTH,
-                    Integer.valueOf((int) contentStream.getLength())); // cast?
+                    Integer.valueOf((int) contentStream.getLength())); // TODO
+                                                                       // Long
             entry.setValue(Property.CONTENT_STREAM_MIME_TYPE,
                     contentStream.getMimeType());
             entry.setValue(Property.CONTENT_STREAM_FILENAME,

Modified: incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-parent/pom.xml Thu Jul 16 14:40:14 2009
@@ -137,6 +137,11 @@
         <version>0.4.0-incubating</version>
       </dependency>
       <dependency>
+        <groupId>commons-io</groupId>
+        <artifactId>commons-io</artifactId>
+        <version>1.4</version>
+      </dependency>
+      <dependency>
         <groupId>commons-collections</groupId>
         <artifactId>commons-collections</artifactId>
         <version>3.1</version>

Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/pom.xml?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/pom.xml Thu Jul 16 14:40:14 2009
@@ -45,6 +45,10 @@
     </dependency>
 
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
       <groupId>commons-logging</groupId>
       <artifactId>commons-logging</artifactId>
       <version>1.1</version>

Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java?rev=794695&r1=794694&r2=794695&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java Thu Jul 16 14:40:14 2009
@@ -17,6 +17,7 @@
  */
 package org.apache.chemistry.test;
 
+import java.io.InputStream;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -26,6 +27,7 @@
 import org.apache.chemistry.BaseType;
 import org.apache.chemistry.CMISObject;
 import org.apache.chemistry.Connection;
+import org.apache.chemistry.ContentStream;
 import org.apache.chemistry.Document;
 import org.apache.chemistry.Folder;
 import org.apache.chemistry.ObjectEntry;
@@ -34,6 +36,7 @@
 import org.apache.chemistry.Repository;
 import org.apache.chemistry.SPI;
 import org.apache.chemistry.Type;
+import org.apache.commons.io.IOUtils;
 
 /**
  * Basic test on a repository created with {@link BasicHelper#makeRepository}.
@@ -142,4 +145,36 @@
         assertEquals(1, parents.size());
     }
 
+    @SuppressWarnings("null")
+    public void testGetStream() throws Exception {
+        Folder f1 = (Folder) conn.getRootFolder().getChildren(BaseType.FOLDER).get(
+                0);
+        Folder f2 = (Folder) f1.getChildren(BaseType.FOLDER).get(0);
+        Document other = null;
+        Document dog = null;
+        for (CMISObject child : f2.getChildren(null)) {
+            String name = child.getName();
+            if (name.equals("doc 2")) {
+                other = (Document) child;
+            } else if (name.equals("dog.jpg")) {
+                dog = (Document) child;
+            }
+        }
+        assertNotNull("doc 2 not found", other);
+        assertNull(other.getContentStream());
+        assertNull(other.getStream());
+
+        assertNotNull("dog not found", dog);
+        ContentStream cs = dog.getContentStream();
+        assertTrue(cs.getLength() != 0);
+        assertEquals("dog.jpg", cs.getFilename());
+        assertEquals("image/jpeg", cs.getMimeType());
+        assertNotNull(cs.getStream());
+        InputStream in = dog.getStream();
+        assertNotNull(in);
+        byte[] array = IOUtils.toByteArray(in);
+        assertTrue(array.length != 0);
+        assertEquals(array.length, cs.getLength());
+    }
+
 }