1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package com.gridsystems.nextgrid.api.builder;
19
20 import java.net.URI;
21 import java.util.HashMap;
22 import java.util.LinkedHashMap;
23 import java.util.Map;
24
25 import org.apache.commons.discovery.ResourceNameIterator;
26 import org.apache.commons.discovery.resource.names.DiscoverServiceNames;
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29
30 import com.gridsystems.nextgrid.api.pom.ref.StringReference;
31
32 import nextgrid.api.pom.Reference;
33
34
35
36
37
38
39 public final class TypeManager {
40
41
42
43
44 private static final Log LOG = LogFactory.getLog("PARSER");
45
46
47
48
49 private static final Map<URI, ReferenceFactory<?>> REF_FACTORIES
50 = new LinkedHashMap<URI, ReferenceFactory<?>>();
51
52
53
54
55 private static final Map<URI, Class<?>> TYPEMAP = new HashMap<URI, Class<?>>();
56
57 static {
58 DiscoverServiceNames dsn = new DiscoverServiceNames();
59 ResourceNameIterator it = dsn.findResourceNames(ReferenceFactory.class.getName());
60 while (it.hasNext()) {
61 String name = it.nextResourceName();
62 try {
63 if (name.indexOf(".") == -1) {
64
65 name = "com.gridsystems.nextgrid.builder.ref." + name;
66 }
67 Class<?> c = Class.forName(name);
68 if (ReferenceFactory.class.isAssignableFrom(c)) {
69 ReferenceFactory<?> factory = (ReferenceFactory<?>)c.newInstance();
70 register(factory);
71 }
72 } catch (Exception e) {
73 e.printStackTrace();
74 }
75 }
76
77 LOG.info("Registered reference factories: " + REF_FACTORIES.size());
78 }
79
80
81
82
83 private TypeManager() { }
84
85
86
87
88
89
90
91 public static Class<?> getType(URI uri) {
92 return TYPEMAP.get(uri);
93 }
94
95
96
97
98
99
100
101
102 public static Reference<?> createReference(Class<?> type) {
103
104
105
106
107
108
109
110
111 for (ReferenceFactory<?> factory : REF_FACTORIES.values()) {
112 if (factory.supports(type)) {
113 return factory.createReference(null);
114 }
115 }
116
117 return new StringReference();
118 }
119
120
121
122
123
124
125 private static void register(ReferenceFactory<?> factory) {
126 if (factory != null) {
127 LOG.debug("Registering factory: " + factory.getClass().getName());
128 URI[] types = factory.getSupportedTypes();
129 if (types != null) {
130 int count = types.length;
131 for (int i = 0; i < count; i++) {
132 REF_FACTORIES.put(types[i], factory);
133 TYPEMAP.put(types[i], factory.toClass(types[i]));
134 }
135 }
136 }
137 }
138
139 }