Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libTools / src / org / gvsig / tools / extensionpoint / impl / DefaultExtensionPoint.java @ 24906

History | View | Annotate | Download (7.37 KB)

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

    
3
import java.lang.reflect.InvocationTargetException;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.Collections;
7
import java.util.HashMap;
8
import java.util.Iterator;
9
import java.util.LinkedHashMap;
10
import java.util.List;
11
import java.util.Map;
12

    
13
import org.gvsig.tools.extensionpoint.ExtensionBuilder;
14
import org.gvsig.tools.extensionpoint.ExtensionPoint;
15
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
16

    
17
public class DefaultExtensionPoint implements ExtensionPoint {
18

    
19
        class Extension implements ExtensionPoint.Extension {
20
                private Class extension;
21
                private ExtensionBuilder builder;
22
                private String name;
23
                private String description;
24
                List alias;
25

    
26
                Extension(String name, String description, Class extension) {
27
                        alias = new ArrayList();
28
                        this.name = name;
29
                        this.description = description;
30
                        this.builder = null;
31
                        this.extension = extension;
32
                }
33

    
34
                Extension(String name, String description, ExtensionBuilder builder) {
35
                        alias = new ArrayList();
36
                        this.name = name;
37
                        this.description = description;
38
                        this.builder = builder;
39
                        this.extension = null;
40
                }
41

    
42
                public List getAlias() {
43
                        return Collections.unmodifiableList(this.alias);
44
                }
45

    
46
                public ExtensionBuilder getBuilder() {
47
                        return this.builder;
48
                }
49

    
50
                public String getDescription() {
51
                        return this.description;
52
                }
53

    
54
                public Class getExtension() {
55
                        return this.extension;
56
                }
57

    
58
                public String getName() {
59
                        return this.name;
60
                }
61

    
62
                public boolean isBuilder() {
63
                        return this.builder != null;
64
                }
65
                
66
                public Object create(String name) throws InstantiationException,
67
                        IllegalAccessException {
68
                        if (isBuilder()) {
69
                                return getBuilder().create();
70
                        }
71
                        return manager.create(getExtension());
72
                }
73

    
74
        
75
                public Object create(String name, Object[] args) throws SecurityException,
76
                        IllegalArgumentException, NoSuchMethodException,
77
                        InstantiationException, IllegalAccessException,
78
                        InvocationTargetException {
79
                        if (isBuilder()) {
80
                                return getBuilder().create(args);
81
                        }
82
                        return manager.create(getExtension(), args);
83
                }
84

    
85
                public Object create(String name, Map args) throws SecurityException,
86
                                IllegalArgumentException, NoSuchMethodException,
87
                                InstantiationException, IllegalAccessException,
88
                                InvocationTargetException {
89
                        if (isBuilder()) {
90
                                return getBuilder().create(args);
91
                        }
92
                        return manager.create(getExtension(), args);
93
                }
94

    
95
        
96
        }
97

    
98
        private String name;
99
        private String description;
100

    
101
        private Map alias; // Map of Extension
102
        private LinkedHashMap extensions; // Map of Extension
103

    
104
        private DefaultExtensionPointManager manager;
105

    
106
        DefaultExtensionPoint(ExtensionPointManager manager, String name) {
107
                this.initialize(manager, name, "");
108
        }
109

    
110
        DefaultExtensionPoint(ExtensionPointManager manager, String name,
111
                        String description) {
112
                this.initialize(manager, name, description);
113
        }
114

    
115
        private void initialize(ExtensionPointManager manager, String name,
116
                        String description) {
117
                this.manager = (DefaultExtensionPointManager) manager;
118
                this.name = name;
119
                this.description = description;
120
                this.alias = new HashMap();
121
                this.extensions = new LinkedHashMap();
122
        }
123

    
124
        private ExtensionPoint.Extension append(Extension extension) {
125
                this.extensions.put(extension.getName(), extension);
126
                return extension;
127
        }
128

    
129
        public ExtensionPoint.Extension append(String name, String description,
130
                        ExtensionBuilder builder) {
131
                return append(new Extension(name, description, builder));
132
        }
133

    
134
        public ExtensionPoint.Extension append(String name, String description,
135
                        Class extension) {
136
                return append(new Extension(name, description, extension));
137
        }
138

    
139
        public String getDescription() {
140
                return this.description;
141
        }
142

    
143
        public String getName() {
144
                return this.name;
145
        }
146

    
147
        private Extension insert(Extension extension) {
148
                LinkedHashMap x = new LinkedHashMap();
149
                x.put(extension.getName(), extension);
150
                x.putAll(this.extensions);
151
                this.extensions = x;
152
                return extension;
153
        }
154

    
155
        public ExtensionPoint.Extension insert(String name, String description,
156
                        Class extension) {
157
                return insert(new Extension(name, description, extension));
158
        }
159

    
160
        public ExtensionPoint.Extension insert(String name, String description,
161
                        ExtensionBuilder builder) {
162
                return insert(new Extension(name, description, builder));
163
        }
164

    
165
        private ExtensionPoint.Extension insert(String beforeName,
166
                        Extension extension) {
167
                if( this.extensions.get(beforeName) == null ) {
168
                        return null;
169
                }
170
                LinkedHashMap x = new LinkedHashMap();
171

    
172
                Iterator it = this.extensions.entrySet().iterator();
173
                while (it.hasNext()) {
174
                        Map.Entry e = (Map.Entry) it.next();
175
                        if (e.getKey().equals(beforeName)) {
176
                                x.put(extension.getName(), extension);
177
                        }
178
                        x.put(e.getKey(), e.getValue());
179
                }
180
                this.extensions = x;
181
                return extension;
182
        }
183

    
184
        synchronized public ExtensionPoint.Extension insert(String beforeName,
185
                        String name,
186
                        String description, Class extension) {
187
                return insert(beforeName, new Extension(name, description, extension));
188
        }
189

    
190
        synchronized public ExtensionPoint.Extension insert(String beforeName,
191
                        String name,
192
                        String description, ExtensionBuilder builder) {
193
                return insert(beforeName, new Extension(name, description, builder));
194
        }
195

    
196
        public void setDescription(String description) {
197
                this.description = description;
198
        }
199

    
200
        public boolean addAlias(String name, String alias) {
201
                Extension extension = (Extension) this.extensions.get(name);
202
                if (extension == null) {
203
                        return false;
204
                }
205
                this.alias.put(alias, extension);
206
                extension.alias.add(alias);
207
                return true;
208
        }
209

    
210
        public Object create(String name) throws InstantiationException,
211
                        IllegalAccessException {
212
                Extension extension = (Extension) this.alias.get(name);
213
                if (extension == null) {
214
                        extension = (Extension) this.extensions.get(name);
215
                        if (extension == null) {
216
                                return null; // FIXME: throw exception
217
                        }
218
                }
219
                return extension.create(name);
220
        }
221

    
222
        public Object create(String name, Object[] args) throws SecurityException,
223
                        IllegalArgumentException, NoSuchMethodException,
224
                        InstantiationException, IllegalAccessException,
225
                        InvocationTargetException {
226
                Extension extension = (Extension) this.alias.get(name);
227
                if (extension == null) {
228
                        extension = (Extension) this.extensions.get(name);
229
                        if (extension == null) {
230
                                return null; // FIXME: throw exception
231
                        }
232
                }
233
                return extension.create(name,args);
234
        }
235

    
236
        public Object create(String name, Map args) throws SecurityException,
237
                        IllegalArgumentException, NoSuchMethodException,
238
                        InstantiationException, IllegalAccessException,
239
                        InvocationTargetException {
240
                Extension extension = (Extension) this.alias.get(name);
241
                if (extension == null) {
242
                        extension = (Extension) this.extensions.get(name);
243
                        if (extension == null) {
244
                                return null; // FIXME: throw exception
245
                        }
246
                }
247
                return extension.create(name,args);
248
        }
249

    
250
        public ExtensionPoint.Extension get(String name) {
251
                Extension extension = (Extension) this.alias.get(name);
252
                if (extension == null) {
253
                        extension = (Extension) this.extensions.get(name);
254
                        if (extension == null) {
255
                                return null; // FIXME: throw exception
256
                        }
257
                }
258
                return extension;
259
        }
260

    
261
        public int getCount() {
262
                return this.extensions.size();
263
        }
264

    
265
        public Iterator iterator() {
266
                return this.extensions.values().iterator();
267
        }
268

    
269
        public List getNames() {
270
                String[] names = (String[]) this.extensions.keySet().toArray(
271
                                new String[] {});
272
                Arrays.sort(names);
273
                return Collections.unmodifiableList(Arrays.asList(names));
274
        }
275

    
276
        public boolean has(String name) {
277
                return this.extensions.containsKey(name);
278
        }
279

    
280
}