Statistics
| Revision:

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
}