1 package org.openprovenance.elmo;
2 import java.net.URI;
3 import java.util.Collection;
4 import java.util.Set;
5 import java.util.List;
6 import java.util.LinkedList;
7 import java.util.HashSet;
8 import java.util.Hashtable;
9 import javax.xml.bind.JAXBElement;
10 import javax.xml.namespace.QName;
11
12 import org.w3c.dom.Document;
13 import org.w3c.dom.Element;
14
15 import org.openrdf.elmo.ElmoManager;
16 import org.openprovenance.elmo.XMLLiteral;
17
18 import org.openprovenance.model.Account;
19 import org.openprovenance.model.AccountRef;
20 import org.openprovenance.model.Agent;
21 import org.openprovenance.model.Annotable;
22 import org.openprovenance.model.Annotation;
23 import org.openprovenance.model.Artifact;
24 import org.openprovenance.model.EmbeddedAnnotation;
25 import org.openprovenance.model.HasAccounts;
26 import org.openprovenance.model.Identifiable;
27 import org.openprovenance.model.Label;
28 import org.openprovenance.model.OPMGraph;
29 import org.openprovenance.model.Process;
30 import org.openprovenance.model.Property;
31 import org.openprovenance.model.Type;
32 import org.openprovenance.model.Used;
33 import org.openprovenance.model.Value;
34 import org.openprovenance.model.WasControlledBy;
35 import org.openprovenance.model.WasDerivedFrom;
36 import org.openprovenance.model.WasGeneratedBy;
37 import org.openprovenance.model.WasTriggeredBy;
38
39 import org.openprovenance.rdf.AnnotationOrEdgeOrNode;
40 import org.openrdf.elmo.Entity;
41
42 /*** The factory class to create OPM entities that can be serialised to rdf.
43 This package relies on Sesame's elmo, which uses a facade object to access the content of the triple
44 store and update it. Each OPM class generated by JAXB is subclassed to get access to the facade
45 for each instance.
46
47 The factory class offers several kinds of factory methods.
48
49 - factory methods that are inherited from OPMFactory, created instance of objects with a facade to the triple store.
50
51 - factory methods that clone opm entities and create new instances with a facade to a triple store
52
53 - factroy methods that create facade-with instances of OPM classes from the content of a triple store.
54
55 Note that to ensure that graph structure is preserved between the Java representation and the RDF triple store,
56 an instance of this factory class is stateful! (The original OPMFactory was purely stateless.
57
58 Note that JAXB beans that have a field that contains a list only
59 offer a getter method for these fields. They can be updated by
60 getting the list and updating it. If bean content are update this
61 way, the RDF facade may not be aware of the update, and may not
62 propagate it to the triple store. Therefore the factory classes
63 (OPMFactory) offers a number of update methods (typically to add
64 new elements to lists). These methods are overridden by
65 RdfOPMFactory to update the triple store.
66
67 */
68
69
70 public class RdfOPMFactory extends org.openprovenance.model.OPMFactory {
71
72 final ElmoManager manager;
73
74 public RdfOPMFactory(org.openprovenance.model.ObjectFactory o) {
75 super(o);
76 this.manager=null;
77 }
78 public RdfOPMFactory(org.openprovenance.model.ObjectFactory o, ElmoManager manager) {
79 super(o);
80 this.manager=manager;
81 }
82
83 static int count=0;
84
85 public String autoGenerateId(String prefix) {
86 String id=prefix+count++;
87 return id;
88 }
89
90 public String autoGenerateId(String prefix, String id) {
91 if (id!=null) return id;
92 id=prefix+count++;
93 return id;
94 }
95
96
97 public void addProperty(EmbeddedAnnotation ann, Property p) {
98 super.addProperty(ann,p);
99 Object o=((HasFacade) ann).findMyFacade();
100 org.openprovenance.rdf.Annotation ann2=(org.openprovenance.rdf.Annotation) o;
101 org.openprovenance.rdf.Property p2=(org.openprovenance.rdf.Property) ((HasFacade)p).findMyFacade();
102 ann2.getProperties().add(p2);
103 }
104
105 public void addProperty(Annotation ann, Property p) {
106 super.addProperty(ann,p);
107 Object o=((HasFacade) ann).findMyFacade();
108 org.openprovenance.rdf.Annotation ann2=(org.openprovenance.rdf.Annotation) o;
109 org.openprovenance.rdf.Property p2=(org.openprovenance.rdf.Property) ((HasFacade)p).findMyFacade();
110 ann2.getProperties().add(p2);
111 }
112
113 public void addAccounts(HasAccounts element, Collection<AccountRef> accounts) {
114 super.addAccounts(element,accounts);
115 if (element instanceof HasAccounts) {
116 HasFacade facade=(HasFacade) element;
117 Object o=facade.findMyFacade();
118 AnnotationOrEdgeOrNode el=(AnnotationOrEdgeOrNode) o;
119
120 Set set=new HashSet();
121 for (AccountRef accr: accounts) {
122 set.add(((HasFacade)accr.getRef()).findMyFacade());
123 }
124 el.getAccounts().addAll(set);
125
126 }
127 }
128
129 public void addAnnotation(Annotable annotable,
130 JAXBElement<? extends org.openprovenance.model.EmbeddedAnnotation> ann) {
131
132 EmbeddedAnnotation ea=ann.getValue();
133 addAnnotation(annotable,ea);
134 }
135
136 public void addAnnotation(Annotable annotable, Label ann) {
137 if (ann!=null) {
138 super.addAnnotation(annotable,ann);
139 try {
140 ((RdfLabel)ann).toRdf(annotable);
141 } catch (org.openrdf.repository.RepositoryException e) {
142 e.printStackTrace();
143 }
144 }
145 }
146
147 public void addAnnotation(Annotable annotable, Type ann) {
148 if (ann!=null) {
149 super.addAnnotation(annotable,ann);
150 try {
151 ((RdfType)ann).toRdf(annotable);
152 } catch (org.openrdf.repository.RepositoryException e) {
153 e.printStackTrace();
154 }
155 }
156 }
157
158 public void addAnnotation(Annotable annotable, Value ann) {
159 if (ann!=null) {
160 super.addAnnotation(annotable,ann);
161
162 HasFacade facade=(HasFacade) annotable;
163 Object o=facade.findMyFacade();
164 org.openprovenance.rdf.Annotable annotable2=(org.openprovenance.rdf.Annotable) o;
165 org.openprovenance.rdf.AValue ann2=(org.openprovenance.rdf.AValue) ((HasFacade)ann).findMyFacade();
166 ((org.openprovenance.rdf.Artifact) annotable2).getAvalues().add(ann2);
167
168 }
169 }
170
171
172 public void addAnnotation(org.openprovenance.model.Annotable annotable,
173 org.openprovenance.model.Annotation ann) {
174 System.out.println("*********** adding a annotations ");
175 annotable.getAnnotation().add(of.createAnnotation(ann));
176 }
177
178 /*** Add annotation to an annotable JAXB Bean and its corresponding RDF facade. */
179
180 public void addAnnotation(org.openprovenance.model.Annotable annotable,
181 org.openprovenance.model.EmbeddedAnnotation ann) {
182
183 if (ann instanceof Label) {
184 addAnnotation(annotable,(Label) ann);
185 } else if (ann instanceof Type) {
186 addAnnotation(annotable,(Type) ann);
187 } else if (ann instanceof Value) {
188 addAnnotation(annotable,(Value) ann);
189 } else {
190 super.addAnnotation(annotable,ann);
191
192
193 HasFacade facade=(HasFacade) annotable;
194 Object o=facade.findMyFacade();
195 org.openprovenance.rdf.Annotable annotable2=(org.openprovenance.rdf.Annotable) o;
196 org.openprovenance.rdf.Annotation ann2=(org.openprovenance.rdf.Annotation) ((HasFacade)ann).findMyFacade();
197 annotable2.getAnnotations().add(ann2);
198 }
199 }
200
201 public OPMGraph newOPMGraph(String id,
202 Collection<org.openprovenance.model.Account> accs,
203 Collection<org.openprovenance.model.Overlaps> ops,
204 Collection<org.openprovenance.model.Process> ps,
205 Collection<org.openprovenance.model.Artifact> as,
206 Collection<org.openprovenance.model.Agent> ags,
207 Collection<Object> lks,
208 Collection<org.openprovenance.model.Annotation> anns)
209 {
210 OPMGraph graph=super.newOPMGraph(id,accs,ops,ps,as,ags,lks,anns);
211 HasFacade facade=(HasFacade) graph;
212 org.openprovenance.rdf.OPMGraph rdfGraph=(org.openprovenance.rdf.OPMGraph) facade.findMyFacade();
213
214 Set<org.openprovenance.rdf.Account> accounts=new HashSet();
215 for (org.openprovenance.model.Account p: accs) {
216 org.openprovenance.rdf.Account pp=(org.openprovenance.rdf.Account) ((HasFacade)p).findMyFacade();
217 accounts.add(pp);
218 }
219 rdfGraph.setHasAccount(accounts);
220
221
222 Set<org.openprovenance.rdf.Process> processes=new HashSet();
223 for (org.openprovenance.model.Process p: ps) {
224 org.openprovenance.rdf.Process pp=(org.openprovenance.rdf.Process) ((HasFacade)p).findMyFacade();
225 processes.add(pp);
226 }
227 rdfGraph.setHasProcess(processes);
228
229
230 Set<org.openprovenance.rdf.Artifact> artifacts=new HashSet();
231 for (org.openprovenance.model.Artifact p: as) {
232 org.openprovenance.rdf.Artifact pp=(org.openprovenance.rdf.Artifact) ((HasFacade)p).findMyFacade();
233 artifacts.add(pp);
234 }
235 rdfGraph.setHasArtifact(artifacts);
236
237
238 Set<org.openprovenance.rdf.Agent> agents=new HashSet();
239 for (org.openprovenance.model.Agent p: ags) {
240 org.openprovenance.rdf.Agent pp=(org.openprovenance.rdf.Agent) ((HasFacade)p).findMyFacade();
241 agents.add(pp);
242 }
243 rdfGraph.setHasAgent(agents);
244
245 Set<org.openprovenance.rdf.Edge> dependency=new HashSet();
246 for (Object o: lks) {
247 org.openprovenance.rdf.Edge pp=(org.openprovenance.rdf.Edge) ((HasFacade)o).findMyFacade();
248 dependency.add(pp);
249 }
250 rdfGraph.setHasDependency(dependency);
251
252
253
254 return graph;
255
256 }
257
258
259 public RdfArtifact newArtifact(org.openprovenance.rdf.Artifact a) {
260 QName qname=((Entity)a).getQName();
261 RdfArtifact res=register(qname,new RdfArtifact(manager,qname));
262 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,res.getAccount());
263 processAnnotations(a,res);
264 return res;
265 }
266
267 public RdfArtifact newArtifact(QName qname) {
268 return register(qname,new RdfArtifact(manager,qname));
269 }
270
271
272 public RdfProcess newProcess(org.openprovenance.rdf.Process a) {
273 QName qname=((Entity)a).getQName();
274 RdfProcess res=register(qname, new RdfProcess(manager,qname));
275 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,res.getAccount());
276 processAnnotations(a,res);
277 return res;
278 }
279
280 public RdfProcess newProcess(QName qname) {
281 return register(qname,new RdfProcess(manager,qname));
282 }
283
284 public RdfAgent newAgent(org.openprovenance.rdf.Agent a) {
285 QName qname=((Entity)a).getQName();
286 RdfAgent res=register(qname,new RdfAgent(manager,qname));
287 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,res.getAccount());
288 processAnnotations(a,res);
289 return res;
290 }
291
292 public RdfAgent newAgent(QName qname) {
293 RdfAgent res=register(qname,new RdfAgent(manager,qname));
294 return res;
295 }
296
297 public RdfAccount newAccount(QName qname) {
298 return register(qname,new RdfAccount(manager,qname));
299 }
300
301 public RdfAccount newAccount(org.openprovenance.rdf.Account a) {
302 QName qname=((Entity)a).getQName();
303 return register(qname, new RdfAccount(manager,qname));
304 }
305
306 public RdfRole newRole(QName qname) {
307 return new RdfRole(manager,qname);
308 }
309
310 public RdfRole newRole(org.openprovenance.rdf.Role r) {
311 QName qname=((Entity)r).getQName();
312 String value=(String)r.getValue();
313 return new RdfRole(manager,qname,value);
314 }
315
316 public RdfProperty newProperty(org.openprovenance.rdf.Property a) {
317 QName qname=((Entity)a).getQName();
318 RdfProperty res=new RdfProperty(manager,qname);
319 res.setFields(a.getUri(), a.getValue());
320 return res;
321 }
322
323 public RdfAnnotation newAnnotation(org.openprovenance.rdf.Annotation a) {
324 QName qname=((Entity)a).getQName();
325
326 RdfAnnotation res=new RdfAnnotation(manager,qname);
327 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,res.getAccount());
328 for (org.openprovenance.rdf.Property prop: a.getProperties()) {
329 res.getProperty().add(newProperty(prop));
330 }
331 return res;
332 }
333
334 public RdfEmbeddedAnnotation newEmbeddedAnnotation(org.openprovenance.rdf.Annotation a) {
335 QName qname=((Entity)a).getQName();
336 RdfEmbeddedAnnotation res=new RdfEmbeddedAnnotation(manager,qname);
337 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,res.getAccount());
338 for (org.openprovenance.rdf.Property prop: a.getProperties()) {
339 res.getProperty().add(newProperty(prop));
340 }
341 return res;
342 }
343
344
345
346
347 private Hashtable<QName, RdfAgent> agentRegister =new Hashtable();
348 private Hashtable<QName, RdfProcess> processRegister =new Hashtable();
349 private Hashtable<QName, RdfArtifact> artifactRegister =new Hashtable();
350 private Hashtable<QName, RdfAccount> accountRegister =new Hashtable();
351
352 public RdfAgent register(QName qname, RdfAgent agent) {
353 agentRegister.put(qname,agent);
354 return agent;
355 }
356 public RdfProcess register(QName qname, RdfProcess process) {
357 processRegister.put(qname,process);
358 return process;
359 }
360 public RdfArtifact register(QName qname, RdfArtifact artifact) {
361 artifactRegister.put(qname,artifact);
362 return artifact;
363 }
364 public RdfAccount register(QName qname, RdfAccount account) {
365 accountRegister.put(qname,account);
366 return account;
367 }
368
369
370 private Hashtable<String, Agent> agentRegister2 =new Hashtable();
371 private Hashtable<String, Process> processRegister2 =new Hashtable();
372 private Hashtable<String, Artifact> artifactRegister2 =new Hashtable();
373 private Hashtable<String, Account> accountRegister2 =new Hashtable();
374
375 public Agent register(String id, Agent agent) {
376 agentRegister2.put(id,agent);
377 return agent;
378 }
379 public Process register(String id, Process process) {
380 processRegister2.put(id,process);
381 return process;
382 }
383 public Artifact register(String id, Artifact artifact) {
384 artifactRegister2.put(id,artifact);
385 return artifact;
386 }
387 public Account register(String id, Account account) {
388 accountRegister2.put(id,account);
389 return account;
390 }
391
392
393 public RdfOTime newOTime(org.openprovenance.rdf.OTime a) {
394 QName qname=((Entity)a).getQName();
395 RdfOTime res=new RdfOTime(manager,qname);
396 res.setFields(a.getNoEarlierThan(), a.getNoLaterThan(), a.getExactlyAt());
397 return res;
398 }
399
400 public void addAccounts(org.openprovenance.rdf.AnnotationOrEdgeOrNode hasAccounts,
401 List<AccountRef> accounts) {
402 for (org.openprovenance.rdf.Account acc: hasAccounts.getAccounts()) {
403 accounts.add(newAccountRef(newAccount(acc)));
404 }
405 }
406
407 public List<AccountRef> newAccounts(List<AccountRef> accounts) {
408 List<AccountRef> res=new LinkedList();
409 for (AccountRef acc: accounts) {
410 res.add(newAccountRef(accountRegister2.get(((Account)acc.getRef()).getId())));
411 }
412 return res;
413 }
414
415 public RdfWasDerivedFrom newWasDerivedFrom(org.openprovenance.rdf.WasDerivedFrom a) {
416 QName qname=((Entity)a).getQName();
417 RdfWasDerivedFrom wdf=new RdfWasDerivedFrom(manager,qname);
418 org.openprovenance.rdf.Node cause=a.getCause();
419 org.openprovenance.rdf.Node effect=a.getEffect();
420 wdf.setNodes(newArtifactRef(artifactRegister.get(((Entity)cause).getQName())),
421 newArtifactRef(artifactRegister.get(((Entity)effect).getQName())));
422 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,wdf.getAccount());
423 processAnnotations(a,wdf);
424 return wdf;
425 }
426
427 public RdfWasGeneratedBy newWasGeneratedBy(org.openprovenance.rdf.WasGeneratedBy a) {
428 QName qname=((Entity)a).getQName();
429 RdfWasGeneratedBy wgb=new RdfWasGeneratedBy(manager,qname);
430 org.openprovenance.rdf.Node cause=a.getCause();
431 org.openprovenance.rdf.Node effect=a.getEffect();
432 org.openprovenance.rdf.Role role=a.getRole();
433 wgb.setFields(newProcessRef(processRegister.get(((Entity)cause).getQName())),
434 newArtifactRef(artifactRegister.get(((Entity)effect).getQName())),
435 newRole(role));
436 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,wgb.getAccount());
437 processAnnotations(a,wgb);
438 if (a.getTime()!=null) wgb.setTime(newOTime(a.getTime()));
439 return wgb;
440 }
441
442 public RdfUsed newUsed(org.openprovenance.rdf.Used a) {
443 QName qname=((Entity)a).getQName();
444 RdfUsed u=new RdfUsed(manager,qname);
445 org.openprovenance.rdf.Node cause=a.getCause();
446 org.openprovenance.rdf.Node effect=a.getEffect();
447 org.openprovenance.rdf.Role role=a.getRole();
448 u.setFields(newArtifactRef(artifactRegister.get(((Entity)cause).getQName())),
449 newProcessRef(processRegister.get(((Entity)effect).getQName())),
450 newRole(role));
451 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,u.getAccount());
452 processAnnotations(a,u);
453 if (a.getTime()!=null) u.setTime(newOTime(a.getTime()));
454 return u;
455 }
456
457 public RdfWasControlledBy newWasControlledBy(org.openprovenance.rdf.WasControlledBy a) {
458 QName qname=((Entity)a).getQName();
459 RdfWasControlledBy wcb=new RdfWasControlledBy(manager,qname);
460 org.openprovenance.rdf.Node cause=a.getCause();
461 org.openprovenance.rdf.Node effect=a.getEffect();
462 org.openprovenance.rdf.Role role=a.getRole();
463 wcb.setFields(newAgentRef(agentRegister.get(((Entity)cause).getQName())),
464 newProcessRef(processRegister.get(((Entity)effect).getQName())),
465 newRole(role));
466 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,wcb.getAccount());
467 processAnnotations(a,wcb);
468 if (a.getStartTime()!=null) wcb.setStartTime(newOTime(a.getStartTime()));
469 if (a.getEndTime()!=null) wcb.setEndTime(newOTime(a.getEndTime()));
470 return wcb;
471 }
472
473
474 public RdfWasTriggeredBy newWasTriggeredBy(org.openprovenance.rdf.WasTriggeredBy a) {
475 QName qname=((Entity)a).getQName();
476 RdfWasTriggeredBy wtb=new RdfWasTriggeredBy(manager,qname);
477 org.openprovenance.rdf.Node cause=a.getCause();
478 org.openprovenance.rdf.Node effect=a.getEffect();
479 wtb.setNodes(newProcessRef(processRegister.get(((Entity)cause).getQName())),
480 newProcessRef(processRegister.get(((Entity)effect).getQName())));
481 addAccounts((org.openprovenance.rdf.AnnotationOrEdgeOrNode)a,wtb.getAccount());
482 processAnnotations(a,wtb);
483 return wtb;
484 }
485
486 public void processAnnotations(org.openprovenance.rdf.Annotable a, Annotable res) {
487 for (org.openprovenance.rdf.Annotation ann: a.getAnnotations()) {
488 addAnnotation(res,newEmbeddedAnnotation(ann));
489 }
490 for (String label: a.getLabels()) {
491 super.addAnnotation(res,newLabel(label));
492 }
493 for (URI pname: a.getPnames()) {
494 super.addAnnotation(res,newPName(pname.toString()));
495 }
496 for (String profile: a.getProfiles()) {
497 super.addAnnotation(res,newProfile(profile));
498 }
499 for (URI type: a.getTypes()) {
500 super.addAnnotation(res,newType(type.toString()));
501 }
502 if (a instanceof org.openprovenance.rdf.Artifact) {
503 org.openprovenance.rdf.Artifact aa=(org.openprovenance.rdf.Artifact) a;
504 for (org.openprovenance.rdf.AValue av: aa.getAvalues()) {
505 if (av.getContent() instanceof XMLLiteral) {
506 XMLLiteral lit=(XMLLiteral)av.getContent();
507 Document doc=builder.newDocument();
508 Element el=(Element)doc.importNode(lit.getDocument().getDocumentElement(),true);
509 super.addAnnotation(res,newValue(el,
510 av.getEncoding().toString()));
511 } else {
512 super.addAnnotation(res,newValue(av.getContent(),
513 av.getEncoding().toString()));
514 }
515 }
516 }
517 }
518
519
520 public void addNewAnnotations(Annotable res,
521 List<JAXBElement<? extends org.openprovenance.model.EmbeddedAnnotation>> anns) {
522 for (JAXBElement<? extends org.openprovenance.model.EmbeddedAnnotation> ann: anns) {
523 EmbeddedAnnotation ea=ann.getValue();
524
525 String label=getLabel(ea);
526 if (label!=null) addAnnotation(res,newLabel(label));
527
528 String type=getType(ea);
529 if (type!=null) addAnnotation(res,newType(type));
530
531 String profile=getProfile(ea);
532 if (profile!=null) addAnnotation(res,newProfile(profile));
533
534 String pname=getPname(ea);
535 if (pname!=null) addAnnotation(res,newPName(pname));
536
537 Object value=getValue(ea);
538 if (value!=null) addAnnotation(res,newValue(value,getEncoding(ea)));
539
540 if (ea.getId()!=null)
541 addAnnotation(res,newEmbeddedAnnotation(ea.getId(),
542 ea.getProperty(),
543 newAccounts(ea.getAccount()),
544 null));
545 }
546 }
547
548
549 public OPMGraph newOPMGraph(org.openprovenance.rdf.OPMGraph gr) {
550
551 QName qname=((Entity)gr).getQName();
552
553 List<Account> accs=new LinkedList();
554 for (org.openprovenance.rdf.Account acc: gr.getHasAccount()) {
555 accs.add(newAccount(acc));
556 }
557
558
559 List<Artifact> as=new LinkedList();
560 for (org.openprovenance.rdf.Artifact a: gr.getHasArtifact()) {
561 as.add(newArtifact(a));
562 }
563
564 List<Process> ps=new LinkedList();
565 for (org.openprovenance.rdf.Process p: gr.getHasProcess()) {
566 ps.add(newProcess(p));
567 }
568
569 List<Agent> ags=new LinkedList();
570 for (org.openprovenance.rdf.Agent ag: gr.getHasAgent()) {
571 ags.add(newAgent(ag));
572 }
573
574 List<Object> lks=new LinkedList();
575 for (org.openprovenance.rdf.Edge edge: gr.getHasDependency()) {
576 if (edge instanceof org.openprovenance.rdf.Used) {
577 lks.add(newUsed((org.openprovenance.rdf.Used) edge));
578 } else if (edge instanceof org.openprovenance.rdf.WasGeneratedBy) {
579 lks.add(newWasGeneratedBy((org.openprovenance.rdf.WasGeneratedBy) edge));
580 } else if (edge instanceof org.openprovenance.rdf.WasDerivedFrom) {
581 lks.add(newWasDerivedFrom((org.openprovenance.rdf.WasDerivedFrom) edge));
582 } else if (edge instanceof org.openprovenance.rdf.WasControlledBy) {
583 lks.add(newWasControlledBy((org.openprovenance.rdf.WasControlledBy) edge));
584 } else if (edge instanceof org.openprovenance.rdf.WasTriggeredBy) {
585 lks.add(newWasTriggeredBy((org.openprovenance.rdf.WasTriggeredBy) edge));
586 }
587 }
588
589
590 List<Annotation> anns=null;
591
592 OPMGraph res=super.newOPMGraph(qname.getLocalPart(),
593 accs,
594 new LinkedList(),
595 ps,
596 as,
597 ags,
598 lks,
599 anns);
600
601 for (org.openprovenance.rdf.Annotation ann: gr.getAnnotations()) {
602
603 RdfEmbeddedAnnotation ann2=newEmbeddedAnnotation(ann);
604 super.addAnnotation(res,ann2);
605 }
606
607 return res;
608 }
609
610 public WasDerivedFrom newWasDerivedFrom(WasDerivedFrom d) {
611 WasDerivedFrom wdf=newWasDerivedFrom(d.getId(),
612 newArtifactRef(artifactRegister2.get(((Artifact)d.getEffect().getRef()).getId())),
613 newArtifactRef(artifactRegister2.get(((Artifact)d.getCause().getRef()).getId())),
614 newAccounts(d.getAccount()));
615 wdf.getAnnotation().addAll(d.getAnnotation());
616 return wdf;
617 }
618
619 public WasTriggeredBy newWasTriggeredBy(WasTriggeredBy d) {
620 WasTriggeredBy wtb=newWasTriggeredBy(d.getId(),
621 newProcessRef(processRegister2.get(((Process)d.getEffect().getRef()).getId())),
622 newProcessRef(processRegister2.get(((Process)d.getCause().getRef()).getId())),
623 newAccounts(d.getAccount()));
624 wtb.getAnnotation().addAll(d.getAnnotation());
625 return wtb;
626 }
627
628 public Used newUsed(Used d) {
629 Used u=newUsed(d.getId(),
630 newProcessRef(processRegister2.get(((Process)d.getEffect().getRef()).getId())),
631 newRole(d.getRole()),
632 newArtifactRef(artifactRegister2.get(((Artifact)d.getCause().getRef()).getId())),
633 newAccounts(d.getAccount()));
634 u.getAnnotation().addAll(d.getAnnotation());
635 if (d.getTime()!=null) u.setTime(newOTime(d.getTime()));
636 return u;
637 }
638 public WasGeneratedBy newWasGeneratedBy(WasGeneratedBy d) {
639 WasGeneratedBy wgb=newWasGeneratedBy(d.getId(),
640 newArtifactRef(artifactRegister2.get(((Artifact)d.getEffect().getRef()).getId())),
641
642 newRole(d.getRole()),
643 newProcessRef(processRegister2.get(((Process)d.getCause().getRef()).getId())),
644 newAccounts(d.getAccount()));
645 wgb.getAnnotation().addAll(d.getAnnotation());
646 if (d.getTime()!=null) wgb.setTime(newOTime(d.getTime()));
647 return wgb;
648 }
649
650 public WasControlledBy newWasControlledBy(WasControlledBy d) {
651 WasControlledBy wcb=newWasControlledBy(d.getId(),
652 newProcessRef(processRegister2.get(((Process)d.getEffect().getRef()).getId())),
653 newRole(d.getRole()),
654 newAgentRef(agentRegister2.get(((Agent)d.getCause().getRef()).getId())),
655 newAccounts(d.getAccount()));
656 wcb.getAnnotation().addAll(d.getAnnotation());
657 if (d.getStartTime()!=null) wcb.setStartTime(newOTime(d.getStartTime()));
658 if (d.getEndTime()!=null) wcb.setEndTime(newOTime(d.getEndTime()));
659 return wcb;
660 }
661
662 public List<Property> newProperties(List<Property> props) {
663 List<Property> res=new LinkedList();
664 for (Property prop: props) {
665 res.add(newProperty(prop));
666 }
667 return res;
668 }
669
670 public Annotation newAnnotation(Annotation ann) {
671 Annotation res=newAnnotation(ann.getId(),
672 getFromRegisters(((Identifiable)ann.getLocalSubject()).getId()),
673 newProperties(ann.getProperty()),
674 newAccounts(ann.getAccount()));
675 return res;
676 }
677
678 public Object getFromRegisters(String id) {
679 Object res=null;
680 res=artifactRegister2.get(id);
681 if (res!=null) return res;
682
683 res=accountRegister2.get(id);
684 if (res!=null) return res;
685
686 res=processRegister2.get(id);
687 if (res!=null) return res;
688
689 res=agentRegister2.get(id);
690 if (res!=null) return res;
691
692 return res;
693 }
694
695
696 /*** Clones an OPMGraph to an OPMGraph with facade, and creates
697 * corresponding rdf representation in triple store. This is
698 * definitely a stateful operation. */
699
700 public RdfOPMGraph newOPMGraph(OPMGraph gr) {
701
702 List<Account> accs=new LinkedList();
703 for (Account acc: gr.getAccounts().getAccount()) {
704 accs.add(register(acc.getId(),newAccount(acc)));
705 }
706
707
708
709 List<Artifact> as=new LinkedList();
710 for (Artifact a: gr.getArtifacts().getArtifact()) {
711 as.add(register(a.getId(),newArtifact(a)));
712 }
713
714 List<Process> ps=new LinkedList();
715 for (Process p: gr.getProcesses().getProcess()) {
716 ps.add(register(p.getId(), newProcess(p)));
717 }
718
719
720 List<Agent> ags=new LinkedList();
721 for (Agent ag: gr.getAgents().getAgent()) {
722 ags.add(register(ag.getId(), newAgent(ag)));
723 }
724
725 List<Object> lks=new LinkedList();
726
727 for (Object edge: gr.getCausalDependencies().getUsedOrWasGeneratedByOrWasTriggeredBy()) {
728 if (edge instanceof org.openprovenance.model.Used) {
729 lks.add(newUsed((org.openprovenance.model.Used) edge));
730 } else if (edge instanceof org.openprovenance.model.WasGeneratedBy) {
731 lks.add(newWasGeneratedBy((org.openprovenance.model.WasGeneratedBy) edge));
732 } else if (edge instanceof org.openprovenance.model.WasDerivedFrom) {
733 lks.add(newWasDerivedFrom((org.openprovenance.model.WasDerivedFrom) edge));
734 } else if (edge instanceof org.openprovenance.model.WasControlledBy) {
735 lks.add(newWasControlledBy((org.openprovenance.model.WasControlledBy) edge));
736 } else if (edge instanceof org.openprovenance.model.WasTriggeredBy) {
737 lks.add(newWasTriggeredBy((org.openprovenance.model.WasTriggeredBy) edge));
738 }
739 }
740
741
742
743 List<Annotation> anns=new LinkedList();
744 if (gr.getAnnotations()!=null) {
745 for (Annotation ann: gr.getAnnotations().getAnnotation()) {
746 Annotation ann2=newAnnotation(ann);
747 anns.add(ann2);
748 }
749 }
750
751 OPMGraph res=super.newOPMGraph(gr.getId(),
752 accs,
753 new LinkedList(),
754 ps,
755 as,
756 ags,
757 lks,
758 anns);
759
760 addNewAnnotations(res,gr.getAnnotation());
761
762 return (RdfOPMGraph) res;
763 }
764
765
766 }