Skip to content

Commit

Permalink
Also, sort far less often; there's no need to sort on every access, o…
Browse files Browse the repository at this point in the history
…nly after mutations.

 This does leave the possibility that custom subclasses are adding to
 the list and not sorting afterwards, but there is an "addLoader" method
 available that behaves appropriately. Ideally, loaders could be made
 private. .
  • Loading branch information
Matt Hoffman committed Nov 11, 2015
1 parent a29489d commit cf5572d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 28 deletions.
Expand Up @@ -40,7 +40,11 @@
@SuppressWarnings("unchecked")
public abstract class AbstractClassLoader extends ClassLoader {

protected final List<ProxyClassLoader> loaders = new ArrayList<ProxyClassLoader>();
// we could use concurrent sorted set like ConcurrentSkipListSet here instead, which would be automatically sorted
// and wouldn't require the lock.
// But that was added in 1.6, and according to Maven we're targeting 1.5+.
/** Note that all iterations over this list *must* synchronize on it first! */
protected final List<ProxyClassLoader> loaders = Collections.synchronizedList(new ArrayList<ProxyClassLoader>());

private final ProxyClassLoader systemLoader = new SystemLoader();
private final ProxyClassLoader parentLoader = new ParentLoader();
Expand All @@ -66,14 +70,20 @@ public AbstractClassLoader() {
}

protected void addDefaultLoader() {
loaders.add(systemLoader);
loaders.add(parentLoader);
loaders.add(currentLoader);
loaders.add(threadLoader);
synchronized (loaders) {
loaders.add(systemLoader);
loaders.add(parentLoader);
loaders.add(currentLoader);
loaders.add(threadLoader);
Collections.sort(loaders);
}
}

public void addLoader(ProxyClassLoader loader) {
loaders.add(loader);
synchronized (loaders) {
loaders.add(loader);
Collections.sort(loaders);
}
}

/*
Expand All @@ -98,8 +108,6 @@ public Class loadClass(String className, boolean resolveIt) throws ClassNotFound
if (className == null || className.trim().equals(""))
return null;

Collections.sort(loaders);

Class clazz = null;

// Check osgi boot delegation
Expand All @@ -108,11 +116,13 @@ public Class loadClass(String className, boolean resolveIt) throws ClassNotFound
}

if (clazz == null) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
clazz = l.loadClass(className, resolveIt);
if (clazz != null)
break;
synchronized (loaders) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
clazz = l.loadClass(className, resolveIt);
if (clazz != null)
break;
}
}
}
}
Expand All @@ -135,8 +145,6 @@ public URL getResource(String name) {
if (name == null || name.trim().equals(""))
return null;

Collections.sort(loaders);

URL url = null;

// Check osgi boot delegation
Expand All @@ -145,11 +153,13 @@ public URL getResource(String name) {
}

if (url == null) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
url = l.findResource(name);
if (url != null)
break;
synchronized (loaders) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
url = l.findResource(name);
if (url != null)
break;
}
}
}
}
Expand All @@ -170,8 +180,6 @@ public InputStream getResourceAsStream(String name) {
if (name == null || name.trim().equals(""))
return null;

Collections.sort(loaders);

InputStream is = null;

// Check osgi boot delegation
Expand All @@ -180,11 +188,13 @@ public InputStream getResourceAsStream(String name) {
}

if (is == null) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
is = l.loadResource(name);
if (is != null)
break;
synchronized (loaders) {
for (ProxyClassLoader l : loaders) {
if (l.isEnabled()) {
is = l.loadResource(name);
if (is != null)
break;
}
}
}
}
Expand Down
Expand Up @@ -62,7 +62,7 @@ public JarClassLoader() {
*
*/
public void initialize() {
loaders.add( localLoader );
addLoader( localLoader );
}

/**
Expand Down

0 comments on commit cf5572d

Please sign in to comment.