001    /*****************************************************************************
002     * Copyright (C) NanoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by Aslak Hellesoy and Paul Hammant                          *
009     *****************************************************************************/
010    package org.nanocontainer.booter;
011    
012    import java.io.File;
013    import java.io.IOException;
014    import java.lang.reflect.Constructor;
015    import java.lang.reflect.InvocationTargetException;
016    import java.net.MalformedURLException;
017    import java.net.URL;
018    import java.net.URLClassLoader;
019    
020    /**
021     * NanoContainerBooter instantiated the NanoContainer {@link org.nanocontainer.Standalone Standalone} 
022     * startup class using a tree of common and hidden classloaders.
023     * 
024     * @author Paul Hammant
025     * @author Mauro Talevi
026     * @see org.nanocontainer.Standalone
027     */
028    public class NanoContainerBooter {
029    
030        private static final String COMMON_PATH = "lib/common";
031        private static final String HIDDEN_PATH = "lib/hidden";
032    
033        /**
034         * Static entry point to NanoContainerBooter
035         * @param args the arguments passed on to Standalone
036         * @throws Exception
037         */
038        public static void main(String[] args) throws Exception {
039            new NanoContainerBooter(args);
040        }
041    
042        /**
043         * Instantiates the NanoContainer Standalone class
044         * 
045         * @param args the arguments passed on to Standalone
046         * 
047         * @throws ClassNotFoundException
048         * @throws IllegalAccessException
049         * @throws InvocationTargetException
050         * @throws InstantiationException
051         * @throws IOException
052         */
053        public NanoContainerBooter(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {
054    
055            URLClassLoader commonClassLoader = new URLClassLoader(toURLs(COMMON_PATH),
056                            NanoContainerBooter.class.getClassLoader().getParent() );
057    
058            URLClassLoader hiddenClassLoader = new URLClassLoader(toURLs(HIDDEN_PATH), 
059                            commonClassLoader );
060    
061            System.out.println("NanoContainer Booter: Booting...");
062            newStandalone(hiddenClassLoader, args);
063            System.out.println("NanoContainer Booter: Booted.");
064    
065        }
066    
067        /**
068         * Instantiates a new Standalone 
069         * 
070         * @param classLoader the ClassLoader used to instantiate class
071         * @param args the arguments passed to Standalone
072         * 
073         * @throws ClassNotFoundException
074         * @throws InstantiationException
075         * @throws IllegalAccessException
076         * @throws InvocationTargetException
077         */
078        private void newStandalone(URLClassLoader classLoader, String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
079            Class nanoStandalone = classLoader.loadClass("org.nanocontainer.Standalone");
080            Constructor constructor = nanoStandalone.getConstructors()[0];
081            constructor.newInstance(new Object[]{args});
082        }
083    
084        /**
085         * Converts files path to URLs
086         * @param path the files path
087         * @return The array of URLs, one for each file in path
088         * @throws MalformedURLException
089         */
090        private URL[] toURLs(String path) throws MalformedURLException{
091            File[] files = new File(path).listFiles();
092            URL[] urls = new URL[files.length];
093            for (int i = 0; i < files.length; i++) {
094                urls[i]= files[i].toURL();
095            }
096            return urls;
097        }
098    }