FileDocCategorySizeDatePackage
DeploymentFactoryInstaller.javaAPI DocGlassfish v2 API8342Fri May 04 22:34:26 BST 2007com.sun.enterprise.deployapi

DeploymentFactoryInstaller

public class DeploymentFactoryInstaller extends Object
This singleton object is responsible to resolving all the DeploymentManagerFactory installed in the RI and register them to the DeploymentManagerFactory
author
Jerome Dochez

Fields Summary
private static DeploymentFactoryInstaller
dfInstaller
private final String
J2EE_DEPLOYMENT_MANAGER_REPOSITORY
private final String
J2EE_DEPLOYMENT_MANAGER
private final String
J2EE_HOME
Constructors Summary
private DeploymentFactoryInstaller()
Creates a single instance of DeploymentManagerFactoryResolver

    
           
      
    
Methods Summary
public voidaddDeploymentFactory(java.io.File newDM)
Add a new deployment manager to our respository

        
        int number=1;
        // copy to the right location...
        File repository = new File(System.getProperty(J2EE_HOME)+File.separator+
            J2EE_DEPLOYMENT_MANAGER_REPOSITORY);
        File to = new File(repository, newDM.getName());
        while (to.exists()) {
            to = new File(repository, newDM.getName()+number);
            number++;
        }
        ArchivistUtils.copy(
            new BufferedInputStream(new FileInputStream(newDM)),
            new BufferedOutputStream(new FileOutputStream(to)));
        
        installDeploymentFactory(to);
    
    
public static com.sun.enterprise.deployapi.DeploymentFactoryInstallergetInstaller()

    
        if (dfInstaller==null) {
            dfInstaller = new DeploymentFactoryInstaller();
            dfInstaller.initialize();
        }
        return dfInstaller;
    
public java.io.File[]getListOfDeploymentFactoryFiles()

return
a list of installed deployment manager implementation archives

        
        File repository = new File(System.getProperty("com.sun.aas.installRoot")+File.separator+
            J2EE_DEPLOYMENT_MANAGER_REPOSITORY);
        
        if (DOLUtils.getDefaultLogger().isLoggable(Level.FINE)) {
            DOLUtils.getDefaultLogger().fine("J2EE Deployment factory repository = " 
                    + repository.getAbsolutePath());
        }
        if (!repository.exists()) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                new Object[] {"Cannot find any deployment manager"});
            return null;
        }
        
        return repository.listFiles();        
    
protected voidinitialize()

                
        File[] elligibleFiles = getListOfDeploymentFactoryFiles();
        if (elligibleFiles==null) {
            return;
        }
           
        for (int i=0;i<elligibleFiles.length;i++) {
            try {
                installDeploymentFactory(elligibleFiles[i]);
            } catch(Exception ioe) {
                ioe.printStackTrace();
                DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                    new Object[] {elligibleFiles[i].getName()});
            }
        }        
    
protected voidinstallDeploymentFactory(java.io.File installedDM)

        
        if (DOLUtils.getDefaultLogger().isLoggable(Level.FINE)) {
            DOLUtils.getDefaultLogger().fine("Installing Deployment factory = " 
                    + installedDM.getAbsolutePath());
        }
        
        // let's check first that we indeed have a valid 
        // deployment manager implementation
        
        /*
         *Declare the JarFile and Manifest but populate them inside the first try block.  This way the 
         *jar file can be closed right away to conserve resources.
         */
        JarFile jarFile = null;
        Manifest m = null;
        try {
            jarFile = new JarFile(installedDM);
            m = jarFile.getManifest();
        } finally {
            /*
             *The jarFile.close can throw IOException, but this method also throws that exception so there is no
             *need to catch it and wrap it here in the finally clause.
             */
            jarFile.close();
            jarFile = null;
        }
        String className = m.getMainAttributes().getValue(J2EE_DEPLOYMENT_MANAGER);
        URL[] urls = new URL[]{installedDM.toURI().toURL()};
        URLClassLoader urlClassLoader = new java.net.URLClassLoader(urls, getClass().getClassLoader());
        Class factory = null;
        try {
            factory=urlClassLoader.loadClass(className);
        } catch (ClassNotFoundException cnfe) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                new Object[] {"Unable to load declared DeploymentManagerFactory"});
            throw new IllegalArgumentException(className + " is not present in the " + installedDM.getName());
        }
        
        // Ok we have the class, let's instanciate it, check it and 
        // if everything is fine, register it to the DeploymentFactoryManager
        Object df = null;
        try {            
            df = factory.newInstance();
        } catch (Exception ie) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                    new Object[]{className});
            ie.printStackTrace();
            throw new IllegalArgumentException("Cannot install " + installedDM.getName());
        }
        if (df instanceof DeploymentFactory) {
            DeploymentFactoryManager.getInstance().registerDeploymentFactory((DeploymentFactory) df);
        } else {
            throw new IllegalArgumentException("The " + className + 
                " declared as a DeploymentFactory does implement the DeploymentFactory interface");
        }