1 4 package com.tc.aspectwerkz.hook.impl; 5 6 import com.tc.aspectwerkz.hook.ClassPreProcessor; 7 8 import java.io.File ; 9 import java.io.IOException ; 10 import java.net.MalformedURLException ; 11 import java.net.URL ; 12 import java.util.ArrayList ; 13 import java.util.Collections ; 14 import java.util.Enumeration ; 15 import java.util.Iterator ; 16 import java.util.List ; 17 import java.util.Map ; 18 import java.util.WeakHashMap ; 19 20 26 public class StdoutPreProcessor implements ClassPreProcessor { 27 31 private static Map classloaders; 32 33 36 private static final long stepms = 15000; 37 38 private static transient long lastPrinted = 0; 39 40 private void log(String s) { 41 System.out.println(Thread.currentThread().getName() + ": StdoutPreProcessor: " + s); 42 } 43 44 public void initialize() { 45 log("initialize"); 46 log("loaded by " + this.getClass().getClassLoader()); 47 classloaders = Collections.synchronizedMap(new WeakHashMap ()); 48 49 registerClassLoader(this.getClass().getClassLoader(), this.getClass().getName()); 51 } 52 53 public byte[] preProcess(String klass, byte[] abyte, ClassLoader caller) { 54 klass = klass.replace('.', '/') + ".class"; 56 URL u = caller.getResource(klass); 57 log("> " + klass + " [" + ((u == null) ? "?" : u.toString()) + "] [" + caller + "]"); 58 59 67 registerClassLoader(caller, klass); 69 70 registerSearchPath(caller, klass); 72 73 if (System.currentTimeMillis() > (lastPrinted + stepms)) { 75 lastPrinted = System.currentTimeMillis(); 76 log("*******************************"); 77 log("size=" + classloaders.size()); 78 dumpHierarchy(null, ""); 79 log("*******************************"); 80 } 81 return abyte; 82 } 83 84 90 private void registerClassLoader(ClassLoader loader, String firstClassLoaded) { 91 if (loader != null) { 92 if (!classloaders.containsKey(loader)) { 93 registerClassLoader(loader.getParent(), loader.getClass().getName()); 95 registerSearchPath(loader.getParent(), loader.getClass().getName()); 96 URL u = null; 97 98 try { 108 Enumeration ue = loader.getResources("META-INF/MANIFEST.MF"); 111 if (ue.hasMoreElements()) { 112 log("--- in scope for " + loader); 113 } 114 while (ue.hasMoreElements()) { 115 log("--- " + ue.nextElement().toString()); 116 } 117 } catch (IOException e) { 118 ; 119 } 120 121 log("****" + loader + " [" + ((u == null) ? "?" : u.toString()) + "] [" + firstClassLoaded + ']'); 123 classloaders.put(loader, new ArrayList ()); 124 } 125 126 } 128 } 129 130 133 private void dumpHierarchy(ClassLoader parent, String depth) { 134 List cl = new ArrayList (classloaders.keySet()); 136 ClassLoader current = null; 137 for (Iterator i = cl.iterator(); i.hasNext();) { 138 current = (ClassLoader ) i.next(); 139 if (current.getParent() == parent) { 140 log(depth + current + '[' + classloaders.get(current)); 141 142 List path = (List ) classloaders.get(current); 144 ClassLoader currentParent = current.getParent(); 145 while (currentParent != null) { 146 for (Iterator us = path.iterator(); us.hasNext();) { 147 URL u = (URL ) us.next(); 148 if (((List ) classloaders.get(currentParent)).contains(u)) { 149 log("!!!! duplicate detected for " + u + " in " + current); 150 } 151 } 152 currentParent = currentParent.getParent(); 153 } 154 dumpHierarchy(current, depth + " "); 155 } 156 } 157 } 158 159 private void registerSearchPath(final ClassLoader loader, final String klass) { 160 if (loader == null) { 162 return; 163 } 164 165 String klassFile = klass.replace('.', '/') + ".class"; 167 URL uKlass = loader.getResource(klassFile); 168 if (uKlass == null) { 169 return; 170 } 171 172 URL uRoot = null; 174 int i = uKlass.toString().indexOf('!'); 175 if (i > 0) { 176 try { 178 uRoot = (new File (uKlass.toString().substring(4, i))).getCanonicalFile().toURL(); 181 182 } catch (MalformedURLException e) { 184 e.printStackTrace(); 185 return; 186 } catch (IOException e2) { 187 e2.printStackTrace(); 188 return; 189 } 190 } else { 191 i = uKlass.toString().indexOf(klassFile); 193 try { 194 uRoot = (new File (uKlass.toString().substring(0, i))).getCanonicalFile().toURL(); 195 } catch (MalformedURLException e) { 196 e.printStackTrace(); 197 return; 198 } catch (IOException e2) { 199 e2.printStackTrace(); 200 return; 201 } 202 } 203 204 ClassLoader parent = loader.getParent(); 206 while (parent != null) { 207 if (((List ) classloaders.get(parent)).contains(uRoot)) { 208 return; 209 } 210 parent = parent.getParent(); 211 } 212 213 List path = (List ) classloaders.get(loader); 216 if (!path.contains(uRoot)) { 217 log("adding path " + uRoot + " to " + loader); 218 path.add(uRoot); 219 } 220 } 221 222 public static void main(String [] args) throws Exception { 223 URL u = new URL ( 224 "jar:file:/C:/bea/user_projects/domains/mydomain/myserver/.wlnotdelete/gallery/gallery-rar.jar!/" 225 ); 226 227 URL u2 = new URL ( 229 "jar:file:/C:/bea/user_projects/domains/mydomain/./myserver/.wlnotdelete/gallery/gallery-rar.jar!/" 230 ); 231 if (u.sameFile(u2)) { 232 System.out.println("same"); 233 } else { 234 System.out.println("differ"); 235 } 236 } 237 } | Popular Tags |