1 package org.sourceforge.jemm.lifecycle;
2
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Map;
6 import java.util.Set;
7
8 import org.sourceforge.jemm.database.FieldInfo;
9 import org.sourceforge.jemm.database.FieldType;
10 import org.sourceforge.jemm.types.ID;
11
12
13
14
15
16
17
18
19
20
21 public class ShadowData {
22 ID id;
23 int version;
24 Map<FieldInfo, ID> fieldData;
25 Set<FieldInfo> initialisations;
26
27 public ShadowData(ID id, int version) {
28 if (id == null)
29 throw new IllegalArgumentException("ID may not be null");
30 this.id = id;
31 this.version = version;
32 }
33
34
35
36
37
38
39
40
41
42
43
44 @SuppressWarnings("unchecked")
45 public void setField(Class declaringClass, FieldType type, String name, ID value) {
46 initialiseFieldData();
47 if(type==FieldType.OBJECT || type==FieldType.OBJECT_ARRAY) {
48 fieldData.put(new FieldInfo(name,declaringClass, type), value);
49 }
50 }
51
52
53
54
55
56
57 private void initialiseFieldData() {
58 if (fieldData == null)
59 fieldData = new HashMap<FieldInfo, ID>();
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73 @SuppressWarnings("unchecked")
74 public ID getField(Class declaringClass, FieldType type, String name) {
75 FieldInfo key = new FieldInfo(name,declaringClass,type);
76
77 if (fieldData == null)
78 throw new RuntimeException("Field " + key + " does not exist");
79
80 if (fieldData.containsKey(key))
81 return fieldData.get(key);
82
83 throw new RuntimeException("Field " + key + " does not exist");
84 }
85
86
87
88
89
90
91
92 public FieldInfo[] getFields() {
93 if (fieldData == null)
94 return new FieldInfo[0];
95 return fieldData.keySet().toArray(new FieldInfo[0]);
96 }
97
98 public boolean hasField(Class<?> declaringClass, FieldType type, String name) {
99 if(fieldData==null)
100 return false;
101 return fieldData.containsKey(new FieldInfo(name,declaringClass,type));
102 }
103
104
105
106
107
108
109 public ID getID() {
110 return id;
111 }
112
113
114
115
116
117
118
119 public int getVersion() {
120 return version;
121 }
122
123
124
125
126
127
128
129 public void setVersion(int newVersion) {
130 version = newVersion;
131 }
132
133 private void initialiseMapSetup() {
134 if(initialisations==null)
135 initialisations = new HashSet<FieldInfo>();
136 }
137
138
139
140
141
142
143
144
145
146 public void initialiseField(Class<?> declaringClass, FieldType type, String name) {
147 if(!hasField(declaringClass,type,name))
148 return;
149 initialiseMapSetup();
150 initialisations.add(new FieldInfo(name,declaringClass,type));
151 }
152
153
154
155
156
157
158
159
160 public void clearInitialisation(Class<?> declaringClass, FieldType type, String name) {
161 if(initialisations==null)
162 return;
163 initialisations.remove(new FieldInfo(name,declaringClass, type));
164 }
165
166 public void clearInitialisations() {
167 if(initialisations==null)
168 return;
169 initialisations = null;
170 }
171
172
173
174
175
176
177
178
179
180 public boolean isFieldInitialised(Class<?> declaringClass, FieldType type, String name) {
181 FieldInfo key = new FieldInfo(name,declaringClass,type);
182 if(initialisations!=null && initialisations.contains(key)) {
183 return true;
184 }
185 return false;
186 }
187
188 public String toString() {
189 StringBuilder builder = new StringBuilder("ShadowData[");
190 for(FieldInfo fi : fieldData.keySet()) {
191 builder.append(fi);
192 builder.append("=");
193 builder.append(fieldData.get(fi));
194 if(initialisations.contains(fi))
195 builder.append("*");
196 builder.append(",");
197 }
198 builder.append("]");
199 return builder.toString();
200 }
201
202 }