User: starksm Date: 01/11/25 19:17:47 Modified: src/main/org/jboss/deployment DeployerMBeanSupport.java Installer.java InstallerFactory.java J2eeApplicationMetaData.java J2eeDeployer.java J2eeModuleMetaData.java Log: Drop the org.jboss.ejb.DeploymentException in favor of the org.jboss.deployment.DeploymentException class. Clean up the org.jboss.logging.Logger to use the Logger.getLogger factory method. Revision Changes Path 1.12 +1 -2 jboss/src/main/org/jboss/deployment/DeployerMBeanSupport.java Index: DeployerMBeanSupport.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/DeployerMBeanSupport.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- DeployerMBeanSupport.java 2001/11/24 19:46:42 1.11 +++ DeployerMBeanSupport.java 2001/11/26 03:17:47 1.12 @@ -35,7 +35,7 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Toby Allsopp</a> * @author <a href="mailto:[EMAIL PROTECTED]">David Jencks</a> - * @version $Revision: 1.11 $ + * @version $Revision: 1.12 $ * * <p><b>Revisions:</b> * @@ -79,7 +79,6 @@ // Constructors -------------------------------------------------- public DeployerMBeanSupport() { - //category = Logger.create(getClass()); } 1.17 +22 -18 jboss/src/main/org/jboss/deployment/Installer.java Index: Installer.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/Installer.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Installer.java 2001/11/24 19:46:42 1.16 +++ Installer.java 2001/11/26 03:17:47 1.17 @@ -30,14 +30,12 @@ import javax.management.ObjectName; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.jboss.logging.Logger; import org.jboss.metadata.XmlFileLoader; -import org.jboss.ejb.DeploymentException; - -import org.apache.log4j.Category; -import org.w3c.dom.Document; -import org.w3c.dom.Element; /** * A class intended to encapsulate the complex task of making an URL pointed @@ -48,7 +46,7 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Schulze</a> * @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a> - * @version $Revision: 1.16 $ + * @version $Revision: 1.17 $ */ public class Installer @@ -72,7 +70,7 @@ Deployment d; // the log4j category for output - Category log; + Logger log; // to get the Log and the temprary deployment dir InstallerFactory factory; @@ -168,27 +166,33 @@ } /** install EAR application */ - protected void executeEARModule(String name, Deployment d, File localCopy, URL libraryRoot) throws J2eeDeploymentException, IOException { + protected void executeEARModule(String name, Deployment d, File localCopy, URL libraryRoot) + throws J2eeDeploymentException, IOException + { // reading the deployment descriptor... JarFile jarFile = new JarFile(localCopy); J2eeApplicationMetaData app = null; - try { + try + { InputStream in = jarFile.getInputStream(jarFile.getEntry(files[EAR_MODULE])); XmlFileLoader xfl = new XmlFileLoader(); Element root = xfl.getDocument(in, files[EAR_MODULE]).getDocumentElement(); app = new J2eeApplicationMetaData(root); in.close(); - } - catch (IOException _ioe) { - throw new J2eeDeploymentException("Error in accessing application metadata: "+_ioe.getMessage()); } - catch (DeploymentException _de) { - throw new J2eeDeploymentException("Error in parsing application.xml: "+_de.getMessage()); + catch (IOException e) + { + throw new J2eeDeploymentException("Error in accessing application metadata", e); + } + catch (DeploymentException e) + { + throw new J2eeDeploymentException("Error deploying application", e); + } + catch (NullPointerException e) + { + throw new J2eeDeploymentException("unexpected error: application.xml was found once but not a second time?!", e); } - catch (NullPointerException _npe) { - throw new J2eeDeploymentException("unexpected error: application.xml was found once but not a second time?!"); - } - + // iterating the modules and install them // the library url is used to root the embedded classpaths libraryRoot=new URL("jar:file:"+localCopy.getAbsolutePath()+"!/"); 1.11 +4 -11 jboss/src/main/org/jboss/deployment/InstallerFactory.java Index: InstallerFactory.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/InstallerFactory.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- InstallerFactory.java 2001/11/24 19:46:42 1.10 +++ InstallerFactory.java 2001/11/26 03:17:47 1.11 @@ -18,21 +18,15 @@ import java.util.Collection; import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.Enumeration; +import org.jboss.logging.Logger; - - - -import org.apache.log4j.Category; - - - /** This class is used by the J2eeDeployer to create, remove or find a particular * Deployment. It uses the Installer class to create a Deployment. * * @see <related> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Schulze</a> * @author <a href="mailto:[EMAIL PROTECTED]">Bill Burke</a> - * @version $Revision: 1.10 $ + * @version $Revision: 1.11 $ */ public class InstallerFactory { @@ -43,8 +37,7 @@ // the deployment base directory (for the temporary files) protected File baseDir; // the logger if there is something to say - protected Category log; - + protected Logger log; // Constructors -------------------------------------------------- @@ -52,7 +45,7 @@ * @param _tmpDir the temporary deployment directory * @param _log the Log for output */ - public InstallerFactory(File _tmpDir, Category _log) throws IOException + public InstallerFactory(File _tmpDir, Logger _log) throws IOException { baseDir = _tmpDir.getCanonicalFile(); 1.4 +5 -5 jboss/src/main/org/jboss/deployment/J2eeApplicationMetaData.java Index: J2eeApplicationMetaData.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/J2eeApplicationMetaData.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- J2eeApplicationMetaData.java 2001/08/03 17:15:42 1.3 +++ J2eeApplicationMetaData.java 2001/11/26 03:17:47 1.4 @@ -9,8 +9,6 @@ import java.util.Vector; import java.util.Iterator; - -import org.jboss.ejb.DeploymentException; import org.jboss.metadata.MetaData; import org.w3c.dom.Element; @@ -20,7 +18,7 @@ * * @see <related> * @author <firstname> <lastname> (<email>) - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ */ public class J2eeApplicationMetaData extends MetaData @@ -73,7 +71,8 @@ - public void importXml (Element element) throws DeploymentException { + public void importXml (Element element) throws DeploymentException + { String rootTag = element.getOwnerDocument().getDocumentElement().getTagName(); if (rootTag.equals("application")) { @@ -91,7 +90,8 @@ e2 = getOptionalChild (element, "large-icon"); largeIcon = e2 != null ? getElementContent (e2) : ""; - } else + } + else { smallIcon = ""; largeIcon = ""; 1.47 +755 -654 jboss/src/main/org/jboss/deployment/J2eeDeployer.java Index: J2eeDeployer.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/J2eeDeployer.java,v retrieving revision 1.46 retrieving revision 1.47 diff -u -r1.46 -r1.47 --- J2eeDeployer.java 2001/11/24 19:46:42 1.46 +++ J2eeDeployer.java 2001/11/26 03:17:47 1.47 @@ -41,7 +41,7 @@ -/** +/** * J2eeDeployer allows to deploy single EJB.jars as well as Web.wars * (if a Servlet Container is present) or even Application.ears. <br> * The deployment is done by determining the file type of the given url. @@ -53,677 +53,778 @@ * The uploaded files are getting passed through to the responsible deployer * (ContainerFactory for JBoss and EmbededTomcatService for Tomcat). * <br> - * Extended and refactored on 5th October 2001 by CGJ to cater for rar and + * Extended and refactored on 5th October 2001 by CGJ to cater for rar and * java-client modules within applications. * * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Schulze</a> * @author <a href="mailto:[EMAIL PROTECTED]">Toby Allsopp</a> * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>. * @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>. - * @version $Revision: 1.46 $ + * @version $Revision: 1.47 $ */ public class J2eeDeployer extends ServiceMBeanSupport -implements J2eeDeployerMBean { - // Constants ----------------------------------------------------- - public File DEPLOYMENT_DIR = null;//"/home/deployment"; // default? MUST BE ABSOLUTE PATH!!! - public static String CONFIG = "deployment.cfg"; - final public static String DEFAULT_NAME="Default"; - final public static String DEFAULT_JAR_DEPLOYER_NAME="EJB:service=ContainerFactory"; - final public static String DEFAULT_WAR_DEPLOYER_NAME=":service=EmbeddedTomcat"; - final public static String DEFAULT_RAR_DEPLOYER_NAME=":service=RarDeployer"; - final public static String DEFAULT_JAVA_DEPLOYER_NAME=":service=JavaDeployer"; - - public static final int EASY = 0; - public static final int RESTRICTIVE = 1; - - // Attributes ---------------------------------------------------- - // my server to lookup for the special deployers - // <comment author="cgjung">better be protected for subclassing </comment> - protected MBeanServer server; - - // <comment author="cgjung">better be protected for subclassing </comment> - protected String name; - - // names of the specials deployers - // <comment author="cgjung">better be protected for subclassing </comment> - protected ObjectName jarDeployer; - protected ObjectName warDeployer; - protected ObjectName rarDeployer; - protected ObjectName javaDeployer; - +implements J2eeDeployerMBean +{ + // Constants ----------------------------------------------------- + public File DEPLOYMENT_DIR = null;//"/home/deployment"; // default? MUST BE ABSOLUTE PATH!!! + public static String CONFIG = "deployment.cfg"; + final public static String DEFAULT_NAME="Default"; + final public static String DEFAULT_JAR_DEPLOYER_NAME="EJB:service=ContainerFactory"; + final public static String DEFAULT_WAR_DEPLOYER_NAME=":service=EmbeddedTomcat"; + final public static String DEFAULT_RAR_DEPLOYER_NAME=":service=RarDeployer"; + final public static String DEFAULT_JAVA_DEPLOYER_NAME=":service=JavaDeployer"; + + public static final int EASY = 0; + public static final int RESTRICTIVE = 1; + + // Attributes ---------------------------------------------------- + // my server to lookup for the special deployers + // <comment author="cgjung">better be protected for subclassing </comment> + protected MBeanServer server; + + // <comment author="cgjung">better be protected for subclassing </comment> + protected String name; + + // names of the specials deployers + // <comment author="cgjung">better be protected for subclassing </comment> + protected ObjectName jarDeployer; + protected ObjectName warDeployer; + protected ObjectName rarDeployer; + protected ObjectName javaDeployer; + /*String jarDeployerName; String warDeployerName; String rarDeployerName; String javaDeployerName;*/ - - int classpathPolicy = EASY; - - // <comment author="cgjung"> better be protected for subclassing </comment> - protected InstallerFactory installer; - - - - // Constructors -------------------------------------------------- - - public J2eeDeployer() { - } - - - public void setDeployerName(String name) { - this.log = Logger.create(this.getClass().getName() + "#" + name); - // what is this for? - name = name.equals("") ? "" : " "+name; - this.name = name; - } - - public String getDeployerName() { - return name.trim(); - } - - public void setJarDeployer(ObjectName jarDeployer) { - this.jarDeployer = jarDeployer; - } - - public ObjectName getJarDeployer() { - return jarDeployer; - } - - public void setWarDeployer(ObjectName warDeployer) { - this.warDeployer = warDeployer; - } - - public ObjectName getWarDeployer() { - return warDeployer; - } - - public void setRarDeployer(ObjectName rarDeployer) { - this.rarDeployer = rarDeployer; - } - - public ObjectName getRarDeployer() { - return rarDeployer; - } - - public void setServiceDeployer(ObjectName javaDeployer) { - this.javaDeployer = javaDeployer; - } - - public ObjectName getServiceDeployer() { - return javaDeployer; - } - - // Public -------------------------------------------------------- - - public FilenameFilter getDeployableFilter() { - return new FilenameFilter() { - public boolean accept(File dir, String filename) { - filename=filename.toLowerCase(); - return - filename.endsWith(".jar") || - filename.endsWith(".war") || - filename.endsWith(".ear") || - filename.endsWith(".zip"); - } - }; - } - - /** Deploys the given URL independent if it is a EJB.jar, Web.war - * or Application.ear. In case of already deployed, it performes a - * redeploy. - * @param _url the url (file or http) to the archiv to deploy - * @throws MalformedURLException in case of a malformed url - * @throws J2eeDeploymentException if something went wrong... - * @throws IOException if trouble while file download occurs - */ - public void deploy(String _url) throws MalformedURLException, IOException, J2eeDeploymentException { - URL url = new URL(_url); - - // <comment author="cgjung">factored out for subclass access </comment> - ObjectName lCollector = createCollectorName(); - - // undeploy first if it is a redeploy - try { - undeploy(_url); - // Remove application data by its id - // <comment author="cgjung"> factored out for subclass access </comment> - removeFromCollector(_url,lCollector); - } - catch (Exception _e) - {} - - // now try to deploy - log.info("Deploy J2EE application: " + _url); - - Deployment d = installApplication(url); - - try { - // <comment author="cgjung"> factored out for subclass access - startApplication(d); - log.info("J2EE application: " + _url + " is deployed."); - } - catch (Exception _e) { - try { - stopApplication(d); - } - catch (Exception _e2) { - log.error("unable to stop application "+d.name+": "+_e2); - } - finally { - try { - uninstallApplication(_url); - } - catch (Exception _e3) { - log.error("unable to uninstall application "+d.name+": "+_e3); - } - } - - if (_e instanceof J2eeDeploymentException) { - throw (J2eeDeploymentException)_e; - } - else { - log.error("fatal error:", _e); - throw new J2eeDeploymentException("fatal error: "+_e); - } - } - } - - /** creation of collector name factored out. - * @author schaefera - * @author cgjung - */ - protected ObjectName createCollectorName() { - try { - return new ObjectName( "Management", "service", "Collector" ); - } - catch( Exception e ) { - return null; - } - } - - /** report of removal to data collector factored out for subclass access - * a try/catch for dealing with an uninstalled collector has been added. - * @author schaefera - * @author cgjung - */ - protected void removeFromCollector(String _url, ObjectName lCollector) { - try{ - server.invoke( - lCollector, + + int classpathPolicy = EASY; + + // <comment author="cgjung"> better be protected for subclassing </comment> + protected InstallerFactory installer; + + + + // Constructors -------------------------------------------------- + + public J2eeDeployer() + { + } + + public void setDeployerName(String name) + { + this.log = Logger.getLogger(this.getClass().getName() + "#" + name); + // what is this for? + name = name.equals("") ? "" : " "+name; + this.name = name; + } + + public String getDeployerName() + { + return name.trim(); + } + + public void setJarDeployer(ObjectName jarDeployer) + { + this.jarDeployer = jarDeployer; + } + + public ObjectName getJarDeployer() + { + return jarDeployer; + } + + public void setWarDeployer(ObjectName warDeployer) + { + this.warDeployer = warDeployer; + } + + public ObjectName getWarDeployer() + { + return warDeployer; + } + + public void setRarDeployer(ObjectName rarDeployer) + { + this.rarDeployer = rarDeployer; + } + + public ObjectName getRarDeployer() + { + return rarDeployer; + } + + public void setServiceDeployer(ObjectName javaDeployer) + { + this.javaDeployer = javaDeployer; + } + + public ObjectName getServiceDeployer() + { + return javaDeployer; + } + + // Public -------------------------------------------------------- + + public FilenameFilter getDeployableFilter() + { + return new FilenameFilter() + { + public boolean accept(File dir, String filename) + { + filename=filename.toLowerCase(); + boolean accept = filename.endsWith(".jar") || + filename.endsWith(".war") || + filename.endsWith(".ear") || + filename.endsWith(".zip"); + return accept; + } + }; + } + + /** Deploys the given URL independent if it is a EJB.jar, Web.war + * or Application.ear. In case of already deployed, it performes a + * redeploy. + * @param _url the url (file or http) to the archiv to deploy + * @throws MalformedURLException in case of a malformed url + * @throws J2eeDeploymentException if something went wrong... + * @throws IOException if trouble while file download occurs + */ + public void deploy(String _url) + throws MalformedURLException, IOException, J2eeDeploymentException + { + URL url = new URL(_url); + + // <comment author="cgjung">factored out for subclass access </comment> + ObjectName lCollector = createCollectorName(); + + // undeploy first if it is a redeploy + try + { + undeploy(_url); + // Remove application data by its id + // <comment author="cgjung"> factored out for subclass access </comment> + removeFromCollector(_url,lCollector); + } + catch (Exception _e) + { + } + + // now try to deploy + log.info("Deploy J2EE application: " + _url); + + Deployment d = installApplication(url); + + try + { + // <comment author="cgjung"> factored out for subclass access + startApplication(d); + log.info("J2EE application: " + _url + " is deployed."); + } + catch (Exception _e) + { + try + { + stopApplication(d); + } + catch (Exception _e2) + { + log.error("unable to stop application "+d.name+": "+_e2); + } + finally + { + try + { + uninstallApplication(_url); + } + catch (Exception _e3) + { + log.error("unable to uninstall application "+d.name+": "+_e3); + } + } + + if (_e instanceof J2eeDeploymentException) + { + throw (J2eeDeploymentException)_e; + } + else + { + log.error("fatal error:", _e); + throw new J2eeDeploymentException("fatal error: "+_e); + } + } + } + + /** creation of collector name factored out. + * @author schaefera + * @author cgjung + */ + protected ObjectName createCollectorName() + { + try + { + return new ObjectName( "Management", "service", "Collector" ); + } + catch( Exception e ) + { + return null; + } + } + + /** report of removal to data collector factored out for subclass access + * a try/catch for dealing with an uninstalled collector has been added. + * @author schaefera + * @author cgjung + */ + protected void removeFromCollector(String _url, ObjectName lCollector) + { + try + { + server.invoke(lCollector, "removeApplication", new Object[] { _url }, - new String[] { "java.lang.String" } - ); - } catch(Exception e) { - log.info("Report of undeployment of J2EE application: " + _url + " could not be reported."); - } - } - - /** Undeploys the given URL (if it is deployed). - * Actually only the file name is of interest, so it dont has to be - * an URL to be undeployed, the file name is ok as well. - * @param _url the url to to undeploy - * @throws MalformedURLException in case of a malformed url - * @throws J2eeDeploymentException if something went wrong (but should have removed all files) - * @throws IOException if file removement fails - */ - public void undeploy(String _app) throws IOException, J2eeDeploymentException { - Deployment d = installer.findDeployment(_app); - - if (d == null) - throw new J2eeDeploymentException("The application \""+name+"\" has not been deployed."); - - try { - stopApplication(d); - } - catch (J2eeDeploymentException _e) { - throw _e; - } - finally { - uninstallApplication(d); - } - } - - /** Checks if the given URL is currently deployed or not. - * Actually only the file name is of interest, so it dont has to be - * an URL to be undeployed, the file name is ok as well. - * @param _url the url to to check - * @return true if _url is deployed - * @throws MalformedURLException in case of a malformed url - * @throws J2eeDeploymentException if the app seems to be deployed, but some of its modules - * are not. - */ - public boolean isDeployed(String _url) throws MalformedURLException, J2eeDeploymentException { - boolean result = false; - - Deployment d = installer.findDeployment(_url); - - if (d != null) { - result = checkApplication(d); - } - - return result; - } - - // ServiceMBeanSupport overrides --------------------------------- - public String getName() { - return "J2EE Deployer" + this.name; - } - - protected ObjectName getObjectName(MBeanServer server, ObjectName name) - throws javax.management.MalformedObjectNameException { - this.server = server; - return name == null ? new ObjectName(OBJECT_NAME+this.name) : name; - } - - - /** */ - protected void startService() - throws Exception { - - - File jbossHomeDir = new File(System.getProperty("jboss.system.home")); - File tmpDir = new File(jbossHomeDir, "tmp"+File.separator); - - if (!tmpDir.exists()) - throw new IOException("Failed to get /tmp.properties URL; Temporary directory does not exist!"); - - File dir = new File(jbossHomeDir, "deploy"+File.separator+getDeployerName()); - if (!dir.exists() && - !dir.mkdirs()) - throw new IOException("Temporary directory \""+dir.getCanonicalPath()+"\" does not exist!"); - - installer = new InstallerFactory(dir, log); - - if (warDeployer == null) - log.info("No web container found - only EJB deployment available..."); - - // clean up the deployment directory since on some Windowz the file removement - // during runtime doesnt work... - log.info("Cleaning up deployment directory"); - installer.unclutter(); - } - - - /** undeploys all deployments */ - protected void stopService() { - log.info("Undeploying all applications."); - - Deployment[] deps = installer.getDeployments(); - int count = 0; - for (int i = 0, l = deps.length; i<l; ++i) { - try { - stopApplication(deps[i]); - } - catch (J2eeDeploymentException _e) { - //throw _e; - log.error("Failed to stop app", _e); - } - finally { - try { - uninstallApplication(deps[i]); - } - catch (IOException _ioe) { - log.error("Failed to unistall app", _ioe); - } - } - ++count; - } - log.info("Undeployed "+count+" applications."); - } - - // Private ------------------------------------------------------- - - /** determines deployment type and installs (downloads) all packages needed - * by the given deployment of the given deployment. <br> - * This means download the needed packages do some validation... - * <i> Validation and do some other things is not yet implemented </i> - * <comment author="cgjung"> better be protected for subclassing </comment> - * @param _downloadUrl the url that points to the app to install - * @throws IOException if the download fails - * @throws J2eeDeploymentException if the given package is somehow inconsistent - */ - protected Deployment installApplication(URL _downloadUrl) throws IOException, J2eeDeploymentException { - return installer.install(_downloadUrl); - } - - - /** Deletes the file tree of the specified application. <br> - * <comment author="cgjung">better be protected for subclassing</comment> - * @param _name the directory (DEPLOYMENT_DIR/<_name> to remove recursivly - * @throws IOException if something goes wrong - */ - protected void uninstallApplication(String _pattern) throws IOException { - Deployment d = installer.findDeployment(_pattern); - - if (d != null) - uninstallApplication(d); - } - - protected void uninstallApplication(Deployment _d) throws IOException { - log.info("Destroying application " + _d.name); - installer.uninstall(_d); - log.info("Destroyed"); - } - - - - /** Starts the successful downloaded deployment. <br> - * Means the modules are deployed by the responsible container deployer - * <comment author="cgjung">better be protected for subclassing </comment> - * @param _d the deployment to start - * @throws J2eeDeploymentException if an error occures for one of these - * modules - */ - protected void startApplication(Deployment _d) throws J2eeDeploymentException { - // Create the appropriate JSR-77 instance - ObjectName lApplication = J2EEApplication.create( - getServer(), - _d.getName(), - _d.getSourceUrl() - ); - - // save the old classloader - ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); - - // set the context classloader for this application - createContextClassLoader(_d); - - // save the application classloader for later - ClassLoader appCl = Thread.currentThread().getContextClassLoader(); - - // <comment author="cgjung">module deployment factored out for subclass - // access </comment> - // redirect all modules to the responsible deployers - startModules(_d,appCl,oldCl); - } - - /** factored out method to start individual modules and reinstall - * context classloader afterwards - */ - protected void startModules(Deployment _d, ClassLoader appCl, ClassLoader oldCl) throws J2eeDeploymentException { - Deployment.Module m = null; - String moduleName = null; - String message; - try { - // Deploy the ejb modules - moduleName = _d.name; - Vector tmp = new java.util.Vector(); - Iterator it = _d.ejbModules.iterator(); - while( it.hasNext() ) { - m = (Deployment.Module) it.next(); - tmp.add( m.localUrls.firstElement().toString() ); - } - String[] jarUrls = new String[ tmp.size() ]; - tmp.toArray( jarUrls ); - // Call the ContainerFactory that is loaded in the JMX server - getLog().info("about to invoke deploy on jardeployer:" + jarDeployer); - server.invoke(jarDeployer, "deploy", - new Object[]{ _d.localUrl.toString(), jarUrls, moduleName }, - new String[]{ String.class.getName(), String[].class.getName(), String.class.getName() } ); + new String[]{ "java.lang.String" } + ); + } + catch(Exception e) + { + log.info("Report of undeployment of J2EE application: " + _url + " could not be reported."); + } + } + + /** Undeploys the given URL (if it is deployed). + * Actually only the file name is of interest, so it dont has to be + * an URL to be undeployed, the file name is ok as well. + * @param _url the url to to undeploy + * @throws MalformedURLException in case of a malformed url + * @throws J2eeDeploymentException if something went wrong (but should have removed all files) + * @throws IOException if file removement fails + */ + public void undeploy(String _app) throws IOException, J2eeDeploymentException + { + Deployment d = installer.findDeployment(_app); + + if (d == null) + throw new J2eeDeploymentException("The application \""+name+"\" has not been deployed."); + + try + { + stopApplication(d); + } + catch (J2eeDeploymentException _e) + { + throw _e; + } + finally + { + uninstallApplication(d); + } + } + + /** Checks if the given URL is currently deployed or not. + * Actually only the file name is of interest, so it dont has to be + * an URL to be undeployed, the file name is ok as well. + * @param _url the url to to check + * @return true if _url is deployed + * @throws MalformedURLException in case of a malformed url + * @throws J2eeDeploymentException if the app seems to be deployed, but some of its modules + * are not. + */ + public boolean isDeployed(String _url) throws MalformedURLException, J2eeDeploymentException + { + boolean result = false; + + Deployment d = installer.findDeployment(_url); + + if (d != null) + { + result = checkApplication(d); + } + + return result; + } + + // ServiceMBeanSupport overrides --------------------------------- + public String getName() + { + return "J2EE Deployer" + this.name; + } + + protected ObjectName getObjectName(MBeanServer server, ObjectName name) + throws javax.management.MalformedObjectNameException + { + this.server = server; + return name == null ? new ObjectName(OBJECT_NAME+this.name) : name; + } + + + /** */ + protected void startService() + throws Exception + { + + + File jbossHomeDir = new File(System.getProperty("jboss.system.home")); + File tmpDir = new File(jbossHomeDir, "tmp"+File.separator); + + if (!tmpDir.exists()) + throw new IOException("Failed to get /tmp.properties URL; Temporary directory does not exist!"); + + File dir = new File(jbossHomeDir, "deploy"+File.separator+getDeployerName()); + if (!dir.exists() && !dir.mkdirs()) + throw new IOException("Temporary directory '"+dir.getCanonicalPath()+"' does not exist!"); + + installer = new InstallerFactory(dir, log); + + if (warDeployer == null) + log.info("No web container found - only EJB deployment available..."); + + // clean up the deployment directory since on some Windowz the file removement + // during runtime doesnt work... + log.info("Cleaning up deployment directory"); + installer.unclutter(); + } + + /** undeploys all deployments */ + protected void stopService() + { + log.info("Undeploying all applications."); + + Deployment[] deps = installer.getDeployments(); + int count = 0; + for (int i = 0, l = deps.length; i<l; ++i) + { + try + { + stopApplication(deps[i]); + } + catch (J2eeDeploymentException _e) + { + //throw _e; + log.error("Failed to stop app", _e); + } + finally + { + try + { + uninstallApplication(deps[i]); + } + catch (IOException _ioe) + { + log.error("Failed to unistall app", _ioe); + } + } + ++count; + } + log.info("Undeployed "+count+" applications."); + } + + // Private ------------------------------------------------------- + + /** determines deployment type and installs (downloads) all packages needed + * by the given deployment of the given deployment. <br> + * This means download the needed packages do some validation... + * <i> Validation and do some other things is not yet implemented </i> + * <comment author="cgjung"> better be protected for subclassing </comment> + * @param _downloadUrl the url that points to the app to install + * @throws IOException if the download fails + * @throws J2eeDeploymentException if the given package is somehow inconsistent + */ + protected Deployment installApplication(URL _downloadUrl) throws IOException, J2eeDeploymentException + { + return installer.install(_downloadUrl); + } + + + /** Deletes the file tree of the specified application. <br> + * <comment author="cgjung">better be protected for subclassing</comment> + * @param _name the directory (DEPLOYMENT_DIR/<_name> to remove recursivly + * @throws IOException if something goes wrong + */ + protected void uninstallApplication(String _pattern) throws IOException + { + Deployment d = installer.findDeployment(_pattern); + + if (d != null) + uninstallApplication(d); + } + + protected void uninstallApplication(Deployment _d) throws IOException + { + log.info("Destroying application " + _d.name); + installer.uninstall(_d); + log.info("Destroyed"); + } + + + + /** Starts the successful downloaded deployment. <br> + * Means the modules are deployed by the responsible container deployer + * <comment author="cgjung">better be protected for subclassing </comment> + * @param _d the deployment to start + * @throws J2eeDeploymentException if an error occures for one of these + * modules + */ + protected void startApplication(Deployment _d) throws J2eeDeploymentException + { + // Create the appropriate JSR-77 instance + ObjectName lApplication = J2EEApplication.create( + getServer(), + _d.getName(), + _d.getSourceUrl() + ); + + // save the old classloader + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + + // set the context classloader for this application + createContextClassLoader(_d); + + // save the application classloader for later + ClassLoader appCl = Thread.currentThread().getContextClassLoader(); + + // <comment author="cgjung">module deployment factored out for subclass + // access </comment> + // redirect all modules to the responsible deployers + startModules(_d,appCl,oldCl); + } + + /** factored out method to start individual modules and reinstall + * context classloader afterwards + */ + protected void startModules(Deployment _d, ClassLoader appCl, ClassLoader oldCl) throws J2eeDeploymentException + { + Deployment.Module m = null; + String moduleName = null; + String message; + try + { + // Deploy the ejb modules + moduleName = _d.name; + Vector tmp = new java.util.Vector(); + Iterator it = _d.ejbModules.iterator(); + while( it.hasNext() ) + { + m = (Deployment.Module) it.next(); + tmp.add( m.localUrls.firstElement().toString() ); + } + String[] jarUrls = new String[ tmp.size() ]; + tmp.toArray( jarUrls ); + // Call the ContainerFactory that is loaded in the JMX server + getLog().info("about to invoke deploy on jardeployer:" + jarDeployer); + server.invoke(jarDeployer, "deploy", + new Object[] + { _d.localUrl.toString(), jarUrls, moduleName }, + new String[] + { String.class.getName(), String[].class.getName(), String.class.getName() } ); + + // Deploy the web application modules + it = _d.webModules.iterator(); + if (it.hasNext() && !warDeployerAvailable()) + throw new J2eeDeploymentException("application contains war files but no web container available"); + + while( it.hasNext() ) + { + m = (Deployment.Module)it.next(); + moduleName = m.name; + log.info("Starting module " + moduleName); - // Deploy the web application modules - it = _d.webModules.iterator(); - if (it.hasNext() && !warDeployerAvailable()) - throw new J2eeDeploymentException("application contains war files but no web container available"); - - while( it.hasNext() ) { - m = (Deployment.Module)it.next(); - moduleName = m.name; - log.info("Starting module " + moduleName); - - // Call the TomcatDeployer that is loaded in the JMX server - server.invoke(warDeployer, "deploy", - new Object[] { m.webContext, m.localUrls.firstElement().toString()}, new String[] { "java.lang.String", "java.lang.String" }); - - // since tomcat changes the context classloader... - Thread.currentThread().setContextClassLoader(appCl); - } - - // Deploy the connector modules - it = _d.connectorModules.iterator(); - if (it.hasNext() && !rarDeployerAvailable()) - throw new J2eeDeploymentException("application contains rar files but no rar deployer available"); - - while( it.hasNext() ) { - m = (Deployment.Module)it.next(); - moduleName = m.name; - log.info("Starting module " + moduleName); - - // Call the rar deployer that is loaded in the JMX server - server.invoke(rarDeployer, "deploy", new Object[] {m.localUrls.firstElement().toString()}, - new String[] { "java.lang.String" }); - - } + // Call the TomcatDeployer that is loaded in the JMX server + Object[] args = { m.webContext, m.localUrls.firstElement().toString()}; + String[] types = { "java.lang.String", "java.lang.String" }; + server.invoke(warDeployer, "deploy", args, types); - // Deploy the connector modules - it = _d.javaModules.iterator(); - if (it.hasNext() && !javaDeployerAvailable()) - throw new J2eeDeploymentException("application contains client java files but no java deployer available"); - - while( it.hasNext() ) { - m = (Deployment.Module)it.next(); - moduleName = m.name; - log.info("Starting module " + moduleName); - // Call the rar deployer that is loaded in the JMX server - server.invoke(javaDeployer, "deploy", new Object[] {m.localUrls.firstElement().toString()}, - new String[] { "java.lang.String" }); - } - } - catch (MBeanException e) { - log.error("Starting "+moduleName+" failed!", e); - throw new J2eeDeploymentException("Error while starting "+moduleName+": " + e.getTargetException().getMessage(), e.getTargetException()); - } - catch (RuntimeErrorException e) { - log.error("Starting "+moduleName+" failed!", e); - throw new J2eeDeploymentException("Error while starting "+moduleName+": " + e.getTargetError().getMessage(), e.getTargetError()); - } - catch (RuntimeMBeanException e) { - log.error("Starting "+moduleName+" failed!", e); - throw new J2eeDeploymentException("Error while starting "+moduleName+": " + e.getTargetException().getMessage(), e.getTargetException()); - } - catch (JMException e) { - log.error("Starting failed!", e); - throw new J2eeDeploymentException("Fatal error while interacting with deployer MBeans... " + e.getMessage()); - } - finally { - Thread.currentThread().setContextClassLoader(oldCl); - } - } - - /** - * Stops a running deployment. <br> - * Means the modules are undeployed by the responsible container deployer - * @param _d the deployment to stop - * @throws J2eeDeploymentException if an error occures for one of these - * modules - */ - protected void stopApplication(Deployment _d) throws J2eeDeploymentException { - // save the old classloader, tomcat replaces my classloader somehow?! - ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); - StringBuffer error = new StringBuffer(); - - // stop the web modules - if( warDeployerAvailable() ) { - for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); ) { - Deployment.Module m = (Deployment.Module)webModules.next(); - stopModule( warDeployer, m.name, m.localUrls.firstElement().toString(), error ); - } - } - else if (!_d.webModules.isEmpty()){ - // in case we are not running with tomcat - // should only happen for tomcat (i=1) - log.warn("Cannot find web container anymore!"); - } - - // stop the java modules - if( javaDeployerAvailable() ) { - for( Iterator javaModules = _d.javaModules.iterator(); javaModules.hasNext(); ) { - Deployment.Module m = (Deployment.Module)javaModules.next(); - stopModule( javaDeployer, m.name, m.localUrls.firstElement().toString(), error ); - } - } - else if (!_d.javaModules.isEmpty()){ - // in case we are not running with tomcat - // should only happen for tomcat (i=1) - log.warn("Cannot find java deployer anymore!"); - } - - // stop the jar modules (the ContainerFactory is responsible for undeploying - // all jars associated w/ a given application) - stopModule( jarDeployer, _d.name, _d.localUrl.toString(), error ); - - // stop the java modules - if( rarDeployerAvailable() ) { - for( Iterator connectorModules = _d.connectorModules.iterator(); connectorModules.hasNext(); ) { - Deployment.Module m = (Deployment.Module)connectorModules.next(); - stopModule( rarDeployer, m.name, m.localUrls.firstElement().toString(), error ); - } - } - else if (!_d.connectorModules.isEmpty()){ - // in case we are not running with tomcat - // should only happen for tomcat (i=1) - log.warn("Cannot find rar deployer anymore!"); - } - - if (!error.toString().equals("")) // there was at least one error... - throw new J2eeDeploymentException("Error(s) on stopping application "+_d.name+":\n"+error.toString()); - - // restore the classloader - Thread.currentThread().setContextClassLoader(oldCl); - } - - private void stopModule( ObjectName container, String moduleName, String moduleUrl, StringBuffer error ) { - try { - // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server - Object result = server.invoke(container, "isDeployed", - new Object[] { moduleUrl }, new String[] { "java.lang.String" }); - if (((Boolean)result).booleanValue()) { - log.info("Stopping module " + moduleName); - server.invoke(container, "undeploy", - new Object[] { moduleUrl }, new String[] { "java.lang.String" }); - } - else - log.info("Module " + moduleName + " is not running"); - } - catch (MBeanException _mbe) { - log.error("Unable to stop module " + moduleName + ": " + _mbe.getTargetException().getMessage()); - error.append("Unable to stop module " + moduleName + ": " + _mbe.getTargetException().getMessage()); - error.append("/n"); - } - catch (JMException _jme) { - log.error("Unable to stop module " + moduleName + ": " + _jme.getMessage()); - error.append("Unable to stop module " + moduleName + ": fatal error while calling " + container + ": " + _jme.getMessage()); - error.append("/n"); - } - } - - /** Checks the Deplyment if it is correctly deployed. - * @param app to check - * @throws J2eeDeploymentException if some inconsistency in the deployment is - * detected - */ - private boolean checkApplication(Deployment _d) throws J2eeDeploymentException { - boolean result = false; - int count = 0; - int others = 0; - - - // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server - Object o = checkModule( jarDeployer, _d.name, _d.localUrl.toString() ); - - if( o == null ) - ++others; - else - result = ((Boolean) o).booleanValue(); - - if (warDeployer != null ) { - for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); ) { - Deployment.Module m = (Deployment.Module)webModules.next(); - o = checkModule( warDeployer, m.name, m.localUrls.firstElement().toString() ); - - if (o == null) // had an exception - ++others; - else if (count++ == 0) // first module -> set state - result = ((Boolean)o).booleanValue(); - else if (result != ((Boolean)o).booleanValue()) // only if differs from state - ++others; - } - } - else { - // in case we are not running with tomcat - log.warn("Cannot find web container"); - } - - if (others > 0) - // there was at least one error... - throw new J2eeDeploymentException("Application "+_d.name+" is not correctly deployed! ("+ - (result ? count-others : others)+ - " modules are running "+ - (result ? others : count-others)+ - " are not)"); - return result; - } - - private Object checkModule( ObjectName container, String moduleName, String moduleUrl ) { - try { - log.info("Checking module " + moduleName); - // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server - return server.invoke(container, "isDeployed", - new Object[] { moduleUrl }, new String[] { "java.lang.String" }); - } - catch (MBeanException _mbe) { - log.error("Error while checking module " + moduleName + ": " + _mbe.getTargetException().getMessage()); - return null; - } - catch (JMException _jme) { - log.error("Fatal error while checking module " + moduleName + ": " + _jme.getMessage()); - return null; - } - } - - - - /** tests if the web container deployer is available - * <comment author="cgjung"> better be protected for subclassing </comment> - */ - protected boolean warDeployerAvailable() { - return server.isRegistered(warDeployer); - } - - /** tests if the web container deployer is available - */ - protected boolean rarDeployerAvailable() { - return server.isRegistered(rarDeployer); - } + // since tomcat changes the context classloader... + Thread.currentThread().setContextClassLoader(appCl); + } + + // Deploy the connector modules + it = _d.connectorModules.iterator(); + if (it.hasNext() && !rarDeployerAvailable()) + throw new J2eeDeploymentException("application contains rar files but no rar deployer available"); + + while( it.hasNext() ) + { + m = (Deployment.Module)it.next(); + moduleName = m.name; + log.info("Starting module " + moduleName); - /** tests if the web container deployer is available - */ - protected boolean javaDeployerAvailable() { - return server.isRegistered(javaDeployer); - } + // Call the rar deployer that is loaded in the JMX server + Object[] args = {m.localUrls.firstElement().toString()}; + String[] types = { "java.lang.String" }; + server.invoke(rarDeployer, "deploy", args, types); + } - /** - * creates an application class loader for this deployment - * this class loader will be shared between jboss and tomcat via the contextclassloader. May throw - * a J2eeDeploymentException to indicate problems stting up the classloader. - * <comment author="cgjung"> should be protected in order to allow reasonable subclassing. Needs an - * exception in case that you do more sophisticated meta-data installations. - * </comment> - */ - protected void createContextClassLoader(Deployment deployment) throws J2eeDeploymentException { - - // get urls we want all classloaders of this application to share - URL[] urls = new URL[deployment.commonUrls.size()]; - for (int i = 0, l = deployment.commonUrls.size(); i < l; ++i) - urls[i] = (URL)deployment.commonUrls.elementAt(i); - - // create classloader - ClassLoader parent = Thread.currentThread().getContextClassLoader(); - URLClassLoader appCl = new URLClassLoader(urls, parent); - - // set it as the context class loader for the deployment thread - Thread.currentThread().setContextClassLoader(appCl); - } + // Deploy the connector modules + it = _d.javaModules.iterator(); + if (it.hasNext() && !javaDeployerAvailable()) + throw new J2eeDeploymentException("application contains client java files but no java deployer available"); + + while( it.hasNext() ) + { + m = (Deployment.Module)it.next(); + moduleName = m.name; + log.info("Starting module " + moduleName); + // Call the rar deployer that is loaded in the JMX server + Object[] args = {m.localUrls.firstElement().toString()}; + String[] types = { "java.lang.String" }; + server.invoke(javaDeployer, "deploy", args, types); + } + } + catch (MBeanException e) + { + log.error("Starting "+moduleName+" failed!", e); + throw new J2eeDeploymentException("Error while starting "+moduleName+": " + + e.getTargetException().getMessage(), e.getTargetException()); + } + catch (RuntimeErrorException e) + { + log.error("Starting "+moduleName+" failed!", e); + throw new J2eeDeploymentException("Error while starting "+moduleName+": " + + e.getTargetError().getMessage(), e.getTargetError()); + } + catch (RuntimeMBeanException e) + { + log.error("Starting "+moduleName+" failed!", e); + throw new J2eeDeploymentException("Error while starting "+moduleName+": " + + e.getTargetException().getMessage(), e.getTargetException()); + } + catch (JMException e) + { + log.error("Starting failed!", e); + throw new J2eeDeploymentException("Fatal error while interacting with deployer MBeans... " + e.getMessage()); + } + finally + { + Thread.currentThread().setContextClassLoader(oldCl); + } + } + + /** + * Stops a running deployment. <br> + * Means the modules are undeployed by the responsible container deployer + * @param _d the deployment to stop + * @throws J2eeDeploymentException if an error occures for one of these + * modules + */ + protected void stopApplication(Deployment _d) throws J2eeDeploymentException + { + // save the old classloader, tomcat replaces my classloader somehow?! + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + StringBuffer error = new StringBuffer(); + + // stop the web modules + if( warDeployerAvailable() ) + { + for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); ) + { + Deployment.Module m = (Deployment.Module)webModules.next(); + stopModule( warDeployer, m.name, m.localUrls.firstElement().toString(), error ); + } + } + else if (!_d.webModules.isEmpty()) + { + // in case we are not running with tomcat + // should only happen for tomcat (i=1) + log.warn("Cannot find web container anymore!"); + } + + // stop the java modules + if( javaDeployerAvailable() ) + { + for( Iterator javaModules = _d.javaModules.iterator(); javaModules.hasNext(); ) + { + Deployment.Module m = (Deployment.Module)javaModules.next(); + stopModule( javaDeployer, m.name, m.localUrls.firstElement().toString(), error ); + } + } + else if (!_d.javaModules.isEmpty()) + { + // in case we are not running with tomcat + // should only happen for tomcat (i=1) + log.warn("Cannot find java deployer anymore!"); + } + + // stop the jar modules (the ContainerFactory is responsible for undeploying + // all jars associated w/ a given application) + stopModule( jarDeployer, _d.name, _d.localUrl.toString(), error ); + + // stop the java modules + if( rarDeployerAvailable() ) + { + for( Iterator connectorModules = _d.connectorModules.iterator(); connectorModules.hasNext(); ) + { + Deployment.Module m = (Deployment.Module)connectorModules.next(); + stopModule( rarDeployer, m.name, m.localUrls.firstElement().toString(), error ); + } + } + else if (!_d.connectorModules.isEmpty()) + { + // in case we are not running with tomcat + // should only happen for tomcat (i=1) + log.warn("Cannot find rar deployer anymore!"); + } + + if (!error.toString().equals("")) // there was at least one error... + throw new J2eeDeploymentException("Error(s) on stopping application "+_d.name+":\n"+error.toString()); + + // restore the classloader + Thread.currentThread().setContextClassLoader(oldCl); + } + + private void stopModule( ObjectName container, String moduleName, String moduleUrl, StringBuffer error ) + { + try + { + // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server + Object result = server.invoke(container, "isDeployed", + new Object[] { moduleUrl }, + new String[] { "java.lang.String" } + ); + if (((Boolean)result).booleanValue()) + { + log.info("Stopping module " + moduleName); + server.invoke(container, "undeploy", + new Object[] { moduleUrl }, new String[] + { "java.lang.String" }); + } + else + log.info("Module " + moduleName + " is not running"); + } + catch (MBeanException _mbe) + { + log.error("Unable to stop module " + moduleName + ": " + _mbe.getTargetException().getMessage()); + error.append("Unable to stop module " + moduleName + ": " + _mbe.getTargetException().getMessage()); + error.append("/n"); + } + catch (JMException _jme) + { + log.error("Unable to stop module " + moduleName + ": " + _jme.getMessage()); + error.append("Unable to stop module " + moduleName + ": fatal error while calling " + container + ": " + _jme.getMessage()); + error.append("/n"); + } + } + + /** Checks the Deplyment if it is correctly deployed. + * @param app to check + * @throws J2eeDeploymentException if some inconsistency in the deployment is + * detected + */ + private boolean checkApplication(Deployment _d) throws J2eeDeploymentException + { + boolean result = false; + int count = 0; + int others = 0; + + + // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server + Object o = checkModule( jarDeployer, _d.name, _d.localUrl.toString() ); + + if( o == null ) + ++others; + else + result = ((Boolean) o).booleanValue(); + + if (warDeployer != null ) + { + for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); ) + { + Deployment.Module m = (Deployment.Module)webModules.next(); + o = checkModule( warDeployer, m.name, m.localUrls.firstElement().toString() ); + + if (o == null) // had an exception + ++others; + else if (count++ == 0) // first module -> set state + result = ((Boolean)o).booleanValue(); + else if (result != ((Boolean)o).booleanValue()) // only if differs from state + ++others; + } + } + else + { + // in case we are not running with tomcat + log.warn("Cannot find web container"); + } + + if (others > 0) + // there was at least one error... + throw new J2eeDeploymentException("Application "+_d.name+" is not correctly deployed! ("+ + (result ? count-others : others)+ + " modules are running "+ + (result ? others : count-others)+ + " are not)"); + return result; + } + + private Object checkModule( ObjectName container, String moduleName, String moduleUrl ) + { + try + { + log.info("Checking module " + moduleName); + // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server + return server.invoke(container, "isDeployed", + new Object[] + { moduleUrl }, new String[] + { "java.lang.String" }); + } + catch (MBeanException _mbe) + { + log.error("Error while checking module " + moduleName + ": " + _mbe.getTargetException().getMessage()); + return null; + } + catch (JMException _jme) + { + log.error("Fatal error while checking module " + moduleName + ": " + _jme.getMessage()); + return null; + } + } + + + + /** tests if the web container deployer is available + * <comment author="cgjung"> better be protected for subclassing </comment> + */ + protected boolean warDeployerAvailable() + { + return server.isRegistered(warDeployer); + } + + /** tests if the web container deployer is available + */ + protected boolean rarDeployerAvailable() + { + return server.isRegistered(rarDeployer); + } + + /** tests if the web container deployer is available + */ + protected boolean javaDeployerAvailable() + { + return server.isRegistered(javaDeployer); + } + + /** + * creates an application class loader for this deployment + * this class loader will be shared between jboss and tomcat via the contextclassloader. May throw + * a J2eeDeploymentException to indicate problems stting up the classloader. + * <comment author="cgjung"> should be protected in order to allow reasonable subclassing. Needs an + * exception in case that you do more sophisticated meta-data installations. + * </comment> + */ + protected void createContextClassLoader(Deployment deployment) throws J2eeDeploymentException + { + + // get urls we want all classloaders of this application to share + URL[] urls = new URL[deployment.commonUrls.size()]; + for (int i = 0, l = deployment.commonUrls.size(); i < l; ++i) + urls[i] = (URL)deployment.commonUrls.elementAt(i); + + // create classloader + ClassLoader parent = Thread.currentThread().getContextClassLoader(); + URLClassLoader appCl = new URLClassLoader(urls, parent); + + // set it as the context class loader for the deployment thread + Thread.currentThread().setContextClassLoader(appCl); + } } 1.5 +1 -2 jboss/src/main/org/jboss/deployment/J2eeModuleMetaData.java Index: J2eeModuleMetaData.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/deployment/J2eeModuleMetaData.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- J2eeModuleMetaData.java 2001/08/03 17:15:42 1.4 +++ J2eeModuleMetaData.java 2001/11/26 03:17:47 1.5 @@ -6,7 +6,6 @@ */ package org.jboss.deployment; -import org.jboss.ejb.DeploymentException; import org.jboss.metadata.MetaData; import org.w3c.dom.Element; @@ -16,7 +15,7 @@ * * @see <related> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Schulze</a> - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ */ public class J2eeModuleMetaData extends MetaData
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development