Search in sources :

Example 6 with FileUtils

use of org.apache.openejb.loader.FileUtils in project tomee by apache.

the class DeploymentLoader method createAppModule.

protected AppModule createAppModule(final File jarFile, final String jarPath) throws OpenEJBException {
    File appDir = unpack(jarFile);
    try {
        appDir = appDir.getCanonicalFile();
    } catch (final IOException e) {
        throw new OpenEJBException("Invalid application directory " + appDir.getAbsolutePath());
    }
    final URL appUrl = getFileUrl(appDir);
    final String appId = appDir.getAbsolutePath();
    final ClassLoader tmpClassLoader = ClassLoaderUtil.createTempClassLoader(appId, new URL[] { appUrl }, getOpenEJBClassLoader());
    final ResourceFinder finder = new ResourceFinder("", tmpClassLoader, appUrl);
    final Map<String, URL> appDescriptors = getDescriptors(finder);
    try {
        // 
        // Find all the modules using either the application xml or by searching for all .jar, .war and .rar files.
        // 
        final Map<String, URL> ejbModules = new LinkedHashMap<>();
        final Map<String, URL> clientModules = new LinkedHashMap<>();
        final Map<String, URL> resouceModules = new LinkedHashMap<>();
        final Map<String, URL> webModules = new LinkedHashMap<>();
        final Map<String, String> webContextRoots = new LinkedHashMap<>();
        final URL applicationXmlUrl = appDescriptors.get("application.xml");
        final List<URL> extraLibs = new ArrayList<>();
        final Application application;
        if (applicationXmlUrl != null) {
            application = unmarshal(applicationXmlUrl);
            for (final Module module : application.getModule()) {
                try {
                    if (module.getEjb() != null) {
                        final URL url = finder.find(module.getEjb().trim());
                        ejbModules.put(module.getEjb(), url);
                    } else if (module.getJava() != null) {
                        final URL url = finder.find(module.getJava().trim());
                        clientModules.put(module.getJava(), url);
                        extraLibs.add(url);
                    } else if (module.getConnector() != null) {
                        final URL url = finder.find(module.getConnector().trim());
                        resouceModules.put(module.getConnector(), url);
                    } else if (module.getWeb() != null) {
                        final URL url = finder.find(module.getWeb().getWebUri().trim());
                        webModules.put(module.getWeb().getWebUri(), url);
                        webContextRoots.put(module.getWeb().getWebUri(), module.getWeb().getContextRoot());
                    }
                } catch (final IOException e) {
                    throw new OpenEJBException("Invalid path to module " + e.getMessage(), e);
                }
            }
        } else {
            application = new Application();
            final HashMap<String, URL> files = new HashMap<>();
            scanDir(appDir, files, "", false);
            files.remove("META-INF/MANIFEST.MF");
            // todo we should also filter URLs here using DeploymentsResolver.loadFromClasspath
            createApplicationFromFiles(appId, tmpClassLoader, ejbModules, clientModules, resouceModules, webModules, files);
        }
        final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(new File(appDir, "META-INF/" + QuickJarsTxtParser.FILE_NAME));
        final Collection<URL> jarsXmlLib = new ArrayList<>();
        if (configurer != null) {
            for (final URL url : configurer.additionalURLs()) {
                try {
                    detectAndAddModuleToApplication(appId, tmpClassLoader, ejbModules, clientModules, resouceModules, webModules, new ImmutablePair<>(URLs.toFile(url).getAbsolutePath(), url));
                } catch (final Exception e) {
                    jarsXmlLib.add(url);
                }
            }
        }
        // lib/*
        if (application.getLibraryDirectory() == null) {
            application.setLibraryDirectory("lib/");
        } else {
            final String dir = application.getLibraryDirectory();
            if (!dir.endsWith("/")) {
                application.setLibraryDirectory(dir + "/");
            }
        }
        try {
            final Map<String, URL> libs = finder.getResourcesMap(application.getLibraryDirectory());
            extraLibs.addAll(libs.values());
        } catch (final IOException e) {
            LOGGER.warning("Cannot load libs from '" + application.getLibraryDirectory() + "' : " + e.getMessage(), e);
        }
        // APP-INF/lib/*
        try {
            final Map<String, URL> libs = finder.getResourcesMap("APP-INF/lib/");
            extraLibs.addAll(libs.values());
        } catch (final IOException e) {
            LOGGER.warning("Cannot load libs from 'APP-INF/lib/' : " + e.getMessage(), e);
        }
        // META-INF/lib/*
        try {
            final Map<String, URL> libs = finder.getResourcesMap("META-INF/lib/");
            extraLibs.addAll(libs.values());
        } catch (final IOException e) {
            LOGGER.warning("Cannot load libs from 'META-INF/lib/' : " + e.getMessage(), e);
        }
        // All jars nested in the Resource Adapter
        final HashMap<String, URL> rarLibs = new HashMap<>();
        for (final Map.Entry<String, URL> entry : resouceModules.entrySet()) {
            try {
                // unpack the resource adapter archive
                File rarFile = URLs.toFile(entry.getValue());
                rarFile = unpack(rarFile);
                entry.setValue(rarFile.toURI().toURL());
                scanDir(appDir, rarLibs, "");
            } catch (final MalformedURLException e) {
                throw new OpenEJBException("Malformed URL to app. " + e.getMessage(), e);
            }
        }
        for (final Iterator<Map.Entry<String, URL>> iterator = rarLibs.entrySet().iterator(); iterator.hasNext(); ) {
            // remove all non jars from the rarLibs
            final Map.Entry<String, URL> fileEntry = iterator.next();
            if (!fileEntry.getKey().endsWith(".jar")) {
                continue;
            }
            iterator.remove();
        }
        final List<URL> classPath = new ArrayList<>();
        classPath.addAll(ejbModules.values());
        classPath.addAll(clientModules.values());
        classPath.addAll(rarLibs.values());
        classPath.addAll(extraLibs);
        classPath.addAll(jarsXmlLib);
        final URL[] urls = classPath.toArray(new URL[classPath.size()]);
        SystemInstance.get().fireEvent(new BeforeDeploymentEvent(urls));
        final ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(appId, urls, getOpenEJBClassLoader());
        // 
        // Create the AppModule and all nested module objects
        // 
        final AppModule appModule = new AppModule(appClassLoader, appId, application, false);
        appModule.getAdditionalLibraries().addAll(extraLibs);
        appModule.getAltDDs().putAll(appDescriptors);
        appModule.getWatchedResources().add(appId);
        if (applicationXmlUrl != null) {
            appModule.getWatchedResources().add(URLs.toFilePath(applicationXmlUrl));
        }
        if (appDescriptors.containsKey(RESOURCES_XML)) {
            final Map<String, Object> altDd = new HashMap<>(appDescriptors);
            ReadDescriptors.readResourcesXml(new org.apache.openejb.config.Module(false) {

                @Override
                public Map<String, Object> getAltDDs() {
                    return altDd;
                }

                @Override
                public void initResources(final Resources resources) {
                    appModule.getContainers().addAll(resources.getContainer());
                    appModule.getResources().addAll(resources.getResource());
                    appModule.getServices().addAll(resources.getService());
                }
            });
        }
        // EJB modules
        for (final Map.Entry<String, URL> stringURLEntry : ejbModules.entrySet()) {
            try {
                URL ejbUrl = stringURLEntry.getValue();
                // we should try to use a reference to the temp classloader
                if (ClassLoaderUtil.isUrlCached(appModule.getJarLocation(), ejbUrl)) {
                    try {
                        ejbUrl = ClassLoaderUtil.getUrlCachedName(appModule.getJarLocation(), ejbUrl).toURI().toURL();
                    } catch (final MalformedURLException ignore) {
                    // no-op
                    }
                }
                final File ejbFile = URLs.toFile(ejbUrl);
                final String absolutePath = ejbFile.getAbsolutePath();
                final EjbModule ejbModule = createEjbModule(ejbUrl, absolutePath, appClassLoader);
                appModule.getEjbModules().add(ejbModule);
            } catch (final OpenEJBException e) {
                LOGGER.error("Unable to load EJBs from EAR: " + appId + ", module: " + stringURLEntry.getKey() + ". Exception: " + e.getMessage(), e);
            }
        }
        // Application Client Modules
        for (final Map.Entry<String, URL> stringURLEntry : clientModules.entrySet()) {
            try {
                URL clientUrl = stringURLEntry.getValue();
                // we should try to use a reference to the temp classloader
                if (ClassLoaderUtil.isUrlCached(appModule.getJarLocation(), clientUrl)) {
                    try {
                        clientUrl = ClassLoaderUtil.getUrlCachedName(appModule.getJarLocation(), clientUrl).toURI().toURL();
                    } catch (final MalformedURLException ignore) {
                    // no-op
                    }
                }
                final File clientFile = URLs.toFile(clientUrl);
                final String absolutePath = clientFile.getAbsolutePath();
                final ClientModule clientModule = createClientModule(clientUrl, absolutePath, appClassLoader, null);
                appModule.getClientModules().add(clientModule);
            } catch (final Exception e) {
                LOGGER.error("Unable to load App Client from EAR: " + appId + ", module: " + stringURLEntry.getKey() + ". Exception: " + e.getMessage(), e);
            }
        }
        // Resource modules
        for (final Map.Entry<String, URL> stringURLEntry : resouceModules.entrySet()) {
            try {
                URL rarUrl = stringURLEntry.getValue();
                // we should try to use a reference to the temp classloader
                if (ClassLoaderUtil.isUrlCached(appModule.getJarLocation(), rarUrl)) {
                    try {
                        rarUrl = ClassLoaderUtil.getUrlCachedName(appModule.getJarLocation(), rarUrl).toURI().toURL();
                    } catch (final MalformedURLException ignore) {
                    // no-op
                    }
                }
                final ConnectorModule connectorModule = createConnectorModule(appId, URLs.toFilePath(rarUrl), appClassLoader, stringURLEntry.getKey());
                if (connectorModule != null) {
                    appModule.getConnectorModules().add(connectorModule);
                }
            } catch (final OpenEJBException e) {
                LOGGER.error("Unable to load RAR: " + appId + ", module: " + stringURLEntry.getKey() + ". Exception: " + e.getMessage(), e);
            }
        }
        // Web modules
        for (final Map.Entry<String, URL> stringURLEntry : webModules.entrySet()) {
            try {
                final URL warUrl = stringURLEntry.getValue();
                addWebModule(appModule, warUrl, appClassLoader, webContextRoots.get(stringURLEntry.getKey()), null);
            } catch (final OpenEJBException e) {
                LOGGER.error("Unable to load WAR: " + appId + ", module: " + stringURLEntry.getKey() + ". Exception: " + e.getMessage(), e);
            }
        }
        addBeansXmls(appModule);
        // Persistence Units
        final Properties p = new Properties();
        p.put(appModule.getModuleId(), appModule.getJarLocation());
        final FileUtils base = new FileUtils(appModule.getModuleId(), appModule.getModuleId(), p);
        final List<URL> filteredUrls = new ArrayList<>();
        DeploymentsResolver.loadFromClasspath(base, filteredUrls, appModule.getClassLoader());
        addPersistenceUnits(appModule, filteredUrls.toArray(new URL[filteredUrls.size()]));
        final Object pXmls = appModule.getAltDDs().get("persistence.xml");
        for (final WebModule webModule : appModule.getWebModules()) {
            final List<URL> foundRootUrls = new ArrayList<>();
            final List<URL> scannableUrls = webModule.getScannableUrls();
            for (final URL url : scannableUrls) {
                if (!addPersistenceUnits(appModule, url).isEmpty()) {
                    foundRootUrls.add(url);
                }
            }
            if (pXmls != null && Collection.class.isInstance(pXmls)) {
                final File webapp = webModule.getFile();
                if (webapp == null) {
                    continue;
                }
                final String webappAbsolutePath = webapp.getAbsolutePath();
                final Collection<URL> list = Collection.class.cast(pXmls);
                for (final URL url : list) {
                    try {
                        final File file = URLs.toFile(url);
                        if (file.getAbsolutePath().startsWith(webappAbsolutePath)) {
                            foundRootUrls.add(url);
                        }
                    } catch (final IllegalArgumentException iae) {
                    // no-op
                    }
                }
            }
            webModule.getAltDDs().put(EAR_WEBAPP_PERSISTENCE_XML_JARS, foundRootUrls);
        }
        for (final DeploymentModule module : appModule.getDeploymentModule()) {
            module.setStandaloneModule(false);
        }
        return appModule;
    } catch (final OpenEJBException e) {
        LOGGER.error("Unable to load EAR: " + jarPath, e);
        throw e;
    }
}
Also used : OpenEJBException(org.apache.openejb.OpenEJBException) MalformedURLException(java.net.MalformedURLException) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) FileUtils(org.apache.openejb.loader.FileUtils) ArrayList(java.util.ArrayList) ClassLoaderConfigurer(org.apache.openejb.classloader.ClassLoaderConfigurer) Properties(java.util.Properties) URL(java.net.URL) LinkedHashMap(java.util.LinkedHashMap) ZipEntry(java.util.zip.ZipEntry) JarEntry(java.util.jar.JarEntry) URLClassLoader(java.net.URLClassLoader) EmptyResourcesClassLoader(org.apache.openejb.core.EmptyResourcesClassLoader) BeforeDeploymentEvent(org.apache.openejb.config.event.BeforeDeploymentEvent) ResourceFinder(org.apache.xbean.finder.ResourceFinder) IOException(java.io.IOException) OpenEJBException(org.apache.openejb.OpenEJBException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) Collection(java.util.Collection) Resources(org.apache.openejb.config.sys.Resources) Module(org.apache.openejb.jee.Module) JarFile(java.util.jar.JarFile) File(java.io.File) Application(org.apache.openejb.jee.Application) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) TreeMap(java.util.TreeMap)

