All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.enterprise.module.single.ProxyModuleDefinition Maven / Gradle / Ivy

There is a newer version: 1.6.9
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2007-2011 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */
package com.sun.enterprise.module.single;

import com.sun.enterprise.module.ModuleDefinition;
import com.sun.enterprise.module.ModuleMetadata;
import com.sun.enterprise.module.ModuleDependency;
import com.sun.enterprise.module.common_impl.ByteArrayInhabitantsDescriptor;
import com.sun.hk2.component.InhabitantsFile;

import java.net.*;
import java.util.*;
import java.util.jar.Manifest;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Creates a ModuleDefinition backed up by a a single classloader.
 * 
 * 

* The implementation does not cache any data - everything is recalculated * for each call. Callers are therefore encouraged to either supply their * own caching, or minimize the calls to methods of this class. * * @author Jerome Dochez */ public class ProxyModuleDefinition implements ModuleDefinition { // consider using SoftCache before bringing these back as members! // // private static final List uris = new ArrayList(); // // static { // // It is impossible to change java.class.path after the JVM starts -- // // so cache away a copy... // // String cp = System.getProperty("java.class.path"); // if (ok(cp)) { // String[] paths = cp.split(System.getProperty("path.separator")); // if (ok(paths)) { // for (int i = 0; i < paths.length; i++) { // uris.add(new File(paths[i]).toURI()); // } // } // } // } // // private final ModuleMetadata metadata = new ModuleMetadata(); // private final Manifest manifest; private final ClassLoader classLoader; private final List mappings; public ProxyModuleDefinition(ClassLoader classLoader) throws IOException { this(classLoader, null); } public ProxyModuleDefinition(ClassLoader classLoader, List mappings) throws IOException { this.classLoader = classLoader; this.mappings = mappings; } private static byte[] readFully(URL url) throws IOException { DataInputStream dis = null; try { URLConnection con = url.openConnection(); int len = con.getContentLength(); InputStream in = con.getInputStream(); dis = new DataInputStream(in); byte[] bytes = new byte[len]; dis.readFully(bytes); return bytes; } catch (IOException e) { IOException x = new IOException("Failed to read " + url); x.initCause(e); throw x; } finally { if (dis != null) { dis.close(); } } } public String getName() { return "Static Module"; } public String[] getPublicInterfaces() { return new String[0]; } public ModuleDependency[] getDependencies() { return new ModuleDependency[0]; } public URI[] getLocations() { List uris = new ArrayList(); if (classLoader instanceof URLClassLoader) { URLClassLoader urlCL = (URLClassLoader) classLoader; for (URL url : urlCL.getURLs()) { try { uris.add(url.toURI()); } catch (URISyntaxException e) { Logger.getAnonymousLogger().log(Level.SEVERE, e.getMessage(), e); } } } else { String cp = System.getProperty("java.class.path"); if (ok(cp)) { String[] paths = cp.split(System.getProperty("path.separator")); if (ok(paths)) { for (int i = 0; i < paths.length; i++) { uris.add(new File(paths[i]).toURI()); } } } } return uris.toArray(new URI[uris.size()]); } public String getVersion() { return "1.0.0"; } public String getImportPolicyClassName() { return null; } public String getLifecyclePolicyClassName() { return null; } public Manifest getManifest() { return generate(new ModuleMetadata()); } public ModuleMetadata getMetadata() { ModuleMetadata metadata = new ModuleMetadata(); generate(metadata); return metadata; } protected Manifest generate(ModuleMetadata metadata) { try { Manifest manifest = new ManifestProxy(classLoader, mappings); Collection habitatNames = Collections.singleton("default"); for (String habitatName : habitatNames) { Enumeration inhabitants = classLoader .getResources(InhabitantsFile.PATH + '/' + habitatName); Set processedFiles = new HashSet(); while (inhabitants.hasMoreElements()) { URL url = inhabitants.nextElement(); if (url.getProtocol().equals("jar")) { int index = url.getPath().indexOf("!"); if (index > 0 && url.getPath().length() > 5) { String path = url.getPath() .substring(5, url.getPath().indexOf("!")); File f = new File(URLDecoder.decode(path)); if (f.exists()) { f = f.getCanonicalFile(); if (processedFiles.contains(f)) { continue; } processedFiles.add(f); } } } metadata.addHabitat(habitatName, new ByteArrayInhabitantsDescriptor( url, readFully(url))); } } return manifest; } catch (IOException e) { throw new RuntimeException(e); } } private static boolean ok(String s) { return s != null && s.length() > 0; } private static boolean ok(String[] ss) { return ss != null && ss.length > 0; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy