1 21 package com.db4o.nativequery.main; 22 23 import java.io.*; 24 import java.net.*; 25 import java.util.*; 26 27 import EDU.purdue.cs.bloat.context.*; 28 import EDU.purdue.cs.bloat.editor.*; 29 import EDU.purdue.cs.bloat.file.*; 30 import EDU.purdue.cs.bloat.reflect.*; 31 32 import com.db4o.nativequery.bloat.*; 33 import com.db4o.nativequery.optimization.*; 34 import com.db4o.query.*; 35 36 public class Db4oEnhancingClassloader extends BloatingClassLoader { 38 private NativeQueryEnhancer enhancer=new NativeQueryEnhancer(); 39 private Map cache=new HashMap(); 40 private BloatUtil bloatUtil=new BloatUtil(new ClassFileLoader()); 41 42 public Db4oEnhancingClassloader(ClassLoader delegate) { 43 super(new URL[]{},delegate); 44 } 45 46 protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { 47 if(cache.containsKey(name)) { 48 return (Class )cache.get(name); 49 } 50 Class delegateClass = super.loadClass(name,resolve); 51 if(mustDelegate(name)) { 52 return delegateClass; 53 } 54 Class clazz=(Predicate.class.isAssignableFrom(delegateClass) ? findClass(name) : findRawClass(name)); 55 cache.put(clazz.getName(),clazz); 56 if(resolve) { 57 resolveClass(clazz); 58 } 59 return clazz; 60 } 61 62 private Class findRawClass(String className) throws ClassNotFoundException { 63 try { 64 String resourcePath=className.replace('.','/')+".class"; 65 InputStream resourceStream = getResourceAsStream(resourcePath); 66 ByteArrayOutputStream rawByteStream=new ByteArrayOutputStream(); 67 byte[] buf=new byte[4096]; 68 int bytesread=0; 69 while((bytesread=resourceStream.read(buf))>=0) { 70 rawByteStream.write(buf,0,bytesread); 71 } 72 resourceStream.close(); 73 byte[] rawBytes=rawByteStream.toByteArray(); 74 return super.defineClass(className, rawBytes, 0, rawBytes.length); 75 } catch (Exception exc) { 76 throw new ClassNotFoundException (className,exc); 77 } 78 } 79 80 private boolean mustDelegate(String name) { 81 return name.startsWith("java.")||name.startsWith("javax.")||name.startsWith("sun.")||(name.startsWith("com.db4o.")&&!name.startsWith("com.db4o.test.")); 82 } 83 84 protected void bloat(ClassEditor ce) { 85 try { 86 Type type=ce.superclass(); 87 while(type!=null) { 88 if(type.className().equals(Predicate.class.getName().replace('.','/'))) { 89 enhancer.enhance(bloatUtil,ce,Predicate.PREDICATEMETHOD_NAME,this.getParent()); 90 return; 91 } 92 ClassInfo classInfo=getClassInfoLoader().loadClass(type.className()); 93 type=new ClassEditor(new CachingBloatContext(getClassInfoLoader(),new ArrayList(),false),classInfo).superclass(); 94 } 95 } catch (Exception exc) { 97 throw new RuntimeException (exc.getMessage()); 98 } 99 } 100 } 101 | Popular Tags |