X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Fbase%2FGeometryProviderRegistry.java;fp=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Fbase%2FGeometryProviderRegistry.java;h=f734cd9e074a8bc0db33f805ab24efbc58eb27ef;hb=10f144a2bb2d7bec98b812b83acecb333fd098ea;hp=0000000000000000000000000000000000000000;hpb=3055b543aa5afc0cca4bb3b341704e7c5103fa6a;p=simantics%2F3d.git diff --git a/org.simantics.g3d/src/org/simantics/proconf/g3d/base/GeometryProviderRegistry.java b/org.simantics.g3d/src/org/simantics/proconf/g3d/base/GeometryProviderRegistry.java new file mode 100644 index 00000000..f734cd9e --- /dev/null +++ b/org.simantics.g3d/src/org/simantics/proconf/g3d/base/GeometryProviderRegistry.java @@ -0,0 +1,149 @@ +/******************************************************************************* + * Copyright (c) 2007- VTT Technical Research Centre of Finland. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.proconf.g3d.base; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; +import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler; +import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; +import org.eclipse.core.runtime.dynamichelpers.IFilter; +import org.simantics.db.Resource; +import org.simantics.layer0.utils.IEntity; +import org.simantics.utils.ui.ErrorLogger; + +import com.jme.scene.Geometry; + +public class GeometryProviderRegistry implements IExtensionChangeHandler { + private static GeometryProviderRegistry instance; + public final static String ELEMENT_NAME = "Geometry"; + public final static String NAMESPACE = "org.simantics.proconf.g3d"; + public final static String EP_NAME = "geometry"; + + private ExtensionTracker tracker; + + private List extensions = new ArrayList(); + private Map providers; + + private GeometryProviderRegistry() { + providers = new HashMap(); + + tracker = new ExtensionTracker(); + + IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE,EP_NAME); + loadExtensions(ep.getConfigurationElements()); + + IFilter filter = ExtensionTracker.createExtensionPointFilter(ep); + tracker.registerHandler(this, filter); + } + + private void close() { + tracker.close(); + tracker = null; + extensions = new ArrayList(); + } + + public static synchronized GeometryProviderRegistry getInstance() { + if (instance==null) instance = new GeometryProviderRegistry(); + return instance; + } + + public static synchronized void dispose() { + if (instance != null) { + instance.close(); + instance = null; + } + } + + public synchronized List getExtensions() { + return Collections.unmodifiableList(extensions); + } + + private synchronized void loadExtensions(IConfigurationElement[] elements) { + for (IConfigurationElement el : elements) { + String id = el.getAttribute("id"); + try { + Object o = el.createExecutableExtension("class"); + GeometryProviderExtension ext = new GeometryProviderExtension(id,(GeometryProvider)o); + tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG); + extensions.add(ext); + } catch (CoreException e) { + ErrorLogger.defaultLogError("Cannot create java interface for GeometryProvider " + id, e); + } + } + } + + private Map getProviderMap() { + return providers; + } + + public static Geometry[] getGeometry(IEntity thing, boolean transform) { + GeometryProvider provider = getGeometryProvider(thing); + return provider.getGeometryFromResource(thing, transform); + } + + public static GeometryProvider getGeometryProvider(IEntity thing) { + Collection types = thing.getRelatedObjects(thing.getGraph().getBuiltins().InstanceOf); + + //Resource types[] = OntologyUtils.getTypes(resource); + for (IEntity t : types) { + GeometryProvider provider = getInstance().getProviderMap().get(t.getResource()); + if (provider == null) { + //for (Extension e : getInstance().getExtensions()) { + for (GeometryProviderExtension e : getInstance().getExtensions()) { + if (e.provider.canHandle(thing)) { + getInstance().getProviderMap().put(t.getResource(), e.provider); + return e.provider; + } + } + + } else { + return provider; + } + } + + throw new UnsupportedOperationException("Cannot handle resource " + thing); + } + + @Override + public void addExtension(IExtensionTracker tracker, IExtension extension) { + loadExtensions(extension.getConfigurationElements()); + } + + @Override + public synchronized void removeExtension(IExtension extension, Object[] objects) { + for (Object o : objects) { + GeometryProviderExtension ext = (GeometryProviderExtension) o; + tracker.unregisterObject(extension, ext); + extensions.remove(ext); + } + } + + public class GeometryProviderExtension { + public String id; + public GeometryProvider provider; + + public GeometryProviderExtension(String id, GeometryProvider provider) { + this.id = id; + this.provider = provider; + } + } +}