1 package org.nanocontainer.booter; 2 3 import java.io.IOException ; 4 import java.lang.reflect.InvocationTargetException ; 5 import java.lang.reflect.Method ; 6 import java.net.MalformedURLException ; 7 import java.net.Socket ; 8 import java.net.URL ; 9 import java.net.URLClassLoader ; 10 import java.security.AccessControlException ; 11 import java.security.AllPermission ; 12 import java.util.HashMap ; 13 import java.util.Map ; 14 15 import org.picocontainer.MutablePicoContainer; 16 import org.picocontainer.PicoContainer; 17 import org.picocontainer.Startable; 18 import org.picocontainer.defaults.CustomPermissionsURLClassLoader; 19 import org.picocontainer.defaults.DefaultPicoContainer; 20 21 public class BrownBear implements Startable { 22 23 private MutablePicoContainer subContainer; 24 25 public BrownBear(Honey honey) throws NoSuchMethodException , IllegalAccessException , InvocationTargetException , InstantiationException , MalformedURLException , ClassNotFoundException { 26 27 try { 28 new Socket ("google.com", 80); 29 System.out.println("BrownBear: 'socket open' NOT blocked to google.com:80 (wrong)"); 30 } catch (AccessControlException e) { 31 System.out.println("BrownBear: 'socket open' blocked to google.com:80 (correct)"); 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 36 try { 37 new Socket ("yahoo.com", 80); 38 System.out.println("BrownBear: 'socket open' NOT blocked to yahoo.com:80 (correct)"); 39 } catch (AccessControlException e) { 40 e.printStackTrace(); 41 System.out.println("BrownBear: 'socket open' blocked to yahoo.com:80 (wrong)"); 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } 45 46 53 this.getClass().getClassLoader(); 54 System.out.println("BrownBear: Can access classloader of this class (correct)"); 55 56 System.out.println("BrownBear: I have eaten " + honey.eatSome() + " calories of Honey (of unknown type)"); 57 Class clazz = null; 58 try { 59 clazz = this.getClass().getClassLoader().loadClass("org.nanocontainer.boot.BeeHiveHoney"); 60 } catch (ClassNotFoundException cnfe) { 61 } 62 System.out.println("BrownBear: Can see class for BeeHiveHoney ? - " + (clazz != null)); 63 System.out.println("BrownBear: honey instance's class type - " + honey.getClass()); 64 Method nonInterfaceMethod = null; 65 try { 66 nonInterfaceMethod = honey.getClass().getMethod("nonInterfaceMethod", new Class [0]); 67 } catch (NoSuchMethodException exception) { 68 } 69 System.out.println("BrownBear: Can see honey instance's 'nonInterfaceMethod'? - " + (nonInterfaceMethod != null)); 70 boolean invoked = false; 71 try { 72 nonInterfaceMethod.invoke(honey, new Object [0]); 73 invoked = true; 74 } catch (Exception e) { 75 } 76 System.out.println("BrownBear: Can invoke honey instance's 'nonInterfaceMethod'? - " + invoked); 77 nonInterfaceMethod = null; 78 if (clazz != null) { 79 nonInterfaceMethod = clazz.getMethod("nonInterfaceMethod", new Class [0]); 80 } 81 System.out.println("BrownBear: Can see HoneyBeeHoney.nonInterfaceMethod()? - " + (nonInterfaceMethod != null)); 82 invoked = false; 83 try { 84 nonInterfaceMethod.invoke(honey, new Object [0]); 85 invoked = true; 86 } catch (Exception e) { 87 } 88 System.out.println("BrownBear: Can invoke HoneyBeeHoney class' 'nonInterfaceMethod' against honey's instance? - " + invoked); 89 System.out.println("BrownBear: Can leverage any implementation detail from honey instance? - false"); 90 91 subContainer = new DefaultPicoContainer(); 92 subContainer.registerComponentImplementation(Map .class, HashMap .class); 93 subContainer.registerComponentImplementation(PicoContainer.class, DefaultPicoContainer.class); 94 subContainer.getComponentInstance(Map .class); 95 subContainer.getComponentInstance(PicoContainer.class); 96 97 System.out.println("BrownBear: Can instantiate new DefaultPicoContainer (sub-container)"); 98 99 try { 100 new BrownBearHelper(); 101 System.out.println("BrownBear: Can instantiate new DefaultNanoContainer (sub-container) - wrong, DefaultNanoContainer should not be in the classpath"); 102 } catch (NoClassDefFoundError e) { 103 System.out.println("BrownBear: Cannot instantiate new DefaultNanoContainer (sub-container) - correct, DefaultNanoContainer is not in the classpath"); 104 } catch (ClassNotFoundException e) { 105 System.out.println("BrownBear: Cannot instantiate new HashMap (error!)"); 106 } 107 108 String qdox = "http://www.ibiblio.org/maven/qdox/jars/qdox-1.5.jar"; 109 try { 110 URLClassLoader urlClassLoader = new URLClassLoader (new URL [] {new URL (qdox)} ); 111 Class qdoxClass = urlClassLoader.loadClass("com.thoughtworks.qdox.JavaDocBuilder"); 112 qdoxClass.newInstance(); 113 System.out.println("BrownBear: Can instantiate new URLClassLoader (incorrect)"); 114 } catch (AccessControlException e) { 115 System.out.println("BrownBear: Cannot instantiate new URLClassLoader (correct)"); 116 } 117 118 Map permissionsMap = new HashMap (); 119 permissionsMap.put(qdox, new AllPermission ()); 120 121 try { 122 URLClassLoader urlClassLoader = new CustomPermissionsURLClassLoader(new URL [] {new URL (qdox)}, permissionsMap, this.getClass().getClassLoader() ); 123 Class qdoxClass = urlClassLoader.loadClass("com.thoughtworks.qdox.JavaDocBuilder"); 124 qdoxClass.newInstance(); 125 System.out.println("BrownBear: Can instantiate new CustomPermissionsURLClassLoader (incorrect)"); 126 } catch (AccessControlException e) { 127 System.out.println("BrownBear: Cannot instantiate new CustomPermissionsURLClassLoader (correct)"); 128 } 129 130 } 131 132 public void start() { 133 subContainer.start(); 134 System.out.println("BrownBear: Started sub-container"); 135 } 136 137 public void stop() { 138 subContainer.stop(); 139 } 140 } | Popular Tags |