You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2014/09/30 04:33:47 UTC
[3/6] git commit: Add findResources method to LoaderUtil.
Add findResources method to LoaderUtil.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/ba39c4e4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ba39c4e4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ba39c4e4
Branch: refs/heads/master
Commit: ba39c4e4363b8257dec136e9c4ea8c4712b96ff7
Parents: 0fcb1bf
Author: Matt Sicker <ma...@apache.org>
Authored: Mon Sep 29 21:29:04 2014 -0500
Committer: Matt Sicker <ma...@apache.org>
Committed: Mon Sep 29 21:29:04 2014 -0500
----------------------------------------------------------------------
.../apache/logging/log4j/util/LoaderUtil.java | 66 +++++++++++++++++++-
1 file changed, 65 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ba39c4e4/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
index 7c3c7e7..950fe1a 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
@@ -16,9 +16,14 @@
*/
package org.apache.logging.log4j.util;
+import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
/**
* <em>Consider this class private.</em> Utility class for ClassLoaders.
@@ -68,6 +73,7 @@ public final class LoaderUtil {
public static ClassLoader getThreadContextClassLoader() {
if (GET_CLASS_LOADER_DISABLED) {
// we can at least get this class's ClassLoader regardless of security context
+ // however, if this is null, there's really no option left at this point
return LoaderUtil.class.getClassLoader();
}
return SECURITY_MANAGER == null
@@ -79,7 +85,6 @@ public final class LoaderUtil {
@Override
public ClassLoader run() {
final ClassLoader cl = Thread.currentThread().getContextClassLoader();
- // if the TCCL is null, that means we're using the system CL
if (cl != null) {
return cl;
}
@@ -161,4 +166,63 @@ public final class LoaderUtil {
}
return ignoreTCCL;
}
+
+ /**
+ * Finds classpath {@linkplain URL resources}.
+ *
+ * @param resource the name of the resource to find.
+ * @return a Collection of URLs matching the resource name. If no resources could be found, then this will be empty.
+ * @since 2.1
+ */
+ public static Collection<URL> findResources(final String resource) {
+ final Collection<UrlResource> urlResources = findUrlResources(resource);
+ final Collection<URL> resources = new LinkedHashSet<URL>(urlResources.size());
+ for (final UrlResource urlResource : urlResources) {
+ resources.add(urlResource.getUrl());
+ }
+ return resources;
+ }
+
+ static Collection<UrlResource> findUrlResources(final String resource) {
+ final ClassLoader[] candidates = {
+ getThreadContextClassLoader(),
+ LoaderUtil.class.getClassLoader(),
+ ClassLoader.getSystemClassLoader()
+ };
+ final Collection<UrlResource> resources = new LinkedHashSet<UrlResource>();
+ for (final ClassLoader cl : candidates) {
+ if (cl != null) {
+ try {
+ final Enumeration<URL> resourceEnum = cl.getResources(resource);
+ while (resourceEnum.hasMoreElements()) {
+ resources.add(new UrlResource(cl, resourceEnum.nextElement()));
+ }
+ } catch (final IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return resources;
+ }
+
+ /**
+ * {@link URL} and {@link ClassLoader} pair.
+ */
+ static class UrlResource {
+ private final ClassLoader classLoader;
+ private final URL url;
+
+ public UrlResource(final ClassLoader classLoader, final URL url) {
+ this.classLoader = classLoader;
+ this.url = url;
+ }
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ public URL getUrl() {
+ return url;
+ }
+ }
}