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 }