gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.dynform / org.gvsig.tools.dynform.impl / src / main / java / org / gvsig / tools / dynform / main / DynClassBuilder.java @ 1118
History | View | Annotate | Download (7.26 KB)
1 |
package org.gvsig.tools.dynform.main; |
---|---|
2 |
|
3 |
import java.lang.annotation.Annotation; |
4 |
import java.lang.reflect.Field; |
5 |
import java.lang.reflect.Method; |
6 |
import java.util.HashMap; |
7 |
import java.util.Iterator; |
8 |
import java.util.Map; |
9 |
import org.apache.commons.lang3.StringUtils; |
10 |
import org.gvsig.tools.ToolsLocator; |
11 |
import org.gvsig.tools.dataTypes.DataType; |
12 |
import org.gvsig.tools.dataTypes.DataTypes; |
13 |
import org.gvsig.tools.dataTypes.DataTypesManager; |
14 |
import org.gvsig.tools.dynobject.DynClass; |
15 |
import org.gvsig.tools.dynobject.DynField; |
16 |
import org.gvsig.tools.dynobject.DynObjectManager; |
17 |
import org.gvsig.tools.dynobject.impl.DefaultDynClass; |
18 |
import org.gvsig.tools.dynobject.impl.DefaultDynField; |
19 |
|
20 |
public class DynClassBuilder { |
21 |
|
22 |
private Class theClass; |
23 |
|
24 |
private DefaultDynClass struct = null; |
25 |
private Map dynClasses = null; |
26 |
|
27 |
public DynClassBuilder() {
|
28 |
this.dynClasses = new HashMap(); |
29 |
} |
30 |
|
31 |
private DynObjectManager getManager() {
|
32 |
return ToolsLocator.getDynObjectManager();
|
33 |
} |
34 |
|
35 |
private DefaultDynField getOrCreateDynField(String name) { |
36 |
DefaultDynField dynfield = (DefaultDynField) this.struct.getDynField(name);
|
37 |
if ( dynfield == null ) { |
38 |
dynfield = new DefaultDynField(name, DataTypes.UNKNOWN);
|
39 |
dynfield = (DefaultDynField) this.struct.addDynField(dynfield);
|
40 |
} |
41 |
return dynfield;
|
42 |
} |
43 |
|
44 |
private dynobjectmetadata getDynobjectMetadata(Annotation[] annotations) { |
45 |
for ( int i = 0; i < annotations.length; i++ ) { |
46 |
Annotation annotation = annotations[i];
|
47 |
if ( annotation instanceof dynobjectmetadata ) { |
48 |
return (dynobjectmetadata) annotation;
|
49 |
} |
50 |
} |
51 |
return null; |
52 |
} |
53 |
|
54 |
private DynField createOrUpdateDynField(String name, Class declaringClass, Annotation[] annotations) { |
55 |
DataType type = null;
|
56 |
try {
|
57 |
DataTypesManager dataManager = ToolsLocator.getDataTypesManager(); |
58 |
type = dataManager.getDataType(declaringClass); |
59 |
} catch (IllegalArgumentException ex) { |
60 |
} catch (Exception ex) { |
61 |
|
62 |
} |
63 |
DefaultDynField dynfield = getOrCreateDynField(name); |
64 |
|
65 |
if ( dynfield.getType() == DataTypes.UNKNOWN ) {
|
66 |
dynfield.setType(type); |
67 |
DynClass declaringDynClass = null;
|
68 |
if ( type.getType() == DataTypes.OBJECT ) {
|
69 |
declaringDynClass = getManager().get(declaringClass.getName()); |
70 |
if ( declaringDynClass == null ) { |
71 |
declaringDynClass = (DynClass) this.dynClasses.get(declaringClass.getName());
|
72 |
} |
73 |
if ( declaringDynClass == null ) { |
74 |
DynClassBuilder builder = new DynClassBuilder();
|
75 |
declaringDynClass = builder.createDynClass(declaringClass); |
76 |
this.dynClasses.put(declaringDynClass.getName(), declaringDynClass);
|
77 |
} |
78 |
if ( declaringDynClass != null ) { |
79 |
dynfield.setType(DataTypes.DYNOBJECT); |
80 |
dynfield.setClassOfValue(declaringDynClass); |
81 |
} |
82 |
} |
83 |
} |
84 |
dynobjectmetadata metadata = this.getDynobjectMetadata(annotations);
|
85 |
if ( metadata != null ) { |
86 |
dynfield.setReadOnly(metadata.readonly()); |
87 |
dynfield.setMandatory(metadata.mandatory()); |
88 |
if ( !StringUtils.isBlank(metadata.label()) ) {
|
89 |
dynfield.setLabel(metadata.label()); |
90 |
} |
91 |
if ( !StringUtils.isBlank(metadata.description()) ) {
|
92 |
dynfield.setDescription(metadata.description()); |
93 |
} |
94 |
if ( !StringUtils.isBlank(metadata.subtype()) ) {
|
95 |
dynfield.setSubtype(metadata.subtype()); |
96 |
} |
97 |
if ( !StringUtils.isBlank(metadata.defaultValue()) ) {
|
98 |
dynfield.setDefaultDynValue(metadata.defaultValue()); |
99 |
} |
100 |
if ( !StringUtils.isBlank(metadata.group()) ) {
|
101 |
dynfield.setGroup(metadata.group()); |
102 |
} |
103 |
// if ( !StringUtils.isBlank(metadata.name()) ) {
|
104 |
// this.struct.renameField(dynfield.getName(),metadata.name());
|
105 |
// }
|
106 |
if ( metadata.order() >= 0 ) { |
107 |
dynfield.setOrder(metadata.order()); |
108 |
} |
109 |
} |
110 |
return dynfield;
|
111 |
} |
112 |
|
113 |
private boolean isGetter(Method method) { |
114 |
String name = method.getName();
|
115 |
return name.startsWith("get") && Character.isUpperCase(name.charAt(3)); |
116 |
} |
117 |
|
118 |
private String getAttributeName(Method method) { |
119 |
if ( !isGetter(method) ) {
|
120 |
return null; |
121 |
} |
122 |
String name = method.getName();
|
123 |
return name.substring(3, 4).toLowerCase() + name.substring(4); |
124 |
} |
125 |
|
126 |
private Method getSetter(Method getter) { |
127 |
Method[] methods = this.theClass.getMethods(); |
128 |
String setterName = "set" + getter.getName().substring(3); |
129 |
for ( int i = 0; i < methods.length; i++ ) { |
130 |
Method method = methods[i];
|
131 |
if ( method.getName().equals(setterName) ) {
|
132 |
return method;
|
133 |
} |
134 |
} |
135 |
return null; |
136 |
} |
137 |
|
138 |
private void createAttributesfOfFields() { |
139 |
|
140 |
Field[] fields = theClass.getFields(); |
141 |
for ( int i = 0; i < fields.length; i++ ) { |
142 |
Field field = fields[i];
|
143 |
DynField dynfield = createOrUpdateDynField( |
144 |
field.getName(), |
145 |
field.getType(), |
146 |
field.getAnnotations() |
147 |
); |
148 |
} |
149 |
|
150 |
} |
151 |
|
152 |
private void createAttributesOfMethods() { |
153 |
Method[] methods = theClass.getMethods(); |
154 |
for ( int i = 0; i < methods.length; i++ ) { |
155 |
Method method = methods[i];
|
156 |
if ( isGetter(method) ) {
|
157 |
Method setter = getSetter(method);
|
158 |
if ( setter != null ) { |
159 |
createOrUpdateDynField( |
160 |
getAttributeName(method), |
161 |
method.getReturnType(), |
162 |
method.getAnnotations() |
163 |
); |
164 |
} else {
|
165 |
dynobjectmetadata metadata = this.getDynobjectMetadata(method.getAnnotations());
|
166 |
if ( metadata != null && metadata.readonly() ) { |
167 |
createOrUpdateDynField( |
168 |
getAttributeName(method), |
169 |
method.getReturnType(), |
170 |
method.getAnnotations() |
171 |
); |
172 |
} |
173 |
} |
174 |
} |
175 |
} |
176 |
|
177 |
} |
178 |
|
179 |
public DynClass createDynClass(Object obj) { |
180 |
return this.createDynClass(obj.getClass()); |
181 |
} |
182 |
|
183 |
public DynClass createDynClass(Class theClass) { |
184 |
this.theClass = theClass;
|
185 |
this.struct = new DefaultDynClass(theClass.getName()); |
186 |
this.struct.setLabel(theClass.getCanonicalName());
|
187 |
this.dynClasses.put(this.struct.getName(), this.struct); |
188 |
|
189 |
this.createAttributesfOfFields();
|
190 |
this.createAttributesOfMethods();
|
191 |
|
192 |
return this.struct; |
193 |
} |
194 |
|
195 |
public void addAllClasses() { |
196 |
DynClass dynClass = null;
|
197 |
DynObjectManager manager = this.getManager();
|
198 |
Iterator it = this.dynClasses.values().iterator(); |
199 |
while( it.hasNext() ) {
|
200 |
dynClass = (DynClass) it.next(); |
201 |
manager.add(dynClass); |
202 |
} |
203 |
} |
204 |
} |