1 package org.simantics.scenegraph.loader;
\r
3 import java.util.Set;
\r
5 import org.simantics.Simantics;
\r
6 import org.simantics.db.Disposable;
\r
7 import org.simantics.db.ReadGraph;
\r
8 import org.simantics.db.RequestProcessor;
\r
9 import org.simantics.db.Resource;
\r
10 import org.simantics.db.common.primitiverequest.PossibleResource;
\r
11 import org.simantics.db.common.procedure.adapter.ListenerSupport;
\r
12 import org.simantics.db.common.request.TernaryRead;
\r
13 import org.simantics.db.common.request.UnaryRead;
\r
14 import org.simantics.db.common.utils.Logger;
\r
15 import org.simantics.db.exception.DatabaseException;
\r
16 import org.simantics.db.layer0.request.ResourceVariable;
\r
17 import org.simantics.db.layer0.variable.Variable;
\r
18 import org.simantics.db.layer0.variable.VariableRepository;
\r
19 import org.simantics.scenegraph.INode;
\r
20 import org.simantics.scenegraph.ParentNode;
\r
21 import org.simantics.utils.datastructures.Pair;
\r
23 import gnu.trove.set.hash.THashSet;
\r
25 public class ScenegraphLoaderProcess implements Disposable, ListenerSupport {
\r
27 final private String name;
\r
28 final Class<?> loaderClass;
\r
30 protected INode root;
\r
32 private boolean disposed = false;
\r
34 final protected Set<String> registeredURIs = new THashSet<String>();
\r
36 public ScenegraphLoaderProcess(String name) {
\r
37 this(null, ScenegraphLoader.class, name);
\r
40 public ScenegraphLoaderProcess(INode root, String name) {
\r
41 this(root, ScenegraphLoader.class, name);
\r
44 public ScenegraphLoaderProcess(INode root, Class<?> loaderClass, String name) {
\r
46 this.loaderClass = loaderClass;
\r
48 //System.out.println("NEW ScenegraphLoaderProcess(" + name + "): " + this);
\r
49 //new Exception("NEW ScenegraphLoaderProcess(" + name + "): " + this).printStackTrace();
\r
52 public INode getRoot() {
\r
57 public String toString() {
\r
61 protected void initialize(RequestProcessor processor, Variable configuration) throws DatabaseException {
\r
65 final public <N extends ParentNode<?>> N load(final String curi, final Resource runtime) throws DatabaseException {
\r
66 return load(Simantics.getSession(), curi, runtime);
\r
69 final public <N extends ParentNode<?>> N load(RequestProcessor processor, final String curi, final Resource runtime) throws DatabaseException {
\r
70 Resource resource = processor.sync(new PossibleResource(curi));
\r
71 if(resource == null) throw new IllegalArgumentException("The given URI is invalid: " + curi);
\r
72 return load(processor, resource, runtime);
\r
75 final public <N extends ParentNode<?>> N load(Resource configuration, Resource runtime) throws DatabaseException {
\r
76 return load(Simantics.getSession(), configuration, runtime);
\r
79 final public <N extends ParentNode<?>> N load(RequestProcessor processor, Resource configuration, Resource runtime) throws DatabaseException {
\r
80 N root = (N)getRoot();
\r
81 return load(processor, getVariable(processor, this, configuration, runtime, root));
\r
84 final public Variable getVariable(RequestProcessor processor, String curi, Resource runtime) throws DatabaseException {
\r
85 Resource resource = processor.sync(new PossibleResource(curi));
\r
86 if(resource == null) throw new IllegalArgumentException("The given URI is invalid: " + curi);
\r
87 return getVariable(processor, this, resource, runtime, root);
\r
90 final static public Variable getVariable(RequestProcessor processor, final ScenegraphLoaderProcess process, final Resource configuration, final Resource runtime, final INode root) throws DatabaseException {
\r
92 assert(root != null);
\r
94 Pair<Variable,String> result = processor.sync(new TernaryRead<INode, Resource, Resource, Pair<Variable,String>>(root, runtime, configuration) {
\r
97 public Pair<Variable,String> perform(ReadGraph graph) throws DatabaseException {
\r
98 Variable conf = graph.sync(new ResourceVariable(parameter3));
\r
99 Variable result = new ScenegraphVariable(conf, parameter3, parameter2, parameter);
\r
100 return Pair.make(result, result.getURI(graph));
\r
105 VariableRepository.register(result.second, result.first);
\r
106 if(process != null) process.registeredURIs.add(result.second);
\r
107 return result.first;
\r
111 final public <N extends ParentNode<?>> N load(RequestProcessor processor, final Variable configuration) throws DatabaseException {
\r
113 initialize(processor, configuration);
\r
114 N root = (N)getRoot();
\r
115 load(processor, configuration, root);
\r
120 <T extends ScenegraphLoader> Class<T> getLoaderClass() {
\r
121 return (Class<T>)ScenegraphLoader.class;
\r
124 protected ScenegraphLoader getLoader(RequestProcessor processor, Variable configuration) throws DatabaseException {
\r
126 return processor.sync(new UnaryRead<Variable, ScenegraphLoader>(configuration) {
\r
129 public ScenegraphLoader perform(ReadGraph graph) throws DatabaseException {
\r
130 return parameter.adapt(graph, getLoaderClass());
\r
136 @SuppressWarnings("unchecked")
\r
137 final private INode load(RequestProcessor processor, Variable configuration, ParentNode<?> current) throws DatabaseException {
\r
139 ScenegraphLoader loader = getLoader(processor, configuration);
\r
141 INode node = loader.create(processor, this, current, configuration);
\r
142 if(node instanceof ParentNode) {
\r
144 for(Variable child : ScenegraphLoaderUtils.getChildren(processor, configuration)) {
\r
145 load(processor, child, (ParentNode<INode>)node);
\r
155 public void exception(Throwable t) {
\r
156 Logger.defaultLogError(t);
\r
160 public boolean isDisposed() {
\r
165 public void dispose() {
\r
166 //System.out.println("DISPOSE ScenegraphLoaderProcess(" + name + "): " + this);
\r
167 //new Exception("DISPOSED ScenegraphLoaderProcess(" + name + "): " + this).printStackTrace();
\r