From 238116da6bc21135b9b3946404aae27db01d7eb2 Mon Sep 17 00:00:00 2001 From: "David M. Lloyd" Date: Tue, 4 Oct 2016 14:31:33 -0500 Subject: [PATCH] [MODULES-256] Deprecate ModuleIdentifier --- .../java/__redirected/__DatatypeFactory.java | 5 + .../__DocumentBuilderFactory.java | 5 + .../java/__redirected/__JAXPRedirected.java | 34 ++- .../java/__redirected/__RedirectedUtils.java | 5 +- .../java/__redirected/__SAXParserFactory.java | 5 + .../java/__redirected/__SchemaFactory.java | 5 + .../__redirected/__TransformerFactory.java | 5 + .../java/__redirected/__XMLEventFactory.java | 5 + .../java/__redirected/__XMLInputFactory.java | 5 + .../java/__redirected/__XMLOutputFactory.java | 5 + .../java/__redirected/__XMLReaderFactory.java | 5 + .../java/__redirected/__XPathFactory.java | 4 + .../org/jboss/modules/AliasModuleSpec.java | 26 +- .../jboss/modules/ClassPathModuleLoader.java | 16 +- .../modules/ClassifyingModuleLoader.java | 12 +- .../org/jboss/modules/ConcreteModuleSpec.java | 4 +- .../org/jboss/modules/DependencySpec.java | 152 +++++++++- .../jboss/modules/DependencyTreeViewer.java | 35 ++- .../jboss/modules/IterableModuleFinder.java | 24 +- .../java/org/jboss/modules/IteratorUtils.java | 42 +++ .../org/jboss/modules/JarModuleFinder.java | 25 +- .../org/jboss/modules/JarModuleLoader.java | 22 +- .../org/jboss/modules/LocalModuleFinder.java | 26 +- src/main/java/org/jboss/modules/Main.java | 28 +- .../modules/ModularContentHandlerFactory.java | 7 +- .../ModularURLStreamHandlerFactory.java | 7 +- src/main/java/org/jboss/modules/Module.java | 130 ++++++-- .../org/jboss/modules/ModuleClassLoader.java | 9 + .../org/jboss/modules/ModuleDependency.java | 16 +- .../jboss/modules/ModuleDependencySpec.java | 23 +- .../java/org/jboss/modules/ModuleFinder.java | 22 +- .../org/jboss/modules/ModuleIdentifier.java | 8 +- .../java/org/jboss/modules/ModuleLoader.java | 282 ++++++++++++++---- .../java/org/jboss/modules/ModuleSpec.java | 110 +++++-- .../java/org/jboss/modules/ModuleXmlUtil.java | 155 ---------- .../jboss/modules/log/JDKModuleLogger.java | 5 +- .../org/jboss/modules/log/ModuleLogger.java | 7 +- .../jboss/modules/log/NoopModuleLogger.java | 3 +- .../jboss/modules/log/StreamModuleLogger.java | 3 +- .../security/ModularPermissionFactory.java | 25 +- .../jboss/modules/xml/ModuleXmlParser.java | 167 ++++++++--- src/main/resources/schema/module-1_6.xsd | 70 +---- .../jboss/modules/AbstractModuleTestCase.java | 1 - .../modules/InstantiatePrivateAccessTest.java | 9 +- .../jboss/modules/LocalModuleLoaderTest.java | 2 +- .../org/jboss/modules/ModuleExportTest.java | 2 +- .../jboss/modules/ModuleIdentifierTest.java | 2 +- .../org/jboss/modules/ModuleIteratorTest.java | 6 +- .../org/jboss/modules/ModulePropertyTest.java | 2 +- .../jboss/modules/ResourceRootPathsTest.java | 2 +- .../jboss/modules/util/ModulesTestBase.java | 8 +- .../jboss/modules/util/TestModuleLoader.java | 15 +- 52 files changed, 1080 insertions(+), 518 deletions(-) create mode 100644 src/main/java/org/jboss/modules/IteratorUtils.java delete mode 100644 src/main/java/org/jboss/modules/ModuleXmlUtil.java diff --git a/src/main/java/__redirected/__DatatypeFactory.java b/src/main/java/__redirected/__DatatypeFactory.java index 601e02536..b12884b21 100644 --- a/src/main/java/__redirected/__DatatypeFactory.java +++ b/src/main/java/__redirected/__DatatypeFactory.java @@ -72,7 +72,12 @@ public final class __DatatypeFactory extends DatatypeFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, DatatypeFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__DocumentBuilderFactory.java b/src/main/java/__redirected/__DocumentBuilderFactory.java index 55baa94fe..cb2bb7f9b 100644 --- a/src/main/java/__redirected/__DocumentBuilderFactory.java +++ b/src/main/java/__redirected/__DocumentBuilderFactory.java @@ -72,7 +72,12 @@ public final class __DocumentBuilderFactory extends DocumentBuilderFactory { */ public static void init() {} + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, DocumentBuilderFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__JAXPRedirected.java b/src/main/java/__redirected/__JAXPRedirected.java index 00157f660..0e60bf0b4 100644 --- a/src/main/java/__redirected/__JAXPRedirected.java +++ b/src/main/java/__redirected/__JAXPRedirected.java @@ -34,18 +34,32 @@ public class __JAXPRedirected { * * @param id the id for the jaxp module * @param loader the loader containing the jaxp module + * @deprecated Use {@link #changeAll(String, ModuleLoader)} instead. */ + @Deprecated public static void changeAll(ModuleIdentifier id, ModuleLoader loader) { - __DocumentBuilderFactory.changeDefaultFactory(id, loader); - __SAXParserFactory.changeDefaultFactory(id, loader); - __TransformerFactory.changeDefaultFactory(id, loader); - __XPathFactory.changeDefaultFactory(id, loader); - __XMLEventFactory.changeDefaultFactory(id, loader); - __XMLInputFactory.changeDefaultFactory(id, loader); - __XMLOutputFactory.changeDefaultFactory(id, loader); - __DatatypeFactory.changeDefaultFactory(id, loader); - __SchemaFactory.changeDefaultFactory(id, loader); - __XMLReaderFactory.changeDefaultFactory(id, loader); + changeAll(id.toString(), loader); + } + + /** + * Change all provided factories to the ones contained in the + * specified module using the standard META-INF/services lookup + * pattern. + * + * @param name the name for the jaxp module + * @param loader the loader containing the jaxp module + */ + public static void changeAll(String name, ModuleLoader loader) { + __DocumentBuilderFactory.changeDefaultFactory(name, loader); + __SAXParserFactory.changeDefaultFactory(name, loader); + __TransformerFactory.changeDefaultFactory(name, loader); + __XPathFactory.changeDefaultFactory(name, loader); + __XMLEventFactory.changeDefaultFactory(name, loader); + __XMLInputFactory.changeDefaultFactory(name, loader); + __XMLOutputFactory.changeDefaultFactory(name, loader); + __DatatypeFactory.changeDefaultFactory(name, loader); + __SchemaFactory.changeDefaultFactory(name, loader); + __XMLReaderFactory.changeDefaultFactory(name, loader); } /** diff --git a/src/main/java/__redirected/__RedirectedUtils.java b/src/main/java/__redirected/__RedirectedUtils.java index 76368456d..cf439d332 100644 --- a/src/main/java/__redirected/__RedirectedUtils.java +++ b/src/main/java/__redirected/__RedirectedUtils.java @@ -31,7 +31,6 @@ import org.jboss.modules.Module; import org.jboss.modules.ModuleClassLoader; -import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoadException; import org.jboss.modules.ModuleLoader; import org.jboss.modules.log.ModuleLogger; @@ -78,11 +77,11 @@ static E wrapped(E e, Throwable orig) { return e; } - static Class loadProvider(ModuleIdentifier id, Class intf, ModuleLoader moduleLoader) { + static Class loadProvider(String id, Class intf, ModuleLoader moduleLoader) { return loadProvider(id, intf, moduleLoader, null); } - static Class loadProvider(ModuleIdentifier id, Class intf, ModuleLoader moduleLoader, String name) { + static Class loadProvider(String id, Class intf, ModuleLoader moduleLoader, String name) { Module module; try { module = moduleLoader.loadModule(id); diff --git a/src/main/java/__redirected/__SAXParserFactory.java b/src/main/java/__redirected/__SAXParserFactory.java index 0520de591..5981bfeff 100644 --- a/src/main/java/__redirected/__SAXParserFactory.java +++ b/src/main/java/__redirected/__SAXParserFactory.java @@ -70,7 +70,12 @@ public final class __SAXParserFactory extends SAXParserFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, SAXParserFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__SchemaFactory.java b/src/main/java/__redirected/__SchemaFactory.java index b032dc4d9..d0d2580c0 100644 --- a/src/main/java/__redirected/__SchemaFactory.java +++ b/src/main/java/__redirected/__SchemaFactory.java @@ -74,7 +74,12 @@ public final class __SchemaFactory extends SchemaFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, SchemaFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__TransformerFactory.java b/src/main/java/__redirected/__TransformerFactory.java index ddfeccd0a..cae048f56 100644 --- a/src/main/java/__redirected/__TransformerFactory.java +++ b/src/main/java/__redirected/__TransformerFactory.java @@ -74,7 +74,12 @@ public final class __TransformerFactory extends SAXTransformerFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, TransformerFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__XMLEventFactory.java b/src/main/java/__redirected/__XMLEventFactory.java index a4451b656..45a962b7b 100644 --- a/src/main/java/__redirected/__XMLEventFactory.java +++ b/src/main/java/__redirected/__XMLEventFactory.java @@ -81,7 +81,12 @@ public final class __XMLEventFactory extends XMLEventFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, XMLEventFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__XMLInputFactory.java b/src/main/java/__redirected/__XMLInputFactory.java index 6e6fe52b6..b68555480 100644 --- a/src/main/java/__redirected/__XMLInputFactory.java +++ b/src/main/java/__redirected/__XMLInputFactory.java @@ -75,7 +75,12 @@ public final class __XMLInputFactory extends XMLInputFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, XMLInputFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__XMLOutputFactory.java b/src/main/java/__redirected/__XMLOutputFactory.java index ae1f54ca8..8a7c682d7 100644 --- a/src/main/java/__redirected/__XMLOutputFactory.java +++ b/src/main/java/__redirected/__XMLOutputFactory.java @@ -70,7 +70,12 @@ public final class __XMLOutputFactory extends XMLOutputFactory { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, XMLOutputFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__XMLReaderFactory.java b/src/main/java/__redirected/__XMLReaderFactory.java index 70518bb14..487693f01 100644 --- a/src/main/java/__redirected/__XMLReaderFactory.java +++ b/src/main/java/__redirected/__XMLReaderFactory.java @@ -82,7 +82,12 @@ public final class __XMLReaderFactory implements XMLReader { } } + @Deprecated public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, XMLReader.class, loader, SAX_DRIVER); if (clazz != null) { try { diff --git a/src/main/java/__redirected/__XPathFactory.java b/src/main/java/__redirected/__XPathFactory.java index f25b51f8c..3654fed79 100644 --- a/src/main/java/__redirected/__XPathFactory.java +++ b/src/main/java/__redirected/__XPathFactory.java @@ -68,6 +68,10 @@ public final class __XPathFactory extends XPathFactory { } public static void changeDefaultFactory(ModuleIdentifier id, ModuleLoader loader) { + changeDefaultFactory(id.toString(), loader); + } + + public static void changeDefaultFactory(String id, ModuleLoader loader) { Class clazz = __RedirectedUtils.loadProvider(id, XPathFactory.class, loader); if (clazz != null) { try { diff --git a/src/main/java/org/jboss/modules/AliasModuleSpec.java b/src/main/java/org/jboss/modules/AliasModuleSpec.java index c4eb1dbc1..d118a0975 100644 --- a/src/main/java/org/jboss/modules/AliasModuleSpec.java +++ b/src/main/java/org/jboss/modules/AliasModuleSpec.java @@ -25,14 +25,30 @@ */ public final class AliasModuleSpec extends ModuleSpec { - private final ModuleIdentifier aliasTarget; + private final String aliasName; - AliasModuleSpec(final ModuleIdentifier moduleIdentifier, final ModuleIdentifier aliasTarget) { - super(moduleIdentifier); - this.aliasTarget = aliasTarget; + AliasModuleSpec(final String name, final String aliasName) { + super(name); + this.aliasName = aliasName; } + /** + * Get the module alias target. + * + * @return the module alias target + * @deprecated Use {@link #getAliasName()} instead. + */ + @Deprecated public ModuleIdentifier getAliasTarget() { - return aliasTarget; + return ModuleIdentifier.fromString(aliasName); + } + + /** + * Get the module alias name. + * + * @return the module alias name + */ + public String getAliasName() { + return aliasName; } } diff --git a/src/main/java/org/jboss/modules/ClassPathModuleLoader.java b/src/main/java/org/jboss/modules/ClassPathModuleLoader.java index f9df8728b..e3eeab080 100644 --- a/src/main/java/org/jboss/modules/ClassPathModuleLoader.java +++ b/src/main/java/org/jboss/modules/ClassPathModuleLoader.java @@ -32,6 +32,7 @@ final class ClassPathModuleLoader extends ModuleLoader { static final String[] NO_STRINGS = new String[0]; + static final String CLASSPATH_STRING = "Classpath"; private final ModuleLoader delegateLoader; private final String classPath; private final String dependencies; @@ -53,19 +54,19 @@ private static boolean isEmpty(final String classPath) { } @Override - protected Module preloadModule(final ModuleIdentifier identifier) throws ModuleLoadException { - if (identifier.equals(ModuleIdentifier.CLASSPATH)) { - return loadModuleLocal(identifier); + protected Module preloadModule(final String name) throws ModuleLoadException { + if (name.equals(CLASSPATH_STRING)) { + return loadModuleLocal(name); } else if (delegateLoader != null) { - return preloadModule(identifier, delegateLoader); + return preloadModule(name, delegateLoader); } else { return null; } } @Override - protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws ModuleLoadException { - ModuleSpec.Builder builder = ModuleSpec.build(moduleIdentifier); + protected ModuleSpec findModule(final String name) throws ModuleLoadException { + ModuleSpec.Builder builder = ModuleSpec.build(name); builder.setMainClass(mainClass); // Process the classpath addClassPath(builder, classPath); @@ -74,12 +75,11 @@ protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws for (String dependencyEntry : dependencyEntries) { dependencyEntry = dependencyEntry.trim(); if (! dependencyEntry.isEmpty()) { - final ModuleIdentifier depModId = ModuleIdentifier.fromString(dependencyEntry); final DependencySpec spec = DependencySpec.createModuleDependencySpec( PathFilters.getMetaInfSubdirectoriesWithoutMetaInfFilter(), PathFilters.rejectAll(), delegateLoader, - depModId, + dependencyEntry, false); builder.addDependency(spec); } diff --git a/src/main/java/org/jboss/modules/ClassifyingModuleLoader.java b/src/main/java/org/jboss/modules/ClassifyingModuleLoader.java index 70b266dc6..6ad184124 100644 --- a/src/main/java/org/jboss/modules/ClassifyingModuleLoader.java +++ b/src/main/java/org/jboss/modules/ClassifyingModuleLoader.java @@ -45,26 +45,26 @@ public ClassifyingModuleLoader(final String name, final Map delegates = this.delegates; for (;;) { final ModuleLoader loader = delegates.get(name); if (loader != null) { - return preloadModule(moduleIdentifier, loader); + return preloadModule(name, loader); } idx = name.lastIndexOf('.'); if (idx == -1) { - return preloadModule(moduleIdentifier, defaultLoader); + return preloadModule(name, defaultLoader); } name = name.substring(0, idx); } } /** {@inheritDoc} */ - protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws ModuleLoadException { + protected ModuleSpec findModule(final String name) throws ModuleLoadException { // We have no modules of our own! return null; } diff --git a/src/main/java/org/jboss/modules/ConcreteModuleSpec.java b/src/main/java/org/jboss/modules/ConcreteModuleSpec.java index 556bb89a2..45c1cc13a 100644 --- a/src/main/java/org/jboss/modules/ConcreteModuleSpec.java +++ b/src/main/java/org/jboss/modules/ConcreteModuleSpec.java @@ -43,8 +43,8 @@ public final class ConcreteModuleSpec extends ModuleSpec { private final PermissionCollection permissionCollection; private final Version version; - ConcreteModuleSpec(final ModuleIdentifier moduleIdentifier, final String mainClass, final AssertionSetting assertionSetting, final ResourceLoaderSpec[] resourceLoaders, final DependencySpec[] dependencies, final LocalLoader fallbackLoader, final ModuleClassLoaderFactory moduleClassLoaderFactory, final ClassFileTransformer classFileTransformer, final Map properties, final PermissionCollection permissionCollection, final Version version) { - super(moduleIdentifier); + ConcreteModuleSpec(final String name, final String mainClass, final AssertionSetting assertionSetting, final ResourceLoaderSpec[] resourceLoaders, final DependencySpec[] dependencies, final LocalLoader fallbackLoader, final ModuleClassLoaderFactory moduleClassLoaderFactory, final ClassFileTransformer classFileTransformer, final Map properties, final PermissionCollection permissionCollection, final Version version) { + super(name); this.mainClass = mainClass; this.assertionSetting = assertionSetting; this.resourceLoaders = resourceLoaders; diff --git a/src/main/java/org/jboss/modules/DependencySpec.java b/src/main/java/org/jboss/modules/DependencySpec.java index 39811995d..714570a9b 100644 --- a/src/main/java/org/jboss/modules/DependencySpec.java +++ b/src/main/java/org/jboss/modules/DependencySpec.java @@ -349,9 +349,21 @@ public String toString() { * * @param identifier the module identifier * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(String)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final ModuleIdentifier identifier) { - return createModuleDependencySpec(identifier, false); + return createModuleDependencySpec(identifier.toString()); + } + + /** + * Create a dependency on the given module. + * + * @param name the module name + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final String name) { + return createModuleDependencySpec(name, false); } /** @@ -360,9 +372,22 @@ public static DependencySpec createModuleDependencySpec(final ModuleIdentifier i * @param identifier the module identifier * @param export {@code true} if the dependency should be exported by default * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(String,boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final ModuleIdentifier identifier, final boolean export) { - return createModuleDependencySpec(identifier, export, false); + return createModuleDependencySpec(identifier.toString(), export); + } + + /** + * Create a dependency on the given module. + * + * @param name the module name + * @param export {@code true} if the dependency should be exported by default + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final String name, final boolean export) { + return createModuleDependencySpec(name, export, false); } /** @@ -372,9 +397,23 @@ public static DependencySpec createModuleDependencySpec(final ModuleIdentifier i * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(String,boolean,boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final ModuleIdentifier identifier, final boolean export, final boolean optional) { - return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), null, identifier, optional); + return createModuleDependencySpec(identifier.toString(), export, optional); + } + + /** + * Create a dependency on the given module. + * + * @param name the module name + * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final String name, final boolean export, final boolean optional) { + return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), null, name, optional); } /** @@ -384,9 +423,23 @@ public static DependencySpec createModuleDependencySpec(final ModuleIdentifier i * @param identifier the module identifier * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(ModuleLoader, String, boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final ModuleLoader moduleLoader, final ModuleIdentifier identifier, final boolean export) { - return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), moduleLoader, identifier, false); + return createModuleDependencySpec(moduleLoader, identifier.toString(), export); + } + + /** + * Create a dependency on the given module. + * + * @param moduleLoader the specific module loader from which the module should be acquired + * @param name the module name + * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final ModuleLoader moduleLoader, final String name, final boolean export) { + return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), moduleLoader, name, false); } /** @@ -397,9 +450,24 @@ public static DependencySpec createModuleDependencySpec(final ModuleLoader modul * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(ModuleLoader,String,boolean,boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final ModuleLoader moduleLoader, final ModuleIdentifier identifier, final boolean export, final boolean optional) { - return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), moduleLoader, identifier, optional); + return createModuleDependencySpec(moduleLoader, identifier.toString(), export, optional); + } + + /** + * Create a dependency on the given module. + * + * @param moduleLoader the specific module loader from which the module should be acquired + * @param name the module name + * @param export {@code true} if this is a fully re-exported dependency, {@code false} if it should not be exported + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final ModuleLoader moduleLoader, final String name, final boolean export, final boolean optional) { + return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), export ? PathFilters.acceptAll() : PathFilters.rejectAll(), moduleLoader, name, optional); } /** @@ -409,9 +477,23 @@ public static DependencySpec createModuleDependencySpec(final ModuleLoader modul * @param identifier the module identifier * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(PathFilter,String,boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final PathFilter exportFilter, final ModuleIdentifier identifier, final boolean optional) { - return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), exportFilter, null, identifier, optional); + return createModuleDependencySpec(exportFilter, identifier.toString(), optional); + } + + /** + * Create a dependency on the given module. + * + * @param exportFilter the export filter to apply + * @param name the module name + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final PathFilter exportFilter, final String name, final boolean optional) { + return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), exportFilter, null, name, optional); } /** @@ -422,9 +504,23 @@ public static DependencySpec createModuleDependencySpec(final PathFilter exportF * @param identifier the module identifier * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(PathFilter,ModuleLoader,String,boolean)} instead. */ public static DependencySpec createModuleDependencySpec(final PathFilter exportFilter, final ModuleLoader moduleLoader, final ModuleIdentifier identifier, final boolean optional) { - return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), exportFilter, moduleLoader, identifier, optional); + return createModuleDependencySpec(exportFilter, moduleLoader, identifier.toString(), optional); + } + + /** + * Create a dependency on the given module. + * + * @param exportFilter the export filter to apply + * @param moduleLoader the specific module loader from which the module should be acquired + * @param name the module name + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final PathFilter exportFilter, final ModuleLoader moduleLoader, final String name, final boolean optional) { + return createModuleDependencySpec(PathFilters.getDefaultImportFilter(), exportFilter, moduleLoader, name, optional); } /** @@ -436,11 +532,27 @@ public static DependencySpec createModuleDependencySpec(final PathFilter exportF * @param identifier the module identifier * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(PathFilter, PathFilter, PathFilter, PathFilter, ClassFilter, ClassFilter, ModuleLoader, String, boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final PathFilter importFilter, final PathFilter exportFilter, final ModuleLoader moduleLoader, final ModuleIdentifier identifier, final boolean optional) { return createModuleDependencySpec(importFilter, exportFilter, PathFilters.acceptAll(), PathFilters.acceptAll(), ClassFilters.acceptAll(), ClassFilters.acceptAll(), moduleLoader, identifier, optional); } + /** + * Create a dependency on the given module. + * + * @param importFilter the import filter to apply + * @param exportFilter the export filter to apply + * @param moduleLoader the specific module loader from which the module should be acquired + * @param name the module name + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final PathFilter importFilter, final PathFilter exportFilter, final ModuleLoader moduleLoader, final String name, final boolean optional) { + return createModuleDependencySpec(importFilter, exportFilter, PathFilters.acceptAll(), PathFilters.acceptAll(), ClassFilters.acceptAll(), ClassFilters.acceptAll(), moduleLoader, name, optional); + } + /** * Create a dependency on the given module. * @@ -454,16 +566,36 @@ public static DependencySpec createModuleDependencySpec(final PathFilter importF * @param identifier the module identifier * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory * @return the dependency spec + * @deprecated Use {@link #createModuleDependencySpec(PathFilter,PathFilter,PathFilter,PathFilter,ClassFilter,ClassFilter,ModuleLoader,String,boolean)} instead. */ + @Deprecated public static DependencySpec createModuleDependencySpec(final PathFilter importFilter, final PathFilter exportFilter, final PathFilter resourceImportFilter, final PathFilter resourceExportFilter, final ClassFilter classImportFilter, final ClassFilter classExportFilter, final ModuleLoader moduleLoader, final ModuleIdentifier identifier, final boolean optional) { + return createModuleDependencySpec(importFilter, exportFilter, resourceImportFilter, resourceExportFilter, classImportFilter, classExportFilter, moduleLoader, identifier.toString(), optional); + } + + /** + * Create a dependency on the given module. + * + * @param importFilter the import filter to apply + * @param exportFilter the export filter to apply + * @param resourceImportFilter the resource import filter to apply + * @param resourceExportFilter the resource export filter to apply + * @param classImportFilter the class import filter to apply + * @param classExportFilter the class export filter to apply + * @param moduleLoader the specific module loader from which the module should be acquired + * @param name the module name + * @param optional {@code true} if the dependency is optional, {@code false} if it is mandatory + * @return the dependency spec + */ + public static DependencySpec createModuleDependencySpec(final PathFilter importFilter, final PathFilter exportFilter, final PathFilter resourceImportFilter, final PathFilter resourceExportFilter, final ClassFilter classImportFilter, final ClassFilter classExportFilter, final ModuleLoader moduleLoader, final String name, final boolean optional) { if (importFilter == null) { throw new IllegalArgumentException("importFilter is null"); } if (exportFilter == null) { throw new IllegalArgumentException("exportFilter is null"); } - if (identifier == null) { - throw new IllegalArgumentException("identifier is null"); + if (name == null) { + throw new IllegalArgumentException("name is null"); } if (classImportFilter == null) { throw new IllegalArgumentException("classImportFilter is null"); @@ -477,6 +609,6 @@ public static DependencySpec createModuleDependencySpec(final PathFilter importF if (resourceExportFilter == null) { throw new IllegalArgumentException("resourceExportFilter is null"); } - return new ModuleDependencySpec(importFilter, exportFilter, resourceImportFilter, resourceExportFilter, classImportFilter, classExportFilter, moduleLoader, identifier, optional); + return new ModuleDependencySpec(importFilter, exportFilter, resourceImportFilter, resourceExportFilter, classImportFilter, classExportFilter, moduleLoader, name, optional); } } diff --git a/src/main/java/org/jboss/modules/DependencyTreeViewer.java b/src/main/java/org/jboss/modules/DependencyTreeViewer.java index 18db4ecee..507476ef5 100644 --- a/src/main/java/org/jboss/modules/DependencyTreeViewer.java +++ b/src/main/java/org/jboss/modules/DependencyTreeViewer.java @@ -40,11 +40,11 @@ private static O[] filtered(Class oType, I... inputs) { return Arrays.copyOf(newArray, o, oType); } - private static void print(PrintWriter out, String prefix, ModuleSpec spec, FastCopyHashSet visited, File... roots) { + private static void print(PrintWriter out, String prefix, ModuleSpec spec, FastCopyHashSet visited, File... roots) { if (spec instanceof AliasModuleSpec) { final AliasModuleSpec aliasModuleSpec = (AliasModuleSpec) spec; out.print(" -> "); - final ModuleIdentifier aliasTarget = aliasModuleSpec.getAliasTarget(); + final String aliasTarget = aliasModuleSpec.getAliasName(); out.println(aliasTarget); if (visited.add(aliasTarget)) { try { @@ -68,15 +68,15 @@ private static void print(PrintWriter out, String prefix, ModuleSpec spec, FastC } } - private static void print(PrintWriter out, String prefix, DependencySpec spec, FastCopyHashSet visited, final boolean last, final File... roots) { + private static void print(PrintWriter out, String prefix, DependencySpec spec, FastCopyHashSet visited, final boolean last, final File... roots) { if (spec instanceof ModuleDependencySpec) { final ModuleDependencySpec moduleDependencySpec = (ModuleDependencySpec) spec; - final ModuleIdentifier identifier = moduleDependencySpec.getIdentifier(); + final String name = moduleDependencySpec.getName(); out.print(prefix); out.print(last ? '└' : '├'); out.print('─'); out.print(' '); - out.print(identifier); + out.print(name); if (moduleDependencySpec.isOptional()) { out.print(" (optional)"); } @@ -84,18 +84,18 @@ private static void print(PrintWriter out, String prefix, DependencySpec spec, F if (! exportFilter.equals(PathFilters.rejectAll())) { out.print(" (exported)"); } - if (visited.add(identifier)) { - print(out, prefix + (last ? " " : "│ "), identifier, visited, roots); + if (visited.add(name)) { + print(out, prefix + (last ? " " : "│ "), name, visited, roots); } else { out.println(); } } } - private static void print(PrintWriter out, String prefix, ModuleIdentifier identifier, FastCopyHashSet visited, final File... roots) { + private static void print(PrintWriter out, String prefix, String name, FastCopyHashSet visited, final File... roots) { final ModuleSpec moduleSpec; try { - moduleSpec = LocalModuleFinder.parseModuleXmlFile(identifier, null, roots); + moduleSpec = LocalModuleFinder.parseModuleXmlFile(name, null, roots); if (moduleSpec == null) { out.println(" (not found)"); } else { @@ -118,10 +118,23 @@ private static void print(PrintWriter out, String prefix, ModuleIdentifier ident * @param out the output stream to use * @param identifier the identifier of the module to examine * @param roots the module roots to search + * @deprecated Use {@link #print(PrintWriter, String, File...)} instead. */ + @Deprecated public static void print(PrintWriter out, ModuleIdentifier identifier, final File... roots) { - out.print(identifier); - print(out, "", identifier, new FastCopyHashSet(), roots); + print(out, identifier.toString(), roots); + } + + /** + * Print the dependency tree for the given module with the given module root list. + * + * @param out the output stream to use + * @param identifier the identifier of the module to examine + * @param roots the module roots to search + */ + public static void print(PrintWriter out, String name, final File... roots) { + out.print(name); + print(out, "", name, new FastCopyHashSet(), roots); out.flush(); } } diff --git a/src/main/java/org/jboss/modules/IterableModuleFinder.java b/src/main/java/org/jboss/modules/IterableModuleFinder.java index e5aa9f3f0..043ac8682 100644 --- a/src/main/java/org/jboss/modules/IterableModuleFinder.java +++ b/src/main/java/org/jboss/modules/IterableModuleFinder.java @@ -18,6 +18,7 @@ package org.jboss.modules; +import java.util.Collections; import java.util.Iterator; /** @@ -28,11 +29,28 @@ public interface IterableModuleFinder extends ModuleFinder { /** - * Iterate the modules which can be located via this module finder. + * This method returns an empty iterator and should not be used by new code. * * @param baseIdentifier the identifier to start with, or {@code null} to iterate all modules - * @param recursive {@code true} to find recursively nested modules, {@code false} to only find immediately nested modules + * @param recursive {@code true} to find recursively nested modules, {@code false} to only find immediately nested + * modules + * @return an iterator for the modules in this module finder + * @deprecated Use {@link #iterateModules(String, boolean)} instead. + */ + default Iterator iterateModules(ModuleIdentifier baseIdentifier, boolean recursive) { + return Collections.emptyIterator(); + } + + /** + * Iterate the modules which can be located via this module finder. + * + * @param baseName the identifier to start with, or {@code null} to iterate all modules; ignored if this module + * loader does not have a concept of nested modules + * @param recursive {@code true} to find recursively nested modules, {@code false} to only find immediately nested + * modules; ignored if this module finder does not have a concept of nested modules * @return an iterator for the modules in this module finder */ - Iterator iterateModules(ModuleIdentifier baseIdentifier, boolean recursive); + default Iterator iterateModules(String baseName, boolean recursive) { + return IteratorUtils.transformingIterator(iterateModules(baseName == null ? null : ModuleIdentifier.fromString(baseName), recursive), ModuleIdentifier::toString); + } } diff --git a/src/main/java/org/jboss/modules/IteratorUtils.java b/src/main/java/org/jboss/modules/IteratorUtils.java new file mode 100644 index 000000000..260e066a4 --- /dev/null +++ b/src/main/java/org/jboss/modules/IteratorUtils.java @@ -0,0 +1,42 @@ +/* + * JBoss, Home of Professional Open Source. + * Copyright 2016 Red Hat, Inc., and individual contributors + * as indicated by the @author tags. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jboss.modules; + +import java.util.Iterator; +import java.util.function.Function; + +/** + * @author David M. Lloyd + */ +final class IteratorUtils { + private IteratorUtils() { + } + + public static Iterator transformingIterator(Iterator original, Function translator) { + return new Iterator() { + public boolean hasNext() { + return original.hasNext(); + } + + public U next() { + return translator.apply(original.next()); + } + }; + } +} diff --git a/src/main/java/org/jboss/modules/JarModuleFinder.java b/src/main/java/org/jboss/modules/JarModuleFinder.java index 7686e23d1..7bc9e1dfe 100755 --- a/src/main/java/org/jboss/modules/JarModuleFinder.java +++ b/src/main/java/org/jboss/modules/JarModuleFinder.java @@ -39,7 +39,7 @@ * @author David M. Lloyd */ public final class JarModuleFinder implements ModuleFinder { - private final ModuleIdentifier myIdentifier; + private final String myName; private final JarFile jarFile; private final AccessControlContext context; @@ -50,13 +50,23 @@ public final class JarModuleFinder implements ModuleFinder { * @param jarFile the JAR file to encapsulate */ public JarModuleFinder(final ModuleIdentifier myIdentifier, final JarFile jarFile) { - this.myIdentifier = myIdentifier; + this(myIdentifier.toString(), jarFile); + } + + /** + * Construct a new instance. + * + * @param myIdentifier the identifier to use for the JAR itself + * @param jarFile the JAR file to encapsulate + */ + public JarModuleFinder(final String myName, final JarFile jarFile) { + this.myName = myName; this.jarFile = jarFile; context = AccessController.getContext(); } - public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoader delegateLoader) throws ModuleLoadException { - if (identifier.equals(myIdentifier)) { + public ModuleSpec findModule(final String name, final ModuleLoader delegateLoader) throws ModuleLoadException { + if (name.equals(myName)) { // special root JAR module Manifest manifest; try { @@ -64,7 +74,7 @@ public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoad } catch (IOException e) { throw new ModuleLoadException("Failed to load MANIFEST from JAR", e); } - ModuleSpec.Builder builder = ModuleSpec.build(identifier); + ModuleSpec.Builder builder = ModuleSpec.build(name); Attributes mainAttributes = manifest.getMainAttributes(); String mainClass = mainAttributes.getValue(Attributes.Name.MAIN_CLASS); if (mainClass != null) { @@ -133,13 +143,14 @@ public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoad } // else ignored } - builder.addDependency(DependencySpec.createModuleDependencySpec(ModuleIdentifier.fromString(moduleName), export, optional)); + builder.addDependency(DependencySpec.createModuleDependencySpec(moduleName, export, optional)); } } builder.addDependency(DependencySpec.createSystemDependencySpec(JDKPaths.JDK)); builder.addDependency(DependencySpec.createLocalDependencySpec()); return builder.create(); } else { + ModuleIdentifier identifier = ModuleIdentifier.fromString(name); String namePath = identifier.getName().replace('.', '/'); String basePath = "modules/" + namePath + "/" + identifier.getSlot(); JarEntry moduleXmlEntry = jarFile.getJarEntry(basePath + "/module.xml"); @@ -150,7 +161,7 @@ public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoad try { InputStream inputStream = jarFile.getInputStream(moduleXmlEntry); try { - moduleSpec = ModuleXmlParser.parseModuleXml((rootPath, loaderPath, loaderName) -> new JarFileResourceLoader(loaderName, jarFile, loaderPath), basePath, inputStream, moduleXmlEntry.getName(), delegateLoader, identifier); + moduleSpec = ModuleXmlParser.parseModuleXml((rootPath, loaderPath, loaderName) -> new JarFileResourceLoader(loaderName, jarFile, loaderPath), basePath, inputStream, moduleXmlEntry.getName(), delegateLoader, name); } finally { StreamUtil.safeClose(inputStream); } diff --git a/src/main/java/org/jboss/modules/JarModuleLoader.java b/src/main/java/org/jboss/modules/JarModuleLoader.java index ef4307884..2cbc2f2c7 100644 --- a/src/main/java/org/jboss/modules/JarModuleLoader.java +++ b/src/main/java/org/jboss/modules/JarModuleLoader.java @@ -29,36 +29,36 @@ final class JarModuleLoader extends ModuleLoader { static final String[] NO_STRINGS = new String[0]; private final ModuleLoader delegate; private final JarFile jarFile; - private final ModuleIdentifier myIdentifier; + private final String myName; JarModuleLoader(final ModuleLoader delegate, final JarFile jarFile) { super(new ModuleFinder[] { new JarModuleFinder(simpleNameOf(jarFile), jarFile) }); this.delegate = delegate; this.jarFile = jarFile; - myIdentifier = simpleNameOf(jarFile); + myName = simpleNameOf(jarFile); } - private static ModuleIdentifier simpleNameOf(JarFile jarFile) { + private static String simpleNameOf(JarFile jarFile) { String jarName = jarFile.getName(); String simpleJarName = jarName.substring(jarName.lastIndexOf(File.separatorChar) + 1); - return ModuleIdentifier.create(simpleJarName); + return simpleJarName; } - protected Module preloadModule(final ModuleIdentifier identifier) throws ModuleLoadException { - if (identifier.equals(myIdentifier)) { - return loadModuleLocal(identifier); + protected Module preloadModule(final String name) throws ModuleLoadException { + if (name.equals(myName)) { + return loadModuleLocal(name); } else { - Module module = loadModuleLocal(identifier); + Module module = loadModuleLocal(name); if (module == null) { - return preloadModule(identifier, delegate); + return preloadModule(name, delegate); } else { return module; } } } - ModuleIdentifier getMyIdentifier() { - return myIdentifier; + String getMyName() { + return myName; } public String toString() { diff --git a/src/main/java/org/jboss/modules/LocalModuleFinder.java b/src/main/java/org/jboss/modules/LocalModuleFinder.java index 1596e7b7a..4bd2b9666 100644 --- a/src/main/java/org/jboss/modules/LocalModuleFinder.java +++ b/src/main/java/org/jboss/modules/LocalModuleFinder.java @@ -137,8 +137,8 @@ private static String toPathString(ModuleIdentifier moduleIdentifier) { return builder.toString(); } - public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoader delegateLoader) throws ModuleLoadException { - final String child = toPathString(identifier); + public ModuleSpec findModule(final String name, final ModuleLoader delegateLoader) throws ModuleLoadException { + final String child = toPathString(ModuleIdentifier.fromString(name)); if (pathFilter.accept(child)) { try { return doPrivileged((PrivilegedExceptionAction) () -> { @@ -146,7 +146,7 @@ public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoad final File file = new File(root, child); final File moduleXml = new File(file, "module.xml"); if (moduleXml.exists()) { - final ModuleSpec spec = ModuleXmlParser.parseModuleXml(delegateLoader, identifier, file, moduleXml); + final ModuleSpec spec = ModuleXmlParser.parseModuleXml(delegateLoader, name, file, moduleXml); if (spec == null) break; return spec; } @@ -179,14 +179,30 @@ public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoad * @return the module specification * @throws IOException if reading the module file failed * @throws ModuleLoadException if creating the module specification failed (e.g. due to a parse error) + * @deprecated Use {@link #parseModuleXmlFile(String, ModuleLoader, File...)} instead. */ + @Deprecated public static ModuleSpec parseModuleXmlFile(final ModuleIdentifier identifier, final ModuleLoader delegateLoader, final File... roots) throws IOException, ModuleLoadException { - final String child = toPathString(identifier); + return parseModuleXmlFile(identifier.toString(), delegateLoader, roots); + } + + /** + * Parse a {@code module.xml} file and return the corresponding module specification. + * + * @param name the name of the module to load + * @param delegateLoader the delegate module loader to use for module specifications + * @param roots the repository root paths to search + * @return the module specification + * @throws IOException if reading the module file failed + * @throws ModuleLoadException if creating the module specification failed (e.g. due to a parse error) + */ + public static ModuleSpec parseModuleXmlFile(final String name, final ModuleLoader delegateLoader, final File... roots) throws IOException, ModuleLoadException { + final String child = toPathString(ModuleIdentifier.fromString(name)); for (File root : roots) { final File file = new File(root, child); final File moduleXml = new File(file, "module.xml"); if (moduleXml.exists()) { - final ModuleSpec spec = ModuleXmlParser.parseModuleXml(delegateLoader, identifier, file, moduleXml); + final ModuleSpec spec = ModuleXmlParser.parseModuleXml(delegateLoader, name, file, moduleXml); if (spec == null) break; return spec; } diff --git a/src/main/java/org/jboss/modules/Main.java b/src/main/java/org/jboss/modules/Main.java index e932c9abe..11bcf0267 100644 --- a/src/main/java/org/jboss/modules/Main.java +++ b/src/main/java/org/jboss/modules/Main.java @@ -125,7 +125,7 @@ public static void main(String[] args) throws Throwable { boolean classDefined = false; boolean depTree = false; String nameArgument = null; - ModuleIdentifier jaxpModuleIdentifier = null; + String jaxpModuleName = null; boolean defaultSecMgr = false; String secMgrModule = null; boolean addIndex = false; @@ -177,7 +177,7 @@ public static void main(String[] args) throws Throwable { } else if ("-debuglog".equals(arg)) { debuglog = true; } else if ("-jaxpmodule".equals(arg)) { - jaxpModuleIdentifier = ModuleIdentifier.fromString(args[++i]); + jaxpModuleName = args[++i]; } else if ("-jar".equals(arg)) { if (jar) { System.err.println("-jar flag may only be specified once"); @@ -300,8 +300,8 @@ public static void main(String[] args) throws Throwable { usage(); System.exit(1); } - if (jaxpModuleIdentifier != null) { - System.err.println("-jaxpModuleIdentifier may not be used with -addindex"); + if (jaxpModuleName != null) { + System.err.println("-jaxpModuleName may not be used with -addindex"); usage(); System.exit(1); } @@ -364,7 +364,7 @@ public static void main(String[] args) throws Throwable { } if (depTree) { - DependencyTreeViewer.print(new PrintWriter(System.out), ModuleIdentifier.fromString(nameArgument), LocalModuleFinder.getRepoRoots(true)); + DependencyTreeViewer.print(new PrintWriter(System.out), nameArgument, LocalModuleFinder.getRepoRoots(true)); System.exit(0); } @@ -376,27 +376,27 @@ public static void main(String[] args) throws Throwable { final ModuleLoader loader; final ModuleLoader environmentLoader; environmentLoader = DefaultBootModuleLoaderHolder.INSTANCE; - final ModuleIdentifier moduleIdentifier; + final String moduleName; if (jar) { loader = new JarModuleLoader(environmentLoader, new JarFile(nameArgument)); - moduleIdentifier = ((JarModuleLoader) loader).getMyIdentifier(); + moduleName = ((JarModuleLoader) loader).getMyName(); } else if (classpathDefined || classDefined) { loader = new ClassPathModuleLoader(environmentLoader, nameArgument, classpath, deps); - moduleIdentifier = ModuleIdentifier.CLASSPATH; + moduleName = ClassPathModuleLoader.CLASSPATH_STRING; } else { loader = environmentLoader; - moduleIdentifier = ModuleIdentifier.fromString(nameArgument); + moduleName = nameArgument; } Module.initBootModuleLoader(loader); - if (jaxpModuleIdentifier != null) { - __JAXPRedirected.changeAll(jaxpModuleIdentifier, Module.getBootModuleLoader()); + if (jaxpModuleName != null) { + __JAXPRedirected.changeAll(jaxpModuleName, Module.getBootModuleLoader()); } else { - __JAXPRedirected.changeAll(moduleIdentifier, Module.getBootModuleLoader()); + __JAXPRedirected.changeAll(moduleName, Module.getBootModuleLoader()); } final Module module; try { - module = loader.loadModule(moduleIdentifier); + module = loader.loadModule(moduleName); } catch (ModuleNotFoundException e) { e.printStackTrace(System.err); System.exit(1); @@ -438,7 +438,7 @@ public static void main(String[] args) throws Throwable { if (secMgrModule != null) { final Module loadedModule; try { - loadedModule = loader.loadModule(ModuleIdentifier.fromString(secMgrModule)); + loadedModule = loader.loadModule(secMgrModule); } catch (ModuleNotFoundException e) { e.printStackTrace(System.err); System.exit(1); diff --git a/src/main/java/org/jboss/modules/ModularContentHandlerFactory.java b/src/main/java/org/jboss/modules/ModularContentHandlerFactory.java index c6b8287d5..87c2abc55 100644 --- a/src/main/java/org/jboss/modules/ModularContentHandlerFactory.java +++ b/src/main/java/org/jboss/modules/ModularContentHandlerFactory.java @@ -53,12 +53,9 @@ final class ModularContentHandlerFactory implements ContentHandlerFactory { final String moduleId = (i == -1 ? urlModulesList.substring(f) : urlModulesList.substring(f, i)).trim(); if (moduleId.length() > 0) { try { - final ModuleIdentifier identifier = ModuleIdentifier.fromString(moduleId); - Module module = Module.getBootModuleLoader().loadModule(identifier); + Module module = Module.getBootModuleLoader().loadModule(moduleId); moduleList.add(module); - } catch (RuntimeException e) { - // skip it - } catch (ModuleLoadException e) { + } catch (RuntimeException | ModuleLoadException e) { // skip it } } diff --git a/src/main/java/org/jboss/modules/ModularURLStreamHandlerFactory.java b/src/main/java/org/jboss/modules/ModularURLStreamHandlerFactory.java index 1dc446031..0924bbb33 100644 --- a/src/main/java/org/jboss/modules/ModularURLStreamHandlerFactory.java +++ b/src/main/java/org/jboss/modules/ModularURLStreamHandlerFactory.java @@ -62,12 +62,9 @@ protected Set initialValue() { final String moduleId = (i == -1 ? urlModulesList.substring(f) : urlModulesList.substring(f, i)).trim(); if (moduleId.length() > 0) { try { - final ModuleIdentifier identifier = ModuleIdentifier.fromString(moduleId); - Module module = Module.getBootModuleLoader().loadModule(identifier); + Module module = Module.getBootModuleLoader().loadModule(moduleId); moduleList.add(module); - } catch (RuntimeException e) { - // skip it - } catch (ModuleLoadException e) { + } catch (RuntimeException | ModuleLoadException e) { // skip it } } diff --git a/src/main/java/org/jboss/modules/Module.java b/src/main/java/org/jboss/modules/Module.java index 54cb5014e..7cac53f69 100644 --- a/src/main/java/org/jboss/modules/Module.java +++ b/src/main/java/org/jboss/modules/Module.java @@ -171,9 +171,9 @@ public static ModulesPrivateAccess getPrivateAccess() { // immutable properties /** - * The identifier of this module. + * The name of this module. */ - private final ModuleIdentifier identifier; + private final String name; /** * The name of the main class, if any (may be {@code null}). */ @@ -231,7 +231,7 @@ public static ModulesPrivateAccess getPrivateAccess() { this.moduleLoader = moduleLoader; // Initialize state from the spec. - identifier = spec.getModuleIdentifier(); + name = spec.getName(); mainClassName = spec.getMainClass(); fallbackLoader = spec.getFallbackLoader(); final PermissionCollection permissionCollection = spec.getPermissionCollection(); @@ -347,9 +347,20 @@ public void run(final String[] args) throws NoSuchMethodException, InvocationTar * Get this module's identifier. * * @return the identifier + * @deprecated Use {@link #getName()} instead. */ + @Deprecated public ModuleIdentifier getIdentifier() { - return identifier; + return ModuleIdentifier.fromString(getName()); + } + + /** + * Get this module's name. + * + * @return this module's name + */ + public String getName() { + return name; } /** @@ -407,9 +418,27 @@ public URL nextElement() { * @param serviceType the service type class * @return the loaded service from the caller's module * @throws ModuleLoadException if the named module failed to load + * @deprecated Use {@link #loadServiceFromCallerModuleLoader(String, Class)} instead. */ + @Deprecated public static ServiceLoader loadServiceFromCallerModuleLoader(ModuleIdentifier identifier, Class serviceType) throws ModuleLoadException { - return getCallerModuleLoader().loadModule(identifier).loadService(serviceType); + return loadServiceFromCallerModuleLoader(identifier.toString(), serviceType); + } + + /** + * Load a service loader from a module in the caller's module loader. The caller's + * module loader refers to the loader of the module of the class that calls this method. + * Note that {@link #loadService(Class)} is more efficient since it does not need to crawl + * the stack. + * + * @param the the service type + * @param name the module name containing the service loader + * @param serviceType the service type class + * @return the loaded service from the caller's module + * @throws ModuleLoadException if the named module failed to load + */ + public static ServiceLoader loadServiceFromCallerModuleLoader(String name, Class serviceType) throws ModuleLoadException { + return getCallerModuleLoader().loadModule(name).loadService(serviceType); } /** @@ -529,9 +558,24 @@ public static ModuleLoader getContextModuleLoader() { * @param identifier the module identifier * @return the module * @throws ModuleLoadException if the module could not be loaded + * @deprecated Use {@link #getModuleFromCallerModuleLoader(String)} instead. */ + @Deprecated public static Module getModuleFromCallerModuleLoader(final ModuleIdentifier identifier) throws ModuleLoadException { - return getCallerModuleLoader().loadModule(identifier); + return getModuleFromCallerModuleLoader(identifier.toString()); + } + + /** + * Get a module from the current module loader. Note that this must crawl the + * stack to determine this, so other mechanisms are more efficient. + * @see #getCallerModuleLoader() + * + * @param name the module name + * @return the module + * @throws ModuleLoadException if the module could not be loaded + */ + public static Module getModuleFromCallerModuleLoader(final String name) throws ModuleLoadException { + return getCallerModuleLoader().loadModule(name); } /** @@ -551,9 +595,22 @@ public static Module getCallerModule() { * @param identifier the module identifier * @return the module * @throws ModuleLoadException if an error occurs + * @deprecated Use {@link #getModule(String)} instead. */ + @Deprecated public Module getModule(final ModuleIdentifier identifier) throws ModuleLoadException { - return moduleLoader.loadModule(identifier); + return getModule(identifier.toString()); + } + + /** + * Get the module with the given identifier from the module loader used by this module. + * + * @param name the module name + * @return the module + * @throws ModuleLoadException if an error occurs + */ + public Module getModule(final String name) throws ModuleLoadException { + return moduleLoader.loadModule(name); } /** @@ -567,10 +624,29 @@ public Module getModule(final ModuleIdentifier identifier) throws ModuleLoadExce * @return the class * @throws ModuleLoadException if the module could not be loaded * @throws ClassNotFoundException if the class could not be loaded + * @deprecated Use {@link #loadClassFromBootModuleLoader(String, String)} instead. */ + @Deprecated public static Class loadClassFromBootModuleLoader(final ModuleIdentifier moduleIdentifier, final String className) throws ModuleLoadException, ClassNotFoundException { - return Class.forName(className, true, getBootModuleLoader().loadModule(moduleIdentifier).getClassLoader()); + return loadClassFromBootModuleLoader(moduleIdentifier.toString(), className); + } + + /** + * Load a class from a module in the system module loader. + * + * @see #getBootModuleLoader() + * + * @param name the name of the module from which the class + * should be loaded + * @param className the class name to load + * @return the class + * @throws ModuleLoadException if the module could not be loaded + * @throws ClassNotFoundException if the class could not be loaded + */ + public static Class loadClassFromBootModuleLoader(final String name, final String className) + throws ModuleLoadException, ClassNotFoundException { + return Class.forName(className, true, getBootModuleLoader().loadModule(name).getClassLoader()); } /** @@ -584,10 +660,28 @@ public static Class loadClassFromBootModuleLoader(final ModuleIdentifier modu * @return the class * @throws ModuleLoadException if the module could not be loaded * @throws ClassNotFoundException if the class could not be loaded + * @deprecated Use {@link #loadClassFromCallerModuleLoader(String, String)} instead. */ public static Class loadClassFromCallerModuleLoader(final ModuleIdentifier moduleIdentifier, final String className) throws ModuleLoadException, ClassNotFoundException { - return Class.forName(className, true, getModuleFromCallerModuleLoader(moduleIdentifier).getClassLoader()); + return loadClassFromCallerModuleLoader(moduleIdentifier.toString(), className); + } + + /** + * Load a class from a module in the caller's module loader. + * + * @see #getCallerModuleLoader() + * + * @param name the name of the module from which the class + * should be loaded + * @param className the class name to load + * @return the class + * @throws ModuleLoadException if the module could not be loaded + * @throws ClassNotFoundException if the class could not be loaded + */ + public static Class loadClassFromCallerModuleLoader(final String name, final String className) + throws ModuleLoadException, ClassNotFoundException { + return Class.forName(className, true, getModuleFromCallerModuleLoader(name).getClassLoader()); } /** @@ -947,7 +1041,7 @@ public Version getVersion() { public String toString() { StringBuilder b = new StringBuilder(); b.append("Module \""); - b.append(identifier); + b.append(getName()); b.append("\""); if (version != null) { b.append(" version ").append(version); @@ -1093,13 +1187,13 @@ private long addPaths(Dependency[] dependencies, Map> if (dependency instanceof ModuleDependency) { final ModuleDependency moduleDependency = (ModuleDependency) dependency; final ModuleLoader moduleLoader = moduleDependency.getModuleLoader(); - final ModuleIdentifier id = moduleDependency.getIdentifier(); + final String name = moduleDependency.getName(); final Module module; try { long pauseStart = Metrics.getCurrentCPUTime(); try { - module = moduleLoader.preloadModule(id); + module = moduleLoader.preloadModule(name); } finally { subtract += Metrics.getCurrentCPUTime() - pauseStart; } @@ -1107,13 +1201,13 @@ private long addPaths(Dependency[] dependencies, Map> if (moduleDependency.isOptional()) { continue; } else { - log.trace("Module %s, dependency %s preload failed: %s", getIdentifier(), moduleDependency.getIdentifier(), ex); + log.trace("Module %s, dependency %s preload failed: %s", getIdentifier(), moduleDependency.getName(), ex); throw ex; } } if (module == null) { if (!moduleDependency.isOptional()) { - throw new ModuleNotFoundException(id.toString()); + throw new ModuleNotFoundException(name); } continue; } @@ -1244,13 +1338,13 @@ private long addExportedPaths(Dependency[] dependencies, MapDavid M. Lloyd * @author Jason T. Greene * + * @deprecated This class has been deprecated in favor of name strings; however, programs using identifiers will + * continue to function correctly. * @apiviz.landmark */ +@Deprecated public final class ModuleIdentifier implements Serializable { private static final long serialVersionUID = 118533026624827995L; @@ -65,7 +68,7 @@ public Field run() { /** * The class path module (only present if booted from a class path). */ - public static final ModuleIdentifier CLASSPATH = new ModuleIdentifier("Classpath", DEFAULT_SLOT); + public static final ModuleIdentifier CLASSPATH = new ModuleIdentifier(ClassPathModuleLoader.CLASSPATH_STRING, DEFAULT_SLOT); private ModuleIdentifier(final String name, final String slot) { this.name = name; @@ -135,7 +138,8 @@ public int hashCode() { */ @Override public String toString() { - return escapeName(name) + ":" + escapeSlot(slot); + final String escapeName = escapeName(name); + return slot.equals(DEFAULT_SLOT) ? escapeName : escapeName + ":" + escapeSlot(slot); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { diff --git a/src/main/java/org/jboss/modules/ModuleLoader.java b/src/main/java/org/jboss/modules/ModuleLoader.java index c07f6171d..afec0cc9c 100644 --- a/src/main/java/org/jboss/modules/ModuleLoader.java +++ b/src/main/java/org/jboss/modules/ModuleLoader.java @@ -22,6 +22,8 @@ import static org.jboss.modules.management.ObjectProperties.property; import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.lang.reflect.UndeclaredThrowableException; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; @@ -30,6 +32,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; @@ -76,6 +79,7 @@ public class ModuleLoader { private static final RuntimePermission MODULE_ITERATE_PERM = new RuntimePermission("canIterateModules"); private static final AtomicInteger SEQ = new AtomicInteger(1); + private static final Class[] JUST_MODULE_IDENTIFIER = { ModuleIdentifier.class }; private static volatile MBeanReg REG_REF = new TempMBeanReg(); @@ -84,7 +88,7 @@ public class ModuleLoader { */ public static final ModuleFinder[] NO_FINDERS = new ModuleFinder[0]; - private final ConcurrentMap moduleMap = new ConcurrentHashMap<>(); + private final ConcurrentMap moduleMap = new ConcurrentHashMap<>(); private final ModuleFinder[] finders; private final boolean canRedefine; @@ -97,6 +101,9 @@ public class ModuleLoader { private final AtomicInteger raceCount = new AtomicInteger(); private final AtomicInteger classCount = new AtomicInteger(); + private final boolean overridesFindModuleByIdentifier; + private final boolean overridesPreloadModuleByIdentifier; + ModuleLoader(boolean canRedefine, boolean skipRegister) { this(canRedefine, skipRegister, NO_FINDERS); } @@ -122,6 +129,32 @@ public ModuleLoaderMXBean run() { return null; } }); + // determine if the subclass overrides the crusty old find-module-by-identifier method + boolean foundFindModule = false; + boolean foundPreloadModule = false; + for (Class clazz = getClass(); clazz != ModuleLoader.class; clazz = clazz.getSuperclass().asSubclass(ModuleLoader.class)) { + for (Method method : clazz.getDeclaredMethods()) { + if ((method.getModifiers() & (Modifier.STATIC | Modifier.PRIVATE)) == 0) { + if (method.getName().equals("findModule")) { + if (ModuleSpec.class.isAssignableFrom(method.getReturnType())) { + if (Arrays.equals(method.getParameterTypes(), JUST_MODULE_IDENTIFIER)) { + foundFindModule = true; + if (foundPreloadModule) break; + } + } + } else if (method.getName().equals("preloadModule")) { + if (Module.class.isAssignableFrom(method.getReturnType())) { + if (Arrays.equals(method.getParameterTypes(), JUST_MODULE_IDENTIFIER)) { + foundPreloadModule = true; + if (foundFindModule) break; + } + } + } + } + } + } + overridesFindModuleByIdentifier = foundFindModule; + overridesPreloadModuleByIdentifier = foundPreloadModule; } /** @@ -211,17 +244,31 @@ static void installMBeanServer() { } /** - * Load a module based on an identifier. This method delegates to {@link #preloadModule(ModuleIdentifier)} and then + * Load a module based on an identifier. This method delegates to {@link #preloadModule(String)} and then * links the returned module if necessary. * * @param identifier The module identifier * @return The loaded Module * @throws ModuleLoadException if the Module can not be loaded + * @deprecated Use {@link #loadModule(String)} instead. */ + @Deprecated public final Module loadModule(ModuleIdentifier identifier) throws ModuleLoadException { - final Module module = preloadModule(identifier); + return loadModule(identifier.toString()); + } + + /** + * Load a module based on an identifier. This method delegates to {@link #preloadModule(String)} and then + * links the returned module if necessary. + * + * @param identifier The module identifier + * @return The loaded Module + * @throws ModuleLoadException if the Module can not be loaded + */ + public final Module loadModule(String name) throws ModuleLoadException { + final Module module = preloadModule(name); if (module == null) { - throw new ModuleNotFoundException(identifier.toString()); + throw new ModuleNotFoundException(name); } module.relinkIfNecessary(); return module; @@ -234,15 +281,31 @@ public final Module loadModule(ModuleIdentifier identifier) throws ModuleLoadExc * @param recursive {@code true} to find recursively nested modules, {@code false} to only find immediately nested modules * @return an iterator for the modules in this module finder * @throws SecurityException if the caller does not have permission to iterate module loaders + * @deprecated Use {@link #iterateModules(String, boolean)} instead. */ + @Deprecated public final Iterator iterateModules(final ModuleIdentifier baseIdentifier, final boolean recursive) { + return IteratorUtils.transformingIterator(iterateModules(baseIdentifier == null ? (String) null : baseIdentifier.toString(), recursive), ModuleIdentifier::fromString); + } + + /** + * Iterate the modules which can be located via this module loader. + * + * @param baseName the identifier to start with, or {@code null} to iterate all modules; ignored if this module + * loader does not have a concept of nested modules + * @param recursive {@code true} to find recursively nested modules, {@code false} to only find immediately nested + * modules; ignored if this module finder does not have a concept of nested modules + * @return an iterator for the modules in this module finder + * @throws SecurityException if the caller does not have permission to iterate module loaders + */ + public final Iterator iterateModules(final String baseName, final boolean recursive) { final SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(MODULE_ITERATE_PERM); } - return new Iterator() { + return new Iterator() { int idx; - Iterator nested; + Iterator nested; public boolean hasNext() { for (;;) { @@ -252,7 +315,7 @@ public boolean hasNext() { } final ModuleFinder finder = finders[idx++]; if (finder instanceof IterableModuleFinder) { - nested = ((IterableModuleFinder) finder).iterateModules(baseIdentifier, recursive); + nested = ((IterableModuleFinder) finder).iterateModules(baseName, recursive); } } @@ -264,7 +327,7 @@ public boolean hasNext() { } } - public ModuleIdentifier next() { + public String next() { if (! hasNext()) { throw new NoSuchElementException(); } @@ -278,40 +341,92 @@ public void remove() { } /** - * Preload a module based on an identifier. By default, no delegation is done and this method simply invokes - * {@link #loadModuleLocal(ModuleIdentifier)}. A delegating module loader may delegate to the appropriate module - * loader based on loader-specific criteria (via the {@link #preloadModule(ModuleIdentifier, ModuleLoader)} method). + * This compatibility method just calls {@code preloadModule(methodIdentifier.toString())} and is usually not used; + * if however a legacy subclass overrides this method, then it will be called instead of {@link #preloadModule(String)}, + * and that method will redirect to this one. * - * @param identifier the module identifier + * @deprecated Use {@link #preloadModule(String)} instead. + * + * @param identifier the module identifier (must not be {@code null}) * @return the load result, or {@code null} if the module is not found * @throws ModuleLoadException if an error occurs */ + @Deprecated protected Module preloadModule(ModuleIdentifier identifier) throws ModuleLoadException { - return loadModuleLocal(identifier); + if (overridesPreloadModuleByIdentifier) { + return loadModuleLocal(identifier); + } else { + return preloadModule(identifier.toString()); + } } /** - * Preload an "exported" module based on an identifier. By default this simply delegates to {@link #preloadModule(ModuleIdentifier)}. + * Preload a module based on an identifier. By default, no delegation is done and this method simply invokes + * {@link #loadModuleLocal(String)}. A delegating module loader may delegate to the appropriate module + * loader based on loader-specific criteria (via the {@link #preloadModule(String, ModuleLoader)} method). * - * @param identifier the module identifier + * @param name the module identifier + * @return the load result, or {@code null} if the module is not found + * @throws ModuleLoadException if an error occurs + */ + protected Module preloadModule(String name) throws ModuleLoadException { + if (overridesPreloadModuleByIdentifier) { + return preloadModule(ModuleIdentifier.fromString(name)); + } else { + return loadModuleLocal(name); + } + } + + /** + * Preload an "exported" module based on an identifier. By default this simply delegates to {@link #preloadModule(String)}. + * + * @param name the module identifier + * @return the load result, or {@code null} if the module is not found + * @throws ModuleLoadException if an error occurs + */ + protected Module preloadExportedModule(String name) throws ModuleLoadException { + return preloadModule(name); + } + + /** + * Preload an "exported" module based on an identifier. By default this simply delegates to {@link #preloadModule(String)}. + * + * @param name the module identifier * @return the load result, or {@code null} if the module is not found * @throws ModuleLoadException if an error occurs + * @deprecated Use {@link #preloadModule(String)} instead. */ + @Deprecated protected Module preloadExportedModule(ModuleIdentifier identifier) throws ModuleLoadException { - return preloadModule(identifier); + return preloadModule(identifier.getName()); } /** * Utility method to delegate to another module loader, accessible from subclasses. The delegate module loader * will be queried for exported modules only. * - * @param identifier the module identifier + * @param name the module name + * @param moduleLoader the module loader to delegate to + * @return the delegation result + * @throws ModuleLoadException if an error occurs + */ + protected static Module preloadModule(String name, ModuleLoader moduleLoader) throws ModuleLoadException { + return moduleLoader.preloadExportedModule(name); + } + + /** + * Utility method to delegate to another module loader, accessible from subclasses. The delegate module loader + * will be queried for exported modules only. + * + * @param name the module name * @param moduleLoader the module loader to delegate to * @return the delegation result * @throws ModuleLoadException if an error occurs + * @deprecated Use {@link #preloadModule(String, ModuleLoader)} instead. */ + @Deprecated protected static Module preloadModule(ModuleIdentifier identifier, ModuleLoader moduleLoader) throws ModuleLoadException { - return moduleLoader.preloadExportedModule(identifier); + return moduleLoader.preloadExportedModule(identifier.toString()); } /** @@ -319,18 +434,33 @@ protected static Module preloadModule(ModuleIdentifier identifier, ModuleLoader * module may not yet be resolved. The returned module may have a different name than the given identifier if * the identifier is an alias for another module. * - * @param identifier the module identifier + * @param moduleIdentifier the module identifier * @return the module * @throws ModuleLoadException if an error occurs while loading the module + * @deprecated Use {@link #loadModuleLocal(String)} instead. */ - protected final Module loadModuleLocal(ModuleIdentifier identifier) throws ModuleLoadException { - FutureModule futureModule = moduleMap.get(identifier); + @Deprecated + protected final Module loadModuleLocal(ModuleIdentifier moduleIdentifier) throws ModuleLoadException { + return loadModuleLocal(moduleIdentifier.toString()); + } + + /** + * Try to load a module from this module loader. Returns {@code null} if the module is not found. The returned + * module may not yet be resolved. The returned module may have a different name than the given identifier if + * the identifier is an alias for another module. + * + * @param name the module name + * @return the module + * @throws ModuleLoadException if an error occurs while loading the module + */ + protected final Module loadModuleLocal(String name) throws ModuleLoadException { + FutureModule futureModule = moduleMap.get(name); if (futureModule != null) { return futureModule.getModule(); } - FutureModule newFuture = new FutureModule(identifier); - futureModule = moduleMap.putIfAbsent(identifier, newFuture); + FutureModule newFuture = new FutureModule(name); + futureModule = moduleMap.putIfAbsent(name, newFuture); if (futureModule != null) { return futureModule.getModule(); } @@ -338,39 +468,36 @@ protected final Module loadModuleLocal(ModuleIdentifier identifier) throws Modul boolean ok = false; try { final ModuleLogger log = Module.log; - log.trace("Locally loading module %s from %s", identifier, this); + log.trace("Locally loading module %s from %s", name, this); final long startTime = Metrics.getCurrentCPUTime(); - final ModuleSpec moduleSpec = findModule(identifier); + final ModuleSpec moduleSpec = findModule(name); loadTime.addAndGet(Metrics.getCurrentCPUTime() - startTime); if (moduleSpec == null) { - log.trace("Module %s not found from %s", identifier, this); + log.trace("Module %s not found from %s", name, this); return null; } - if (! moduleSpec.getModuleIdentifier().equals(identifier)) { + if (! moduleSpec.getName().equals(name)) { throw new ModuleLoadException("Module loader found a module with the wrong name"); } final Module module; if ( moduleSpec instanceof AliasModuleSpec) { - final ModuleIdentifier aliasTarget = ((AliasModuleSpec) moduleSpec).getAliasTarget(); + final String aliasName = ((AliasModuleSpec) moduleSpec).getAliasName(); try { - newFuture.setModule(module = loadModuleLocal(aliasTarget)); - } catch (RuntimeException e) { - log.trace(e, "Failed to load module %s (alias for %s)", identifier, aliasTarget); - throw e; - } catch (Error e) { - log.trace(e, "Failed to load module %s (alias for %s)", identifier, aliasTarget); + newFuture.setModule(module = loadModuleLocal(name)); + } catch (RuntimeException | Error e) { + log.trace(e, "Failed to load module %s (alias for %s)", name, aliasName); throw e; } } else { module = defineModule((ConcreteModuleSpec) moduleSpec, newFuture); } - log.trace("Loaded module %s from %s", identifier, this); + log.trace("Loaded module %s from %s", name, this); ok = true; return module; } finally { if (! ok) { newFuture.setModule(null); - moduleMap.remove(identifier, newFuture); + moduleMap.remove(name, newFuture); } } } @@ -382,9 +509,23 @@ protected final Module loadModuleLocal(ModuleIdentifier identifier) throws Modul * * @param identifier the module identifier * @return the module, or {@code null} if it wasn't found + * @deprecated Use {@link #findLoadedModuleLocal(String)} instead. */ + @Deprecated protected final Module findLoadedModuleLocal(ModuleIdentifier identifier) { - FutureModule futureModule = moduleMap.get(identifier); + return findLoadedModuleLocal(identifier.toString()); + } + + /** + * Find an already-loaded module, returning {@code null} if the module isn't currently loaded. May block + * while the loaded state of the module is in question (if the module is being concurrently loaded from another + * thread, for example). + * + * @param name the module identifier + * @return the module, or {@code null} if it wasn't found + */ + protected final Module findLoadedModuleLocal(String name) { + FutureModule futureModule = moduleMap.get(name); if (futureModule != null) { try { return futureModule.getModule(); @@ -421,6 +562,26 @@ protected final void unloadModuleLocal(Module module) throws SecurityException { } } + /** + * This compatibility method just calls {@code findModule(methodIdentifier.toString())} and is usually not used; + * if however a legacy subclass overrides this method, then it will be called instead of {@link #findModule(String)}, + * and that method will redirect to this one. + * + * @deprecated Use {@link #findModule(String)} instead. + * + * @param moduleIdentifier the module identifier + * @return the module specification + * @throws ModuleLoadException + */ + @Deprecated + protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws ModuleLoadException { + if (overridesFindModuleByIdentifier) { + return findModule0(moduleIdentifier.toString()); + } else { + return findModule(moduleIdentifier.toString()); + } + } + /** * Find a Module's specification in this ModuleLoader by its identifier. This can be overriden by sub-classes to * implement the Module loading strategy for this loader. The default implementation iterates the module finders @@ -434,10 +595,18 @@ protected final void unloadModuleLocal(Module module) throws SecurityException { * @return the module specification, or {@code null} if no module is found with the given identifier * @throws ModuleLoadException if any problems occur finding the module */ - protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws ModuleLoadException { + protected ModuleSpec findModule(final String name) throws ModuleLoadException { + if (overridesFindModuleByIdentifier) { + return findModule(ModuleIdentifier.fromString(name)); + } else { + return findModule0(name); + } + } + + private ModuleSpec findModule0(final String name) throws ModuleLoadException { for (ModuleFinder finder : finders) { if (finder != null) { - final ModuleSpec spec = finder.findModule(moduleIdentifier, this); + final ModuleSpec spec = finder.findModule(name, this); if (spec != null) { return spec; } @@ -456,7 +625,7 @@ protected final ModuleFinder[] getFinders() { } /** - * Defines a Module based on a specification. May only be called from {@link #loadModuleLocal(ModuleIdentifier)}. + * Defines a Module based on a specification. May only be called from {@link #loadModuleLocal(String)}. * * @param moduleSpec The module specification to create the Module from * @param futureModule the future module to populate @@ -468,20 +637,20 @@ private Module defineModule(final ConcreteModuleSpec moduleSpec, final FutureMod return doPrivileged(new PrivilegedExceptionAction() { public Module run() throws Exception { final ModuleLogger log = Module.log; - final ModuleIdentifier moduleIdentifier = moduleSpec.getModuleIdentifier(); + final String name = moduleSpec.getName(); final Module module = new Module(moduleSpec, ModuleLoader.this); module.getClassLoaderPrivate().recalculate(); module.setDependencies(moduleSpec.getDependenciesInternal()); - log.moduleDefined(moduleIdentifier, ModuleLoader.this); + log.moduleDefined(name, ModuleLoader.this); try { futureModule.setModule(module); return module; } catch (RuntimeException e) { - log.trace(e, "Failed to load module %s", moduleIdentifier); + log.trace(e, "Failed to load module %s", name); throw e; } catch (Error e) { - log.trace(e, "Failed to load module %s", moduleIdentifier); + log.trace(e, "Failed to load module %s", name); throw e; } } @@ -629,11 +798,11 @@ void incClassCount() { private static final class FutureModule { private static final Object NOT_FOUND = new Object(); - final ModuleIdentifier identifier; + final String name; volatile Object module; - FutureModule(final ModuleIdentifier identifier) { - this.identifier = identifier; + FutureModule(final String name) { + this.name = name; } Module getModule() throws ModuleNotFoundException { @@ -649,7 +818,7 @@ Module getModule() throws ModuleNotFoundException { } } } - if (module == NOT_FOUND) throw new ModuleNotFoundException(identifier.toString()); + if (module == NOT_FOUND) throw new ModuleNotFoundException(name); return (Module) module; } finally { if (intr) Thread.currentThread().interrupt(); @@ -710,13 +879,10 @@ public int getClassCount() { } public List queryLoadedModuleNames() { - ModuleLoader loader = getModuleLoader(); - final Set identifiers = loader.moduleMap.keySet(); - final ArrayList list = new ArrayList(identifiers.size()); - for (ModuleIdentifier identifier : identifiers) { - list.add(identifier.toString()); - } - Collections.sort(list); + final ModuleLoader loader = getModuleLoader(); + final Set names = loader.moduleMap.keySet(); + final ArrayList list = new ArrayList<>(names); + list.sort(Comparator.naturalOrder()); return list; } @@ -778,7 +944,7 @@ public boolean unloadModule(final String name) { sm.checkPermission(MODULE_UNLOAD_ANY_PERM); } final ModuleLoader loader = getModuleLoader(); - final Module module = loader.findLoadedModuleLocal(ModuleIdentifier.fromString(name)); + final Module module = loader.findLoadedModuleLocal(name); if (module == null) { return false; } else { @@ -835,7 +1001,7 @@ private List doGetDependencies(final Module module) { info = new DependencyInfo(dependencyType, exportFilter, importFilter, null, null, false, localDependency.getLocalLoader().toString(), pathList); } else if (dependency instanceof ModuleDependency) { final ModuleDependency moduleDependency = (ModuleDependency) dependency; - info = new DependencyInfo(dependencyType, exportFilter, importFilter, moduleDependency.getModuleLoader().mxBean, moduleDependency.getIdentifier().toString(), moduleDependency.isOptional(), null, null); + info = new DependencyInfo(dependencyType, exportFilter, importFilter, moduleDependency.getModuleLoader().mxBean, moduleDependency.getName(), moduleDependency.isOptional(), null, null); } else { info = new DependencyInfo(dependencyType, exportFilter, importFilter, null, null, false, null, null); } @@ -900,7 +1066,7 @@ public SortedMap> getModulePathsInfo(final String name, fin private Module loadModule(final String name, final ModuleLoader loader) { try { - final Module module = loader.findLoadedModuleLocal(ModuleIdentifier.fromString(name)); + final Module module = loader.findLoadedModuleLocal(name); if (module == null) { throw new IllegalArgumentException("Module " + name + " not found"); } diff --git a/src/main/java/org/jboss/modules/ModuleSpec.java b/src/main/java/org/jboss/modules/ModuleSpec.java index d8f06bc4f..10a85ef3e 100644 --- a/src/main/java/org/jboss/modules/ModuleSpec.java +++ b/src/main/java/org/jboss/modules/ModuleSpec.java @@ -35,10 +35,10 @@ */ public abstract class ModuleSpec { - private final ModuleIdentifier moduleIdentifier; + private final String name; - ModuleSpec(final ModuleIdentifier moduleIdentifier) { - this.moduleIdentifier = moduleIdentifier; + ModuleSpec(final String name) { + this.name = name; } /** @@ -46,10 +46,22 @@ public abstract class ModuleSpec { * * @param moduleIdentifier the module identifier * @return the builder + * @deprecated Use {@link #buider(String)} instead. */ + @Deprecated public static Builder build(final ModuleIdentifier moduleIdentifier) { - if (moduleIdentifier == null) { - throw new IllegalArgumentException("moduleIdentifier is null"); + return build(moduleIdentifier.toString()); + } + + /** + * Get a builder for a new module specification. + * + * @param name the module name + * @return the builder + */ + public static Builder build(final String name) { + if (name == null) { + throw new IllegalArgumentException("name is null"); } return new Builder() { private String mainClass; @@ -125,12 +137,12 @@ public Builder setVersion(Version version) { @Override public ModuleSpec create() { - return new ConcreteModuleSpec(moduleIdentifier, mainClass, assertionSetting, resourceLoaders.toArray(new ResourceLoaderSpec[resourceLoaders.size()]), dependencies.toArray(new DependencySpec[dependencies.size()]), fallbackLoader, moduleClassLoaderFactory, classFileTransformer, properties, permissionCollection, version); + return new ConcreteModuleSpec(name, mainClass, assertionSetting, resourceLoaders.toArray(new ResourceLoaderSpec[resourceLoaders.size()]), dependencies.toArray(new DependencySpec[dependencies.size()]), fallbackLoader, moduleClassLoaderFactory, classFileTransformer, properties, permissionCollection, version); } @Override - public ModuleIdentifier getIdentifier() { - return moduleIdentifier; + public String getName() { + return name; } }; } @@ -141,25 +153,38 @@ public ModuleIdentifier getIdentifier() { * @param moduleIdentifier the module identifier * @param aliasTarget the alias target identifier * @return the builder + * @deprecated Use {@link #buildAlias(String, String)} instead. */ + @Deprecated public static AliasBuilder buildAlias(final ModuleIdentifier moduleIdentifier, final ModuleIdentifier aliasTarget) { - if (moduleIdentifier == null) { - throw new IllegalArgumentException("moduleIdentifier is null"); + return buildAlias(moduleIdentifier.toString(), aliasTarget.toString()); + } + + /** + * Get a builder for a new module alias specification. + * + * @param moduleIdentifier the module identifier + * @param aliasTarget the alias target identifier + * @return the builder + */ + public static AliasBuilder buildAlias(final String name, final String aliasName) { + if (name == null) { + throw new IllegalArgumentException("name is null"); } - if (aliasTarget == null) { - throw new IllegalArgumentException("aliasTarget is null"); + if (aliasName == null) { + throw new IllegalArgumentException("aliasName is null"); } return new AliasBuilder() { public ModuleSpec create() { - return new AliasModuleSpec(moduleIdentifier, aliasTarget); + return new AliasModuleSpec(name, aliasName); } - public ModuleIdentifier getIdentifier() { - return moduleIdentifier; + public String getName() { + return null; } - public ModuleIdentifier getAliasTarget() { - return aliasTarget; + public String getAliasName() { + return null; } }; } @@ -168,9 +193,19 @@ public ModuleIdentifier getAliasTarget() { * Get the module identifier for the module which is specified by this object. * * @return the module identifier + * @deprecated Use {@link #getName()} instead. */ public ModuleIdentifier getModuleIdentifier() { - return moduleIdentifier; + return ModuleIdentifier.fromString(name); + } + + /** + * Get the module name for the module which is specified by this object. + * + * @return the module name + */ + public String getName() { + return name; } /** @@ -223,8 +258,19 @@ public interface Builder { * Get the identifier of the module being defined by this builder. * * @return the module identifier + * @deprecated use {@link #getName()} instead */ - ModuleIdentifier getIdentifier(); + @Deprecated + default ModuleIdentifier getIdentifier() { + return ModuleIdentifier.fromString(getName()); + } + + /** + * Get the name of the module being defined by this builder. + * + * @return the module name + */ + String getName(); /** * Sets a "fall-back" loader that will attempt to load a class if all other mechanisms @@ -294,14 +340,36 @@ public interface AliasBuilder { * Get the identifier of the module being defined by this builder. * * @return the module identifier + * @deprecated Use {@link #getName()} instead. + */ + @Deprecated + default ModuleIdentifier getIdentifier() { + return ModuleIdentifier.fromString(getName()); + } + + /** + * Get the name of the module being defined by this builder. + * + * @return the module name */ - ModuleIdentifier getIdentifier(); + String getName(); /** * Get the identifier of the module being referenced by this builder. * * @return the module identifier + * @deprecated Use {@link #getAliasName()} instead. + */ + @Deprecated + default ModuleIdentifier getAliasTarget() { + return ModuleIdentifier.fromString(getAliasName()); + } + + /** + * Get the name of the module being referenced by this builder. + * + * @return the module name */ - ModuleIdentifier getAliasTarget(); + String getAliasName(); } } diff --git a/src/main/java/org/jboss/modules/ModuleXmlUtil.java b/src/main/java/org/jboss/modules/ModuleXmlUtil.java deleted file mode 100644 index e1b012f2e..000000000 --- a/src/main/java/org/jboss/modules/ModuleXmlUtil.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * JBoss, Home of Professional Open Source. - * Copyright 2014 Red Hat, Inc., and individual contributors - * as indicated by the @author tags. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jboss.modules; - -import java.io.File; - -/** - * Utility class for default module file names. - *

- * Date: 10.05.2011 - * - * @author James R. Perkins - */ -class ModuleXmlUtil { - public static final String DEFAULT_FILENAME = "module.xml"; - - /** - * Private constructor. - */ - private ModuleXmlUtil() { - } - - /** - * Creates a file based on the directory and the module identifier. - *

- * The {@code dir} parameter must be a directory and the {@code identifier} cannot be {@code null}. - * - * @param dir the base directory where the file should be located. - * @param identifier the module identifier. - * - * @return the module XML file. - * @throws IllegalArgumentException if the {@code dir} parameter is not a directory or an argument is {@code null}. - */ - public static File toFile(final File dir, final ModuleIdentifier identifier) { - return toFile(dir, DEFAULT_FILENAME, identifier); - } - - /** - * Creates a file based on the directory and the module identifier. - *

- * The {@code dir} parameter must be a directory and the {@code identifier} cannot be {@code null}. - * - * @param dir the base directory where the file should be located. - * @param name the name of the XML file. - * @param identifier the module identifier. - * - * @return the module XML file. - * @throws IllegalArgumentException if the {@code dir} parameter is not a directory or an argument is {@code null}. - */ - public static File toFile(final File dir, final String name, final ModuleIdentifier identifier) { - if (dir == null || !dir.isDirectory()) { - throw new IllegalArgumentException(String.format("Must be a directory. File %s is not a directory.", dir)); - } - if (name == null || name.isEmpty()) { - throw new IllegalArgumentException("The name cannot be empty."); - } - if (identifier == null) { - throw new IllegalArgumentException("The module identifier cannot be null."); - } - return new File(dir, baseFilename(name, identifier)); - } - - /** - * Creates a path name from the module identifier. The name always ends with the separator character. - *

- * A {@code null} identifier will result in no separator being used. - * - * @param identifier the module identifier. - * @param separator the directory separator. - * - * @return a path name of the module identifier. - * @throws IllegalArgumentException if the module identifier is {@code null}. - */ - public static String baseDirectory(final ModuleIdentifier identifier, final String separator) { - if (identifier == null) { - throw new IllegalArgumentException("The module identifier cannot be null."); - } - final String namePath = identifier.getName().replace('.', File.separatorChar); - final StringBuilder baseName = new StringBuilder(); - baseName.append(namePath). - append((separator == null ? "" : separator)). - append(identifier.getSlot()). - append((separator == null ? "" : separator)); - return baseName.toString(); - } - - /** - * Creates a path name from the module identifier with the default {@link java.io.File#separator} character. - * - * @param identifier the module identifier. - * - * @return a path name of the module identifier. - * @throws IllegalArgumentException if the module identifier is {@code null}. - * @see #baseDirectory(ModuleIdentifier, String) - */ - public static String baseDirectory(final ModuleIdentifier identifier) { - return baseDirectory(identifier, File.separator); - } - - /** - * Creates a path name to the module XML file from the module identifier. Uses the {@link #DEFAULT_FILENAME} for - * the XML file name. - * - * @param identifier the module identifier. - * - * @return a path name to the module XML file. - * @throws IllegalArgumentException if the module identifier is {@code null}. - */ - public static String baseFilename(final ModuleIdentifier identifier) { - return baseFilename(DEFAULT_FILENAME, identifier); - } - - /** - * Creates a path name to the module XML file from the module identifier. - * - * @param name the XML file name. - * @param identifier the module identifier. - * - * @return a path name to the module XML file. - * @throws IllegalArgumentException if the module identifier is {@code null}. - */ - public static String baseFilename(final String name, final ModuleIdentifier identifier) { - return baseDirectory(identifier) + name; - } - - /** - * Creates a path name to the module XML - * - * @param name the XML file name. file from the module identifier. - * @param separator the directory separator. - * @param identifier the module identifier. - * - * @return a path name to the module XML file. - * @throws IllegalArgumentException if the module identifier is {@code null}. - */ - public static String baseFilename(final String name, final String separator, final ModuleIdentifier identifier) { - return baseDirectory(identifier, separator) + name; - } -} diff --git a/src/main/java/org/jboss/modules/log/JDKModuleLogger.java b/src/main/java/org/jboss/modules/log/JDKModuleLogger.java index b9617fa9f..a1eac4cd6 100644 --- a/src/main/java/org/jboss/modules/log/JDKModuleLogger.java +++ b/src/main/java/org/jboss/modules/log/JDKModuleLogger.java @@ -23,7 +23,6 @@ import org.jboss.modules.Main; import org.jboss.modules.Module; -import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoader; /** @@ -179,9 +178,9 @@ public void greeting() { } /** {@inheritDoc} */ - public void moduleDefined(final ModuleIdentifier identifier, final ModuleLoader moduleLoader) { + public void moduleDefined(final String name, final ModuleLoader moduleLoader) { if (logger.isLoggable(DEBUG)) { - doLog(DEBUG, String.format("Module %s defined by %s", identifier, moduleLoader)); + doLog(DEBUG, String.format("Module %s defined by %s", name, moduleLoader)); } } diff --git a/src/main/java/org/jboss/modules/log/ModuleLogger.java b/src/main/java/org/jboss/modules/log/ModuleLogger.java index 8c2925694..1203d28fe 100644 --- a/src/main/java/org/jboss/modules/log/ModuleLogger.java +++ b/src/main/java/org/jboss/modules/log/ModuleLogger.java @@ -52,7 +52,12 @@ public interface ModuleLogger { void greeting(); - void moduleDefined(ModuleIdentifier identifier, final ModuleLoader moduleLoader); + default void moduleDefined(String name, final ModuleLoader moduleLoader) { + moduleDefined(ModuleIdentifier.fromString(name), moduleLoader); + } + + default void moduleDefined(ModuleIdentifier identifier, final ModuleLoader moduleLoader) { + } void classDefineFailed(Throwable throwable, String className, Module module); diff --git a/src/main/java/org/jboss/modules/log/NoopModuleLogger.java b/src/main/java/org/jboss/modules/log/NoopModuleLogger.java index 9a18ae2e9..f27cb9b2a 100644 --- a/src/main/java/org/jboss/modules/log/NoopModuleLogger.java +++ b/src/main/java/org/jboss/modules/log/NoopModuleLogger.java @@ -19,7 +19,6 @@ package org.jboss.modules.log; import org.jboss.modules.Module; -import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoader; /** @@ -81,7 +80,7 @@ public void greeting() { } @Override - public void moduleDefined(final ModuleIdentifier identifier, final ModuleLoader moduleLoader) { + public void moduleDefined(final String name, final ModuleLoader moduleLoader) { } @Override diff --git a/src/main/java/org/jboss/modules/log/StreamModuleLogger.java b/src/main/java/org/jboss/modules/log/StreamModuleLogger.java index bb08d8158..219e6c3b8 100644 --- a/src/main/java/org/jboss/modules/log/StreamModuleLogger.java +++ b/src/main/java/org/jboss/modules/log/StreamModuleLogger.java @@ -22,7 +22,6 @@ import java.io.PrintStream; import org.jboss.modules.Module; -import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoader; /** @@ -145,7 +144,7 @@ public void greeting() { } /** {@inheritDoc} */ - public void moduleDefined(final ModuleIdentifier identifier, final ModuleLoader moduleLoader) { + public void moduleDefined(final String name, final ModuleLoader moduleLoader) { } /** {@inheritDoc} */ diff --git a/src/main/java/org/jboss/modules/security/ModularPermissionFactory.java b/src/main/java/org/jboss/modules/security/ModularPermissionFactory.java index d7d829528..de29235a0 100644 --- a/src/main/java/org/jboss/modules/security/ModularPermissionFactory.java +++ b/src/main/java/org/jboss/modules/security/ModularPermissionFactory.java @@ -31,7 +31,7 @@ */ public final class ModularPermissionFactory implements PermissionFactory { private final ModuleLoader moduleLoader; - private final ModuleIdentifier moduleIdentifier; + private final String moduleName; private final String className; private final String targetName; private final String permissionActions; @@ -48,19 +48,34 @@ public final class ModularPermissionFactory implements PermissionFactory { * @param className the name of the permission class * @param targetName the name to pass to the permission class constructor or {@code null} for none * @param permissionActions the action list to pass to the permission class constructor or {@code null} for none + * @deprecated Use {@link #ModularPermissionFactory(ModuleLoader, String, String, String, String)} instead. */ + @Deprecated public ModularPermissionFactory(final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, final String className, final String targetName, final String permissionActions) { + this(moduleLoader, moduleIdentifier.toString(), className, targetName, permissionActions); + } + + /** + * Construct a new instance. + * + * @param moduleLoader the module loader from which the module is to be loaded + * @param moduleName the module name from which the permission is to be loaded + * @param className the name of the permission class + * @param targetName the name to pass to the permission class constructor or {@code null} for none + * @param permissionActions the action list to pass to the permission class constructor or {@code null} for none + */ + public ModularPermissionFactory(final ModuleLoader moduleLoader, final String moduleName, final String className, final String targetName, final String permissionActions) { if (moduleLoader == null) { throw new IllegalArgumentException("moduleLoader is null"); } - if (moduleIdentifier == null) { - throw new IllegalArgumentException("moduleIdentifier is null"); + if (moduleName == null) { + throw new IllegalArgumentException("moduleName is null"); } if (className == null) { throw new IllegalArgumentException("className is null"); } this.moduleLoader = moduleLoader; - this.moduleIdentifier = moduleIdentifier; + this.moduleName = moduleName; this.className = className; this.targetName = targetName; this.permissionActions = permissionActions; @@ -75,7 +90,7 @@ public Permission construct() { return instance; } try { - final Module module = moduleLoader.loadModule(moduleIdentifier); + final Module module = moduleLoader.loadModule(moduleName); final Class permissionClass = access.getClassLoaderOf(module).loadClass(className, true).asSubclass(Permission.class); return instance = PermissionFactory.constructFromClass(permissionClass, targetName, permissionActions); } catch (Throwable t) { diff --git a/src/main/java/org/jboss/modules/xml/ModuleXmlParser.java b/src/main/java/org/jboss/modules/xml/ModuleXmlParser.java index 7797091dd..e7d42a238 100755 --- a/src/main/java/org/jboss/modules/xml/ModuleXmlParser.java +++ b/src/main/java/org/jboss/modules/xml/ModuleXmlParser.java @@ -161,8 +161,25 @@ private ModuleXmlParser() { * @return a module specification * @throws ModuleLoadException if a dependency could not be established or another error occurs * @throws IOException if I/O fails + * @deprecated Use {@link #parseModuleXml(ModuleLoader, String, File, File)} instead. */ + @Deprecated public static ModuleSpec parseModuleXml(final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, final File root, final File moduleInfoFile) throws ModuleLoadException, IOException { + return parseModuleXml(moduleLoader, moduleIdentifier.toString(), root, moduleInfoFile); + } + + /** + * Parse a {@code module.xml} file. + * + * @param moduleLoader the module loader to use for dependency specifications + * @param moduleName the name of the module to load + * @param root the module path root + * @param moduleInfoFile the {@code File} of the {@code module.xml} content + * @return a module specification + * @throws ModuleLoadException if a dependency could not be established or another error occurs + * @throws IOException if I/O fails + */ + public static ModuleSpec parseModuleXml(final ModuleLoader moduleLoader, final String moduleName, final File root, final File moduleInfoFile) throws ModuleLoadException, IOException { final FileInputStream fis; try { fis = new FileInputStream(moduleInfoFile); @@ -197,7 +214,7 @@ public static ModuleSpec parseModuleXml(final ModuleLoader moduleLoader, final M final JarFile jarFile = new JarFile(file, true); return ResourceLoaders.createJarResourceLoader(loaderName, jarFile); } - }, root.getPath(), new BufferedInputStream(fis), moduleInfoFile.getPath(), moduleLoader, moduleIdentifier); + }, root.getPath(), new BufferedInputStream(fis), moduleInfoFile.getPath(), moduleLoader, moduleName); } finally { safeClose(fis); } @@ -215,11 +232,30 @@ public static ModuleSpec parseModuleXml(final ModuleLoader moduleLoader, final M * @return a module specification * @throws ModuleLoadException if a dependency could not be established or another error occurs * @throws IOException if I/O fails + * @deprecated Use {@link #parseModuleXml(ResourceRootFactory, String, InputStream, String, ModuleLoader, String)} instead. */ + @Deprecated public static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final String rootPath, InputStream source, final String moduleInfoFile, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier) throws ModuleLoadException, IOException { return parseModuleXml(factory, MavenResolver.createDefaultResolver(), rootPath, source, moduleInfoFile, moduleLoader, moduleIdentifier); } + /** + * Parse a {@code module.xml} file. + * + * @param factory the resource root factory to use (must not be {@code null}) + * @param rootPath the root path to send in to the resource root factory (must not be {@code null}) + * @param source a stream of the {@code module.xml} content (must not be {@code null}) + * @param moduleInfoFile the {@code File} of the {@code module.xml} content (must not be {@code null}) + * @param moduleLoader the module loader to use for dependency specifications (must not be {@code null}) + * @param moduleName the module name of the module to load + * @return a module specification + * @throws ModuleLoadException if a dependency could not be established or another error occurs + * @throws IOException if I/O fails + */ + public static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final String rootPath, InputStream source, final String moduleInfoFile, final ModuleLoader moduleLoader, final String moduleName) throws ModuleLoadException, IOException { + return parseModuleXml(factory, MavenResolver.createDefaultResolver(), rootPath, source, moduleInfoFile, moduleLoader, moduleName); + } + /** * Parse a {@code module.xml} file. * @@ -233,13 +269,33 @@ public static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final * @return a module specification * @throws ModuleLoadException if a dependency could not be established or another error occurs * @throws IOException if I/O fails + * @deprecated Use {@link #parseModuleXml(ResourceRootFactory, MavenResolver, String, InputStream, String, ModuleLoader, String)} instead. */ + @Deprecated public static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final MavenResolver mavenResolver, final String rootPath, InputStream source, final String moduleInfoFile, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier) throws ModuleLoadException, IOException { + return parseModuleXml(factory, mavenResolver, rootPath, source, moduleInfoFile, moduleLoader, moduleIdentifier.toString()); + } + + /** + * Parse a {@code module.xml} file. + * + * @param factory the resource root factory to use (must not be {@code null}) + * @param mavenResolver the Maven artifact resolver to use (must not be {@code null}) + * @param rootPath the root path to send in to the resource root factory (must not be {@code null}) + * @param source a stream of the {@code module.xml} content (must not be {@code null}) + * @param moduleInfoFile the {@code File} of the {@code module.xml} content (must not be {@code null}) + * @param moduleLoader the module loader to use for dependency specifications (must not be {@code null}) + * @param moduleName the module name of the module to load + * @return a module specification + * @throws ModuleLoadException if a dependency could not be established or another error occurs + * @throws IOException if I/O fails + */ + public static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final MavenResolver mavenResolver, final String rootPath, InputStream source, final String moduleInfoFile, final ModuleLoader moduleLoader, final String moduleName) throws ModuleLoadException, IOException { try { final MXParser parser = new MXParser(); parser.setFeature(FEATURE_PROCESS_NAMESPACES, true); parser.setInput(source, null); - return parseDocument(mavenResolver, factory, rootPath, parser, moduleLoader, moduleIdentifier); + return parseDocument(mavenResolver, factory, rootPath, parser, moduleLoader, moduleName); } catch (XmlPullParserException e) { throw new ModuleLoadException("Error loading module from " + moduleInfoFile, e); } finally { @@ -277,7 +333,7 @@ public static XmlPullParserException endOfDocument(final XmlPullParser reader) { return new XmlPullParserException("Unexpected end of document", reader, null); } - private static XmlPullParserException invalidModuleName(final XmlPullParser reader, final ModuleIdentifier expected) { + private static XmlPullParserException invalidModuleName(final XmlPullParser reader, final String expected) { return new XmlPullParserException("Invalid/mismatched module name (expected " + expected + ")", reader, null); } @@ -328,6 +384,10 @@ private static void validateNamespace(final XmlPullParser reader) throws XmlPull } } + private static boolean atLeast1_6(final XmlPullParser reader) { + return MODULE_1_6.equals(reader.getNamespace()); + } + private static void assertNoAttributes(final XmlPullParser reader) throws XmlPullParserException { final int attributeCount = reader.getAttributeCount(); if (attributeCount > 0) { @@ -341,30 +401,31 @@ private static void validateAttributeNamespace(final XmlPullParser reader, final } } - private static ModuleSpec parseDocument(final MavenResolver mavenResolver, final ResourceRootFactory factory, final String rootPath, XmlPullParser reader, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier) throws XmlPullParserException, IOException { + private static ModuleSpec parseDocument(final MavenResolver mavenResolver, final ResourceRootFactory factory, final String rootPath, XmlPullParser reader, final ModuleLoader moduleLoader, final String moduleName) throws XmlPullParserException, IOException { int eventType; for (;;) { eventType = reader.nextTag(); switch (eventType) { case START_DOCUMENT: { - return parseRootElement(mavenResolver, factory, rootPath, reader, moduleLoader, moduleIdentifier); + return parseRootElement(mavenResolver, factory, rootPath, reader, moduleLoader, moduleName); } case START_TAG: { + validateNamespace(reader); final String element = reader.getName(); switch (element) { case E_MODULE: { - final ModuleSpec.Builder specBuilder = ModuleSpec.build(moduleIdentifier); - parseModuleContents(mavenResolver, reader, factory, moduleLoader, moduleIdentifier, specBuilder, rootPath); + final ModuleSpec.Builder specBuilder = ModuleSpec.build(moduleName); + parseModuleContents(mavenResolver, reader, factory, moduleLoader, moduleName, specBuilder, rootPath); parseEndDocument(reader); return specBuilder.create(); } case E_MODULE_ALIAS: { - final ModuleSpec moduleSpec = parseModuleAliasContents(reader, moduleIdentifier); + final ModuleSpec moduleSpec = parseModuleAliasContents(reader, moduleName); parseEndDocument(reader); return moduleSpec; } case E_MODULE_ABSENT: { - parseModuleAbsentContents(reader, moduleIdentifier); + parseModuleAbsentContents(reader, moduleName); return null; } default: { @@ -379,7 +440,7 @@ private static ModuleSpec parseDocument(final MavenResolver mavenResolver, final } } - private static ModuleSpec parseRootElement(final MavenResolver mavenResolver, final ResourceRootFactory factory, final String rootPath, final XmlPullParser reader, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier) throws XmlPullParserException, IOException { + private static ModuleSpec parseRootElement(final MavenResolver mavenResolver, final ResourceRootFactory factory, final String rootPath, final XmlPullParser reader, final ModuleLoader moduleLoader, final String moduleName) throws XmlPullParserException, IOException { assertNoAttributes(reader); int eventType; while ((eventType = reader.nextTag()) != END_DOCUMENT) { @@ -389,18 +450,18 @@ private static ModuleSpec parseRootElement(final MavenResolver mavenResolver, fi final String element = reader.getName(); switch (element) { case E_MODULE: { - final ModuleSpec.Builder specBuilder = ModuleSpec.build(moduleIdentifier); - parseModuleContents(mavenResolver, reader, factory, moduleLoader, moduleIdentifier, specBuilder, rootPath); + final ModuleSpec.Builder specBuilder = ModuleSpec.build(moduleName); + parseModuleContents(mavenResolver, reader, factory, moduleLoader, moduleName, specBuilder, rootPath); parseEndDocument(reader); return specBuilder.create(); } case E_MODULE_ALIAS: { - final ModuleSpec moduleSpec = parseModuleAliasContents(reader, moduleIdentifier); + final ModuleSpec moduleSpec = parseModuleAliasContents(reader, moduleName); parseEndDocument(reader); return moduleSpec; } case E_MODULE_ABSENT: { - parseModuleAbsentContents(reader, moduleIdentifier); + parseModuleAbsentContents(reader, moduleName); return null; } default: { @@ -416,12 +477,13 @@ private static ModuleSpec parseRootElement(final MavenResolver mavenResolver, fi throw endOfDocument(reader); } - private static ModuleSpec parseModuleAliasContents(final XmlPullParser reader, final ModuleIdentifier moduleIdentifier) throws XmlPullParserException, IOException { + private static ModuleSpec parseModuleAliasContents(final XmlPullParser reader, final String moduleName) throws XmlPullParserException, IOException { final int count = reader.getAttributeCount(); String name = null; String slot = null; String targetName = null; String targetSlot = null; + boolean noSlots = atLeast1_6(reader); final Set required = new HashSet<>(LIST_A_NAME_A_TARGET_NAME); for (int i = 0; i < count; i ++) { validateAttributeNamespace(reader, i); @@ -429,24 +491,34 @@ private static ModuleSpec parseModuleAliasContents(final XmlPullParser reader, f required.remove(attribute); switch (attribute) { case A_NAME: name = reader.getAttributeValue(i); break; - case A_SLOT: slot = reader.getAttributeValue(i); break; + case A_SLOT: if (noSlots) throw unknownAttribute(reader,i); else slot = reader.getAttributeValue(i); break; case A_TARGET_NAME: targetName = reader.getAttributeValue(i); break; - case A_TARGET_SLOT: targetSlot = reader.getAttributeValue(i); break; + case A_TARGET_SLOT: if (noSlots) throw unknownAttribute(reader,i); else targetSlot = reader.getAttributeValue(i); break; default: throw unknownAttribute(reader, i); } } if (! required.isEmpty()) { throw missingAttributes(reader, required); } - if (! moduleIdentifier.equals(ModuleIdentifier.create(name, slot))) { - throw invalidModuleName(reader, moduleIdentifier); + if (noSlots) { + if (! moduleName.equals(name)) { + throw invalidModuleName(reader, moduleName); + } + } else { + if (! ModuleIdentifier.fromString(moduleName).equals(ModuleIdentifier.create(name, slot))) { + throw invalidModuleName(reader, moduleName); + } } int eventType; for (;;) { eventType = reader.nextTag(); switch (eventType) { case END_TAG: { - return ModuleSpec.buildAlias(moduleIdentifier, ModuleIdentifier.create(targetName, targetSlot)).create(); + if (noSlots) { + return ModuleSpec.buildAlias(moduleName, targetName).create(); + } else { + return ModuleSpec.buildAlias(ModuleIdentifier.fromString(moduleName), ModuleIdentifier.create(targetName, targetSlot)).create(); + } } default: { throw unexpectedContent(reader); @@ -455,10 +527,11 @@ private static ModuleSpec parseModuleAliasContents(final XmlPullParser reader, f } } - private static void parseModuleAbsentContents(final XmlPullParser reader, final ModuleIdentifier moduleIdentifier) throws XmlPullParserException, IOException { + private static void parseModuleAbsentContents(final XmlPullParser reader, final String moduleName) throws XmlPullParserException, IOException { final int count = reader.getAttributeCount(); String name = null; String slot = null; + boolean noSlots = atLeast1_6(reader); final Set required = new HashSet<>(LIST_A_NAME_A_SLOT); for (int i = 0; i < count; i ++) { validateAttributeNamespace(reader, i); @@ -466,15 +539,21 @@ private static void parseModuleAbsentContents(final XmlPullParser reader, final required.remove(attribute); switch (attribute) { case A_NAME: name = reader.getAttributeValue(i); break; - case A_SLOT: slot = reader.getAttributeValue(i); break; + case A_SLOT: if (noSlots) throw unknownAttribute(reader, i); else slot = reader.getAttributeValue(i); break; default: throw unknownAttribute(reader, i); } } if (! required.isEmpty()) { throw missingAttributes(reader, required); } - if (! moduleIdentifier.equals(ModuleIdentifier.create(name, slot))) { - throw invalidModuleName(reader, moduleIdentifier); + if (noSlots) { + if (! name.equals(moduleName)) { + throw invalidModuleName(reader, moduleName); + } + } else { + if (! ModuleIdentifier.fromString(moduleName).equals(ModuleIdentifier.create(name, slot))) { + throw invalidModuleName(reader, moduleName); + } } int eventType; for (;;) { @@ -500,19 +579,20 @@ private static Permissions getAllPermission() { return permissions; } - private static void parseModuleContents(final MavenResolver mavenResolver, final XmlPullParser reader, final ResourceRootFactory factory, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, final ModuleSpec.Builder specBuilder, final String rootPath) throws XmlPullParserException, IOException { + private static void parseModuleContents(final MavenResolver mavenResolver, final XmlPullParser reader, final ResourceRootFactory factory, final ModuleLoader moduleLoader, final String moduleName, final ModuleSpec.Builder specBuilder, final String rootPath) throws XmlPullParserException, IOException { final int count = reader.getAttributeCount(); String name = null; String slot = null; + boolean noSlots = atLeast1_6(reader); Version version = null; - final Set required = new HashSet<>(LIST_A_NAME); + final Set required = noSlots ? new HashSet<>(LIST_A_NAME) : new HashSet<>(LIST_A_NAME); for (int i = 0; i < count; i ++) { validateAttributeNamespace(reader, i); final String attribute = reader.getAttributeName(i); required.remove(attribute); switch (attribute) { case A_NAME: name = reader.getAttributeValue(i); break; - case A_SLOT: slot = reader.getAttributeValue(i); break; + case A_SLOT: if (noSlots) throw unknownAttribute(reader, i); else slot = reader.getAttributeValue(i); break; case A_VERSION: try { version = Version.parse(reader.getAttributeValue(i)); @@ -526,8 +606,14 @@ private static void parseModuleContents(final MavenResolver mavenResolver, final if (! required.isEmpty()) { throw missingAttributes(reader, required); } - if (! specBuilder.getIdentifier().equals(ModuleIdentifier.create(name, slot))) { - throw invalidModuleName(reader, specBuilder.getIdentifier()); + if (noSlots) { + if (! specBuilder.getName().equals(name)) { + throw invalidModuleName(reader, specBuilder.getName()); + } + } else { + if (! specBuilder.getIdentifier().equals(ModuleIdentifier.create(name, slot))) { + throw invalidModuleName(reader, specBuilder.getIdentifier().toString()); + } } specBuilder.setVersion(version); // xsd:all @@ -560,7 +646,7 @@ private static void parseModuleContents(final MavenResolver mavenResolver, final case E_MAIN_CLASS: parseMainClass(reader, specBuilder); break; case E_RESOURCES: parseResources(mavenResolver, factory, rootPath, reader, specBuilder); break; case E_PROPERTIES: parseProperties(reader, specBuilder); break; - case E_PERMISSIONS: parsePermissions(reader, moduleLoader, moduleIdentifier, specBuilder); gotPerms = true; break; + case E_PERMISSIONS: parsePermissions(reader, moduleLoader, moduleName, specBuilder); gotPerms = true; break; default: throw unexpectedContent(reader); } break; @@ -603,6 +689,7 @@ private static void parseModuleDependency(final XmlPullParser reader, final Arra String slot = null; boolean export = false; boolean optional = false; + boolean noSlots = atLeast1_6(reader); String services = D_NONE; final Set required = new HashSet<>(LIST_A_NAME); final int count = reader.getAttributeCount(); @@ -612,7 +699,7 @@ private static void parseModuleDependency(final XmlPullParser reader, final Arra required.remove(attribute); switch (attribute) { case A_NAME: name = reader.getAttributeValue(i); break; - case A_SLOT: slot = reader.getAttributeValue(i); break; + case A_SLOT: if (noSlots) throw unknownAttribute(reader, i); else slot = reader.getAttributeValue(i); break; case A_EXPORT: export = Boolean.parseBoolean(reader.getAttributeValue(i)); break; case A_OPTIONAL: optional = Boolean.parseBoolean(reader.getAttributeValue(i)); break; case A_SERVICES: { @@ -661,7 +748,11 @@ private static void parseModuleDependency(final XmlPullParser reader, final Arra importBuilder.addFilter(PathFilters.getMetaInfFilter(), false); importFilter = importBuilder.create(); } - dependencies.add(DependencySpec.createModuleDependencySpec(importFilter, exportFilter, null, ModuleIdentifier.create(name, slot), optional)); + if (noSlots) { + dependencies.add(DependencySpec.createModuleDependencySpec(importFilter, exportFilter, null, name, optional)); + } else { + dependencies.add(DependencySpec.createModuleDependencySpec(importFilter, exportFilter, null, ModuleIdentifier.create(name, slot), optional)); + } return; } case START_TAG: { @@ -1099,7 +1190,7 @@ private static void parseProperty(final XmlPullParser reader, final ModuleSpec.B parseNoContent(reader); } - private static void parsePermissions(final XmlPullParser reader, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, final ModuleSpec.Builder specBuilder) throws XmlPullParserException, IOException { + private static void parsePermissions(final XmlPullParser reader, final ModuleLoader moduleLoader, final String moduleName, final ModuleSpec.Builder specBuilder) throws XmlPullParserException, IOException { assertNoAttributes(reader); // xsd:choice ArrayList list = new ArrayList<>(); @@ -1115,7 +1206,7 @@ private static void parsePermissions(final XmlPullParser reader, final ModuleLoa validateNamespace(reader); switch (reader.getName()) { case E_GRANT: { - parseGrant(reader, moduleLoader, moduleIdentifier, list); + parseGrant(reader, moduleLoader, moduleName, list); break; } default: throw unexpectedContent(reader); @@ -1129,7 +1220,7 @@ private static void parsePermissions(final XmlPullParser reader, final ModuleLoa } } - private static void parseGrant(final XmlPullParser reader, final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, final ArrayList list) throws XmlPullParserException, IOException { + private static void parseGrant(final XmlPullParser reader, final ModuleLoader moduleLoader, final String moduleName, final ArrayList list) throws XmlPullParserException, IOException { String permission = null; String name = null; String actions = null; @@ -1149,19 +1240,19 @@ private static void parseGrant(final XmlPullParser reader, final ModuleLoader mo if (! required.isEmpty()) { throw missingAttributes(reader, required); } - expandName(moduleLoader, moduleIdentifier, list, permission, name, actions); + expandName(moduleLoader, moduleName, list, permission, name, actions); // consume remainder of element parseNoContent(reader); } - private static void expandName(final ModuleLoader moduleLoader, final ModuleIdentifier moduleIdentifier, + private static void expandName(final ModuleLoader moduleLoader, final String moduleName, final ArrayList list, String permission, String name, String actions) { String expandedName = PolicyExpander.expand(name); //If a property can't be expanded in a permission entry that entry is ignored. //https://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html#PropertyExp if(expandedName != null) - list.add(new ModularPermissionFactory(moduleLoader, moduleIdentifier, permission, expandedName, actions)); + list.add(new ModularPermissionFactory(moduleLoader, moduleName, permission, expandedName, actions)); } private static void parseNoContent(final XmlPullParser reader) throws XmlPullParserException, IOException { diff --git a/src/main/resources/schema/module-1_6.xsd b/src/main/resources/schema/module-1_6.xsd index f5cff5045..7967e5941 100755 --- a/src/main/resources/schema/module-1_6.xsd +++ b/src/main/resources/schema/module-1_6.xsd @@ -107,20 +107,13 @@ - + The name of this module (required). - - - - The version slot of this module (optional). - - - @@ -130,31 +123,6 @@ - - - - A module name, which consists of one or more dot (.)-separated segments. Each segment must begin and end - with an alphanumeric or underscore (_), and may otherwise contain alphanumerics, underscores, and hyphens - (-). - - - - - - - - - - - A module version slot. A slot may consist of one or more alphanumerics, hyphens (-), underscores (_), - plus signs (+), asterisks (*), or dots (.). - - - - - - - @@ -218,20 +186,13 @@ - + The dependency module name (required). - - - - The dependency module version slot (optional). - - - @@ -526,34 +487,20 @@ A module alias type, which defines the target for a module alias. - + The name of this module alias (required). - - - - The version slot of this module alias (optional). - - - - + The name of the module to which this alias refers (required). - - - - The version slot of the module to which this alias refers (optional). - - - @@ -562,20 +509,13 @@ An explicitly absent module. - + The name of the absent module (required). - - - - The version slot of the absent module (optional). - - - diff --git a/src/test/java/org/jboss/modules/AbstractModuleTestCase.java b/src/test/java/org/jboss/modules/AbstractModuleTestCase.java index 940a76e4e..6db601749 100644 --- a/src/test/java/org/jboss/modules/AbstractModuleTestCase.java +++ b/src/test/java/org/jboss/modules/AbstractModuleTestCase.java @@ -36,7 +36,6 @@ * @author John Bailey */ public class AbstractModuleTestCase { - protected static final ModuleIdentifier MODULE_ID = ModuleIdentifier.fromString("test.test"); @BeforeClass public static void initUrlHandler() { diff --git a/src/test/java/org/jboss/modules/InstantiatePrivateAccessTest.java b/src/test/java/org/jboss/modules/InstantiatePrivateAccessTest.java index 080b7901c..a3553f47f 100644 --- a/src/test/java/org/jboss/modules/InstantiatePrivateAccessTest.java +++ b/src/test/java/org/jboss/modules/InstantiatePrivateAccessTest.java @@ -42,21 +42,20 @@ public void ensureFailure() { @Test public void ensureModularPermissionFactory() { - final ModuleIdentifier test = ModuleIdentifier.create("test"); final ModuleLoader moduleLoader = new ModuleLoader(new ModuleFinder[]{ new ModuleFinder() { - public ModuleSpec findModule(final ModuleIdentifier identifier, final ModuleLoader delegateLoader) throws ModuleLoadException { - if (identifier.equals(test)) { + public ModuleSpec findModule(final String name, final ModuleLoader delegateLoader) throws ModuleLoadException { + if (name.equals("test")) { final Permissions perms = new Permissions(); perms.add(new AllPermission()); - return ModuleSpec.build(test).setPermissionCollection(perms).create(); + return ModuleSpec.build("test").setPermissionCollection(perms).create(); } else { return null; } } } }); - final ModularPermissionFactory factory = new ModularPermissionFactory(moduleLoader, test, RuntimePermission.class.getName(), "foo", "*"); + final ModularPermissionFactory factory = new ModularPermissionFactory(moduleLoader, "test", RuntimePermission.class.getName(), "foo", "*"); assertEquals(new RuntimePermission("foo", "*"), factory.construct()); } } diff --git a/src/test/java/org/jboss/modules/LocalModuleLoaderTest.java b/src/test/java/org/jboss/modules/LocalModuleLoaderTest.java index 250856d10..83d43887e 100644 --- a/src/test/java/org/jboss/modules/LocalModuleLoaderTest.java +++ b/src/test/java/org/jboss/modules/LocalModuleLoaderTest.java @@ -42,7 +42,7 @@ public void setupModuleLoader() throws Exception { @Test public void testBasicLoad() throws Exception { - Module module = moduleLoader.loadModule(MODULE_ID); + Module module = moduleLoader.loadModule("test.test"); assertNotNull(module); } diff --git a/src/test/java/org/jboss/modules/ModuleExportTest.java b/src/test/java/org/jboss/modules/ModuleExportTest.java index 4e83197c5..a833ac56e 100644 --- a/src/test/java/org/jboss/modules/ModuleExportTest.java +++ b/src/test/java/org/jboss/modules/ModuleExportTest.java @@ -98,7 +98,7 @@ private static void getExportedModuleDeps(final Module module, final Set for (Dependency dependency : module.getDependenciesInternal()) { if (dependency instanceof ModuleDependency && dependency.getExportFilter() != PathFilters.rejectAll()) { final ModuleDependency moduleDependency = (ModuleDependency) dependency; - final Module md = moduleDependency.getModuleLoader().loadModule(moduleDependency.getIdentifier()); + final Module md = moduleDependency.getModuleLoader().loadModule(moduleDependency.getName()); if (md != null && moduleDependency.getExportFilter() != PathFilters.rejectAll()) { if (visited.add(md)) { dependencyExports.add(md.getIdentifier()); diff --git a/src/test/java/org/jboss/modules/ModuleIdentifierTest.java b/src/test/java/org/jboss/modules/ModuleIdentifierTest.java index 9239244e0..9ab583f17 100644 --- a/src/test/java/org/jboss/modules/ModuleIdentifierTest.java +++ b/src/test/java/org/jboss/modules/ModuleIdentifierTest.java @@ -42,7 +42,7 @@ public void testFromString() throws Exception { @Test public void testToString() { ModuleIdentifier identifier = ModuleIdentifier.fromString("test.module"); - assertEquals("test.module:main", identifier.toString()); + assertEquals("test.module", identifier.toString()); identifier = ModuleIdentifier.fromString("test.module:old"); assertEquals("test.module:old", identifier.toString()); diff --git a/src/test/java/org/jboss/modules/ModuleIteratorTest.java b/src/test/java/org/jboss/modules/ModuleIteratorTest.java index ca938e014..4188ebf6b 100644 --- a/src/test/java/org/jboss/modules/ModuleIteratorTest.java +++ b/src/test/java/org/jboss/modules/ModuleIteratorTest.java @@ -95,10 +95,10 @@ public void remove() { } @Override - public ModuleSpec findModule(ModuleIdentifier identifier, ModuleLoader delegateLoader) + public ModuleSpec findModule(String name, ModuleLoader delegateLoader) throws ModuleLoadException { for (ModuleIdentifier m : modules) { - if (m.equals(identifier)) { + if (m.equals(name)) { return ModuleSpec.build(m).create(); } } @@ -108,7 +108,7 @@ public ModuleSpec findModule(ModuleIdentifier identifier, ModuleLoader delegateL ModuleLoader loader = new ModuleLoader(new ModuleFinder[]{fakeFinder}); - Iterator it = loader.iterateModules(null, true); + Iterator it = loader.iterateModules((ModuleIdentifier) null, true); int count = 0; while (it.hasNext()) { it.next(); diff --git a/src/test/java/org/jboss/modules/ModulePropertyTest.java b/src/test/java/org/jboss/modules/ModulePropertyTest.java index ea151c17d..695fe9c24 100644 --- a/src/test/java/org/jboss/modules/ModulePropertyTest.java +++ b/src/test/java/org/jboss/modules/ModulePropertyTest.java @@ -41,7 +41,7 @@ public void setupModuleLoader() throws Exception { @Test public void testBasic() throws Exception { - Module module = moduleLoader.loadModule(MODULE_ID); + Module module = moduleLoader.loadModule("test.test"); assertNull(module.getProperty("non-existent")); assertEquals("blah", module.getProperty("non-existent", "blah")); assertEquals("true", module.getProperty("test.prop.1")); diff --git a/src/test/java/org/jboss/modules/ResourceRootPathsTest.java b/src/test/java/org/jboss/modules/ResourceRootPathsTest.java index 34b9c5de7..90493667d 100644 --- a/src/test/java/org/jboss/modules/ResourceRootPathsTest.java +++ b/src/test/java/org/jboss/modules/ResourceRootPathsTest.java @@ -91,7 +91,7 @@ public void setupModuleLoader() throws Exception { @Test public void testPaths() throws Exception { - ConcreteModuleSpec moduleSpec = (ConcreteModuleSpec) moduleLoader.findModule(MODULE_ID); + ConcreteModuleSpec moduleSpec = (ConcreteModuleSpec) moduleLoader.findModule("test.test"); ResourceLoaderSpec[] resourceLoaders = moduleSpec.getResourceLoaders(); int checkCount = 0; for (ResourceLoaderSpec r : resourceLoaders) { diff --git a/src/test/java/org/jboss/modules/util/ModulesTestBase.java b/src/test/java/org/jboss/modules/util/ModulesTestBase.java index 0987b6e00..18f32c733 100644 --- a/src/test/java/org/jboss/modules/util/ModulesTestBase.java +++ b/src/test/java/org/jboss/modules/util/ModulesTestBase.java @@ -129,19 +129,19 @@ protected URL getResource(ModuleIdentifier identifier, String resourcePath) thro static class ModuleLoaderSupport extends ModuleLoader { private String loaderName; - private Map modules = new HashMap(); + private Map modules = new HashMap<>(); ModuleLoaderSupport(String loaderName) { this.loaderName = loaderName; } void addModuleSpec(ModuleSpec moduleSpec) { - modules.put(moduleSpec.getModuleIdentifier(), moduleSpec); + modules.put(moduleSpec.getName(), moduleSpec); } @Override - protected ModuleSpec findModule(ModuleIdentifier identifier) throws ModuleLoadException { - ModuleSpec moduleSpec = modules.get(identifier); + protected ModuleSpec findModule(String name) throws ModuleLoadException { + ModuleSpec moduleSpec = modules.get(name); return moduleSpec; } diff --git a/src/test/java/org/jboss/modules/util/TestModuleLoader.java b/src/test/java/org/jboss/modules/util/TestModuleLoader.java index 59f004154..06348ea0a 100644 --- a/src/test/java/org/jboss/modules/util/TestModuleLoader.java +++ b/src/test/java/org/jboss/modules/util/TestModuleLoader.java @@ -19,7 +19,6 @@ package org.jboss.modules.util; import org.jboss.modules.Module; -import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoadException; import org.jboss.modules.ModuleLoader; import org.jboss.modules.ModuleSpec; @@ -35,21 +34,21 @@ */ public class TestModuleLoader extends ModuleLoader { - private final Map moduleSpecs = new HashMap(); + private final Map moduleSpecs = new HashMap<>(); - protected Module preloadModule(final ModuleIdentifier identifier) throws ModuleLoadException { - return super.preloadModule(identifier); + protected Module preloadModule(final String name) throws ModuleLoadException { + return super.preloadModule(name); } @Override - protected ModuleSpec findModule(ModuleIdentifier moduleIdentifier) throws ModuleLoadException { - final ModuleSpec moduleSpec = moduleSpecs.get(moduleIdentifier); - if(moduleSpec == null) throw new ModuleLoadException("No module spec found for module " + moduleIdentifier); + protected ModuleSpec findModule(String name) throws ModuleLoadException { + final ModuleSpec moduleSpec = moduleSpecs.get(name); + if(moduleSpec == null) throw new ModuleLoadException("No module spec found for module " + name); return moduleSpec; } public void addModuleSpec(final ModuleSpec moduleSpec) { - moduleSpecs.put(moduleSpec.getModuleIdentifier(), moduleSpec); + moduleSpecs.put(moduleSpec.getName(), moduleSpec); } public String toString() {