1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
package org.apache.commons.javaflow.stores; |
18 | |
|
19 | |
import java.util.ArrayList; |
20 | |
import java.util.Collection; |
21 | |
import java.util.Iterator; |
22 | |
import org.apache.bcel.Repository; |
23 | |
import org.apache.bcel.util.ClassLoaderRepository; |
24 | |
import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer; |
25 | |
import org.apache.commons.javaflow.bytecode.transformation.bcel.BcelClassTransformer; |
26 | |
import org.apache.commons.jci.stores.MemoryResourceStore; |
27 | |
import org.apache.commons.jci.stores.ResourceStore; |
28 | |
import org.apache.commons.jci.stores.TransactionalResourceStore; |
29 | |
import org.apache.commons.logging.Log; |
30 | |
import org.apache.commons.logging.LogFactory; |
31 | |
|
32 | |
|
33 | |
|
34 | |
|
35 | |
|
36 | |
|
37 | |
|
38 | |
|
39 | |
|
40 | |
public final class JavaflowResourceStore extends TransactionalResourceStore { |
41 | |
|
42 | 0 | private final static Log log = LogFactory.getLog(JavaflowResourceStore.class); |
43 | |
|
44 | |
private final TransformingResourceStore tstore; |
45 | 0 | private final Collection changes = new ArrayList(); |
46 | |
|
47 | |
public JavaflowResourceStore() { |
48 | 0 | this(new MemoryResourceStore()); |
49 | 0 | } |
50 | |
|
51 | |
public JavaflowResourceStore(final ResourceStore pStore) { |
52 | 0 | super(pStore); |
53 | 0 | tstore = new TransformingResourceStore( |
54 | |
pStore, |
55 | |
new ResourceTransformer[] { new BcelClassTransformer() } |
56 | |
); |
57 | 0 | Repository.setRepository(new ClassLoaderRepository(this.getClass().getClassLoader())); |
58 | 0 | } |
59 | |
|
60 | |
public void write(final String pResourceName, final byte[] pResourceData) { |
61 | 0 | super.write(pResourceName, pResourceData); |
62 | 0 | changes.add(pResourceName); |
63 | 0 | } |
64 | |
|
65 | |
public void onStart() { |
66 | 0 | changes.clear(); |
67 | 0 | } |
68 | |
|
69 | |
public void onStop() { |
70 | 0 | if (changes.size() > 0) { |
71 | 0 | log.debug("rewriting" + changes); |
72 | |
|
73 | 0 | for (Iterator it = changes.iterator(); it.hasNext();) { |
74 | 0 | final String clazzName = (String) it.next(); |
75 | |
try { |
76 | 0 | final byte[] oldClazz = super.read(clazzName); |
77 | |
|
78 | 0 | if (oldClazz == null) { |
79 | 0 | throw new ClassNotFoundException("could not find " + clazzName); |
80 | |
} |
81 | |
|
82 | 0 | tstore.write(clazzName, oldClazz); |
83 | |
|
84 | 0 | log.debug("rewrote " + clazzName); |
85 | 0 | } catch (ClassNotFoundException e) { |
86 | 0 | log.error("", e); |
87 | 0 | } |
88 | 0 | } |
89 | |
|
90 | 0 | changes.clear(); |
91 | |
} |
92 | 0 | } |
93 | |
} |