View Javadoc

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) { //Annotable
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             //el.setAccounts(set);
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             //RdfAnnotation ann2=newAnnotation(ann);
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 }