提交 502e0add 编写于 作者: F frederikheremans

ACT-241 consistent closing of inputstreams

上级 70e50b36
......@@ -5,6 +5,8 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.activiti.engine.impl.util.IoUtil;
/**
* This class encapsulates real content (text, images, ...).
*
......@@ -36,13 +38,14 @@ public class Content {
}
byteStream.write(buf, 0, len);
}
inputStream.close();
byteStream.close();
return byteStream.toByteArray();
} catch (IOException ex) {
throw new RepositoryException("Couldn't load from InputStream of content, check nested exception.", ex);
}
throw new RepositoryException("Couldn't load from InputStream of content, check nested exception.", ex);
} finally {
// Close inputstream. Closing of ByteArrayOutputStream not nessecairy, does nothing
IoUtil.closeSilently(inputStream);
}
}
public byte[] asByteArray() {
......
......@@ -5,6 +5,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import org.activiti.cycle.RepositoryException;
import org.activiti.engine.impl.util.IoUtil;
/**
* Base class for all actions requiring parameters (see
......@@ -31,13 +32,15 @@ public abstract class ParameterizedHtmlFormTemplateAction extends ParameterizedA
return "/" + this.getClass().getName().replace(".", "/") + ".html";
}
public String getFormAsHtml() {
InputStream is = null;
try {
String resourceName = getFormResourceName();
if (resourceName == null) {
return null;
}
InputStream is = this.getClass().getResourceAsStream(resourceName);
is = this.getClass().getResourceAsStream(resourceName);
if (is == null) {
throw new RepositoryException("HTML form for action " + this.getClass() + " from template '" + getFormResourceName() + "' doesn't exist in classpath");
}
......@@ -53,6 +56,8 @@ public abstract class ParameterizedHtmlFormTemplateAction extends ParameterizedA
} catch (Exception ex) {
throw new RepositoryException("Exception while creating HTML form for action " + this.getClass() + " from form template '" + getFormResourceName() + "'",
ex);
} finally {
IoUtil.closeSilently(is);
}
}
......
......@@ -38,9 +38,10 @@ public class CycleDbSqlSessionFactory extends DbSqlSessionFactory {
@Override
protected SqlSessionFactory createSessionFactory(DataSource dataSource, TransactionFactory transactionFactory) {
InputStream inputStream = null;
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("org/activiti/db/cycle/ibatis/activiti.ibatis.mem.conf.xml");
inputStream = classLoader.getResourceAsStream("org/activiti/db/cycle/ibatis/activiti.ibatis.mem.conf.xml");
// update the jdbc parameters to the configured ones...
Environment environment = new Environment("default", transactionFactory, dataSource);
......@@ -55,6 +56,8 @@ public class CycleDbSqlSessionFactory extends DbSqlSessionFactory {
} catch (Exception e) {
throw new ActivitiException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);
} finally {
IoUtil.closeSilently(inputStream);
}
}
......@@ -71,11 +74,12 @@ public class CycleDbSqlSessionFactory extends DbSqlSessionFactory {
public static void executeSchemaResource(String operation, String databaseName, SqlSessionFactory sqlSessionFactory) {
SqlSession sqlSession = sqlSessionFactory.openSession();
boolean success = false;
InputStream inputStream = null;
try {
Connection connection = sqlSession.getConnection();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String resource = "org/activiti/db/cycle/" + operation + "/activiti." + databaseName + "." + operation + ".sql";
InputStream inputStream = classLoader.getResourceAsStream(resource);
inputStream = classLoader.getResourceAsStream(resource);
if (inputStream == null) {
throw new ActivitiException("resource '" + resource + "' is not available for creating the schema");
}
......@@ -111,6 +115,7 @@ public class CycleDbSqlSessionFactory extends DbSqlSessionFactory {
throw new ActivitiException("couldn't create db schema", e);
} finally {
IoUtil.closeSilently(inputStream);
if (success) {
sqlSession.commit(true);
} else {
......
......@@ -21,6 +21,7 @@ import org.activiti.cycle.impl.RepositoryArtifactImpl;
import org.activiti.cycle.impl.RepositoryFolderImpl;
import org.activiti.cycle.impl.RepositoryNodeCollectionImpl;
import org.activiti.cycle.impl.connector.AbstractRepositoryConnector;
import org.activiti.engine.impl.util.IoUtil;
public class DemoConnector extends AbstractRepositoryConnector<DemoConnectorConfiguration> {
......@@ -147,12 +148,13 @@ public class DemoConnector extends AbstractRepositoryConnector<DemoConnectorConf
private Content createContent(String contentSourceUrl) {
Content result = new Content();
InputStream in = null;
try {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
// read locally instead of internet
// InputStream in = new URL(contentSourceUrl).openStream();
InputStream in = DemoConnector.class.getResourceAsStream(contentSourceUrl);
in = DemoConnector.class.getResourceAsStream(contentSourceUrl);
if (in == null) {
throw new RuntimeException("resource '" + contentSourceUrl + "' not found in classpath");
}
......@@ -169,6 +171,8 @@ public class DemoConnector extends AbstractRepositoryConnector<DemoConnectorConf
result.setValue(byteStream.toByteArray());
} catch (Exception ex) {
throw new RepositoryException("couldn't create content from URL " + contentSourceUrl, ex);
} finally {
IoUtil.closeSilently(in);
}
return result;
}
......
......@@ -17,6 +17,7 @@ import java.io.InputStream;
import java.util.Properties;
import org.activiti.engine.impl.cfg.ProcessEngineConfiguration;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.util.ReflectUtil;
/**
......@@ -245,6 +246,8 @@ public class ProcessEngineBuilder {
properties.load(inputStream);
} catch (IOException e) {
throw new ActivitiException("problem while reading activiti configuration properties " + e.getMessage(), e);
} finally {
IoUtil.closeSilently(inputStream);
}
configureFromProperties(properties);
return this;
......
......@@ -28,6 +28,7 @@ import java.util.logging.Logger;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.engine.impl.ProcessEngineInfoImpl;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.util.ReflectUtil;
......@@ -142,9 +143,10 @@ public abstract class ProcessEngines {
return sw.toString();
}
private static ProcessEngine buildProcessEngine(URL resource) {
private static ProcessEngine buildProcessEngine(URL resource) {
InputStream inputStream = null;
try {
InputStream inputStream = resource.openStream();
inputStream = resource.openStream();
ProcessEngine processEngine = new ProcessEngineBuilder()
.configureFromPropertiesInputStream(inputStream)
.buildProcessEngine();
......@@ -152,6 +154,8 @@ public abstract class ProcessEngines {
} catch (IOException e) {
throw new ActivitiException("couldn't open resource stream: "+e.getMessage(), e);
} finally {
IoUtil.closeSilently(inputStream);
}
}
......
......@@ -24,6 +24,7 @@ import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineInfo;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.util.LogUtil;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
......@@ -103,7 +104,7 @@ public class DeployBarTask extends Task {
.addZipInputStream(new ZipInputStream(inputStream))
.deploy();
} finally {
inputStream.close();
IoUtil.closeSilently(inputStream);
}
} catch (Exception e) {
throw new BuildException("couldn't deploy bar "+path+": "+e.getMessage(), e);
......
......@@ -17,6 +17,7 @@ import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.activiti.engine.impl.util.IoUtil;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
......@@ -71,10 +72,11 @@ public class LaunchThread extends Thread {
.redirectErrorStream(true)
.directory(dir);
InputStream consoleStream = null;
try {
Process process = processBuilder.start();
InputStream consoleStream = process.getInputStream();
consoleStream = process.getInputStream();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(consoleStream));
String consoleLine = "";
while ( (consoleLine!=null)
......@@ -90,6 +92,8 @@ public class LaunchThread extends Thread {
}
} catch (Exception e) {
throw new BuildException("couldn't launch "+cmdString(cmd), e);
} finally {
IoUtil.closeSilently(consoleStream);
}
}
}
......@@ -132,9 +132,10 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
}
protected SqlSessionFactory createSessionFactory(DataSource dataSource, TransactionFactory transactionFactory) {
InputStream inputStream = null;
try {
InputStream inputStream = ReflectUtil.getResourceAsStream("org/activiti/db/ibatis/activiti.ibatis.mem.conf.xml");
inputStream = ReflectUtil.getResourceAsStream("org/activiti/db/ibatis/activiti.ibatis.mem.conf.xml");
// update the jdbc parameters to the configured ones...
Environment environment = new Environment("default", transactionFactory, dataSource);
......@@ -149,6 +150,8 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
} catch (Exception e) {
throw new ActivitiException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);
} finally {
IoUtil.closeSilently(inputStream);
}
}
......@@ -257,10 +260,11 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
public static void executeSchemaResource(String operation, String databaseName, SqlSessionFactory sqlSessionFactory) {
SqlSession sqlSession = sqlSessionFactory.openSession();
boolean success = false;
InputStream inputStream = null;
try {
Connection connection = sqlSession.getConnection();
String resource = "org/activiti/db/" + operation + "/activiti." + databaseName + "." + operation + ".sql";
InputStream inputStream = ReflectUtil.getResourceAsStream(resource);
inputStream = ReflectUtil.getResourceAsStream(resource);
if (inputStream == null) {
throw new ActivitiException("resource '" + resource + "' is not available for creating the schema");
}
......@@ -296,6 +300,7 @@ public class DbSqlSessionFactory implements SessionFactory, ProcessEngineConfigu
throw new ActivitiException("couldn't create or drop db schema", e);
} finally {
IoUtil.closeSilently(inputStream);
if (success) {
sqlSession.commit(true);
} else {
......
......@@ -38,6 +38,7 @@ import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.engine.impl.cfg.ProcessEngineConfiguration;
import org.activiti.engine.impl.jobexecutor.JobExecutor;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.util.ReflectUtil;
import org.activiti.engine.impl.util.LogUtil.ThreadLogMode;
import org.activiti.engine.runtime.ProcessInstance;
......@@ -94,6 +95,8 @@ public class ActivitiInternalTestCase extends PvmTestCase {
} catch (Exception e) {
throw new RuntimeException("couldn't instantiate process engine initializer "+properties+": "+e, e);
} finally {
IoUtil.closeSilently(initializersInputStream);
}
}
return new DefaultProcessEngineInitializer();
......
......@@ -13,13 +13,16 @@
package org.activiti.engine.impl.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.activiti.engine.ActivitiException;
/**
* @author Tom Baeyens
* @author Frederik Heremans
*/
public class IoUtil {
......@@ -38,5 +41,31 @@ public class IoUtil {
return outputStream.toByteArray();
}
/**
* Closes the given stream. The same as calling {@link InputStream#close()}, but
* errors while closing are silently ignored.
*/
public static void closeSilently(InputStream inputStream) {
try {
if(inputStream != null) {
inputStream.close();
}
} catch(IOException ignore) {
// Exception is silently ignored
}
}
/**
* Closes the given stream. The same as calling {@link OutputStream#close()}, but
* errors while closing are silently ignored.
*/
public static void closeSilently(OutputStream outputStream) {
try {
if(outputStream != null) {
outputStream.close();
}
} catch(IOException ignore) {
// Exception is silently ignored
}
}
}
......@@ -51,8 +51,7 @@ public class LogUtil {
}
public static void readJavaUtilLoggingConfigFromClasspath() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("logging.properties");
InputStream inputStream = ReflectUtil.getResourceAsStream("logging.properties");
try {
if (inputStream != null) {
LogManager.getLogManager().readConfiguration(inputStream);
......@@ -61,11 +60,11 @@ public class LogUtil {
if ((redirectCommons != null) && (!redirectCommons.equalsIgnoreCase("false"))) {
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.Jdk14Logger");
}
inputStream.close();
}
} catch (Exception e) {
throw new PvmException("couldn't initialize logging properly", e);
} finally {
IoUtil.closeSilently(inputStream);
}
}
......
......@@ -21,6 +21,7 @@ import java.io.Serializable;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.runtime.VariableInstanceEntity;
import org.activiti.engine.impl.util.IoUtil;
/**
* @author Tom Baeyens
......@@ -57,6 +58,8 @@ public class SerializableType extends ByteArrayType {
} catch (Exception e) {
throw new ActivitiException("coudn't deserialize object in variable '"+valueFields.getName()+"'", e);
} finally {
IoUtil.closeSilently(bais);
}
return deserializedObject;
}
......@@ -72,11 +75,14 @@ public class SerializableType extends ByteArrayType {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream ois = null;
try {
ObjectOutputStream ois = new ObjectOutputStream(baos);
ois = new ObjectOutputStream(baos);
ois.writeObject(value);
} catch (Exception e) {
throw new ActivitiException("coudn't deserialize value '"+value+"' in variable '"+valueFields.getName()+"'", e);
} finally {
IoUtil.closeSilently(ois);
}
return baos.toByteArray();
}
......
......@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Set;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.impl.test.PvmTestCase;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentQuery;
......@@ -120,9 +121,7 @@ public class SpringAutoDeployTest extends PvmTestCase {
inputStream = new BufferedInputStream(new FileInputStream(getFile(filePath)));
inputStream.read(buffer);
} finally {
if (inputStream != null) {
inputStream.close();
}
IoUtil.closeSilently(inputStream);
}
return new String(buffer);
}
......
......@@ -25,6 +25,7 @@ import org.activiti.cycle.CycleService;
import org.activiti.cycle.RepositoryArtifact;
import org.activiti.cycle.impl.CycleServiceImpl;
import org.activiti.cycle.impl.transform.TransformationException;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.rest.util.ActivitiRequest;
import org.activiti.rest.util.ActivitiStreamingWebScript;
import org.springframework.extensions.webscripts.WebScriptResponse;
......@@ -85,15 +86,18 @@ public class ContentGet extends ActivitiStreamingWebScript {
}
}
InputStream contentInputStream = null;
try {
streamResponse(res, this.cycleService.getContent(artifact.getConnectorId(), artifact.getNodeId(), contentRepresentation.getId()).asInputStream(), new Date(0),
contentInputStream = this.cycleService.getContent(artifact.getConnectorId(), artifact.getNodeId(), contentRepresentation.getId()).asInputStream();
streamResponse(res, contentInputStream, new Date(0),
// TODO: what is a good way to determine the etag? Using a fake one...
"W/\"647-1281077702000\"", attach, attachmentFileName, contentType);
} catch (TransformationException e) {
streamResponse(res, new ByteArrayInputStream(e.getRenderContent().getBytes()), new Date(0),
// TODO: what is a good way to determine the etag? Using a fake one...
"W/\"647-1281077702000\"", false, null, CycleDefaultMimeType.HTML.getContentType());
} finally {
IoUtil.closeSilently(contentInputStream);
}
......
package org.activiti.rest.api.process;
import org.activiti.rest.util.ActivitiRequest;
import org.activiti.rest.util.ActivitiStreamingWebScript;
import org.activiti.rest.util.ActivitiWebScript;
import org.springframework.extensions.webscripts.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Map;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.rest.util.ActivitiRequest;
import org.activiti.rest.util.ActivitiStreamingWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptResponse;
/**
* Returns a process definition's form.
......@@ -42,6 +43,8 @@ public class ProcessDefinitionFormGet extends ActivitiStreamingWebScript
streamResponse(res, is, new Date(0), null, true, processDefinitionId, mimeType);
} catch (IOException e) {
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, "The form for process definition '" + processDefinitionId + "' failed to render.");
} finally {
IoUtil.closeSilently(is);
}
}
else if (form != null) {
......
......@@ -13,6 +13,7 @@
package org.activiti.rest.api.repository;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.rest.util.ActivitiRequest;
import org.activiti.rest.util.ActivitiStreamingWebScript;
import org.springframework.extensions.webscripts.*;
......@@ -39,6 +40,8 @@ public class DeploymentResourceGet extends ActivitiStreamingWebScript {
streamResponse(res, resource, new Date(0), null, true, resourceName, getMimeType(resource));
} catch (IOException e) {
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, "The resource with name '" + resourceName + "' for deployment with id '" + deploymentId + "' could not be streamed: " + e.getMessage());
} finally {
IoUtil.closeSilently(resource);
}
}
else {
......
package org.activiti.rest.api.task;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.rest.util.ActivitiRequest;
import org.activiti.rest.util.ActivitiStreamingWebScript;
import org.activiti.rest.util.ActivitiWebScript;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Map;
/**
* Returns a task's form.
*
......@@ -45,6 +43,8 @@ public class TaskFormGet extends ActivitiStreamingWebScript
streamResponse(res, is, new Date(0), null, true, taskId, mimeType);
} catch (IOException e) {
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, "The form for task '" + taskId + "' failed to render.");
} finally {
IoUtil.closeSilently(is);
}
}
else if (form != null){
......
......@@ -12,21 +12,26 @@
*/
package org.activiti.rest.util;
import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil;
import org.activiti.engine.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.Date;
import org.activiti.engine.FormService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineInfo;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.rest.Config;
import org.springframework.extensions.webscripts.AbstractWebScript;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.Collection;
import java.util.Date;
/**
* Helper class that wrapps the webscript request to perform methods upon it.
*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册