Search in sources :

Example 1 with DEPENDENCIES

use of org.jboss.modules.Utils.DEPENDENCIES in project jboss-modules by jboss-modules.

the class JarModuleFinder method findModule.

public ModuleSpec findModule(final String name, final ModuleLoader delegateLoader) throws ModuleLoadException {
    if (name.equals(myName)) {
        // special root JAR module
        Manifest manifest;
        try {
            manifest = jarFile.getManifest();
        } catch (IOException e) {
            throw new ModuleLoadException("Failed to load MANIFEST from JAR", e);
        }
        ModuleSpec.Builder builder = ModuleSpec.build(name);
        Attributes mainAttributes = manifest.getMainAttributes();
        String mainClass = mainAttributes.getValue(Attributes.Name.MAIN_CLASS);
        if (mainClass != null) {
            builder.setMainClass(mainClass);
        }
        String classPath = mainAttributes.getValue(Attributes.Name.CLASS_PATH);
        String dependencies = mainAttributes.getValue(DEPENDENCIES);
        MultiplePathFilterBuilder pathFilterBuilder = PathFilters.multiplePathFilterBuilder(true);
        pathFilterBuilder.addFilter(PathFilters.is(MODULES_DIR), false);
        pathFilterBuilder.addFilter(PathFilters.isChildOf(MODULES_DIR), false);
        builder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec(new JarFileResourceLoader("", jarFile), pathFilterBuilder.create()));
        String[] classPathEntries = classPath == null ? Utils.NO_STRINGS : classPath.split("\\s+");
        for (String entry : classPathEntries) {
            if (!entry.isEmpty()) {
                if (entry.startsWith("../") || entry.startsWith("./") || entry.startsWith("/") || entry.contains("/../")) {
                    // invalid
                    continue;
                }
                File root;
                try {
                    File path = new File(new URI(entry));
                    if (path.isAbsolute()) {
                        root = path;
                    } else {
                        root = new File(jarFile.getName(), path.getPath());
                    }
                } catch (URISyntaxException e) {
                    // invalid, will probably fail anyway
                    root = new File(jarFile.getName(), entry);
                }
                if (entry.endsWith("/")) {
                    // directory reference
                    builder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec(new PathResourceLoader(entry, root.toPath(), context)));
                } else {
                    // assume a JAR
                    JarFile childJarFile;
                    try {
                        childJarFile = JDKSpecific.getJarFile(root, true);
                    } catch (IOException e) {
                        // ignore and continue
                        continue;
                    }
                    builder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec(new JarFileResourceLoader(entry, childJarFile)));
                }
            }
        }
        String[] dependencyEntries = dependencies == null ? Utils.NO_STRINGS : dependencies.split("\\s*,\\s*");
        for (String dependencyEntry : dependencyEntries) {
            boolean optional = false;
            boolean export = false;
            dependencyEntry = dependencyEntry.trim();
            if (!dependencyEntry.isEmpty()) {
                String[] fields = dependencyEntry.split("\\s+");
                if (fields.length < 1) {
                    continue;
                }
                String moduleName = fields[0];
                for (int i = 1; i < fields.length; i++) {
                    String field = fields[i];
                    if (field.equals(OPTIONAL)) {
                        optional = true;
                    } else if (field.equals(EXPORT)) {
                        export = true;
                    }
                // else ignored
                }
                builder.addDependency(new ModuleDependencySpecBuilder().setName(moduleName).setExport(export).setOptional(optional).build());
            }
        }
        builder.addDependency(DependencySpec.createSystemDependencySpec(JDKPaths.JDK));
        builder.addDependency(DependencySpec.createLocalDependencySpec());
        return builder.create();
    } else {
        final String path = PathUtils.basicModuleNameToPath(name);
        if (path == null) {
            // not valid, so not found
            return null;
        }
        String basePath = MODULES_DIR + "/" + path;
        JarEntry moduleXmlEntry = jarFile.getJarEntry(basePath + "/" + MODULE_FILE);
        if (moduleXmlEntry == null) {
            return null;
        }
        ModuleSpec moduleSpec;
        try {
            try (final InputStream inputStream = jarFile.getInputStream(moduleXmlEntry)) {
                moduleSpec = ModuleXmlParser.parseModuleXml((rootPath, loaderPath, loaderName) -> new JarFileResourceLoader(loaderName, jarFile, loaderPath), basePath, inputStream, moduleXmlEntry.getName(), delegateLoader, name);
            }
        } catch (IOException e) {
            throw new ModuleLoadException("Failed to read " + MODULE_FILE + " file", e);
        }
        return moduleSpec;
    }
}
Also used : AccessControlContext(java.security.AccessControlContext) Manifest(java.util.jar.Manifest) URISyntaxException(java.net.URISyntaxException) MODULE_FILE(org.jboss.modules.Utils.MODULE_FILE) IOException(java.io.IOException) JarFile(java.util.jar.JarFile) MultiplePathFilterBuilder(org.jboss.modules.filter.MultiplePathFilterBuilder) Attributes(java.util.jar.Attributes) File(java.io.File) DEPENDENCIES(org.jboss.modules.Utils.DEPENDENCIES) PathFilters(org.jboss.modules.filter.PathFilters) JarEntry(java.util.jar.JarEntry) MODULES_DIR(org.jboss.modules.Utils.MODULES_DIR) ModuleXmlParser(org.jboss.modules.xml.ModuleXmlParser) URI(java.net.URI) AccessController(java.security.AccessController) InputStream(java.io.InputStream) EXPORT(org.jboss.modules.Utils.EXPORT) OPTIONAL(org.jboss.modules.Utils.OPTIONAL) InputStream(java.io.InputStream) Attributes(java.util.jar.Attributes) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) Manifest(java.util.jar.Manifest) JarFile(java.util.jar.JarFile) JarEntry(java.util.jar.JarEntry) URI(java.net.URI) MultiplePathFilterBuilder(org.jboss.modules.filter.MultiplePathFilterBuilder) JarFile(java.util.jar.JarFile) File(java.io.File)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 AccessControlContext (java.security.AccessControlContext)1 AccessController (java.security.AccessController)1 Attributes (java.util.jar.Attributes)1 JarEntry (java.util.jar.JarEntry)1 JarFile (java.util.jar.JarFile)1 Manifest (java.util.jar.Manifest)1 DEPENDENCIES (org.jboss.modules.Utils.DEPENDENCIES)1 EXPORT (org.jboss.modules.Utils.EXPORT)1 MODULES_DIR (org.jboss.modules.Utils.MODULES_DIR)1 MODULE_FILE (org.jboss.modules.Utils.MODULE_FILE)1 OPTIONAL (org.jboss.modules.Utils.OPTIONAL)1 MultiplePathFilterBuilder (org.jboss.modules.filter.MultiplePathFilterBuilder)1 PathFilters (org.jboss.modules.filter.PathFilters)1 ModuleXmlParser (org.jboss.modules.xml.ModuleXmlParser)1