View Javadoc

1   /*
2    ORDI - Ontology Repository and Data Integration
3   
4    Copyright (c) 2004-2007, OntoText Lab. / SIRMA
5   
6    This library is free software; you can redistribute it and/or modify it under
7    the terms of the GNU Lesser General Public License as published by the Free
8    Software Foundation; either version 2.1 of the License, or (at your option)
9    any later version.
10   This library is distributed in the hope that it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12   FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13   details.
14   You should have received a copy of the GNU Lesser General Public License along
15   with this library; if not, write to the Free Software Foundation, Inc.,
16   59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17   */
18  package com.ontotext.ordi.wsmo4rdf.impl;
19  
20  import java.util.Iterator;
21  import java.util.List;
22  import java.util.Set;
23  import java.util.Stack;
24  
25  import org.deri.wsmo4j.io.serializer.wsml.SerializerImpl;
26  import org.omwg.logicalexpression.LogicalExpression;
27  import org.omwg.ontology.Attribute;
28  import org.omwg.ontology.Axiom;
29  import org.omwg.ontology.Concept;
30  import org.omwg.ontology.Instance;
31  import org.omwg.ontology.Ontology;
32  import org.omwg.ontology.OntologyElement;
33  import org.omwg.ontology.Parameter;
34  import org.omwg.ontology.Relation;
35  import org.omwg.ontology.RelationInstance;
36  import org.omwg.ontology.Type;
37  import org.omwg.ontology.Variable;
38  import org.omwg.ontology.WsmlDataType;
39  import org.openrdf.model.URI;
40  import org.openrdf.model.vocabulary.XMLSchema;
41  import org.wsmo.common.Entity;
42  import org.wsmo.common.IRI;
43  import org.wsmo.common.Identifier;
44  import org.wsmo.common.TopEntity;
45  import org.wsmo.common.exception.SynchronisationException;
46  import org.wsmo.factory.WsmoFactory;
47  import org.wsmo.mediator.GGMediator;
48  import org.wsmo.mediator.OOMediator;
49  import org.wsmo.mediator.WGMediator;
50  import org.wsmo.mediator.WWMediator;
51  import org.wsmo.service.Capability;
52  import org.wsmo.service.Choreography;
53  import org.wsmo.service.Goal;
54  import org.wsmo.service.Interface;
55  import org.wsmo.service.Orchestration;
56  import org.wsmo.service.WebService;
57  
58  import com.ontotext.ordi.wsmo4rdf.Constants;
59  import com.ontotext.ordi.wsmo4rdf.WSMLTripleHandler;
60  import com.ontotext.ordi.wsmo4rdf.WSMLtoTriples;
61  import com.ontotext.ordi.wsmo4rdf.WSMO4RDFRuntimeException;
62  import com.ontotext.wsmo4j.serializer.wsml.WSMLEnumerator;
63  import com.ontotext.wsmo4j.serializer.wsml.WSMLItem;
64  
65  /**
66   * This class transforms a WSMO Entity to a set of triples associated with
67   * specific meta data. Meta-data is associated to triples as follows:
68   * 
69   * Named graph contains the IRI of the outer most TopEntity to be converted
70   * (i.e, the container of all statements). Triplesets contains all IRIs of
71   * Entities, which after deletion should remove the statement.
72   * 
73   * @author vassil
74   */
75  @SuppressWarnings("unchecked")
76  public class WSML2TriplesImpl extends WSMLEnumerator implements WSMLtoTriples {
77  
78      protected final WsmoFactory wsmoFactory;
79      protected final Stack<URI> stack = new Stack<URI>();
80      private WSMLTripleHandler handler;
81      // Helper handles for the exceptions of identifier in the stack
82      private URI attributeId = null;
83      private URI axiomId = null;
84      // Helper handles for the meta-data association
85      protected URI namedGraph = null;
86      protected final Stack<URI> metaDataStack = new Stack<URI>();
87  
88      public WSML2TriplesImpl(WsmoFactory wsmoFactory, WSMLTripleHandler handler) {
89          super();
90          if (wsmoFactory == null || handler == null) {
91              throw new IllegalArgumentException(
92                      "Null is not allowed for this constructor!");
93          }
94          this.wsmoFactory = wsmoFactory;
95          this.handler = handler;
96      }
97  
98      public synchronized void process(Entity entity) {
99          stack.clear();
100         metaDataStack.clear();
101         new WSMLItem(entity).apply(this);
102         namedGraph = null;
103 
104         assert stack.size() == 0;
105     }
106 
107     public WSMLTripleHandler getHandler() {
108         return handler;
109     }
110 
111     public synchronized void setHandler(WSMLTripleHandler handler) {
112         if (handler == null) {
113             throw new IllegalArgumentException();
114         }
115         this.handler = handler;
116     }
117 
118     public void inEntity(Entity item) {
119         if (item instanceof Attribute) {
120             // fix to use the _x id of the attribute but not the IRI
121             stack.push(attributeId);
122         } else if (item instanceof Axiom) {
123             stack.push(axiomId);
124         } else {
125             URI entityURI = Util.toURI(item.getIdentifier());
126             stack.push(entityURI);
127         }
128     }
129 
130     public void onNFPKeyValues(IRI key, Set vals) {
131         if (vals.size() == 0) {
132             return;
133         }
134         Iterator<?> iter = vals.iterator();
135         // Mark the property as non-functional/owl:AnnotationProperty
136         handler.handleTriple(Util.toURI(key), Util.toURI(wsmoFactory
137                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
138                 .createIRI(Constants.OWL_AnnotationProperty)), namedGraph,
139                 metaDataStack.toArray(new URI[metaDataStack.size()]));
140 
141         while (iter.hasNext()) {
142             Object obj = iter.next();
143             handler.handleTriple(stack.peek(), Util.toURI(key), Util
144                     .toValue(obj), namedGraph, metaDataStack
145                     .toArray(new URI[metaDataStack.size()]));
146         }
147     }
148 
149     public void outEntity(Entity item) {
150         stack.pop();
151     }
152 
153     public void inTopEntity(TopEntity te) {
154         super.inTopEntity(te);
155         String variant = te.getWsmlVariant();
156         if (variant == null)
157             variant = Constants.WSML_wsml_core.toString();
158         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
159                 .createIRI(Constants.WSML_variant)), Util.toValue(variant),
160                 namedGraph, metaDataStack
161                         .toArray(new URI[metaDataStack.size()]));
162     }
163 
164     public void outTopEntity(TopEntity te) {
165         return;
166     }
167 
168     public void inImportsOntologies(TopEntity _) {
169         stack.push(Util.toURI(_.getIdentifier()));
170     }
171 
172     public void onImportedOntologies(Set list) {
173         Iterator<?> iter = list.iterator();
174         while (iter.hasNext()) {
175             Identifier entityID = ((Entity) iter.next()).getIdentifier();
176             URI ontologId = Util.toURI(entityID);
177             metaDataStack.push(ontologId);
178             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
179                     .createIRI(Constants.WSML_importsOntology)), ontologId,
180                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
181                             .size()]));
182             metaDataStack.pop();
183         }
184     }
185 
186     public void outImportsOntologies(TopEntity _) {
187         stack.pop();
188     }
189 
190     public void inUsesMediators(TopEntity item) {
191         stack.push(Util.toURI(item.getIdentifier()));
192     }
193 
194     public void onUsedMediators(Set list) {
195         Iterator<?> iter = list.iterator();
196         while (iter.hasNext()) {
197             Identifier entityID = (Identifier) iter.next();
198             URI mediatorId = Util.toURI(entityID);
199             metaDataStack.push(mediatorId);
200             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
201                     .createIRI(Constants.WSML_usesMediator)), mediatorId,
202                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
203                             .size()]));
204             metaDataStack.pop();
205         }
206     }
207 
208     public void outUsesMediators(TopEntity item) {
209         stack.pop();
210     }
211 
212     public void inOntology(Ontology item) {
213         URI ontologyURI = Util.toURI(item.getIdentifier());
214         namedGraph = ontologyURI;
215         stack.push(ontologyURI);
216         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
217                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
218                 .createIRI(Constants.WSML_ontology)), namedGraph, metaDataStack
219                 .toArray(new URI[metaDataStack.size()]));
220     }
221 
222     public void outOntology(Ontology item) {
223         stack.pop();
224         namedGraph = null;
225     }
226 
227     public void inAxiom(Axiom item) {
228         axiomId = Util.toURI(item.getIdentifier());
229         metaDataStack.push(axiomId);
230         processOntologyElement(item);
231         stack.push(axiomId);
232         handler.handleTriple(axiomId, Util.toURI(wsmoFactory
233                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
234                 .createIRI(Constants.WSML_axiom)), namedGraph, metaDataStack
235                 .toArray(new URI[metaDataStack.size()]));
236     }
237 
238     /*
239      * Method is used instead of outAxiom and other axiom like types etc (see
240      * types contained in Capability).
241      */
242     public void onAxiomDefinition(Axiom item) {
243         super.onAxiomDefinition(item);
244         stack.pop();
245         metaDataStack.pop();
246     }
247 
248     public void onLogExpression(LogicalExpression item) {
249         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
250                 .createIRI(Constants.RDFS_isDefinedBy)), Util.toValue(item
251                 .toString()), namedGraph, metaDataStack
252                 .toArray(new URI[metaDataStack.size()]));
253     }
254 
255     public void inConcept(Concept item) {
256         URI id = Util.toURI(item.getIdentifier());
257         metaDataStack.push(id);
258         processOntologyElement(item);
259         stack.push(id);
260         handler.handleTriple(id, Util.toURI(wsmoFactory
261                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
262                 .createIRI(Constants.WSML_concept)), namedGraph, metaDataStack
263                 .toArray(new URI[metaDataStack.size()]));
264     }
265 
266     public void onSuperConcepts(Set list) {
267         Iterator<?> iter = list.iterator();
268         while (iter.hasNext()) {
269             Identifier entityID = ((Entity) iter.next()).getIdentifier();
270             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
271                     .createIRI(Constants.RDFS_subClassOf)), Util
272                     .toValue(entityID), namedGraph, metaDataStack
273                     .toArray(new URI[metaDataStack.size()]));
274         }
275     }
276 
277     public void outConcept(Concept item) {
278         stack.pop();
279         metaDataStack.pop();
280     }
281 
282     public void inAttribute(Attribute item) {
283         if (stack.size() == 0 && item.getConcept() != null) {
284             inConcept(item.getConcept());
285         }
286         attributeId = Util.toURI(wsmoFactory.createAnonymousID());
287         metaDataStack.push(Util.toURI(item.getIdentifier()));
288         if (stack.size() != 0) { // stand-alone mode should be checked
289             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
290                     .createIRI(Constants.PART_hasPart_directly)), attributeId,
291                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
292                             .size()]));
293         }
294         stack.push(attributeId);
295 
296         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
297                 .createIRI(Constants.WSML_forAttribute)), Util.toValue(item
298                 .getIdentifier()), namedGraph, metaDataStack
299                 .toArray(new URI[metaDataStack.size()]));
300         // shortcut - maybe be considered as materialized reasoning!
301         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
302                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
303                 .createIRI(Constants.WSML_attribute_definition)), namedGraph,
304                 metaDataStack.toArray(new URI[metaDataStack.size()]));
305         // features
306         if (item.isTransitive()) {
307             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
308                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
309                     .createIRI(Constants.WSML_transitiveAttributeDefinition)),
310                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
311                             .size()]));
312         }
313         if (item.isReflexive()) {
314             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
315                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
316                     .createIRI(Constants.WSML_reflexiveAttributeDefinition)),
317                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
318                             .size()]));
319         }
320         if (item.isSymmetric()) {
321             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
322                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
323                     .createIRI(Constants.WSML_symmetricAttributeDefinition)),
324                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
325                             .size()]));
326         }
327         if (item.getInverseOf() != null) {
328             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
329                     .createIRI(Constants.WSML_inverseOf)), Util.toValue(item
330                     .getIdentifier()), namedGraph, metaDataStack
331                     .toArray(new URI[metaDataStack.size()]));
332         }
333         IRI pred = null;
334         if (item.isConstraining()) {
335             pred = wsmoFactory.createIRI(Constants.WSML_ofType);
336         } else {
337             pred = wsmoFactory.createIRI(Constants.WSML_impliesType);
338         }
339         Set<?> list = item.listTypes();
340         Iterator<?> iter = list.iterator();
341         while (iter.hasNext()) {
342             Type c = (Type) iter.next();
343             if (c instanceof Concept)
344                 handler.handleTriple(stack.peek(), Util.toURI(pred), Util
345                         .toValue(((Concept) c).getIdentifier()), namedGraph,
346                         metaDataStack.toArray(new URI[metaDataStack.size()]));
347             else if (c instanceof WsmlDataType)
348                 handler.handleTriple(stack.peek(), Util.toURI(pred), Util
349                         .toURI(((WsmlDataType) c).getIRI()), namedGraph,
350                         metaDataStack.toArray(new URI[metaDataStack.size()]));
351             else
352                 throw new SynchronisationException("Unexpected attribute type!");
353 
354         }
355 
356         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
357                 .createIRI(Constants.WSML_minCardinality)), Util.toValue(item
358                 .getMinCardinality(), XMLSchema.NON_NEGATIVE_INTEGER),
359                 namedGraph, metaDataStack
360                         .toArray(new URI[metaDataStack.size()]));
361         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
362                 .createIRI(Constants.WSML_maxCardinality)), Util.toValue(item
363                 .getMaxCardinality(), XMLSchema.NON_NEGATIVE_INTEGER),
364                 namedGraph, metaDataStack
365                         .toArray(new URI[metaDataStack.size()]));
366     }
367 
368     public void outAttribute(Attribute item) {
369         stack.pop();
370         metaDataStack.pop();
371         attributeId = null;
372     }
373 
374     public void inRelation(Relation item) {
375         URI id = Util.toURI(item.getIdentifier());
376         metaDataStack.push(id);
377         processOntologyElement(item);
378         stack.push(id);
379         handler.handleTriple(id, Util.toURI(wsmoFactory
380                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
381                 .createIRI(Constants.WSML_Relation)), namedGraph, metaDataStack
382                 .toArray(new URI[metaDataStack.size()]));
383     }
384 
385     // @todo: fix the case when there are no pram defs at all -> shoud use (id,
386     // hasPart rdf:nil) triple instead
387     public void onParameters(List list) {
388         if (list.size() == 0)
389             return;
390         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
391                 .createIRI(Constants.WSML_arity)), Util.toValue(list.size(),
392                 XMLSchema.NON_NEGATIVE_INTEGER), namedGraph, metaDataStack
393                 .toArray(new URI[metaDataStack.size()]));
394         Iterator<?> iter = list.iterator();
395         URI anon = Util.toURI(wsmoFactory.createAnonymousID());
396         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
397                 .createIRI(Constants.PART_hasPart_directly)), anon, namedGraph,
398                 metaDataStack.toArray(new URI[metaDataStack.size()]));
399         URI last = null;
400 
401         while (iter.hasNext()) {
402             if (last != null) {
403                 URI foo = Util.toURI(wsmoFactory.createAnonymousID());
404                 handler.handleTriple(anon, Util.toURI(wsmoFactory
405                         .createIRI(Constants.RDF_rest)), foo, namedGraph,
406                         metaDataStack.toArray(new URI[metaDataStack.size()]));
407                 anon = foo;
408             }
409             handler.handleTriple(anon, Util.toURI(wsmoFactory
410                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
411                     .createIRI(Constants.RDF_List)), namedGraph, metaDataStack
412                     .toArray(new URI[metaDataStack.size()]));
413             URI local = Util.toURI(wsmoFactory.createAnonymousID());
414             handler.handleTriple(anon, Util.toURI(wsmoFactory
415                     .createIRI(Constants.RDF_first)), local, namedGraph,
416                     metaDataStack.toArray(new URI[metaDataStack.size()]));
417             Parameter param = (Parameter) iter.next();
418             URI pred = null;
419             // range semantics
420             if (param.isConstraining()) {
421                 pred = Util.toURI(wsmoFactory.createIRI(Constants.WSML_ofType));
422             } else {
423                 pred = Util.toURI(wsmoFactory
424                         .createIRI(Constants.WSML_impliesType));
425             }
426             // parameter range(s)
427             Set types = param.listTypes();
428             Iterator typesIter = types.iterator();
429             while (typesIter.hasNext()) {
430 
431                 Object theType = typesIter.next();
432                 if (theType instanceof WsmlDataType)
433                     handler.handleTriple(local, pred, Util
434                             .toValue(((WsmlDataType) theType).getIRI()),
435                             namedGraph, metaDataStack
436                                     .toArray(new URI[metaDataStack.size()]));
437                 else
438                     handler.handleTriple(local, pred, Util
439                             .toValue(((Concept) theType).getIdentifier()),
440                             namedGraph, metaDataStack
441                                     .toArray(new URI[metaDataStack.size()]));
442             }
443             last = anon;
444         }
445 
446         handler.handleTriple(anon, Util.toURI(wsmoFactory
447                 .createIRI(Constants.RDF_rest)), Util.toValue(wsmoFactory
448                 .createIRI(Constants.RDF_nil)), namedGraph, metaDataStack
449                 .toArray(new URI[metaDataStack.size()]));
450     }
451 
452     public void onSuperRelations(Set list) {
453         Iterator iter = list.iterator();
454         while (iter.hasNext()) {
455             Entity sc = (Entity) iter.next();
456             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
457                     .createIRI(Constants.WSML_subRelationOf)), Util.toValue(sc
458                     .getIdentifier()), namedGraph, metaDataStack
459                     .toArray(new URI[metaDataStack.size()]));
460         }
461     }
462 
463     public void outRelation(Relation item) {
464         stack.pop();
465         metaDataStack.pop();
466     }
467 
468     public void inInstance(Instance item) {
469         URI id = Util.toURI(item.getIdentifier());
470         metaDataStack.push(id);
471         processOntologyElement(item);
472         // if there is no other information for a instance state that its type
473         // is resources
474         if (item.listAttributeValues().size() == 0
475                 && item.listConcepts().size() == 0
476                 && item.listNFPValues().size() == 0) {
477             handler.handleTriple(id, Util.toURI(wsmoFactory
478                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
479                     .createIRI(Constants.RDFS_Resource)), namedGraph,
480                     metaDataStack.toArray(new URI[metaDataStack.size()]));
481         }
482         stack.push(id);
483     }
484 
485     public void onInstanceMemberOf(Set list) {
486         if (0 == list.size())
487             return;
488         Iterator<?> iter = list.iterator();
489         while (iter.hasNext()) {
490             Concept c = (Concept) iter.next();
491             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
492                     .createIRI(Constants.RDF_type)), Util.toValue(c
493                     .getIdentifier()), namedGraph, metaDataStack
494                     .toArray(new URI[metaDataStack.size()]));
495         }
496     }
497 
498     public void onAttributeKeyValue(Identifier key, Set values) {
499         if (values.size() == 0 || key instanceof IRI == false) {
500             return;
501         }
502         URI pred = Util.toURI(key);
503         handler.handleTriple(pred, Util.toURI(wsmoFactory
504                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
505                 .createIRI(Constants.WSML_Attribute)), namedGraph,
506                 metaDataStack.toArray(new URI[metaDataStack.size()]));
507         Iterator<?> iter = values.iterator();
508         while (iter.hasNext()) {
509             Object o = iter.next();
510             handler.handleTriple(stack.peek(), pred, Util.toValue(o),
511                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
512                             .size()]));
513         }
514     }
515 
516     public void outInstance(Instance item) {
517         stack.pop();
518         metaDataStack.pop();
519     }
520 
521     public void inRelationInstance(RelationInstance item) {
522         URI id = Util.toURI(item.getIdentifier());
523         metaDataStack.push(id);
524         processOntologyElement(item);
525         stack.push(id);
526         handler.handleTriple(id, Util.toURI(wsmoFactory
527                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
528                 .createIRI(Constants.WSML_RelationInstance)), namedGraph,
529                 metaDataStack.toArray(new URI[metaDataStack.size()]));
530     }
531 
532     public void onRelationInstanceMemberOf(Relation relation) {
533         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
534                 .createIRI(Constants.RDF_type)), Util.toValue(relation
535                 .getIdentifier()), namedGraph, metaDataStack
536                 .toArray(new URI[metaDataStack.size()]));
537     }
538 
539     public void onParameterValues(List list) {
540         URI last = null;
541         URI anon = Util.toURI(wsmoFactory.createAnonymousID());
542         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
543                 .createIRI(Constants.PART_hasPart_directly)), anon, namedGraph,
544                 metaDataStack.toArray(new URI[metaDataStack.size()]));
545         Iterator<?> iter = list.iterator();
546         while (iter.hasNext()) {
547             Object val = iter.next();
548             if (last != null) {
549                 URI foo = Util.toURI(wsmoFactory.createAnonymousID());
550                 handler.handleTriple(anon, Util.toURI(wsmoFactory
551                         .createIRI(Constants.RDF_rest)), foo, namedGraph,
552                         metaDataStack.toArray(new URI[metaDataStack.size()]));
553                 anon = foo;
554             }
555             handler.handleTriple(anon, Util.toURI(wsmoFactory
556                     .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
557                     .createIRI(Constants.RDF_List)), namedGraph, metaDataStack
558                     .toArray(new URI[metaDataStack.size()]));
559             handler.handleTriple(anon, Util.toURI(wsmoFactory
560                     .createIRI(Constants.RDF_first)), Util.toValue(val),
561                     namedGraph, metaDataStack.toArray(new URI[metaDataStack
562                             .size()]));
563             last = anon;
564         }
565         handler.handleTriple(anon, Util.toURI(wsmoFactory
566                 .createIRI(Constants.RDF_rest)), Util.toValue(wsmoFactory
567                 .createIRI(Constants.RDF_nil)), namedGraph, metaDataStack
568                 .toArray(new URI[metaDataStack.size()]));
569     }
570 
571     public void outRelationInstance(RelationInstance item) {
572         stack.pop();
573         metaDataStack.pop();
574     }
575 
576     public void inWebService(WebService item) {
577         URI webServiceURI = Util.toURI(item.getIdentifier());
578         namedGraph = webServiceURI;
579         stack.push(webServiceURI);
580         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
581                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
582                 .createIRI(Constants.WSML_webService)), namedGraph,
583                 metaDataStack.toArray(new URI[metaDataStack.size()]));
584     }
585 
586     public void outWebService(WebService item) {
587         stack.pop();
588         namedGraph = null;
589     }
590 
591     public void inCapability(Capability item) {
592         URI id = Util.toURI(item.getIdentifier());
593         if (namedGraph == null)
594             namedGraph = id;
595         metaDataStack.push(id);
596         if (stack.size() > 0) {
597             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
598                     .createIRI(Constants.PART_hasPart_directly)), Util
599                     .toValue(item.getIdentifier()), namedGraph, metaDataStack
600                     .toArray(new URI[metaDataStack.size()])); // WSML_useCapability
601         }
602         stack.push(id);
603         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
604                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
605                 .createIRI(Constants.WSML_Capability)), namedGraph,
606                 metaDataStack.toArray(new URI[metaDataStack.size()]));
607     }
608 
609     public void onSharedVariables(Set list) {
610         Iterator<?> iter = list.iterator();
611         while (iter.hasNext()) {
612             Variable sc = (Variable) iter.next();
613             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
614                     .createIRI(Constants.WSML_sharedVariable)), Util
615                     .toValue("?" + sc.getName()), namedGraph, metaDataStack
616                     .toArray(new URI[metaDataStack.size()]));
617         }
618     }
619 
620     public void outCapability(Capability item) {
621         URI id = stack.pop();
622         metaDataStack.pop();
623         if (namedGraph.equals(id))
624             namedGraph = null;
625     }
626 
627     public void onHasAssumptions(Entity item) {
628         URI id = Util.toURI(item.getIdentifier());
629         metaDataStack.push(id);
630         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
631                 .createIRI(Constants.WSML_hasAssumption)), id, namedGraph,
632                 metaDataStack.toArray(new URI[metaDataStack.size()]));
633         stack.push(id);
634         axiomId = id;
635     }
636 
637     public void onHasEffects(Entity item) {
638         URI id = Util.toURI(item.getIdentifier());
639         metaDataStack.push(id);
640         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
641                 .createIRI(Constants.WSML_hasEffect)), id, namedGraph,
642                 metaDataStack.toArray(new URI[metaDataStack.size()]));
643         stack.push(id);
644         axiomId = id;
645     }
646 
647     public void onHasPreconditions(Entity item) {
648         URI id = Util.toURI(item.getIdentifier());
649         metaDataStack.push(id);
650         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
651                 .createIRI(Constants.WSML_hasPrecondition)), id, namedGraph,
652                 metaDataStack.toArray(new URI[metaDataStack.size()]));
653         stack.push(id);
654         axiomId = id;
655     }
656 
657     public void onHasPostconditions(Entity item) {
658         URI id = Util.toURI(item.getIdentifier());
659         metaDataStack.push(id);
660         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
661                 .createIRI(Constants.WSML_hasPostcondition)), id, namedGraph,
662                 metaDataStack.toArray(new URI[metaDataStack.size()]));
663         stack.push(id);
664         axiomId = id;
665     }
666 
667     public void inInterface(Interface item) {
668         URI id = Util.toURI(item.getIdentifier());
669         if (namedGraph == null)
670             namedGraph = id;
671         metaDataStack.push(id);
672         if (stack.size() > 0) {
673             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
674                     .createIRI(Constants.PART_hasPart_directly)), Util
675                     .toValue(item.getIdentifier()), namedGraph, metaDataStack
676                     .toArray(new URI[metaDataStack.size()])); // WSML_useInterface
677         }
678         stack.push(id);
679         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
680                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
681                 .createIRI(Constants.WSML_Interface)), namedGraph,
682                 metaDataStack.toArray(new URI[metaDataStack.size()]));
683 
684         if (item.getChoreography() != null)
685             _inChoreography(item.getChoreography());
686     }
687 
688     public void outInterface(Interface item) {
689         URI id = stack.pop();
690         metaDataStack.pop();
691         if (namedGraph.equals(id))
692             namedGraph = null;
693     }
694 
695     public void onMultipleInterfaces(Set list) {
696         Iterator<?> iter = list.iterator();
697         while (iter.hasNext()) {
698             Entity en = (Entity) iter.next();
699             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
700                     .createIRI(Constants.PART_hasPart_directly)), Util
701                     .toValue(en.getIdentifier()), namedGraph, metaDataStack
702                     .toArray(new URI[metaDataStack.size()]));
703         }
704     }
705 
706     public void inOrchestration(Orchestration item) {
707         // this is added to accommodate anonymous identifiers
708         URI id = Util.toURI(item.getIdentifier());
709         metaDataStack.push(id);
710         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
711                 .createIRI(Constants.WSML_Orchestration)), id, namedGraph,
712                 metaDataStack.toArray(new URI[metaDataStack.size()]));
713         stack.push(id);
714     }
715 
716     public void outOrchestration(Orchestration item) {
717         stack.pop();
718         metaDataStack.pop();
719     }
720 
721     /*
722      * Check inInterface method where the choreography is processed. NB: This
723      * method will not handle org.wsmo.service.choreography.Choreography type,
724      * because the specificity of the visitor (implemented using reflection)!
725      */
726     public void inChoreography(Choreography item) {
727         return;
728     }
729 
730     public void inGoal(Goal item) {
731         URI id = Util.toURI(item.getIdentifier());
732         namedGraph = id;
733         stack.push(id);
734         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
735                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
736                 .createIRI(Constants.WSML_goal)), namedGraph, metaDataStack
737                 .toArray(new URI[metaDataStack.size()]));
738     }
739 
740     public void outGoal(Goal item) {
741         stack.pop();
742         namedGraph = null;
743     }
744 
745     public void onMediatorSources(Set list) {
746         Iterator<?> iter = list.iterator();
747         while (iter.hasNext()) {
748             URI id = Util.toURI((Identifier) iter.next());
749             metaDataStack.push(id);
750             handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
751                     .createIRI(Constants.WSML_source)), id, namedGraph,
752                     metaDataStack.toArray(new URI[metaDataStack.size()]));
753             metaDataStack.pop();
754         }
755     }
756 
757     public void onMediatorTarget(Identifier item) {
758         URI id = Util.toURI(item);
759         metaDataStack.push(id);
760         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
761                 .createIRI(Constants.WSML_target)), id, namedGraph,
762                 metaDataStack.toArray(new URI[metaDataStack.size()]));
763         metaDataStack.pop();
764     }
765 
766     public void onMediatorUseService(Identifier item) {
767         URI id = Util.toURI(item);
768         metaDataStack.push(id);
769         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
770                 .createIRI(Constants.WSML_usesService)), Util.toValue(item),
771                 namedGraph, metaDataStack
772                         .toArray(new URI[metaDataStack.size()]));
773         metaDataStack.pop();
774     }
775 
776     public void inOOMediator(OOMediator item) {
777         URI id = Util.toURI(item.getIdentifier());
778         namedGraph = id;
779         stack.push(id);
780         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
781                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
782                 .createIRI(Constants.WSML_ooMediator)), namedGraph,
783                 metaDataStack.toArray(new URI[metaDataStack.size()]));
784     }
785 
786     public void outOOMediator(OOMediator item) {
787         stack.pop();
788         namedGraph = null;
789     }
790 
791     public void inWGMediator(WGMediator item) {
792         URI id = Util.toURI(item.getIdentifier());
793         namedGraph = id;
794         stack.push(id);
795         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
796                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
797                 .createIRI(Constants.WSML_wgMediator)), namedGraph,
798                 metaDataStack.toArray(new URI[metaDataStack.size()]));
799     }
800 
801     public void outWGMediator(WGMediator item) {
802         stack.pop();
803         namedGraph = null;
804     }
805 
806     public void inWWMediator(WWMediator item) {
807         URI id = Util.toURI(item.getIdentifier());
808         namedGraph = id;
809         stack.push(id);
810         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
811                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
812                 .createIRI(Constants.WSML_wwMediator)), namedGraph,
813                 metaDataStack.toArray(new URI[metaDataStack.size()]));
814     }
815 
816     public void outWWMediator(WWMediator item) {
817         stack.pop();
818         namedGraph = null;
819     }
820 
821     public void inGGMediator(GGMediator item) {
822         URI id = Util.toURI(item.getIdentifier());
823         namedGraph = id;
824         stack.push(id);
825         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
826                 .createIRI(Constants.RDF_type)), Util.toValue(wsmoFactory
827                 .createIRI(Constants.WSML_ggMediator)), namedGraph,
828                 metaDataStack.toArray(new URI[metaDataStack.size()]));
829     }
830 
831     public void outGGMediator(GGMediator item) {
832         stack.pop();
833         namedGraph = null;
834     }
835 
836     /*
837      * Ontology elements may be converted as part of Ontology or as Entities.
838      */
839     private void processOntologyElement(OntologyElement item) {
840         if (stack.size() == 0) { // stand-alone OntologyElement
841             if (item.getOntology() == null) {
842                 throw new WSMO4RDFRuntimeException(String.format(
843                         "The OntologyElement %s could not be persisted, "
844                                 + "because it's not associated with Ontology!",
845                         item.getIdentifier()));
846             }
847             // add the Ontology identifier as tripleset
848             URI container = Util.toURI(item.getOntology().getIdentifier());
849             if (namedGraph == null) {
850                 namedGraph = container;
851             }
852             handler.handleTriple(container, Util.toURI(wsmoFactory
853                     .createIRI(Constants.PART_hasPart_directly)), metaDataStack
854                     .peek(), namedGraph, metaDataStack
855                     .toArray(new URI[metaDataStack.size()]));
856         } else {
857             URI container = stack.peek();
858             handler.handleTriple(container, Util.toURI(wsmoFactory
859                     .createIRI(Constants.PART_hasPart_directly)), metaDataStack
860                     .peek(), namedGraph, metaDataStack
861                     .toArray(new URI[metaDataStack.size()]));
862         }
863     }
864 
865     /*
866      * There are two choreography objects: org.wsmo.service.Choreography and
867      * org.wsmo.service.choreography.Choreography (subclass of the former).
868      * WSMLEnumrator implementation uses a special visitor pattern that may
869      * refer to org.wsmo.service.Choreography only.
870      */
871     private void _inChoreography(Choreography item) {
872         URI id = Util.toURI(item.getIdentifier());
873         metaDataStack.push(id);
874         handler.handleTriple(stack.peek(), Util.toURI(wsmoFactory
875                 .createIRI(Constants.WSML_Choreography)), id, namedGraph,
876                 metaDataStack.toArray(new URI[metaDataStack.size()]));
877         if (item instanceof org.wsmo.service.choreography.Choreography) {
878             SerializerImpl serializer = new SerializerImpl(null);
879             handler
880                     .handleTriple(
881                             id,
882                             Util
883                                     .toURI(wsmoFactory
884                                             .createIRI("urn:"
885                                                     + org.wsmo.service.choreography.Choreography.class
886                                                             .getName())),
887                             Util
888                                     .toValue(serializer
889                                             .serialize((org.wsmo.service.choreography.Choreography) item)),
890                             namedGraph, metaDataStack
891                                     .toArray(new URI[metaDataStack.size()]));
892         }
893         metaDataStack.pop();
894     }
895 }