From 597ef5babba88360e4def0845ad58f3eb936b722 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 1 Apr 2014 09:47:21 +0200
Subject: [PATCH] no-jira: close inputstream in QTI ParserManager and in
 ServletUtil

---
 .../org/olat/core/gui/media/ServletUtil.java  | 38 ++++++------
 .../editor/beecom/parser/ParserManager.java   | 58 ++++++++++---------
 2 files changed, 50 insertions(+), 46 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/media/ServletUtil.java b/src/main/java/org/olat/core/gui/media/ServletUtil.java
index 4bdd4073afb..dce35842db7 100644
--- a/src/main/java/org/olat/core/gui/media/ServletUtil.java
+++ b/src/main/java/org/olat/core/gui/media/ServletUtil.java
@@ -180,22 +180,23 @@ public class ServletUtil {
 				}
 
 				if (ranges != null && ranges.size() == 1) {
-          Range range = ranges.get(0);
-          httpResp.addHeader("Content-Range", "bytes " + range.start + "-" + range.end + "/" + range.length);
-          long length = range.end - range.start + 1;
-          if (length < Integer.MAX_VALUE) {
-          	httpResp.setContentLength((int) length);
-          } else {
-              // Set the content-length as String to be able to use a long
-          	httpResp.setHeader("content-length", "" + length);
-          }
-          httpResp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
-          try {
-          	httpResp.setBufferSize(2048);
-          } catch (IllegalStateException e) {
-          	// Silent catch
-          }
-          copy(out, in, range);
+					
+					Range range = ranges.get(0);
+					httpResp.addHeader("Content-Range", "bytes " + range.start + "-" + range.end + "/" + range.length);
+					long length = range.end - range.start + 1;
+					if (length < Integer.MAX_VALUE) {
+						httpResp.setContentLength((int) length);
+					} else {
+						// Set the content-length as String to be able to use a long
+						httpResp.setHeader("content-length", "" + length);
+					}
+					httpResp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+					try {
+						httpResp.setBufferSize(2048);
+					} catch (IllegalStateException e) {
+						// Silent catch
+					}
+					copy(out, in, range);
 				} else {
 					if (size != null) {
 						httpResp.setContentLength(size.intValue());
@@ -211,8 +212,6 @@ public class ServletUtil {
 				}
 			}
 		} catch (IOException e) {
-			FileUtils.closeSafely(in);
-			FileUtils.closeSafely(bis);
 			FileUtils.closeSafely(out);
 			String className = e.getClass().getSimpleName();
 			if("ClientAbortException".equals(className)) {
@@ -220,6 +219,9 @@ public class ServletUtil {
 			} else {
 				log.error("client browser probably abort when serving media resource", e);
 			}
+		} finally {
+			IOUtils.closeQuietly(bis);
+			IOUtils.closeQuietly(in);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti/editor/beecom/parser/ParserManager.java b/src/main/java/org/olat/ims/qti/editor/beecom/parser/ParserManager.java
index c11f7807b99..d338cd60026 100644
--- a/src/main/java/org/olat/ims/qti/editor/beecom/parser/ParserManager.java
+++ b/src/main/java/org/olat/ims/qti/editor/beecom/parser/ParserManager.java
@@ -25,47 +25,50 @@
 
 package org.olat.ims.qti.editor.beecom.parser;
 
+import java.io.InputStream;
 import java.util.Enumeration;
-import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.commons.io.IOUtils;
 import org.dom4j.Document;
 import org.dom4j.Element;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 
 /**
  * @author rkulow
  */
 public class ParserManager implements IParser {
-
+	private static final OLog log = Tracing.createLoggerFor(ParserManager.class);
 	private static String PROPERTIES_FILENAME = "org/olat/ims/qti/editor/beecom/parser/qtiparser.properties";
-	private HashMap parserMap = null;
+	private static final Map<String,String> parserMap = new ConcurrentHashMap<>();
 	private static String PARSER_DEFAULT = "defaultparser";
 
-	/**
-	 * 
-	 */
 	public ParserManager() {
-		this.init();
+		init();
 	}
 
 	private void init() {
-		this.parserMap = new HashMap();
-
-		try {
-			Properties prop = new Properties();
-			prop.load(this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILENAME));
-			Enumeration enumeration = prop.keys();
-			while (enumeration.hasMoreElements()) {
-				String key = (String) enumeration.nextElement();
-				String value = prop.getProperty(key);
-				this.parserMap.put(key, value);
+		if(parserMap.isEmpty()) {
+			InputStream in = null;
+			try {
+				in = this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILENAME);
+				Properties prop = new Properties();
+				prop.load(in);
+				for(Enumeration<Object> enumeration = prop.keys(); enumeration.hasMoreElements(); ) {
+					String key = (String) enumeration.nextElement();
+					String value = prop.getProperty(key);
+					parserMap.put(key, value);
+				}
+			} catch (Exception e) {
+				log.error("Could not load qtiparser.properties", e);
+			} finally {
+				IOUtils.closeQuietly(in);
 			}
-		} catch (Exception e) {
-			//
 		}
-
 	}
 
 	/**
@@ -74,7 +77,7 @@ public class ParserManager implements IParser {
 	 */
 	public Object parse(Document doc) {
 		Element rootElement = doc.getRootElement();
-		return this.parse(rootElement);
+		return parse(rootElement);
 	}
 
 	/**
@@ -85,16 +88,16 @@ public class ParserManager implements IParser {
 			if (element == null) return null;
 			String name = element.getName();
 			String parserClassName = null;
-			Object tmpName = this.parserMap.get(name);
+			String tmpName = parserMap.get(name);
 			if (tmpName == null) {
-				parserClassName = (String) this.parserMap.get(PARSER_DEFAULT);
+				parserClassName = parserMap.get(PARSER_DEFAULT);
 			} else {
-				parserClassName = (String) tmpName;
+				parserClassName = tmpName;
 			}
-			if(Tracing.isDebugEnabled(ParserManager.class)){
-				Tracing.logDebug("ELEMENTNAME:" + name + "PARSERNAME" + parserClassName,ParserManager.class);
+			if(log.isDebug()){
+				log.debug("ELEMENTNAME:" + name + "PARSERNAME" + parserClassName);
 			}
-			Class parserClass = this.getClass().getClassLoader().loadClass(parserClassName);
+			Class<?> parserClass = this.getClass().getClassLoader().loadClass(parserClassName);
 			IParser parser = (IParser) parserClass.newInstance();
 			return parser.parse(element);
 		} catch (ClassNotFoundException e) {
@@ -105,5 +108,4 @@ public class ParserManager implements IParser {
 			throw new OLATRuntimeException(this.getClass(), "Illegal Access in QTI editor", e);
 		}
 	}
-
 }
\ No newline at end of file
-- 
GitLab