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 private final static Log log = LogFactory.getLog(JavaflowResourceStore.class);
43
44 private final TransformingResourceStore tstore;
45 private final Collection changes = new ArrayList();
46
47 public JavaflowResourceStore() {
48 this(new MemoryResourceStore());
49 }
50
51 public JavaflowResourceStore(final ResourceStore pStore) {
52 super(pStore);
53 tstore = new TransformingResourceStore(
54 pStore,
55 new ResourceTransformer[] { new BcelClassTransformer() }
56 );
57 Repository.setRepository(new ClassLoaderRepository(this.getClass().getClassLoader()));
58 }
59
60 public void write(final String pResourceName, final byte[] pResourceData) {
61 super.write(pResourceName, pResourceData);
62 changes.add(pResourceName);
63 }
64
65 public void onStart() {
66 changes.clear();
67 }
68
69 public void onStop() {
70 if (changes.size() > 0) {
71 log.debug("rewriting" + changes);
72
73 for (Iterator it = changes.iterator(); it.hasNext();) {
74 final String clazzName = (String) it.next();
75 try {
76 final byte[] oldClazz = super.read(clazzName);
77
78 if (oldClazz == null) {
79 throw new ClassNotFoundException("could not find " + clazzName);
80 }
81
82 tstore.write(clazzName, oldClazz);
83
84 log.debug("rewrote " + clazzName);
85 } catch (ClassNotFoundException e) {
86 log.error("", e);
87 }
88 }
89
90 changes.clear();
91 }
92 }
93 }