Revision 24256

View differences:

branches/v2_0_0_prep/libraries/libTools/src/org/gvsig/tools/extensionpoint/impl/DefaultExtensionPoint.java
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

  
67
	private String name;
68
	private String description;
69

  
70
	private Map alias; // Map of Extension
71
	private LinkedHashMap extensions; // Map of Extension
72

  
73
	private DefaultExtensionPointManager manager;
74

  
75
	DefaultExtensionPoint(ExtensionPointManager manager, String name) {
76
		this.initialize(manager, name, "");
77
	}
78

  
79
	DefaultExtensionPoint(ExtensionPointManager manager, String name,
80
			String description) {
81
		this.initialize(manager, name, description);
82
	}
83

  
84
	private void initialize(ExtensionPointManager manager, String name,
85
			String description) {
86
		this.manager = (DefaultExtensionPointManager) manager;
87
		this.name = name;
88
		this.description = description;
89
		this.alias = new HashMap();
90
		this.extensions = new LinkedHashMap();
91
	}
92

  
93
	private ExtensionPoint.Extension append(Extension extension) {
94
		this.extensions.put(extension.getName(), extension);
95
		return extension;
96
	}
97

  
98
	public ExtensionPoint.Extension append(String name, String description,
99
			ExtensionBuilder builder) {
100
		return append(new Extension(name, description, builder));
101
	}
102

  
103
	public ExtensionPoint.Extension append(String name, String description,
104
			Class extension) {
105
		return append(new Extension(name, description, extension));
106
	}
107

  
108
	public String getDescription() {
109
		return this.description;
110
	}
111

  
112
	public String getName() {
113
		return this.name;
114
	}
115

  
116
	private Extension insert(Extension extension) {
117
		LinkedHashMap x = new LinkedHashMap();
118
		x.put(extension.getName(), extension);
119
		x.putAll(this.extensions);
120
		this.extensions = x;
121
		return extension;
122
	}
123

  
124
	public ExtensionPoint.Extension insert(String name, String description,
125
			Class extension) {
126
		return insert(new Extension(name, description, extension));
127
	}
128

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

  
134
	private ExtensionPoint.Extension insert(String beforeName,
135
			Extension extension) {
136
		if( this.extensions.get(beforeName) == null ) {
137
			return null;
138
		}
139
		LinkedHashMap x = new LinkedHashMap();
140

  
141
		Iterator it = this.extensions.entrySet().iterator();
142
		while (it.hasNext()) {
143
			Map.Entry e = (Map.Entry) it.next();
144
			if (e.getKey().equals(beforeName)) {
145
				x.put(extension.getName(), extension);
146
			}
147
			x.put(e.getKey(), e.getValue());
148
		}
149
		this.extensions = x;
150
		return extension;
151
	}
152

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

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

  
165
	public void setDescription(String description) {
166
		this.description = description;
167
	}
168

  
169
	public boolean addAlias(String name, String alias) {
170
		Extension extension = (Extension) this.extensions.get(name);
171
		if (extension == null) {
172
			return false;
173
		}
174
		this.alias.put(alias, extension);
175
		extension.alias.add(alias);
176
		return true;
177
	}
178

  
179
	public Object create(String name) throws InstantiationException,
180
			IllegalAccessException {
181
		Extension extension = (Extension) this.alias.get(name);
182
		if (extension == null) {
183
			extension = (Extension) this.extensions.get(name);
184
			if (extension == null) {
185
				return null; // FIXME: throw exception
186
			}
187
		}
188
		if (extension.isBuilder()) {
189
			return extension.getBuilder().create();
190
		}
191
		return this.manager.create(extension.getExtension());
192
	}
193

  
194
	public Object create(String name, Object[] args) throws SecurityException,
195
			IllegalArgumentException, NoSuchMethodException,
196
			InstantiationException, IllegalAccessException,
197
			InvocationTargetException {
198
		Extension extension = (Extension) this.alias.get(name);
199
		if (extension == null) {
200
			extension = (Extension) this.extensions.get(name);
201
			if (extension == null) {
202
				return null; // FIXME: throw exception
203
			}
204
		}
205
		if (extension.isBuilder()) {
206
			return extension.getBuilder().create(args);
207
		}
208
		return this.manager.create(extension.getExtension(), args);
209
	}
210

  
211
	public Object create(String name, Map args) throws SecurityException,
212
			IllegalArgumentException, NoSuchMethodException,
213
			InstantiationException, IllegalAccessException,
214
			InvocationTargetException {
215
		Extension extension = (Extension) this.alias.get(name);
216
		if (extension == null) {
217
			extension = (Extension) this.extensions.get(name);
218
			if (extension == null) {
219
				return null; // FIXME: throw exception
220
			}
221
		}
222
		if (extension.isBuilder()) {
223
			return extension.getBuilder().create(args);
224
		}
225
		return this.manager.create(extension.getExtension(), args);
226
	}
