From acc77c6a19a9e708b5f85b35527839b093bbffe6 Mon Sep 17 00:00:00 2001 From: igorife Date: Mon, 29 Dec 2008 16:22:05 +0000 Subject: [PATCH] plexus/osgi integration prototype branch --- .../plexus/classworlds/ClassWorld.java | 26 ++++++++++++---- .../plexus/classworlds/realm/ClassRealm.java | 30 +++++++++++++++---- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/classworlds/ClassWorld.java b/src/main/java/org/codehaus/plexus/classworlds/ClassWorld.java index 9afe123..540a1ee 100644 --- a/src/main/java/org/codehaus/plexus/classworlds/ClassWorld.java +++ b/src/main/java/org/codehaus/plexus/classworlds/ClassWorld.java @@ -62,14 +62,10 @@ public ClassRealm newRealm( String id ) return newRealm( id, null ); } - public synchronized ClassRealm newRealm( String id, + public ClassRealm newRealm( String id, ClassLoader classLoader ) throws DuplicateRealmException { - if ( realms.containsKey( id ) ) - { - throw new DuplicateRealmException( this, id ); - } ClassRealm realm; @@ -82,11 +78,29 @@ public synchronized ClassRealm newRealm( String id, realm = new ClassRealm( this, id ); } - realms.put( id, realm ); + addRealm( realm ); return realm; } + public synchronized void addRealm( ClassRealm realm ) + throws DuplicateRealmException + { + if ( realm.getWorld() != this ) + { + throw new IllegalArgumentException(); + } + + String id = realm.getId(); + + if ( realms.containsKey( id ) ) + { + throw new DuplicateRealmException( this, id ); + } + + realms.put( id, realm ); + } + public synchronized void disposeRealm( String id ) throws NoSuchRealmException { diff --git a/src/main/java/org/codehaus/plexus/classworlds/realm/ClassRealm.java b/src/main/java/org/codehaus/plexus/classworlds/realm/ClassRealm.java index f72de25..36e7175 100644 --- a/src/main/java/org/codehaus/plexus/classworlds/realm/ClassRealm.java +++ b/src/main/java/org/codehaus/plexus/classworlds/realm/ClassRealm.java @@ -16,19 +16,21 @@ * limitations under the License. */ -import org.codehaus.plexus.classworlds.strategy.Strategy; -import org.codehaus.plexus.classworlds.strategy.StrategyFactory; -import org.codehaus.plexus.classworlds.ClassWorld; - import java.io.IOException; import java.io.InputStream; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.net.MalformedURLException; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; +import java.util.List; import java.util.TreeSet; +import org.codehaus.plexus.classworlds.ClassWorld; +import org.codehaus.plexus.classworlds.strategy.Strategy; +import org.codehaus.plexus.classworlds.strategy.StrategyFactory; + /** * Implementation of ClassRealm. The realm is the class loading gateway. @@ -277,4 +279,22 @@ public String toString() { return "ClassRealm[" + getId() + ", parent: " + getParentRealm() + "]"; } + + /** + * Returned list includes all directly and indirectly accessible realms, + * starting with this realm. + */ + public List getAccessibleRealms() + { + ArrayList realms = new ArrayList(); + + ClassRealm realm = this; + + while (realm != null) { + realms.add(realm); + realm = realm.getParentRealm(); + } + + return realms; + } }