Author: peter_firmstone Date: Mon May 20 13:24:00 2013 New Revision: 1484475
URL: http://svn.apache.org/r1484475 Log: Support for Closeable in Java 7. Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/RFC3986URLClassLoader.java Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/RFC3986URLClassLoader.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/RFC3986URLClassLoader.java?rev=1484475&r1=1484474&r2=1484475&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/RFC3986URLClassLoader.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/RFC3986URLClassLoader.java Mon May 20 13:24:00 2013 @@ -52,6 +52,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -110,6 +111,8 @@ public class RFC3986URLClassLoader exten else if (Uri.asciiStringsUpperCaseEqual(codebaseAnnotationProperty, "URL")) uri = false; else uri = true; } + + private final static Logger logger = Logger.getLogger(RFC3986URLClassLoader.class.getName()); private final List<URL> originalUrls; // Copy on Write @@ -371,6 +374,10 @@ public class RFC3986URLClassLoader exten return null; } } + + public void close() throws IOException { + // do nothing. + } } @@ -560,7 +567,7 @@ public class RFC3986URLClassLoader exten try { key = Uri.urlToUri(url); } catch (URISyntaxException ex) { - Logger.getLogger(RFC3986URLClassLoader.class.getName()).log(Level.SEVERE, null, ex); + logger.log(Level.WARNING, "Unable to create Uri from URL" + url.toString(), ex); } synchronized (subHandlers){ URLHandler sub = subHandlers.get(key); @@ -610,6 +617,30 @@ public class RFC3986URLClassLoader exten } return null; } + + public void close() throws IOException { + IOException first = null; + try { + jf.close(); + } catch (IOException e){ + first = e; + } + synchronized (subHandlers){ + Iterator<URLHandler> it = subHandlers.values().iterator(); + while (it.hasNext()){ + try { + it.next().close(); + } catch (IOException e){ + if (first == null) first = e; + else { + logger.log(Level.WARNING, "Unable to close URLHandler during URLClassLoader close()", e); + } + } + } + subHandlers.clear(); + } + if (first != null) throw first; + } } @@ -1155,7 +1186,7 @@ public class RFC3986URLClassLoader exten try { candidateKey = Uri.urlToUri(nextCandidate); } catch (URISyntaxException ex) { - Logger.getLogger(RFC3986URLClassLoader.class.getName()).log(Level.SEVERE, null, ex); + logger.log(Level.WARNING, "Unable to parse URL" + nextCandidate.toString(), ex); } if (!handlerMap.containsKey(candidateKey)) { URLHandler result; @@ -1366,5 +1397,41 @@ public class RFC3986URLClassLoader exten return null; } + + /** + * Java 6 compatible implementation that overrides Java 7 URLClassLoader.close() + * + * URLClassLoader implements Closeable in Java 7 to allow resources such + * as open jar files to be released. + * + * Closes any open resources and prevents this ClassLoader loading any + * additional classes or resources. + * + * @throws IOException + */ + public void close() throws IOException { + synchronized (searchList){ + searchList.clear(); // Prevent any new searches. + } + IOException first = null; + synchronized (handlerList){ + Iterator<URLHandler> it = handlerList.iterator(); + while (it.hasNext()){ + try { + it.next().close(); + } catch (IOException e){ + if (first == null) first = e; + else { + // Log it because it can't be included in returned exceptions. + logger.log(Level.WARNING, "Unable to close URLHandler during URLClassLoader close()", e); + } + } + } + handlerList.clear(); + handlerMap.clear(); + if (first != null) throw first; + } + // This ClassLoader is no longer able to load any new resources. + } }