227

  
228
	public ExtensionPoint.Extension get(String name) {
229
		Extension extension = (Extension) this.alias.get(name);
230
		if (extension == null) {
231
			extension = (Extension) this.extensions.get(name);
232
			if (extension == null) {
233
				return null; // FIXME: throw exception
234
			}
235
		}
236
		return extension;
237
	}
238

  
239
	public int getCount() {
240
		return this.extensions.size();
241
	}
242

  
243
	public Iterator iterator() {
244
		return this.extensions.values().iterator();
245
	}
246

  
247
	public List getNames() {
248
		String[] names = (String[]) this.extensions.keySet().toArray();
249
		Arrays.sort(names);
250
		return Collections.unmodifiableList(Arrays.asList(names));
251
	}
252

  
253
}
0 254

  
branches/v2_0_0_prep/libraries/libTools/src/org/gvsig/tools/extensionpoint/impl/DefaultExtensionPointManager.java
1
package org.gvsig.tools.extensionpoint.impl;
2

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

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

  
16
public class DefaultExtensionPointManager implements ExtensionPointManager {
17

  
18
	private Map extensionsPoints;
19

  
20
	public DefaultExtensionPointManager() {
21
		this.extensionsPoints = new HashMap();
22
	}
23

  
24
	public Object create(Class cls) throws InstantiationException,
25
			IllegalAccessException {
26
		Object obj = null;
27

  
28
		if (cls == null) {
29
			return null;
30
		}
31
		obj = cls.newInstance();
32
		return obj;
33
	}
34

  
35
	public Object create(Class cls, Map args) throws SecurityException,
36
			NoSuchMethodException, IllegalArgumentException,
37
			InstantiationException, IllegalAccessException,
38
			InvocationTargetException {
39
		Object obj = null;
40
		Constructor create = null;
41
		Class[] types = new Class[1];
42
		Object[] argsx = new Object[1];
43

  
44
		if (cls == null) {
45
			return null;
46
		}
47
		types[0] = Map.class;
48
		argsx[0] = args;
49
		create = cls.getConstructor(types);
50
		obj = create.newInstance(argsx);
51
		return obj;
52
	}
53

  
54
	public Object create(Class cls, Object[] args) throws SecurityException,
55
			NoSuchMethodException, IllegalArgumentException,
56
			InstantiationException, IllegalAccessException,
57
			InvocationTargetException {
58
		Object obj = null;
59
		Constructor create = null;
60
		Class[] types = new Class[args.length];
61

  
62
		if (cls == null) {
63
			return null;
64
		}
65
		for (int n = 0; n < args.length; n++) {
66
			Object arg = args[n];
67
			types[n] = arg.getClass();
68
		}
69
		create = cls.getConstructor(types);
70
		obj = create.newInstance(args);
71
		return obj;
72
	}
73

  
74
	public ExtensionPoint create(String name, String description) {
75
		return new DefaultExtensionPoint(this, name, description);
76
	}
77

  
78
	public boolean add(ExtensionPoint extensionPoint) {
79
		this.extensionsPoints.put(extensionPoint.getName(), extensionPoint);
80
		return true;
81
	}
82

  
83
	public ExtensionPoint add(String name, String description) {
84
		ExtensionPoint ep = (ExtensionPoint) this.extensionsPoints.get(name);
85
		if (ep == null) {
86
			ep = new DefaultExtensionPoint(this, name, description);
87
			this.extensionsPoints.put(ep.getName(), ep);
88
		}
89
		return ep;
90
	}
91

  
92
	public ExtensionPoint.Extension add(String name, String description,
93
			String extName,
94
			String extDescription, Class extension) {
95
		ExtensionPoint ep = add(name, description);
96
		return ep.append(extName, extDescription, extension);
97
	}
98

  
99
	public ExtensionPoint.Extension add(String name, String description,
100
			String extName,
101
			String extDescription, ExtensionBuilder builder) {
102
		ExtensionPoint ep = add(name, description);
103
		return ep.append(extName, extDescription, builder);
104
	}
105

  
106
	public ExtensionPoint get(String name) {
107
		return (ExtensionPoint) this.extensionsPoints.get(name);
108
	}
109

  
110
	public int getCount() {
111
		return this.extensionsPoints.size();
112
	}
113

  
114
	public boolean has(String name) {
115
		return this.extensionsPoints.get(name) != null;
116
	}
117

  
118
	public Iterator interator() {
119
		return this.extensionsPoints.values().iterator();
120
	}
121

  
122
	public List getNames() {
123
		String[] names = (String[]) this.extensionsPoints.keySet().toArray();
124
		Arrays.sort(names);
125
		return Collections.unmodifiableList(Arrays.asList(names));
126
	}
127

  
128

  
129
}
0 130

  

Also available in: Unified diff