]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph.loader/src/org/simantics/scenegraph/loader/ScenegraphLoaderProcess.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph.loader / src / org / simantics / scenegraph / loader / ScenegraphLoaderProcess.java
1 package org.simantics.scenegraph.loader;\r
2 \r
3 import java.util.Set;\r
4 \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
22 \r
23 import gnu.trove.set.hash.THashSet;\r
24 \r
25 public class ScenegraphLoaderProcess implements Disposable, ListenerSupport {\r
26 \r
27         final private String name;\r
28         final Class<?> loaderClass;\r
29 \r
30         protected INode root;\r
31 \r
32         private boolean disposed = false;\r
33         \r
34         final protected Set<String> registeredURIs = new THashSet<String>();\r
35         \r
36         public ScenegraphLoaderProcess(String name) {\r
37                 this(null, ScenegraphLoader.class, name);\r
38         }\r
39 \r
40         public ScenegraphLoaderProcess(INode root, String name) {\r
41                 this(root, ScenegraphLoader.class, name);\r
42         }\r
43         \r
44         public ScenegraphLoaderProcess(INode root, Class<?> loaderClass, String name) {\r
45                 this.root = root;\r
46                 this.loaderClass = loaderClass;\r
47                 this.name = name;\r
48                 //System.out.println("NEW ScenegraphLoaderProcess(" + name + "): " + this);\r
49                 //new Exception("NEW ScenegraphLoaderProcess(" + name + "): " + this).printStackTrace();\r
50         }\r
51 \r
52         public INode getRoot() {\r
53                 return root;\r
54         }\r
55         \r
56         @Override\r
57         public String toString() {\r
58                 return name;\r
59         }\r
60 \r
61         protected void initialize(RequestProcessor processor, Variable configuration) throws DatabaseException {\r
62                 \r
63         }\r
64         \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
67         }\r
68 \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
73         }\r
74 \r
75         final public <N extends ParentNode<?>> N load(Resource configuration, Resource runtime) throws DatabaseException {\r
76                 return load(Simantics.getSession(), configuration, runtime);\r
77         }\r
78 \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
82         }\r
83         \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
88         }\r
89         \r
90         final static public Variable getVariable(RequestProcessor processor, final ScenegraphLoaderProcess process, final Resource configuration, final Resource runtime, final INode root) throws DatabaseException {\r
91                 \r
92                 assert(root != null);\r
93 \r
94                 Pair<Variable,String> result = processor.sync(new TernaryRead<INode, Resource, Resource, Pair<Variable,String>>(root, runtime, configuration) {\r
95 \r
96                         @Override\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
101                         }\r
102                         \r
103                 });\r
104 \r
105                 VariableRepository.register(result.second, result.first);\r
106                 if(process != null) process.registeredURIs.add(result.second);\r
107                 return result.first;\r
108                 \r
109         }\r
110         \r
111         final public <N extends ParentNode<?>> N load(RequestProcessor processor, final Variable configuration) throws DatabaseException {\r
112                 \r
113                 initialize(processor, configuration);\r
114                 N root = (N)getRoot();\r
115                 load(processor, configuration, root);\r
116                 return root;\r
117                 \r
118         }\r
119 \r
120         <T extends ScenegraphLoader> Class<T> getLoaderClass() {\r
121                 return (Class<T>)ScenegraphLoader.class;\r
122         }\r
123         \r
124         protected ScenegraphLoader getLoader(RequestProcessor processor, Variable configuration) throws DatabaseException {\r
125                 \r
126                 return processor.sync(new UnaryRead<Variable, ScenegraphLoader>(configuration) {\r
127 \r
128                         @Override\r
129                         public ScenegraphLoader perform(ReadGraph graph) throws DatabaseException {\r
130                                 return parameter.adapt(graph, getLoaderClass());\r
131                         }\r
132 \r
133                 });\r
134         }\r
135         \r
136         @SuppressWarnings("unchecked")\r
137         final private INode load(RequestProcessor processor, Variable configuration, ParentNode<?> current) throws DatabaseException {\r
138                 \r
139                 ScenegraphLoader loader = getLoader(processor, configuration);\r
140                 \r
141                 INode node = loader.create(processor, this, current, configuration);\r
142                 if(node instanceof ParentNode) {\r
143                 \r
144                         for(Variable child : ScenegraphLoaderUtils.getChildren(processor, configuration)) {\r
145                                 load(processor, child, (ParentNode<INode>)node);\r
146                         }\r
147                         \r
148                 }\r
149                 \r
150                 return node;\r
151                 \r
152         }\r
153 \r
154         @Override\r
155         public void exception(Throwable t) {\r
156                 Logger.defaultLogError(t);\r
157         }\r
158 \r
159         @Override\r
160         public boolean isDisposed() {\r
161                 return disposed;\r
162         }\r
163 \r
164         @Override\r
165         public void dispose() {\r
166                 //System.out.println("DISPOSE ScenegraphLoaderProcess(" + name + "): " + this);\r
167                 //new Exception("DISPOSED ScenegraphLoaderProcess(" + name + "): " + this).printStackTrace();\r
168                 disposed = true;\r
169         }\r
170         \r
171 }\r