root / trunk / extensions / extHyperlink / src / org / gvsig / hyperlink / layers / ManagerRegistry.java @ 28132
History | View | Annotate | Download (3.67 KB)
1 |
package org.gvsig.hyperlink.layers; |
---|---|
2 |
|
3 |
import java.util.Comparator; |
4 |
import java.util.HashMap; |
5 |
import java.util.HashSet; |
6 |
import java.util.Iterator; |
7 |
import java.util.TreeSet; |
8 |
|
9 |
import com.iver.andami.PluginServices; |
10 |
import com.iver.cit.gvsig.fmap.layers.FLayer; |
11 |
import com.iver.utiles.extensionPoints.ExtensionPoint; |
12 |
import com.iver.utiles.extensionPoints.ExtensionPointsSingleton; |
13 |
|
14 |
public class ManagerRegistry{ |
15 |
public static final String EXTENSIONPOINTNAME = "hyperlink.layer.manager"; |
16 |
private ExtensionPoint extensionPoint;
|
17 |
/**
|
18 |
* We will cache the proper manager for each class, so that we don't calculate the right one everytime.
|
19 |
* This assumes that no manager will be added after extensions' initialize() method, otherwise the
|
20 |
* cached values will be incorrect.
|
21 |
*/
|
22 |
private HashMap<Class, String> cachedManagers; |
23 |
/**
|
24 |
* We will also cache the unmanaged layers (layers without managers).
|
25 |
*/
|
26 |
private HashSet<Class> cachedUnmanagedLayers; |
27 |
|
28 |
public ManagerRegistry() {
|
29 |
extensionPoint = new ExtensionPoint(EXTENSIONPOINTNAME, "Registers ILinkToolManagers that are able to manage specific layer types."); |
30 |
ExtensionPointsSingleton.getInstance().put(extensionPoint); |
31 |
cachedManagers = new HashMap<Class, String>(); |
32 |
cachedUnmanagedLayers = new HashSet<Class>(); |
33 |
} |
34 |
|
35 |
public void put(Class layerType, Class manager) { |
36 |
if (layerType.isInterface()) {
|
37 |
throw new RuntimeException("Interfaces are not supported"); |
38 |
} |
39 |
if (!ILinkLayerManager.class.isAssignableFrom(manager)) {
|
40 |
throw new RuntimeException("Managers must be of type ILinkLayerManager"); |
41 |
} |
42 |
extensionPoint.put(layerType.getName(), manager); |
43 |
} |
44 |
|
45 |
public ILinkLayerManager get(FLayer layer) throws ClassNotFoundException, InstantiationException, |
46 |
IllegalAccessException, IncompatibleLayerException {
|
47 |
if (cachedManagers.containsKey(layer.getClass())) {
|
48 |
String layerType = cachedManagers.get(layer.getClass());
|
49 |
ILinkLayerManager manager = (ILinkLayerManager) extensionPoint.create(layerType); |
50 |
manager.setLayer(layer); |
51 |
return manager;
|
52 |
} |
53 |
else if (cachedUnmanagedLayers.contains(layer.getClass())) { |
54 |
return null; |
55 |
} |
56 |
// search for proper manager for this class
|
57 |
Iterator<String> iterator = extensionPoint.keySet().iterator(); |
58 |
TreeSet<Class> classList = new TreeSet<Class>(new ClassComparator()); |
59 |
while (iterator.hasNext()) {
|
60 |
String layerType = iterator.next();
|
61 |
Class layerClass = Class.forName(layerType); |
62 |
if (layerClass.isInstance(layer)) {
|
63 |
classList.add(layerClass); |
64 |
} |
65 |
} |
66 |
if (!classList.isEmpty()) {
|
67 |
ILinkLayerManager manager = (ILinkLayerManager) extensionPoint.create(classList.first().getName()); |
68 |
cachedManagers.put(layer.getClass(), classList.first().getName()); |
69 |
manager.setLayer(layer); |
70 |
return manager;
|
71 |
} |
72 |
else {
|
73 |
cachedUnmanagedLayers.add(layer.getClass()); |
74 |
return null; |
75 |
} |
76 |
} |
77 |
|
78 |
public boolean hasManager(FLayer layer){ |
79 |
if (cachedManagers.containsKey(layer.getClass())) {
|
80 |
return true; |
81 |
} |
82 |
else if (cachedUnmanagedLayers.contains(layer.getClass())) { |
83 |
return false; |
84 |
} |
85 |
Iterator<String> iterator = extensionPoint.keySet().iterator(); |
86 |
while (iterator.hasNext()) {
|
87 |
String layerType = iterator.next();
|
88 |
try {
|
89 |
Class layerClass = Class.forName(layerType); |
90 |
if (layerClass.isInstance(layer)) {
|
91 |
// there is a manager for this layer class
|
92 |
return true; |
93 |
} |
94 |
} |
95 |
catch (ClassNotFoundException ex) { |
96 |
PluginServices.getLogger().error(ex); |
97 |
} |
98 |
} |
99 |
cachedUnmanagedLayers.add(layer.getClass()); |
100 |
return false; |
101 |
} |
102 |
|
103 |
private class ClassComparator implements Comparator<Class> { |
104 |
|
105 |
public int compare(Class class1, Class class2) { |
106 |
if (class1.equals(class2))
|
107 |
return 0; |
108 |
if (class1.isAssignableFrom(class2)) {
|
109 |
return 1; |
110 |
} |
111 |
else {
|
112 |
return -1; |
113 |
} |
114 |
} |
115 |
} |
116 |
} |