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

org.glassfish.appclient.client.jws.boot.ClassPathManager Maven / Gradle / Ivy

There is a newer version: 6.2024.6
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-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.
 */
// Portions Copyright [2019-2020] [Payara Foundation and/or its affiliates]
package org.glassfish.appclient.client.jws.boot;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * Abstract superclass of classes that manage the class path needed to run
 * the Java Web Start-aware ACC.
 *

* Some details vary among releases of the Java runtime This abstract class * and its concrete implementation subclasses isolate those dependencies. * * @author tjquinn */ public abstract class ClassPathManager { public static final String PERSISTENCE_JAR_CLASSES = "org.h2.jdbcx.JdbcDataSource," + "persistence.antlr.ActionElement," /* toplink-essentials */ + "org.netbeans.modules.dbschema.ColumnElement," /* dbschema */ ; /** instance of appropriate type of class path manager, depending on the Java runtime version */ private static volatile ClassPathManager mgr = null; private final boolean keepJWSClassLoader; /** *Returns the appropriate type of ClassPathManager. *@return an instance of the correct implementation subclass class path manager */ public static ClassPathManager getClassPathManager(boolean keepJWSClassLoader) { if (mgr == null) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); /* *Distinguish between 1.6 and earlier by seeing if the curent *class loader - the JNLP class loader - is also a URLClassLoader *or not. */ if (loader instanceof URLClassLoader) { mgr = new ClassPathManager16(loader, keepJWSClassLoader); } else { mgr = new ClassPathManager15(loader, keepJWSClassLoader); } } return mgr; } /** the JNLP class loader active during the instantiation of this mgr */ private ClassLoader jnlpClassLoader = null; /** *Returns a new instance of the manager. *@param loader the class loader provided by Java Web Start */ protected ClassPathManager(ClassLoader loader, boolean keepJWSClassLoader) { jnlpClassLoader = loader; this.keepJWSClassLoader = keepJWSClassLoader; } protected boolean keepJWSClassLoader() { return keepJWSClassLoader; } protected ClassLoader getJnlpClassLoader() { return jnlpClassLoader; } /** *Locates the URI for the JAR containing the specified class *@param className the name of the class to be located *@return the URI for the JAR file containing the class of interest */ public URI locateClass(String className) throws IllegalAccessException, InvocationTargetException, MalformedURLException, URISyntaxException, ClassNotFoundException { String resourceName = classNameToResourceName(className); URL classURL = locateResource(resourceName); File f = findContainingJar(classURL); if (f == null) { /* *Could not locate the class we expected. */ throw new ClassNotFoundException(className + "->" + resourceName); } return f.toURI(); } /** *Returns the appropriate parent class loader for the ACC. *@return the correct class loader instance */ public abstract ClassLoader getParentClassLoader(); /* *Returns the jar that contains the specified resource. *@param resourceURL URL to look for *@return File object for the jar or directory containing the entry */ public abstract File findContainingJar(URL resourceURL) throws IllegalArgumentException, URISyntaxException, MalformedURLException, IllegalAccessException, InvocationTargetException; /** *Returns the Java Web Start-provided class loader recorded when the *class path manager was created. *@return the Java Web Start class loader */ protected ClassLoader getJNLPClassLoader() { return jnlpClassLoader; } /** *Converts a class name to a resource name. *@param className the name of the class of interest in x.y.z format *@return the resource name in x/y/z.class format */ protected String classNameToResourceName(String className) { return className.replace(".", "/") + ".class"; } /** *Finds a resource using the class's class loader. *@param resourceName the class to find *@return URL for the resource; null if not found */ protected URL locateResource(String resourceName) { URL resourceURL = getClass().getClassLoader().getResource(resourceName); return resourceURL; } /** *Reports URLs for the locally-cached copies of the JARs downloaded by *Java Web Start needed for the ACC's class path and policy settings. *@return array of URLs, one entry for each downloaded JAR */ public URL[] locateDownloadedJars() throws ClassNotFoundException, URISyntaxException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, MalformedURLException { /* *For each downloaded unsigned app client jar, get a URL that locates *it and add the URL to the list. * *This set of values should be automated on the server side and *communicated via a property setting in the JNLP document so *any changes in the list of downloaded files does not need to be made *there and here. */ String probeClassNames = System.getProperty("com.sun.aas.jar.probe.class.names", "com.sun.enterprise.appclient.jws.boot.JWSACCMain," /* appserv-jwsacc */ + "com.sun.enterprise.appclient.Main," /* appserv-rt */ + "com.sun.jdo.api.persistence.enhancer.ByteCodeEnhancer," /* appserv-cmp */ + "com.sun.enterprise.admin.servermgmt.DomainConfig," /* appserv-admin */ + "com.sun.enterprise.deployment.client.DeploymentClientUtils," /* appserv-deployment-client */ + "jakarta.ejb.EJB," /* jakarta ee */ + "jakarta.security.auth.message.module.ServerAuthModule," /* jaspic-api */ + "com.sun.appserv.management.ext.logging.LogAnalyzer," /* appserv-ext */ + "com.sun.mail.iap.Argument," /* mail */ + "com.sun.activation.viewers.ImageViewer," /* activation */ + "com.sun.xml.ws.api.server.WSEndpoint," /* webservices-rt */ + "com.sun.tools.ws.wsdl.parser.W3CAddressingExtensionHandler," /* webservices-tools */ + "com.sun.jms.spi.xa.JMSXAConnection," /* imqjmsra */ + "com.sun.jndi.fscontext.FSContext" /* fscontext */ ); return locateJARs(probeClassNames); } public URL[] locateJARs(String classNamesString) throws IllegalAccessException, InvocationTargetException, MalformedURLException, URISyntaxException, ClassNotFoundException { String [] classNames = classNamesString.split(","); /* *For each class name, find the jar that contains it by getting a URL *to the class and then using that URL to find the jar. */ URL [] urls = new URL[classNames.length]; int nextURL = 0; for (String className : classNames) { URI jarFileURI = locateClass(className); URL url = jarFileURI.toURL(); urls[nextURL++] = url; } return urls; } public URL[] locatePersistenceJARs() throws IllegalAccessException, InvocationTargetException, MalformedURLException, URISyntaxException, ClassNotFoundException { return locateJARs(PERSISTENCE_JAR_CLASSES); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy