You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2015/01/26 12:15:46 UTC

svn commit: r1654763 - in /chemistry/opencmis/trunk: chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/ chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/ap...

Author: fmui
Date: Mon Jan 26 11:15:46 2015
New Revision: 1654763

URL: http://svn.apache.org/r1654763
Log:
Server: provide MIME type to temp stream, if available

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/TempStoreOutputStream.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultipartParser.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/AtomEntryParserTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/ThresholdOutputStreamTest.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/TempStoreOutputStream.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/TempStoreOutputStream.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/TempStoreOutputStream.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-commons/chemistry-opencmis-commons-api/src/main/java/org/apache/chemistry/opencmis/commons/server/TempStoreOutputStream.java Mon Jan 26 11:15:46 2015
@@ -41,6 +41,19 @@ import java.io.OutputStream;
 public abstract class TempStoreOutputStream extends OutputStream {
 
     /**
+     * Sets the MIME type of the stream.
+     * 
+     * This method is usually be called once before {@link #getInputStream()} is
+     * called. It might never be called if the MIME type is unknown or multiple
+     * times if previous MIME type detections were inaccurate.
+     * 
+     * @param mimeType
+     *            the MIME type or {@code null} if the MIME type is unknown or
+     *            should be reset to unknown
+     */
+    public abstract void setMimeType(String mimeType);
+
+    /**
      * Returns an {@link InputStream} that serves the content that has been
      * provided to this {@link TempStoreOutputStream} instance.
      * 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java Mon Jan 26 11:15:46 2015
@@ -18,8 +18,6 @@
  */
 package org.apache.chemistry.opencmis.server.impl.atompub;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigInteger;
@@ -29,7 +27,6 @@ import java.util.Locale;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
-import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
@@ -359,10 +356,10 @@ public final class AtomEntryParser {
 
         // read attributes
         String type = "text";
+        String mimeType = "text/plain";
         for (int i = 0; i < parser.getAttributeCount(); i++) {
             QName attrName = parser.getAttributeName(i);
             if (ATTR_TYPE.equals(attrName.getLocalPart())) {
-                atomContentStream.setMimeType(parser.getAttributeValue(i));
                 if (parser.getAttributeValue(i) != null) {
                     type = parser.getAttributeValue(i).trim().toLowerCase(Locale.ENGLISH);
                 }
@@ -377,19 +374,28 @@ public final class AtomEntryParser {
         }
 
         TempStoreOutputStream tsos = null;
-        byte[] bytes = null;
-        if (type.equals("text") || type.equals("html")) {
-            tsos = readContentBytes(parser);
+        if (type.equals("text")) {
+            mimeType = "text/plain";
+            tsos = readContentBytes(parser, mimeType);
+        } else if (type.equals("html")) {
+            mimeType = "text/html";
+            tsos = readContentBytes(parser, mimeType);
         } else if (type.equals("xhtml")) {
-            bytes = copy(parser);
+            mimeType = "application/xhtml+xml";
+            tsos = copy(parser, mimeType);
         } else if (type.endsWith("/xml") || type.endsWith("+xml")) {
-            bytes = copy(parser);
+            mimeType = type;
+            tsos = copy(parser, mimeType);
         } else if (type.startsWith("text/")) {
-            tsos = readContentBytes(parser);
+            mimeType = type;
+            tsos = readContentBytes(parser, mimeType);
         } else {
-            tsos = readBase64(parser);
+            mimeType = type;
+            tsos = readBase64(parser, mimeType);
         }
 
+        atomContentStream.setMimeType(mimeType);
+
         if (tsos != null) {
             try {
                 atomContentStream.setStream(tsos.getInputStream());
@@ -399,12 +405,6 @@ public final class AtomEntryParser {
                 throw e;
             }
         }
-
-        if (bytes != null) {
-            atomContentStream.setStream(new ByteArrayInputStream(bytes));
-            atomContentStream.setLength(BigInteger.valueOf(bytes.length));
-            cappedStream.deductBytes(bytes.length);
-        }
     }
 
     /**
@@ -431,7 +431,7 @@ public final class AtomEntryParser {
                     if (TAG_MEDIATYPE.equals(name.getLocalPart())) {
                         cmisContentStream.setMimeType(XMLUtils.readText(parser, XMLConstraints.MAX_STRING_LENGTH));
                     } else if (TAG_BASE64.equals(name.getLocalPart())) {
-                        TempStoreOutputStream tsos = readBase64(parser);
+                        TempStoreOutputStream tsos = readBase64(parser, cmisContentStream.getMimeType());
                         try {
                             cmisContentStream.setStream(tsos.getInputStream());
                             cmisContentStream.setLength(BigInteger.valueOf(tsos.getLength()));
@@ -466,8 +466,10 @@ public final class AtomEntryParser {
     /**
      * Parses a tag that contains content bytes.
      */
-    private TempStoreOutputStream readContentBytes(XMLStreamReader parser) throws XMLStreamException, IOException {
+    private TempStoreOutputStream readContentBytes(XMLStreamReader parser, String mimeType) throws XMLStreamException,
+            IOException {
         TempStoreOutputStream bufferStream = streamFactory.newOutputStream();
+        bufferStream.setMimeType(mimeType);
 
         XMLUtils.next(parser);
 
@@ -510,8 +512,10 @@ public final class AtomEntryParser {
     /**
      * Parses a tag that contains base64 encoded content.
      */
-    private TempStoreOutputStream readBase64(XMLStreamReader parser) throws XMLStreamException, IOException {
+    private TempStoreOutputStream readBase64(XMLStreamReader parser, String mimeType) throws XMLStreamException,
+            IOException {
         TempStoreOutputStream bufferStream = streamFactory.newOutputStream();
+        bufferStream.setMimeType(mimeType);
         Base64.OutputStream b64stream = new Base64.OutputStream(bufferStream, Base64.DECODE);
 
         XMLUtils.next(parser);
@@ -562,42 +566,57 @@ public final class AtomEntryParser {
     /**
      * Copies a subtree into a stream.
      */
-    private static byte[] copy(XMLStreamReader parser) throws XMLStreamException {
+    private TempStoreOutputStream copy(XMLStreamReader parser, String mimeType) throws XMLStreamException, IOException {
         // create a writer
-        ByteArrayOutputStream out = new ByteArrayOutputStream(32 * 1024);
-        XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
+        TempStoreOutputStream bufferStream = streamFactory.newOutputStream();
+        bufferStream.setMimeType(mimeType);
 
-        writer.writeStartDocument();
+        try {
+            XMLStreamWriter writer = XMLUtils.createWriter(bufferStream);
 
-        // copy subtree
-        int level = 1;
-        while (XMLUtils.next(parser)) {
-            int event = parser.getEventType();
-            if (event == XMLStreamReader.START_ELEMENT) {
-                copyStartElement(parser, writer);
-                level++;
-            } else if (event == XMLStreamReader.CHARACTERS) {
-                writer.writeCharacters(parser.getText());
-            } else if (event == XMLStreamReader.COMMENT) {
-                writer.writeComment(parser.getText());
-            } else if (event == XMLStreamReader.CDATA) {
-                writer.writeCData(parser.getText());
-            } else if (event == XMLStreamReader.END_ELEMENT) {
-                level--;
-                if (level == 0) {
+            writer.writeStartDocument();
+
+            // copy subtree
+            int level = 1;
+            while (XMLUtils.next(parser)) {
+                int event = parser.getEventType();
+                if (event == XMLStreamReader.START_ELEMENT) {
+                    copyStartElement(parser, writer);
+                    level++;
+                } else if (event == XMLStreamReader.CHARACTERS) {
+                    writer.writeCharacters(parser.getText());
+                } else if (event == XMLStreamReader.COMMENT) {
+                    writer.writeComment(parser.getText());
+                } else if (event == XMLStreamReader.CDATA) {
+                    writer.writeCData(parser.getText());
+                } else if (event == XMLStreamReader.END_ELEMENT) {
+                    level--;
+                    if (level == 0) {
+                        break;
+                    }
+                    writer.writeEndElement();
+                } else {
                     break;
                 }
-                writer.writeEndElement();
-            } else {
-                break;
             }
-        }
 
-        writer.writeEndDocument();
+            writer.writeEndDocument();
+            writer.flush();
+
+            bufferStream.close();
+        } catch (XMLStreamException xse) {
+            // remove temp file
+            bufferStream.destroy(xse);
+            throw xse;
+        } catch (IOException ioe) {
+            // remove temp file
+            bufferStream.destroy(ioe);
+            throw ioe;
+        }
 
         XMLUtils.next(parser);
 
-        return out.toByteArray();
+        return bufferStream;
     }
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultipartParser.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultipartParser.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultipartParser.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultipartParser.java Mon Jan 26 11:15:46 2015
@@ -413,8 +413,9 @@ public class MultipartParser {
         }
     }
 
-    private void readBodyAsStream() throws IOException {
+    private void readBodyAsStream(String contentType) throws IOException {
         TempStoreOutputStream stream = streamFactory.newOutputStream();
+        stream.setMimeType(contentType);
 
         try {
             while (true) {
@@ -485,7 +486,7 @@ public class MultipartParser {
                 contentType = Constants.MEDIATYPE_OCTETSTREAM;
             }
 
-            readBodyAsStream();
+            readBodyAsStream(contentType);
         } else {
             String name = params.get(MimeHelper.DISPOSITION_NAME);
             byte[] rawValue = readBodyBytes();

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ThresholdOutputStream.java Mon Jan 26 11:15:46 2015
@@ -74,6 +74,7 @@ public class ThresholdOutputStream exten
     private OutputStream tmpStream;
     private Key key;
     private byte[] iv;
+    private String mimeType;
 
     /**
      * Constructor.
@@ -201,6 +202,14 @@ public class ThresholdOutputStream exten
         }
     }
 
+    public void setMimeType(String mimeType) {
+        this.mimeType = mimeType;
+    }
+
+    public String getMimeType() {
+        return mimeType;
+    }
+
     public long getLength() {
         return length;
     }
@@ -400,6 +409,15 @@ public class ThresholdOutputStream exten
         }
 
         /**
+         * Returns the MIME type of the stream.
+         * 
+         * @return the MIME type or {@code null} if the MIME type is unknown
+         */
+        public String getMimeType() {
+            return mimeType;
+        }
+
+        /**
          * Returns the length of the stream.
          * 
          * @return the length of the stream in bytes

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/AtomEntryParserTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/AtomEntryParserTest.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/AtomEntryParserTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/AtomEntryParserTest.java Mon Jan 26 11:15:46 2015
@@ -36,6 +36,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.impl.IOUtils;
 import org.apache.chemistry.opencmis.server.impl.atompub.AtomEntryParser;
 import org.apache.chemistry.opencmis.server.shared.TempStoreOutputStreamFactory;
+import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStream.ThresholdInputStream;
 import org.junit.Test;
 
 /**
@@ -143,19 +144,19 @@ public class AtomEntryParserTest {
 
     @Test
     public void testCmisContent() throws Exception {
-        byte[] content = parse(CMIS_ENTRY.getBytes());
+        byte[] content = parse(CMIS_ENTRY.getBytes(), "text/plain");
         assertEquals(CMIS_ENTRY_CONTENT, new String(content));
     }
 
     @Test
     public void testAtomContentText() throws Exception {
-        byte[] content = parse(ATOM_ENTRY_TEXT.getBytes());
+        byte[] content = parse(ATOM_ENTRY_TEXT.getBytes(), "text/plain");
         assertEquals(ATOM_ENTRY_TEXT_CONTENT, new String(content));
     }
 
     @Test
     public void testAtomContentXml() throws Exception {
-        byte[] content = parse(ATOM_ENTRY_XML.getBytes());
+        byte[] content = parse(ATOM_ENTRY_XML.getBytes(), "text/xml");
         String xmlContent = new String(content);
         assertTrue(xmlContent.indexOf('>') > -1);
         assertEquals(ATOM_ENTRY_XML_CONTENT, xmlContent.substring(xmlContent.indexOf('>') + 1));
@@ -163,7 +164,7 @@ public class AtomEntryParserTest {
 
     @Test
     public void testAtomContentXHtml() throws Exception {
-        byte[] content = parse(ATOM_ENTRY_XHTML.getBytes());
+        byte[] content = parse(ATOM_ENTRY_XHTML.getBytes(), "application/xhtml+xml");
         String xmlContent = new String(content);
         assertTrue(xmlContent.indexOf('>') > -1);
         assertEquals(ATOM_ENTRY_XHTML_CONTENT, xmlContent.substring(xmlContent.indexOf('>') + 1));
@@ -171,7 +172,7 @@ public class AtomEntryParserTest {
 
     @Test
     public void testAtomContentBase64() throws Exception {
-        byte[] content = parse(ATOM_ENTRY_BASE64.getBytes());
+        byte[] content = parse(ATOM_ENTRY_BASE64.getBytes(), "application/something");
         assertEquals(ATOM_ENTRY_BASE64_CONTENT, new String(content));
     }
 
@@ -249,7 +250,7 @@ public class AtomEntryParserTest {
         assertNull(aep.getContentStream());
     }
 
-    private static byte[] parse(byte[] entry) throws Exception {
+    private static byte[] parse(byte[] entry, String mimeType) throws Exception {
         TempStoreOutputStreamFactory streamFactory = TempStoreOutputStreamFactory.newInstance(null, THRESHOLD,
                 MAX_SIZE, false);
         AtomEntryParser aep = new AtomEntryParser(new ByteArrayInputStream(entry), streamFactory);
@@ -258,6 +259,11 @@ public class AtomEntryParserTest {
         assertNotNull(contentStream);
         assertNotNull(contentStream.getStream());
 
+        assertEquals(mimeType, contentStream.getMimeType());
+        if (contentStream.getStream() instanceof ThresholdInputStream) {
+            assertEquals(mimeType, ((ThresholdInputStream) contentStream.getStream()).getMimeType());
+        }
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
 
         IOUtils.copy(contentStream.getStream(), baos);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/ThresholdOutputStreamTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/ThresholdOutputStreamTest.java?rev=1654763&r1=1654762&r2=1654763&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/ThresholdOutputStreamTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/ThresholdOutputStreamTest.java Mon Jan 26 11:15:46 2015
@@ -36,6 +36,8 @@ import org.junit.Test;
 
 public class ThresholdOutputStreamTest {
 
+    private static final String MIME_TYPE_1 = "some/type";
+    private static final String MIME_TYPE_2 = "another/type";
     private static final byte[] CONTENT = "Hello".getBytes();
 
     @Test
@@ -43,6 +45,7 @@ public class ThresholdOutputStreamTest {
         TempStoreOutputStreamFactory streamFactory = TempStoreOutputStreamFactory.newInstance(null, 1024, 1024, false);
 
         TempStoreOutputStream tempStream = streamFactory.newOutputStream();
+        tempStream.setMimeType(MIME_TYPE_1);
         assertTrue(tempStream instanceof ThresholdOutputStream);
 
         // set content
@@ -58,6 +61,7 @@ public class ThresholdOutputStreamTest {
         assertTrue(tis.markSupported());
         assertEquals(CONTENT.length, tis.getLength());
         assertArrayEquals(CONTENT, getBytesFromArray(tis.getBytes(), (int) tis.getLength()));
+        assertEquals(MIME_TYPE_1, tis.getMimeType());
 
         // read stream
         byte[] buffer = new byte[CONTENT.length];
@@ -99,6 +103,7 @@ public class ThresholdOutputStreamTest {
         TempStoreOutputStreamFactory streamFactory = TempStoreOutputStreamFactory.newInstance(null, 0, 1024, false);
 
         TempStoreOutputStream tempStream = streamFactory.newOutputStream();
+        tempStream.setMimeType(MIME_TYPE_2);
         assertTrue(tempStream instanceof ThresholdOutputStream);
 
         // set content
@@ -113,6 +118,7 @@ public class ThresholdOutputStreamTest {
         assertTrue(tis.markSupported());
         assertNull(tis.getBytes());
         assertEquals(CONTENT.length, tis.getLength());
+        assertEquals(MIME_TYPE_2, tis.getMimeType());
 
         assertTrue(tis.getTemporaryFile().exists());
         assertEquals(CONTENT.length, tis.getTemporaryFile().length());