1
2
3
4
5
6
7
8 package it.imolinfo.jbi4ejb.webservice.generator.bcm;
9
10
11 import it.imolinfo.jbi4ejb.Logger;
12 import it.imolinfo.jbi4ejb.LoggerFactory;
13 import it.imolinfo.jbi4ejb.webservice.generator.ClassMetaInfo;
14
15 import java.util.HashSet;
16 import java.util.Set;
17
18 import org.objectweb.asm.ClassAdapter;
19 import org.objectweb.asm.ClassVisitor;
20 import org.objectweb.asm.FieldVisitor;
21 import org.objectweb.asm.Type;
22
23
24
25
26
27 public class SerializableInspectorAdapter extends ClassAdapter {
28
29
30
31
32 public static final String INTERNAL_NAME_OF_SERIALIZABLE
33 = "java/io/Serializable";
34
35
36
37
38 public static final String FIELDNAME_SERIAL_VERSION_UID = "serialVersionUID";
39
40
41
42
43 private static final Logger LOG
44 = LoggerFactory.getLogger(SerializableInspectorAdapter.class);
45
46
47
48
49 private ClassMetaInfo classMetaInfo = new ClassMetaInfo();
50
51
52
53
54
55
56
57 public SerializableInspectorAdapter(ClassVisitor cv) {
58 super(cv);
59 }
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public void visit(int version, int access, String name, String signature,
79 String superName, String [] interfaces) {
80
81 LOG.debug("visit. version=" + version + "; access=" + access
82 + "; name" + name + "; superName=" + superName);
83
84 if (implementsSerializable(interfaces)) {
85 LOG.debug("The class " + name + " implements Serializable.");
86 classMetaInfo.setSerializable(true);
87
88 } else {
89 LOG.debug("The class " + name + " does not implement Serializable.");
90 classMetaInfo.setSerializable(false);
91 }
92
93 classMetaInfo.setClassName(name.replace('/', '.'));
94 classMetaInfo.setSuperClassName(superName.replace('/', '.'));
95
96 Set<String> set = new HashSet<String>();
97 if (interfaces != null) {
98 for (String current : interfaces) {
99 set.add(current.replace('/', '.'));
100 }
101 }
102 classMetaInfo.setInterfaces(set);
103
104 super.visit(version, access, name, signature, superName, interfaces);
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 public FieldVisitor visitField(int access, String name, String desc,
124 String signature, Object value) {
125
126 LOG.debug("visitField. access=" + access + "; name=" + name
127 + "; desc=" + desc + "; signature=" + signature + "; value=" + value);
128
129 if (hasSerialVersionUIDField(name, desc)) {
130 LOG.debug("The class " + name + " has a serial version UID:" + value);
131
132 classMetaInfo.setClassSerialVersionUid((Long) value);
133 }
134
135 return super.visitField(access, name, desc, signature, value);
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150 protected boolean hasSerialVersionUIDField(String name, String desc) {
151 if (FIELDNAME_SERIAL_VERSION_UID.equals(name)
152 && Type.LONG_TYPE.getDescriptor().equals(desc)) {
153
154 LOG.debug(FIELDNAME_SERIAL_VERSION_UID + " found.");
155 return true;
156 }
157
158 return false;
159 }
160
161
162
163
164
165
166
167
168
169 protected boolean implementsSerializable(String [] interfaces) {
170 if (interfaces == null || interfaces.length == 0) {
171 return false;
172 }
173
174 for (String current : interfaces) {
175 if (INTERNAL_NAME_OF_SERIALIZABLE.equals(current)) {
176 return true;
177 }
178 }
179
180 return false;
181 }
182
183
184
185
186
187
188 public ClassMetaInfo getClassMetaInfo() {
189 return classMetaInfo;
190 }
191
192
193
194
195
196
197
198 public void setClassMetaInfo(ClassMetaInfo classMetaInfo) {
199 this.classMetaInfo = classMetaInfo;
200 }
201
202 }