]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/base/AppearanceProviderRegistry.java
6540cf52a483c93c5b13f718f57d948c3f12a474
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / base / AppearanceProviderRegistry.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * which accompanies this distribution, and is available at\r
6  * http://www.eclipse.org/legal/epl-v10.html\r
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.proconf.g3d.base;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.Collection;\r
15 import java.util.Collections;\r
16 import java.util.HashMap;\r
17 import java.util.List;\r
18 import java.util.Map;\r
19 \r
20 import org.eclipse.core.runtime.CoreException;\r
21 import org.eclipse.core.runtime.IConfigurationElement;\r
22 import org.eclipse.core.runtime.IExtension;\r
23 import org.eclipse.core.runtime.IExtensionPoint;\r
24 import org.eclipse.core.runtime.Platform;\r
25 import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;\r
26 import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;\r
27 import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;\r
28 import org.eclipse.core.runtime.dynamichelpers.IFilter;\r
29 import org.simantics.db.Resource;\r
30 import org.simantics.layer0.utils.IEntity;\r
31 import org.simantics.utils.ui.ErrorLogger;\r
32 \r
33 import com.jme.renderer.Renderer;\r
34 import com.jme.scene.state.RenderState;\r
35 \r
36 public class AppearanceProviderRegistry implements IExtensionChangeHandler {\r
37     private static AppearanceProviderRegistry instance;\r
38     //public final static String ELEMENT_NAME = "Appearance";\r
39     public final static String NAMESPACE = "org.simantics.proconf.g3d";\r
40     public final static String EP_NAME = "appearance";\r
41     \r
42     private ExtensionTracker tracker;\r
43     \r
44     private List<AppearanceProviderExtension> extensions = new ArrayList<AppearanceProviderExtension>();\r
45     private Map<Resource,AppearanceProvider> providers;\r
46     \r
47     private AppearanceProviderRegistry() {\r
48         providers = new HashMap<Resource,AppearanceProvider>();\r
49         \r
50         tracker = new ExtensionTracker();\r
51                 \r
52                 IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE,EP_NAME);\r
53                 loadExtensions(ep.getConfigurationElements());\r
54                 \r
55                 IFilter filter = ExtensionTracker.createExtensionPointFilter(ep);\r
56                 tracker.registerHandler(this, filter);\r
57     }\r
58     \r
59     private void close() {\r
60                 tracker.close();\r
61                 tracker = null;\r
62                 extensions = new ArrayList<AppearanceProviderExtension>();\r
63         }\r
64     \r
65     public static synchronized AppearanceProviderRegistry getInstance() {\r
66         if (instance==null) instance = new AppearanceProviderRegistry();\r
67         return instance;\r
68     }\r
69     \r
70     public static synchronized void dispose() {\r
71                 if (instance != null) {\r
72                         instance.close();\r
73                         instance = null;\r
74                 }       \r
75         }\r
76     \r
77     public synchronized List<AppearanceProviderExtension> getExtensions() {\r
78                 return Collections.unmodifiableList(extensions);\r
79         }\r
80     \r
81     private synchronized void loadExtensions(IConfigurationElement[] elements) {\r
82                 for (IConfigurationElement el : elements) {\r
83                         String id = el.getAttribute("id");\r
84                         try {\r
85                                 Object o = el.createExecutableExtension("class");\r
86                                 AppearanceProviderExtension ext = new AppearanceProviderExtension(id,(AppearanceProvider)o);\r
87                                 tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
88                                 extensions.add(ext);\r
89                         } catch (CoreException e) {\r
90                                 ErrorLogger.defaultLogError("Cannot create java interface for GeometryProvider " + id, e);\r
91                         }\r
92                 }\r
93         }\r
94     \r
95     private Map<Resource,AppearanceProvider> getProviderMap() {\r
96         return providers;\r
97     }\r
98     \r
99     public static Collection<RenderState> getAppearance(IEntity thing, Renderer renderer) {\r
100         AppearanceProvider provider = getAppearanceProvider(thing);\r
101         return provider.getAppearanceFromResource(thing, renderer);\r
102     }\r
103     \r
104     public static AppearanceProvider getAppearanceProvider(IEntity thing) {\r
105         Collection<IEntity> types = thing.getRelatedObjects(thing.getGraph().getBuiltins().InstanceOf);\r
106         \r
107         //Resource types[] = OntologyUtils.getTypes(resource);\r
108         for (IEntity t : types) {\r
109                 AppearanceProvider provider = getInstance().getProviderMap().get(t.getResource());\r
110                 if (provider == null) {\r
111                 //for (Extension<GeometryProvider> e : getInstance().getExtensions()) {\r
112                         for (AppearanceProviderExtension e : getInstance().getExtensions()) {\r
113                     if (e.provider.canHandle(thing)) {\r
114                         getInstance().getProviderMap().put(t.getResource(), e.provider);\r
115                         return e.provider;\r
116                     }\r
117                 }\r
118                 \r
119             } else {\r
120                 return provider;\r
121             }\r
122         }\r
123         \r
124         return null;\r
125     }\r
126     \r
127     @Override\r
128     public void addExtension(IExtensionTracker tracker, IExtension extension) {\r
129         loadExtensions(extension.getConfigurationElements());\r
130     }\r
131     \r
132     @Override\r
133         public synchronized void removeExtension(IExtension extension, Object[] objects) {\r
134                 for (Object o : objects) {\r
135                         AppearanceProviderExtension ext = (AppearanceProviderExtension) o;\r
136                         tracker.unregisterObject(extension, ext);\r
137                         extensions.remove(ext);\r
138                 }\r
139         }\r
140     \r
141     public class AppearanceProviderExtension {\r
142                 public String id;\r
143                 public AppearanceProvider provider;\r
144                 \r
145                 public AppearanceProviderExtension(String id, AppearanceProvider provider) {\r
146                         this.id = id;\r
147                         this.provider = provider;\r
148                 }\r
149         }\r
150 }\r