Tuesday, 27 March
2012
Tue, 27 Mar
'12
2:36 a.m.
Author: tolusha
Date: 2012-03-27 03:36:01 -0400 (Tue, 27 Mar 2012)
New Revision: 5968
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/EditableValueData.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/FilePersistedValueData.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewContentExporter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewStreamExporter.java
jcr/trunk/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java
Log:
EXOJCR-1817: Close all unclosed streams
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/EditableValueData.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/EditableValueData.java 2012-03-26
12:55:32 UTC (rev 5967)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/EditableValueData.java 2012-03-27
07:36:01 UTC (rev 5968)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.impl.dataflow;
import org.exoplatform.commons.utils.PrivilegedFileHelper;
+import org.exoplatform.services.jcr.impl.util.io.DirectoryHelper;
import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
import org.exoplatform.services.jcr.impl.util.io.SpoolFile;
import org.exoplatform.services.log.ExoLogger;
@@ -130,15 +131,7 @@
OutputStream sfout = PrivilegedFileHelper.fileOutputStream(sf);
try
{
- byte[] tmpBuff = new byte[2048];
- int read = 0;
- int len = 0;
-
- while ((read = stream.read(tmpBuff)) >= 0)
- {
- sfout.write(tmpBuff, 0, read);
- len += read;
- }
+ DirectoryHelper.transfer(stream, sfout);
}
catch (final IOException e)
{
@@ -163,6 +156,11 @@
}
};
}
+ finally
+ {
+ sfout.close();
+ stream.close();
+ }
this.data = null;
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/FilePersistedValueData.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/FilePersistedValueData.java 2012-03-26
12:55:32 UTC (rev 5967)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/FilePersistedValueData.java 2012-03-27
07:36:01 UTC (rev 5968)
@@ -25,6 +25,7 @@
import java.io.Externalizable;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -32,7 +33,6 @@
import java.io.ObjectOutput;
import java.io.OutputStream;
import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
@@ -56,8 +56,6 @@
protected File file;
- protected FileChannel channel;
-
/**
* Empty constructor to serialization.
*/
@@ -111,37 +109,46 @@
*/
public long read(OutputStream stream, long length, long position) throws IOException
{
- if (channel == null)
- {
- channel = PrivilegedFileHelper.fileInputStream(file).getChannel();
- }
+ FileInputStream in = PrivilegedFileHelper.fileInputStream(file);
- // validation
- if (position >= channel.size() && position > 0)
+ try
{
- throw new IOException("Position " + position + " out of value
size " + channel.size());
- }
+ FileChannel channel = in.getChannel();
- if (position + length >= channel.size())
- {
- length = channel.size() - position;
- }
+ // validation
+ if (position >= channel.size() && position > 0)
+ {
+ throw new IOException("Position " + position + " out of value
size " + channel.size());
+ }
- MappedByteBuffer bb = channel.map(FileChannel.MapMode.READ_ONLY, position,
length);
+ if (position + length >= channel.size())
+ {
+ length = channel.size() - position;
+ }
- WritableByteChannel ch;
- if (stream instanceof FileOutputStream)
- {
- ch = ((FileOutputStream)stream).getChannel();
+ WritableByteChannel ch;
+ if (stream instanceof FileOutputStream)
+ {
+ ch = ((FileOutputStream)stream).getChannel();
+ }
+ else
+ {
+ ch = Channels.newChannel(stream);
+ }
+
+ long size = 0;
+ do
+ {
+ size += channel.transferTo(position, length, ch);
+ }
+ while (size != length);
+
+ return size;
}
- else
+ finally
{
- ch = Channels.newChannel(stream);
+ in.close();
}
- ch.write(bb);
- ch.close();
-
- return length;
}
/**
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewContentExporter.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewContentExporter.java 2012-03-26
12:55:32 UTC (rev 5967)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewContentExporter.java 2012-03-27
07:36:01 UTC (rev 5968)
@@ -191,13 +191,20 @@
else
{
InputStream is = data.getAsStream();
- byte[] buffer = new byte[3 * 1024 * 3];
- int len;
- while ((len = is.read(buffer)) > 0)
+ try
{
- char[] charbuf1 = Base64.encode(buffer, 0, len, 0,
"").toCharArray();
- contentHandler.characters(charbuf1, 0, charbuf1.length);
+ byte[] buffer = new byte[3 * 1024 * 3];
+ int len;
+ while ((len = is.read(buffer)) > 0)
+ {
+ char[] charbuf1 = Base64.encode(buffer, 0, len, 0,
"").toCharArray();
+ contentHandler.characters(charbuf1, 0, charbuf1.length);
+ }
}
+ finally
+ {
+ is.close();
+ }
}
}
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewStreamExporter.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewStreamExporter.java 2012-03-26
12:55:32 UTC (rev 5967)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/exporting/SystemViewStreamExporter.java 2012-03-27
07:36:01 UTC (rev 5968)
@@ -249,10 +249,7 @@
}
finally
{
- if (is != null)
- {
- is.close();
- }
+ is.close();
}
}
}
Modified:
jcr/trunk/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java
===================================================================
---
jcr/trunk/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java 2012-03-26
12:55:32 UTC (rev 5967)
+++
jcr/trunk/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java 2012-03-27
07:36:01 UTC (rev 5968)
@@ -39,6 +39,7 @@
import org.exoplatform.services.rest.ext.provider.XSLTStreamingOutput;
import org.exoplatform.services.rest.impl.header.MediaTypeHelper;
+import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.text.DateFormat;
@@ -110,6 +111,7 @@
}
}
+ InputStream istream = null;
try
{
Node node = (Node)session.getItem(path);
@@ -118,11 +120,9 @@
URI uri = new URI(TextUtil.escape(baseURI + node.getPath(), '%',
true));
Resource resource;
- InputStream istream;
if (ResourceUtil.isFile(node))
{
-
HierarchicalProperty lastModifiedProperty;
if (version != null)
@@ -131,14 +131,12 @@
resource = versionedFile.getVersionHistory().getVersion(version);
lastModifiedProperty =
resource.getProperty(FileResource.GETLASTMODIFIED);
- istream = ((VersionResource)resource).getContentAsStream();
}
else
{
resource = new FileResource(uri, node, nsContext);
lastModifiedProperty =
resource.getProperty(FileResource.GETLASTMODIFIED);
- istream = ((FileResource)resource).getContentAsStream();
}
// check before any other reads
@@ -150,8 +148,9 @@
dateFormat = new
SimpleDateFormat(WebDavConst.DateFormat.IF_MODIFIED_SINCE_PATTERN, Locale.US);
Date ifModifiedSinceDate = dateFormat.parse(ifModifiedSince);
-
- if(ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime()){
+
+ if (ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime())
+ {
return Response.notModified().entity("Not
Modified").build();
}
}
@@ -162,6 +161,7 @@
// content length is not present
if (contentLength == 0)
{
+ istream = openStream(resource, version != null);
return Response.ok().header(ExtHttpHeaders.ACCEPT_RANGES,
"bytes").entity(istream).build();
}
@@ -171,10 +171,13 @@
// no ranges request
if (ranges.size() == 0)
{
- return Response.ok().header(HttpHeaders.CONTENT_LENGTH,
Long.toString(contentLength)).header(
- ExtHttpHeaders.ACCEPT_RANGES,
"bytes").header(ExtHttpHeaders.LAST_MODIFIED,
- lastModifiedProperty.getValue()).header(ExtHttpHeaders.CACHE_CONTROL,
- generateCacheControl(cacheControls,
contentType)).entity(istream).type(contentType).build();
+ istream = openStream(resource, version != null);
+
+ return Response.ok().header(HttpHeaders.CONTENT_LENGTH,
Long.toString(contentLength))
+ .header(ExtHttpHeaders.ACCEPT_RANGES, "bytes")
+ .header(ExtHttpHeaders.LAST_MODIFIED, lastModifiedProperty.getValue())
+ .header(ExtHttpHeaders.CACHE_CONTROL,
generateCacheControl(cacheControls, contentType))
+ .entity(istream).type(contentType).build();
}
// one range
@@ -182,13 +185,16 @@
{
Range range = ranges.get(0);
if (!validateRange(range, contentLength))
- return
Response.status(HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE).header(
- ExtHttpHeaders.CONTENTRANGE, "bytes */" +
contentLength).build();
+ {
+ return Response.status(HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE)
+ .header(ExtHttpHeaders.CONTENTRANGE, "bytes */" +
contentLength).build();
+ }
long start = range.getStart();
long end = range.getEnd();
long returnedContentLength = (end - start + 1);
+ istream = openStream(resource, version != null);
RangedInputStream rangedInputStream = new RangedInputStream(istream,
start, end);
return Response.status(HTTPStatus.PARTIAL)
@@ -204,8 +210,10 @@
{
Range range = ranges.get(i);
if (!validateRange(range, contentLength))
- return
Response.status(HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE).header(
- ExtHttpHeaders.CONTENTRANGE, "bytes */" +
contentLength).build();
+ {
+ return Response.status(HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE)
+ .header(ExtHttpHeaders.CONTENTRANGE, "bytes */" +
contentLength).build();
+ }
ranges.set(i, range);
}
@@ -232,15 +240,20 @@
}
catch (PathNotFoundException exc)
{
+ closeStream(istream);
return Response.status(HTTPStatus.NOT_FOUND).entity(exc.getMessage()).build();
}
catch (RepositoryException exc)
{
+ closeStream(istream);
+
LOG.error(exc.getMessage(), exc);
return Response.serverError().entity(exc.getMessage()).build();
}
catch (Exception exc)
{
+ closeStream(istream);
+
LOG.error(exc.getMessage(), exc);
return Response.serverError().entity(exc.getMessage()).build();
}
@@ -327,4 +340,25 @@
return cacheControlValue;
}
+ private InputStream openStream(Resource resource, boolean isVersionableResource)
throws RepositoryException
+ {
+ return isVersionableResource ? ((VersionResource)resource).getContentAsStream() :
((FileResource)resource)
+ .getContentAsStream();
+ }
+
+ private void closeStream(InputStream istream)
+ {
+ if (istream != null)
+ {
+ try
+ {
+ istream.close();
+ }
+ catch (IOException e)
+ {
+ LOG.error("Can't close the stream", e);
+ }
+ }
+ }
+
}