Example 7 with FileUtils

use of org.apache.openejb.loader.FileUtils in project tomee by apache.

the class ConfigurationFactory method resolveClasspath.

/**
 * Takes a raw unparsed string expected to be in jvm classpath syntax
 * and parses it, producing a collection of URIs representing the absolute
 * file paths of the classpath to be created.
 *
 * OS specific delimiters are supported.
 *
 * @param rawstring unparsed string in "classpath" syntax
 * @return URI array
 * @throws IOException if path cannot be resolved or file referenced does not exist
 */
public static URI[] resolveClasspath(final String rawstring) throws IOException {
    final FileUtils base = SystemInstance.get().getBase();
    final String[] strings = rawstring.contains("mvn:") ? rawstring.split(";") : rawstring.split(File.pathSeparator);
    final Collection<URI> classpath = new LinkedList<>();
    for (final String string : strings) {
        final Set<String> locations = ProvisioningUtil.realLocation(PropertyPlaceHolderHelper.simpleValue(string));
        for (final String location : locations) {
            final File file = base.getFile(location, false);
            classpath.add(file.toURI());
        }
    }
    return classpath.toArray(new URI[classpath.size()]);
}
Also used : FileUtils(org.apache.openejb.loader.FileUtils) URI(java.net.URI) File(java.io.File) LinkedList(java.util.LinkedList)

