1 9 package com.vladium.emma.rt; 10 11 import java.io.File ; 12 import java.io.IOException ; 13 import java.io.InputStream ; 14 import java.util.Properties ; 15 import java.util.StringTokenizer ; 16 17 import com.vladium.emma.data.ICoverageData; 18 19 23 final class RTExitHook implements Runnable 24 { 25 27 28 public synchronized void run () 29 { 30 if (m_cdata != null) 31 { 32 RTCoverageDataPersister.dumpCoverageData (m_cdata, true, m_outFile, m_merge); 33 34 m_RT = null; 35 m_cdata = null; 36 } 37 } 38 39 public static void createClassLoaderClosure () 40 { 41 Properties closureMap = null; 42 43 InputStream in = null; 44 try 45 { 46 50 in = RTExitHook.class.getResourceAsStream (CLOSURE_RESOURCE); 51 if (in != null) 52 { 53 closureMap = new Properties (); 54 closureMap.load (in); 55 } 56 else 57 { 58 throw new Error ("packaging failure: closure resource not found"); 59 } 60 } 61 catch (Exception e) 62 { 63 e.printStackTrace (System.out); 64 65 throw new Error ("packaging failure: " + e.toString ()); 66 } 67 finally 68 { 69 if (in != null) try { in.close (); } catch (IOException ignore) { ignore.printStackTrace (); } 70 } 71 in = null; 72 73 final String closureList = closureMap.getProperty ("closure"); 74 if (closureList == null) 75 { 76 throw new Error ("packaging failure: no closure mapping"); 77 } 78 79 82 final ClassLoader loader = RTExitHook.class.getClassLoader (); 83 84 final StringTokenizer tokenizer = new StringTokenizer (closureList, ","); 85 while (tokenizer.hasMoreTokens ()) 86 { 87 final String className = tokenizer.nextToken (); 88 89 try 90 { 91 Class.forName (className, true, loader); 92 } 93 catch (Exception e) 94 { 95 throw new Error ("packaging failure: class [" + className + "] not found {" + e.toString () + "}"); 96 } 97 } 98 } 99 100 102 104 105 RTExitHook (final Class RT, final ICoverageData cdata, final File outFile, final boolean merge) 106 { 107 m_RT = RT; 108 m_cdata = cdata; 109 110 m_outFile = outFile; 111 m_merge = merge; 112 } 113 114 116 117 private final File m_outFile; 118 private final boolean m_merge; 119 120 private Class m_RT; private ICoverageData m_cdata; 122 123 private static final String CLOSURE_RESOURCE = "RTExitHook.closure"; 125 } | Popular Tags |