chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From f...@apache.org
Subject svn commit: r1652084 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src: main/java/org/apache/chemistry/opencmis/server/impl/atompub/ main/java/org/apache/chemistry/opencmis/server/impl/browser/ main/java/or...
Date Thu, 15 Jan 2015 13:04:51 GMT
Author: fmui
Date: Thu Jan 15 13:04:50 2015
New Revision: 1652084

URL: http://svn.apache.org/r1652084
Log:
Server: added paranoiac content handling and stream closing 

Modified:
    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/atompub/MultiFilingService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ObjectService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/PolicyService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/RepositoryService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/VersioningService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/AbstractServiceCall.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

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=1652084&r1=1652083&r2=1652084&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
Thu Jan 15 13:04:50 2015
@@ -194,9 +194,7 @@ public final class AtomEntryParser {
      * Parses the stream.
      */
     public void parse(InputStream stream) throws XMLStreamException, IOException {
-        object = null;
-        atomContentStream = null;
-        cmisContentStream = null;
+        release();
 
         if (stream == null) {
             return;
@@ -224,12 +222,48 @@ public final class AtomEntryParser {
                     break;
                 }
             }
+        } catch (XMLStreamException xse) {
+            release();
+            throw xse;
+        } catch (IOException ioe) {
+            release();
+            throw ioe;
+        } catch (RuntimeException re) {
+            release();
+            throw re;
         } finally {
             parser.close();
         }
     }
 
     /**
+     * Releases all resources.
+     */
+    public void release() {
+        object = null;
+        typeDef = null;
+        bulkUpdate = null;
+        closeAtomContentStream();
+        closeCmisContentStream();
+    }
+
+    /**
+     * Closes the Atom content stream.
+     */
+    private void closeAtomContentStream() {
+        IOUtils.closeQuietly(atomContentStream);
+        atomContentStream = null;
+    }
+
+    /**
+     * Closes the CMIS content stream.
+     */
+    private void closeCmisContentStream() {
+        IOUtils.closeQuietly(cmisContentStream);
+        cmisContentStream = null;
+    }
+
+    /**
      * Parses an Atom entry.
      */
     private void parseEntry(XMLStreamReader parser) throws XMLStreamException, IOException
{
@@ -310,6 +344,17 @@ public final class AtomEntryParser {
      * @throws IOException
      */
     private void parseAtomContent(XMLStreamReader parser) throws XMLStreamException, IOException
{
+        if (atomContentStream != null) {
+            closeAtomContentStream();
+            throw new CmisInvalidArgumentException("More than one content provided!");
+        }
+
+        if (cmisContentStream != null) {
+            // CMIS content takes precedence (see CMIS spec)
+            XMLUtils.skip(parser);
+            return;
+        }
+
         atomContentStream = new ContentStreamImpl();
 
         // read attributes
@@ -366,6 +411,12 @@ public final class AtomEntryParser {
      * Extract the content stream.
      */
     private void parseCmisContent(XMLStreamReader parser) throws XMLStreamException, IOException
{
+        closeAtomContentStream();
+        if (cmisContentStream != null) {
+            closeCmisContentStream();
+            throw new CmisInvalidArgumentException("More than one content provided!");
+        }
+
         cmisContentStream = new ContentStreamImpl();
 
         XMLUtils.next(parser);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.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/MultiFilingService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java
Thu Jan 15 13:04:50 2015
@@ -58,23 +58,25 @@ public class MultiFilingService {
             parser.setIgnoreAtomContentSrc(true); // needed for some clients
             parser.parse(request.getInputStream());
 
-            String objectId = parser.getId();
-
-            if (stopBeforeService(service)) {
-                return;
-            }
-
-            if (objectId == null && removeFrom == null) {
-                // create unfiled object
-                createUnfiledObject(context, service, repositoryId, request, response, parser);
-                return;
-            }
-
             // execute
-            service.removeObjectFromFolder(repositoryId, objectId, removeFrom, null);
-
-            if (stopAfterService(service)) {
-                return;
+            String objectId = parser.getId();
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
+
+                if (objectId == null && removeFrom == null) {
+                    createUnfiledObject(context, service, repositoryId, request, response,
parser);
+                    return;
+                }
+
+                service.removeObjectFromFolder(repositoryId, objectId, removeFrom, null);
+
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, objectId);
@@ -117,13 +119,8 @@ public class MultiFilingService {
 
             // create
             ContentStream contentStream = parser.getContentStream();
-            String newObjectId = null;
-            try {
-                newObjectId = service.create(repositoryId, parser.getProperties(), null,
contentStream,
-                        versioningState, parser.getPolicyIds(), null);
-            } finally {
-                closeContentStream(contentStream);
-            }
+            String newObjectId = service.create(repositoryId, parser.getProperties(), null,
contentStream,
+                    versioningState, parser.getPolicyIds(), null);
 
             if (stopAfterService(service)) {
                 return;

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ObjectService.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/ObjectService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ObjectService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ObjectService.java
Thu Jan 15 13:04:50 2015
@@ -97,47 +97,37 @@ public class ObjectService {
             parser.setIgnoreAtomContentSrc(true); // needed for some clients
             parser.parse(request.getInputStream());
 
-            String objectId = parser.getId();
-
             // execute
             String newObjectId = null;
-
-            if (objectId == null) {
+            String objectId = parser.getId();
+            try {
                 if (stopBeforeService(service)) {
                     return;
                 }
 
-                // create
-                ContentStream contentStream = parser.getContentStream();
-                try {
+                if (objectId == null) {
+                    // create
+                    ContentStream contentStream = parser.getContentStream();
                     newObjectId = service.create(repositoryId, parser.getProperties(), folderId,
contentStream,
                             versioningState, parser.getPolicyIds(), null);
-                } finally {
-                    closeContentStream(contentStream);
-                }
-
-                if (stopAfterService(service)) {
-                    return;
-                }
-            } else {
-                if (stopBeforeService(service)) {
-                    return;
-                }
-
-                if (sourceFolderId == null || sourceFolderId.trim().length() == 0) {
-                    // addObjectToFolder
-                    service.addObjectToFolder(repositoryId, objectId, folderId, null, null);
-                    newObjectId = objectId;
                 } else {
-                    // move
-                    Holder<String> objectIdHolder = new Holder<String>(objectId);
-                    service.moveObject(repositoryId, objectIdHolder, folderId, sourceFolderId,
null);
-                    newObjectId = objectIdHolder.getValue();
+                    if (sourceFolderId == null || sourceFolderId.trim().length() == 0) {
+                        // addObjectToFolder
+                        service.addObjectToFolder(repositoryId, objectId, folderId, null,
null);
+                        newObjectId = objectId;
+                    } else {
+                        // move
+                        Holder<String> objectIdHolder = new Holder<String>(objectId);
+                        service.moveObject(repositoryId, objectIdHolder, folderId, sourceFolderId,
null);
+                        newObjectId = objectIdHolder.getValue();
+                    }
                 }
 
                 if (stopAfterService(service)) {
                     return;
                 }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, newObjectId);
@@ -184,15 +174,20 @@ public class ObjectService {
             AtomEntryParser parser = new AtomEntryParser(request.getInputStream(), streamFactory);
 
             // execute
-            if (stopBeforeService(service)) {
-                return;
-            }
+            String newObjectId = null;
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
 
-            String newObjectId = service.createRelationship(repositoryId, parser.getProperties(),
-                    parser.getPolicyIds(), null, null, null);
+                newObjectId = service.createRelationship(repositoryId, parser.getProperties(),
parser.getPolicyIds(),
+                        null, null, null);
 
-            if (stopAfterService(service)) {
-                return;
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, newObjectId);
@@ -694,50 +689,51 @@ public class ObjectService {
             // execute
             Holder<String> objectIdHolder = new Holder<String>(objectId);
 
-            if ((checkin != null) && (checkin.booleanValue())) {
-                if (stopBeforeService(service)) {
-                    return;
-                }
+            try {
+                if ((checkin != null) && (checkin.booleanValue())) {
+                    if (stopBeforeService(service)) {
+                        return;
+                    }
 
-                ContentStream contentStream = parser.getContentStream();
-                try {
+                    ContentStream contentStream = parser.getContentStream();
                     service.checkIn(repositoryId, objectIdHolder, major, parser.getProperties(),
contentStream,
                             checkinComment, parser.getPolicyIds(), null, null, null);
-                } finally {
-                    closeContentStream(contentStream);
-                }
 
-                if (stopAfterService(service)) {
-                    return;
-                }
-            } else {
-                Properties properties = parser.getProperties();
-                String changeToken = null;
-                if (properties != null) {
-                    changeToken = extractChangeToken(properties);
-                    if (changeToken != null) {
-                        properties = new PropertiesImpl(properties);
-                        ((PropertiesImpl) properties).removeProperty(PropertyIds.CHANGE_TOKEN);
+                    if (stopAfterService(service)) {
+                        return;
+                    }
+                } else {
+                    Properties properties = parser.getProperties();
+                    String changeToken = null;
+                    if (properties != null) {
+                        changeToken = extractChangeToken(properties);
+                        if (changeToken != null) {
+                            properties = new PropertiesImpl(properties);
+                            ((PropertiesImpl) properties).removeProperty(PropertyIds.CHANGE_TOKEN);
+                        }
                     }
-                }
 
-                if (changeToken == null) {
-                    // not required by the CMIS specification
-                    // -> keep for backwards compatibility with older OpenCMIS
-                    // clients
-                    changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-                }
+                    if (changeToken == null) {
+                        // not required by the CMIS specification
+                        // -> keep for backwards compatibility with older
+                        // OpenCMIS
+                        // clients
+                        changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+                    }
 
-                if (stopBeforeService(service)) {
-                    return;
-                }
+                    if (stopBeforeService(service)) {
+                        return;
+                    }
 
-                service.updateProperties(repositoryId, objectIdHolder, changeToken == null
? null : new Holder<String>(
-                        changeToken), properties, null);
+                    service.updateProperties(repositoryId, objectIdHolder, changeToken ==
null ? null
+                            : new Holder<String>(changeToken), properties, null);
 
-                if (stopAfterService(service)) {
-                    return;
+                    if (stopAfterService(service)) {
+                        return;
+                    }
                 }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, objectIdHolder.getValue());
@@ -806,14 +802,28 @@ public class ObjectService {
             AtomEntryParser parser = new AtomEntryParser(streamFactory);
             parser.parse(request.getInputStream());
 
-            BulkUpdateImpl bulkUpdate = parser.getBulkUpdate();
-            if (bulkUpdate == null) {
-                throw new CmisInvalidArgumentException("Bulk update data is missing!");
-            }
+            // execute
+            List<BulkUpdateObjectIdAndChangeToken> result = null;
+            try {
+                BulkUpdateImpl bulkUpdate = parser.getBulkUpdate();
+                if (bulkUpdate == null) {
+                    throw new CmisInvalidArgumentException("Bulk update data is missing!");
+                }
 
-            List<BulkUpdateObjectIdAndChangeToken> result = service.bulkUpdateProperties(repositoryId,
-                    bulkUpdate.getObjectIdAndChangeToken(), bulkUpdate.getProperties(),
-                    bulkUpdate.getAddSecondaryTypeIds(), bulkUpdate.getRemoveSecondaryTypeIds(),
null);
+                if (stopBeforeService(service)) {
+                    return;
+                }
+
+                result = service.bulkUpdateProperties(repositoryId, bulkUpdate.getObjectIdAndChangeToken(),
+                        bulkUpdate.getProperties(), bulkUpdate.getAddSecondaryTypeIds(),
+                        bulkUpdate.getRemoveSecondaryTypeIds(), null);
+
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
+            }
 
             response.setStatus(HttpServletResponse.SC_CREATED);
             response.setContentType(Constants.MEDIATYPE_FEED);

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/PolicyService.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/PolicyService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/PolicyService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/PolicyService.java
Thu Jan 15 13:04:50 2015
@@ -159,14 +159,18 @@ public class PolicyService {
             AtomEntryParser parser = new AtomEntryParser(request.getInputStream(), streamFactory);
 
             // execute
-            if (stopBeforeService(service)) {
-                return;
-            }
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
 
-            service.applyPolicy(repositoryId, parser.getId(), objectId, null);
+                service.applyPolicy(repositoryId, parser.getId(), objectId, null);
 
-            if (stopAfterService(service)) {
-                return;
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, parser.getId());

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/RepositoryService.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/RepositoryService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/RepositoryService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/RepositoryService.java
Thu Jan 15 13:04:50 2015
@@ -490,14 +490,19 @@ public class RepositoryService {
             parser.parse(request.getInputStream());
 
             // execute
-            if (stopBeforeService(service)) {
-                return;
-            }
-
-            TypeDefinition newType = service.createType(repositoryId, parser.getTypeDefinition(),
null);
-
-            if (stopAfterService(service)) {
-                return;
+            TypeDefinition newType = null;
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
+
+                newType = service.createType(repositoryId, parser.getTypeDefinition(), null);
+
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             // set headers
@@ -535,14 +540,19 @@ public class RepositoryService {
             parser.parse(request.getInputStream());
 
             // execute
-            if (stopBeforeService(service)) {
-                return;
-            }
-
-            TypeDefinition newType = service.updateType(repositoryId, parser.getTypeDefinition(),
null);
-
-            if (stopAfterService(service)) {
-                return;
+            TypeDefinition newType = null;
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
+
+                newType = service.updateType(repositoryId, parser.getTypeDefinition(), null);
+
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             // set headers

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/VersioningService.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/VersioningService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/VersioningService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/VersioningService.java
Thu Jan 15 13:04:50 2015
@@ -60,15 +60,19 @@ public class VersioningService {
             parser.parse(request.getInputStream());
 
             // execute
-            if (stopBeforeService(service)) {
-                return;
-            }
-
             Holder<String> checkOutId = new Holder<String>(parser.getId());
-            service.checkOut(repositoryId, checkOutId, null, null);
+            try {
+                if (stopBeforeService(service)) {
+                    return;
+                }
+
+                service.checkOut(repositoryId, checkOutId, null, null);
 
-            if (stopAfterService(service)) {
-                return;
+                if (stopAfterService(service)) {
+                    return;
+                }
+            } finally {
+                parser.release();
             }
 
             ObjectInfo objectInfo = service.getObjectInfo(repositoryId, checkOutId.getValue());

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.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/CmisBrowserBindingServlet.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
Thu Jan 15 13:04:50 2015
@@ -75,6 +75,7 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.server.shared.Dispatcher.METHOD_POST;
 
 import java.io.IOException;
+import java.io.InputStream;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
@@ -262,6 +263,18 @@ public class CmisBrowserBindingServlet e
                 printError(context, e, request, response);
             }
         } finally {
+            // in any case close the content stream if one has been provided
+            if (request instanceof POSTHttpServletRequestWrapper) {
+                InputStream stream = ((POSTHttpServletRequestWrapper) request).getStream();
+                if (stream != null) {
+                    try {
+                        stream.close();
+                    } catch (IOException e) {
+                        LOG.error("Could not close POST stream: {}", e.toString(), e);
+                    }
+                }
+            }
+
             // we are done.
             response.flushBuffer();
         }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.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/ObjectService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
Thu Jan 15 13:04:50 2015
@@ -111,14 +111,8 @@ public class ObjectService {
                 return;
             }
 
-            String newObjectId = null;
-            try {
-                newObjectId = service
-                        .createDocument(repositoryId, createNewProperties(cp, typeCache),
folderId, contentStream,
-                                versioningState, createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp),
null);
-            } finally {
-                closeContentStream(contentStream);
-            }
+            String newObjectId = service.createDocument(repositoryId, createNewProperties(cp,
typeCache), folderId,
+                    contentStream, versioningState, createPolicies(cp), createAddAcl(cp),
createRemoveAcl(cp), null);
 
             if (stopAfterService(service)) {
                 return;
@@ -964,12 +958,8 @@ public class ObjectService {
                 return;
             }
 
-            try {
-                service.setContentStream(repositoryId, objectIdHolder, overwriteFlag, changeTokenHolder,
contentStream,
-                        null);
-            } finally {
-                closeContentStream(contentStream);
-            }
+            service.setContentStream(repositoryId, objectIdHolder, overwriteFlag, changeTokenHolder,
contentStream,
+                    null);
 
             if (stopAfterService(service)) {
                 return;
@@ -1023,12 +1013,8 @@ public class ObjectService {
                 return;
             }
 
-            try {
-                service.appendContentStream(repositoryId, objectIdHolder, changeTokenHolder,
contentStream,
-                        isLastChunk, null);
-            } finally {
-                closeContentStream(contentStream);
-            }
+            service.appendContentStream(repositoryId, objectIdHolder, changeTokenHolder,
contentStream, isLastChunk,
+                    null);
 
             if (stopAfterService(service)) {
                 return;

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.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/VersioningService.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java
Thu Jan 15 13:04:50 2015
@@ -161,13 +161,9 @@ public class VersioningService {
                 return;
             }
 
-            try {
-                service.checkIn(repositoryId, objectIdHolder, major,
-                        createUpdateProperties(cp, typeId, null, Collections.singletonList(objectId),
typeCache),
-                        contentStream, checkinComment, createPolicies(cp), createAddAcl(cp),
createRemoveAcl(cp), null);
-            } finally {
-                closeContentStream(contentStream);
-            }
+            service.checkIn(repositoryId, objectIdHolder, major,
+                    createUpdateProperties(cp, typeId, null, Collections.singletonList(objectId),
typeCache),
+                    contentStream, checkinComment, createPolicies(cp), createAddAcl(cp),
createRemoveAcl(cp), null);
 
             if (stopAfterService(service)) {
                 return;

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/AbstractServiceCall.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/AbstractServiceCall.java?rev=1652084&r1=1652083&r2=1652084&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/AbstractServiceCall.java
(original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/AbstractServiceCall.java
Thu Jan 15 13:04:50 2015
@@ -126,13 +126,6 @@ public abstract class AbstractServiceCal
     }
 
     /**
-     * Closes a content stream.
-     */
-    public void closeContentStream(ContentStream contentStream) {
-        IOUtils.closeQuietly(contentStream);
-    }
-
-    /**
      * Sets certain HTTP headers if the server implementation requested them.
      * 
      * @return {@code true} if the request has been served by this method (for

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=1652084&r1=1652083&r2=1652084&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
Thu Jan 15 13:04:50 2015
@@ -159,29 +159,45 @@ public class ThresholdOutputStream exten
     private void openTempFile() throws IOException {
         tempFile = File.createTempFile("opencmis", null, tempDir);
 
-        if (encrypt) {
-            Cipher cipher;
-            try {
-                KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
-                keyGenerator.init(KEY_SIZE);
-                key = keyGenerator.generateKey();
+        try {
+            if (encrypt) {
+                Cipher cipher;
+                try {
+                    KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
+                    keyGenerator.init(KEY_SIZE);
+                    key = keyGenerator.generateKey();
 
-                cipher = Cipher.getInstance(TRANSFORMATION);
-                cipher.init(Cipher.ENCRYPT_MODE, key);
+                    cipher = Cipher.getInstance(TRANSFORMATION);
+                    cipher.init(Cipher.ENCRYPT_MODE, key);
 
-                iv = cipher.getIV();
-            } catch (Exception e) {
+                    iv = cipher.getIV();
+                } catch (Exception e) {
 
-                if (LOG.isErrorEnabled()) {
-                    LOG.error("Cannot initialize encryption cipher: {}", e.toString(), e);
+                    if (LOG.isErrorEnabled()) {
+                        LOG.error("Cannot initialize encryption cipher: {}", e.toString(),
e);
+                    }
+
+                    throw new IOException("Cannot initialize encryption cipher!", e);
                 }
 
-                throw new IOException("Cannot initialize encryption cipher!", e);
+                tmpStream = new BufferedOutputStream(new CipherOutputStream(new FileOutputStream(tempFile),
cipher));
+            } else {
+                tmpStream = new BufferedOutputStream(new FileOutputStream(tempFile));
+            }
+        } catch (IOException ioe) {
+            if (tempFile.exists()) {
+                if (!tempFile.delete()) {
+                    if (LOG.isErrorEnabled()) {
+                        LOG.error("Temp file {} could not be deleted!", tempFile.getAbsolutePath());
+                    }
+                }
             }
 
-            tmpStream = new BufferedOutputStream(new CipherOutputStream(new FileOutputStream(tempFile),
cipher));
-        } else {
-            tmpStream = new BufferedOutputStream(new FileOutputStream(tempFile));
+            throw ioe;
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Created temp file: {}", tempFile.getAbsolutePath());
         }
     }
 
@@ -297,13 +313,23 @@ public class ThresholdOutputStream exten
             LOG.debug("ThresholdOutputStream destroyed." + (cause == null ? "" : " Cause:
" + cause.toString()), cause);
         }
 
-        try {
-            if (tmpStream != null) {
+        if (tmpStream != null) {
+            try {
                 tmpStream.flush();
+            } catch (Exception e) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Flushing the temp file {} failed: {}", tempFile.getAbsolutePath(),
e.toString(), e);
+                }
+            }
+            try {
                 tmpStream.close();
+            } catch (Exception e) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Closing the temp file {} failed: {}", tempFile.getAbsolutePath(),
e.toString(), e);
+                }
             }
-        } catch (Exception e) {
-            // ignore
+
+            tmpStream = null;
         }
 
         if (tempFile != null) {
@@ -312,6 +338,10 @@ public class ThresholdOutputStream exten
                 if (LOG.isErrorEnabled()) {
                     LOG.error("Temp file {} could not be deleted!", tempFile.getAbsolutePath());
                 }
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Deleted temp file: {}", tempFile.getAbsolutePath());
+                }
             }
         }
 
@@ -654,15 +684,24 @@ public class ThresholdOutputStream exten
                 try {
                     stream.close();
                     isClosed = true;
+                    stream = null;
                 } catch (Exception e) {
-                    // ignore
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Closing the temp file {} failed: {}", tempFile.getAbsolutePath(),
e.toString(), e);
+                    }
                 }
             }
 
             if (!isDeleted) {
                 isDeleted = tempFile.delete();
                 if (!isDeleted) {
-                    LOG.warn("Temp file {} could not be deleted!", tempFile.getAbsolutePath());
+                    if (LOG.isErrorEnabled()) {
+                        LOG.error("Temp file {} could not be deleted!", tempFile.getAbsolutePath());
+                    }
+                } else {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Deleted temp file: {}", tempFile.getAbsolutePath());
+                    }
                 }
             }
         }

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=1652084&r1=1652083&r2=1652084&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
Thu Jan 15 13:04:50 2015
@@ -191,6 +191,9 @@ public class AtomEntryParserTest {
                 .get(PropertyIds.NAME);
 
         assertEquals("atom.title", nameProperty.getFirstValue());
+
+        aep.release();
+        assertNull(aep.getContentStream());
     }
 
     @Test
@@ -241,6 +244,9 @@ public class AtomEntryParserTest {
         assertNotNull(contentStream.getStream());
 
         contentStream.getStream().close();
+
+        aep.release();
+        assertNull(aep.getContentStream());
     }
 
     private static byte[] parse(byte[] entry) throws Exception {
@@ -258,6 +264,9 @@ public class AtomEntryParserTest {
 
         contentStream.getStream().close();
 
+        aep.release();
+        assertNull(aep.getContentStream());
+
         return baos.toByteArray();
     }
 }



Mime
View raw message