Statistics
| Revision:

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
}