Example 8 with FileUtils

use of org.apache.openejb.loader.FileUtils in project tomee by apache.

the class ConfigurationFactory method getDeclaredApps.

private List<File> getDeclaredApps() {
    // make a copy of the list because we update it
    final List<Deployments> deployments = new ArrayList<>();
    if (openejb != null) {
        deployments.addAll(openejb.getDeployments());
    }
    Collection<Deployments> additionalDeploymentsList = Collections.emptyList();
    try {
        final File additionalDeploymentFile = SystemInstance.get().getBase().getFile(ADDITIONAL_DEPLOYMENTS, false);
        if (additionalDeploymentFile.exists()) {
            InputStream fis = null;
            try {
                fis = IO.read(additionalDeploymentFile);
                final AdditionalDeployments additionalDeployments = JaxbOpenejb.unmarshal(AdditionalDeployments.class, fis);
                additionalDeploymentsList = additionalDeployments.getDeployments();
            } catch (final Exception e) {
                logger.error("can't read " + ADDITIONAL_DEPLOYMENTS, e);
            } finally {
                IO.close(fis);
            }
        }
    } catch (final Exception e) {
        logger.info("No additional deployments found: " + e);
    }
    // resolve jar locations //////////////////////////////////////  BEGIN  ///////
    final FileUtils base = SystemInstance.get().getBase();
    final List<Deployments> autoDeploy = new ArrayList<>();
    final List<File> declaredAppsUrls = new ArrayList<>();
    for (final Deployments deployment : deployments) {
        try {
            DeploymentsResolver.loadFrom(deployment, base, declaredAppsUrls);
            if (deployment.isAutoDeploy()) {
                autoDeploy.add(deployment);
            }
        } catch (final SecurityException se) {
            logger.warning("Security check failed on deployment: " + deployment.getFile(), se);
        }
    }
    for (final Deployments additionalDep : additionalDeploymentsList) {
        if (additionalDep.getFile() != null) {
            declaredAppsUrls.add(Files.path(base.getDirectory().getAbsoluteFile(), additionalDep.getFile()));
        } else if (additionalDep.getDir() != null) {
            declaredAppsUrls.add(Files.path(base.getDirectory().getAbsoluteFile(), additionalDep.getDir()));
        }
        if (additionalDep.isAutoDeploy()) {
            autoDeploy.add(additionalDep);
        }
    }
    if (autoDeploy.size() > 0) {
        final AutoDeployer autoDeployer = new AutoDeployer(this, autoDeploy);
        SystemInstance.get().setComponent(AutoDeployer.class, autoDeployer);
        SystemInstance.get().addObserver(autoDeployer);
    }
    return declaredAppsUrls;
}
Also used : FileUtils(org.apache.openejb.loader.FileUtils) InputStream(java.io.InputStream) AdditionalDeployments(org.apache.openejb.config.sys.AdditionalDeployments) Deployments(org.apache.openejb.config.sys.Deployments) ArrayList(java.util.ArrayList) AdditionalDeployments(org.apache.openejb.config.sys.AdditionalDeployments) File(java.io.File) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) OpenEJBException(org.apache.openejb.OpenEJBException) MalformedURLException(java.net.MalformedURLException)

Aggregations

File (java.io.File)8 FileUtils (org.apache.openejb.loader.FileUtils)8 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 Map (java.util.Map)3 Properties (java.util.Properties)3 MalformedURLException (java.net.MalformedURLException)2 JarFile (java.util.jar.JarFile)2 OpenEJBException (org.apache.openejb.OpenEJBException)2 FilenameFilter (java.io.FilenameFilter)1 InputStream (java.io.InputStream)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 URL (java.net.URL)1 URLClassLoader (java.net.URLClassLoader)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 LinkedList (java.util.LinkedList)1