Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libTools / src / org / gvsig / tools / dynobject / impl / DefaultDynClass.java @ 25018

History | View | Annotate | Download (4.78 KB)

1
package org.gvsig.tools.dynobject.impl;
2

    
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.Iterator;
6
import java.util.LinkedHashMap;
7
import java.util.Map;
8

    
9
import org.gvsig.tools.dynobject.DynClass;
10
import org.gvsig.tools.dynobject.DynField;
11
import org.gvsig.tools.dynobject.DynObject;
12
import org.gvsig.tools.dynobject.DynObjectManager;
13

    
14
public class DefaultDynClass implements DynClass {
15

    
16
        class FieldAndIndex {
17
                DynField field;
18
                int index;
19
                
20
                FieldAndIndex(DynField field, int index) {
21
                        this.field = field;
22
                        this.index = index;
23
                }
24
        }
25
        
26
    private DefaultDynObjectManager manager;
27

    
28
    private String name;
29
    private String description;
30

    
31
    private Map parents;
32
        private Map fields;
33
    private Map declaredFields;
34
    
35
    private boolean needConsolide;
36

    
37
    public DefaultDynClass(DynObjectManager manager, String name, String description) {
38
            this.parents = new LinkedHashMap();
39
            this.fields = new LinkedHashMap();
40
            this.declaredFields = new HashMap();
41
            this.needConsolide = false;
42
            
43
            this.manager = (DefaultDynObjectManager) manager;
44
            this.name = name;
45
            this.description = description;
46
    }
47
    
48
    public DefaultDynClass(DynObjectManager manager, String name, String description, DynClass[] superClases) {
49
            this(manager,name,description);
50
            for( int i=0; i<superClases.length; i++ ) {
51
                    DynClass dynClass = superClases[i];
52
                    if( ! this.parents.containsKey(dynClass.getName()) ) {
53
                            this.parents.put(dynClass.getName(), dynClass);
54
                    }
55
            }
56
    }
57
    
58
           public DefaultDynObjectManager getManager() {
59
            return this.manager;
60
    }
61
    
62
    public Map getFieldsMap() {
63
            return this.fields;
64
    }
65
    
66
    public void consolide() {
67
            this.fields = new LinkedHashMap();
68
            int index = 0;
69
            Iterator it = this.declaredFields.values().iterator();
70
            while( it.hasNext() ) {
71
                    DynField field = (DynField) it.next();
72
                    this.fields.put(field.getName(), new FieldAndIndex(field,index++));
73
            }
74
            it = this.parents.values().iterator();
75
            while( it.hasNext() ) {
76
                    DefaultDynClass dynClass =  (DefaultDynClass) it.next();
77
                    Map fields = dynClass.getFieldsMap();
78
                    Iterator itf = fields.values().iterator();
79
                    while( itf.hasNext() ) {
80
                            DynField field = (DynField) it.next();
81
                            if( !this.fields.containsKey(field.getName()) ) {
82
                                    this.fields.put(field.getName(), new FieldAndIndex(field,index++));
83
                            }
84
                    }
85
            }
86
            this.needConsolide = false;
87
    }
88
    
89
        public void extend(DynClass dynClass) {
90
                if( this.parents.containsKey(dynClass.getName()) ) {
91
                        return;
92
                }
93
                this.parents.put(dynClass.getName(), dynClass);
94
                consolide();
95
        }
96

    
97
        public void extend(String dynClassName) {
98
                DynClass dynClass = manager.get(dynClassName);
99
                extend(dynClass);
100
        }
101

    
102
    int getFieldIndex(String name) {
103
            FieldAndIndex f = (FieldAndIndex) this.fields.get(name);
104
            if( f == null ) {
105
                    return -1;
106
            }
107
            return f.index;
108
    }
109
    
110
        public DynField getDeclaredDynField(String name) {
111
                return (DynField)this.declaredFields.get(name);
112
        }
113

    
114
        public DynField[] getDeclaredDynFields() {
115
                return (DynField[]) this.declaredFields.values().toArray();
116
        }
117

    
118
        public String getDescription() {
119
                return this.description;
120
        }
121

    
122
        public DynField getDynField(String name) {
123
                return ((FieldAndIndex)this.fields.get(name)).field;
124
        }
125

    
126
        public int getDynFieldsCount() {
127
                return this.fields.size();
128
        }
129
        
130
        public DynField[] getDynFields() {
131
                DynField[] fields = new DynField[ this.fields.size() ];
132
                int i=0;
133
                Iterator it = this.fields.values().iterator();
134
                while( it.hasNext() ) {
135
                        DynField field = (DynField) it.next();
136
                        fields[i++] = field;
137
                }
138
                return fields;
139
        }
140

    
141
        public String getName() {
142
                return this.name;
143
        }
144

    
145
        public DynField addDynField(String name) {
146
                this.needConsolide = true;
147
                DynField field = new DefaultDynField(name);
148
                return field;
149
        }
150

    
151
        public ArrayList _getSuperDynClasses(ArrayList dcList) {
152
                Iterator iter = parents.values().iterator();
153
                while (iter.hasNext()) {
154
                        DefaultDynClass dc = (DefaultDynClass) iter.next();
155
                        if (dc.parents.size() > 1)
156
                                dcList.add(dc._getSuperDynClasses(dcList));
157
                        if (!dcList.contains(dc))
158
                                dcList.add(dc);
159
                }
160
                return dcList;
161
        }
162

    
163
        public DynClass[] getSuperDynClasses() {
164
                ArrayList dcList = new ArrayList();
165
                return (DynClass[]) _getSuperDynClasses(dcList).toArray();
166
        }
167

    
168
        public DynObject newInstance() {
169
                return this.manager.createDynObject(this);
170
        }
171

    
172
        public boolean isInstance(DynObject dynObject) {
173
                ArrayList dcList = new ArrayList();
174
                _getSuperDynClasses(dcList);
175
                if (dcList.contains(dynObject.getDynClass()))
176
                        return true;
177
                return false;
178
        }
179

    
180
        public void removeDynField(String name) {
181
                // TODO Auto-generated method stub
182
                this.needConsolide = false;
183
        }
184

    
185
        public Iterator allParentDynClassesIterator() {
186
                // TODO Auto-generated method stub
187
                return null;
188
        }
189

    
190
    
191
}