diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..0453115f0495577d03554ea22bc24a64ea812b17 --- /dev/null +++ b/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java @@ -0,0 +1,162 @@ +/* + * $Id$ + * + * Copyright (C) INRIA Rhône-Alpes, 2003-2004 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package fr.inrialpes.exmo.align.impl.renderer; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.io.PrintWriter; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URI; + +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + +import org.semanticweb.owl.model.OWLOntology; +import org.semanticweb.owl.model.OWLEntity; +import org.semanticweb.owl.model.OWLException; + +import org.semanticweb.owl.align.Alignment; +import org.semanticweb.owl.align.AlignmentVisitor; +import org.semanticweb.owl.align.AlignmentException; +import org.semanticweb.owl.align.Cell; +import org.semanticweb.owl.align.Relation; + +import fr.inrialpes.exmo.align.impl.rel.*; + +/** + * Renders an alignment as a new ontology merging these. + * + * @author Jérôme Euzenat + * @version $Id$ + */ + + +public class COWLMappingRendererVisitor implements AlignmentVisitor +{ + PrintWriter writer = null; + Alignment alignment = null; + Cell cell = null; + + public COWLMappingRendererVisitor( PrintWriter writer ){ + this.writer = writer; + } + + public void visit( Alignment align ) throws AlignmentException { + alignment = align; + writer.print("<rdf:RDF\n"); + writer.print(" xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n"); + writer.print(" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n"); + writer.print(" xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" \n"); + writer.print(" xmlns:cowl=\"http://www.itc.it/cowl#\" \n"); + writer.print(" xml:base=\"http://www.itc.it/cowl#\" \n"); + writer.print(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\">\n\n"); + writer.print(" <cowl:Mapping rdf:ID=\"\">\n"); + try { + writer.print(" <cowl:sourceOntology>\n"); + writer.print(" <owl:Ontology rdf:about=\""+((OWLOntology)align.getOntology1()).getURI()+"\"/>\n"); + writer.print(" </cowl:sourceOntology>\n"); + writer.print(" <cowl:targetOntology>\n"); + writer.print(" <owl:Ontology rdf:about=\""+((OWLOntology)align.getOntology2()).getURI()+"\"/>\n"); + writer.print(" </cowl:targetOntology>\n"); + for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){ + Cell c = (Cell)e.nextElement(); + c.accept( this ); + } //end for + } catch (OWLException e) { throw new AlignmentException("getURI problem", e); }; + writer.print(" </cowl:Mapping>\n"); + writer.print("</rdf:RDF>\n"); + } + public void visit( Cell cell ) throws AlignmentException { + this.cell = cell; + OWLOntology onto1 = (OWLOntology)alignment.getOntology1(); + writer.print(" <cowl:bridgeRule>\n"); + cell.getRelation().accept( this ); + writer.print(" </cowl:bridgeRule>\n"); + } + public void visit( EquivRelation rel ) throws AlignmentException { + try { + writer.print(" <cowl:Equivalent>\n"); + writer.print(" <cowl:source>\n"); + printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1()); + writer.print(" </cowl:source>\n"); + writer.print(" <cowl:target>\n"); + printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2()); + writer.print(" </cowl:target>\n"); + writer.print(" </cowl:Equivalent>\n"); + } catch (OWLException e) { throw new AlignmentException("getURI problem", e); }; + } + + public void visit( SubsumeRelation rel ) throws AlignmentException { + try { + writer.print(" <cowl:Into>\n"); + writer.print(" <cowl:source>\n"); + printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1()); + writer.print(" </cowl:source>\n"); + writer.print(" <cowl:target>\n"); + printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2()); + writer.print(" </cowl:target>\n"); + writer.print(" </cowl:Into>\n"); + } catch (OWLException e) { throw new AlignmentException("getURI problem", e); }; + } + public void visit( IncompatRelation rel ) throws AlignmentException { + try { + writer.print(" <cowl:INCOMPATIBLE>\n"); + writer.print(" <cowl:source>\n"); + printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1()); + writer.print(" </cowl:source>\n"); + writer.print(" <cowl:target>\n"); + printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2()); + writer.print(" </cowl:target>\n"); + writer.print(" </cowl:INCOMPATIBLE>\n"); + } catch (OWLException e) { throw new AlignmentException("getURI problem", e); }; + } + public void visit( Relation rel ) throws AlignmentException { + // JE: I do not understand why I need this, + // but this seems to be the case... + try { + Method mm = null; + if ( Class.forName("fr.inrialpes.exmo.align.impl.rel.EquivRelation").isInstance(rel) ){ + mm = this.getClass().getMethod("visit", + new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.EquivRelation")}); + } else if (Class.forName("fr.inrialpes.exmo.align.impl.rel.SubsumeRelation").isInstance(rel) ) { + mm = this.getClass().getMethod("visit", + new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.SubsumeRelation")}); + } else if (Class.forName("fr.inrialpes.exmo.align.impl.rel.IncompatRelation").isInstance(rel) ) { + mm = this.getClass().getMethod("visit", + new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.IncompatRelation")}); + } + if ( mm != null ) mm.invoke(this,new Object[] {rel}); + } catch (Exception e) { throw new AlignmentException("Dispatching problem ", e); }; + } + + public void printObject( URI uri, OWLOntology onto ) throws OWLException { + if ( (OWLEntity)onto.getClass( uri ) != null ) { // A class + writer.print(" <owl:Class rdf:about=\""+uri.toString()+"\"/>\n"); + } else if ( (OWLEntity)onto.getDataProperty( uri ) != null ) { // A Dataproperty + writer.print(" <owl:DataProperty rdf:about=\""+uri.toString()+"\"/>\n"); + } else if ( (OWLEntity)onto.getObjectProperty( uri ) != null ) { // An ObjectProperty + writer.print(" <owl:ObjectProperty rdf:about=\""+uri.toString()+"\"/>\n"); + } else if ( (OWLEntity)onto.getIndividual( uri ) != null ) { // An individual (but check this) + writer.print(" <owl:Individual rdf:about=\""+uri.toString()+"\"/>\n"); + } + } +} diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java index 94546a5ec9068308a11418bbbd983eb234673847..f71170f96a4902ddb2fc0420a910083854ac0c46 100644 --- a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java +++ b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java @@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer; import java.util.Hashtable; import java.util.Enumeration; -import java.io.PrintStream; +import java.io.PrintWriter; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; @@ -52,11 +52,11 @@ import fr.inrialpes.exmo.align.impl.rel.*; public class OWLAxiomsRendererVisitor implements AlignmentVisitor { - PrintStream writer = null; + PrintWriter writer = null; Alignment alignment = null; Cell cell = null; - public OWLAxiomsRendererVisitor( PrintStream writer ){ + public OWLAxiomsRendererVisitor( PrintWriter writer ){ this.writer = writer; } diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java index f65a29a2e92889ad03799b86d50c44afbaffdc6d..320ba3e2c281ddaa84ea549c548dc0be707a9720 100644 --- a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java +++ b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java @@ -23,6 +23,9 @@ package fr.inrialpes.exmo.align.impl.renderer; import java.util.Hashtable; import java.util.Enumeration; import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; @@ -52,57 +55,55 @@ import fr.inrialpes.exmo.align.impl.rel.*; public class RDFRendererVisitor implements AlignmentVisitor { - PrintStream writer = null; + + PrintWriter writer = null; Alignment alignment = null; Cell cell = null; - public RDFRendererVisitor( PrintStream writer ){ + public RDFRendererVisitor( PrintWriter writer ){ this.writer = writer; } public void visit( Alignment align ) throws AlignmentException { alignment = align; writer.print("<?xml version='1.0' encoding='utf-8"); - // writer.print(writer.getEncoding().toString()); writer.print("' standalone='no'?>\n"); - //writer.print("<!DOCTYPE rdf:RDF SYSTEM \"align.dtd\">\n\n"); - // add date, etc. writer.print("<rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment'\n xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'\n xmlns:xsd='http://www.w3.org/2001/XMLSchema#'>\n"); writer.print("<Alignment>\n <xml>yes</xml>\n"); writer.print(" <level>"); writer.print( align.getLevel() ); writer.print("</level>\n <type>"); writer.print( align.getType() ); - writer.print("</type>\n <onto1>"); + writer.print("</type>\n"); try { - writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString()); - writer.print("</onto1>\n <onto2>"); - writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString()); - writer.print("</onto2>\n"); - //if ( align.getFile1() != null ) - //writer.print(" <uri1>"+align.getFile1().toString()+"</uri1>\n"); - //if ( align.getFile2() != null ) - //writer.print(" <uri2>"+align.getFile2().toString()+"</uri2>\n"); + //writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString()); + //writer.print("</onto1>\n <onto2>"); + //writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString()); + //writer.print("</onto2>\n"); + if ( align.getFile1() != null ) + writer.print(" <onto1>"+align.getFile1().toString()+"</onto1>\n"); + if ( align.getFile2() != null ) + writer.print(" <onto2>"+align.getFile2().toString()+"</onto2>\n"); writer.print(" <uri1>"); writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString()); writer.print("</uri1>\n"); writer.print(" <uri2>"); writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString()); writer.print("</uri2>\n"); - writer.print(" <map>\n"); for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){ Cell c = (Cell)e.nextElement(); c.accept( this ); } //end for } catch (OWLException ex) { throw new AlignmentException( "getURI problem", ex); } - writer.print(" </map>\n</Alignment>\n"); + writer.print("</Alignment>\n"); writer.print("</rdf:RDF>\n"); } public void visit( Cell cell ) throws AlignmentException { this.cell = cell; //OWLOntology onto1 = (OWLOntology)alignment.getOntology1(); try { + writer.print(" <map>\n"); writer.print(" <Cell"); if ( cell.getId() != null ){ writer.print(" rdf:resource=\"#"+cell.getId()+"\""); @@ -115,7 +116,7 @@ public class RDFRendererVisitor implements AlignmentVisitor writer.print( cell.getStrength() ); writer.print("</measure>\n <relation>"); cell.getRelation().accept( this ); - writer.print("</relation>\n </Cell>\n"); + writer.print("</relation>\n </Cell>\n </map>\n"); } catch ( OWLException e) { throw new AlignmentException( "getURI problem", e ); } } public void visit( Relation rel ) { diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java index a4c8f05cc2170ee472ca1e83bf2cb76bba53f353..1cbddc4069f1a9a1e2078c5499713506c07e5311 100644 --- a/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java +++ b/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java @@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer; import java.util.Hashtable; import java.util.Enumeration; -import java.io.PrintStream; +import java.io.PrintWriter; import java.io.IOException; import java.lang.reflect.Method; @@ -54,11 +54,11 @@ import fr.inrialpes.exmo.align.impl.rel.*; public class SWRLRendererVisitor implements AlignmentVisitor { - PrintStream writer = null; + PrintWriter writer = null; Alignment alignment = null; Cell cell = null; - public SWRLRendererVisitor( PrintStream writer ){ + public SWRLRendererVisitor( PrintWriter writer ){ this.writer = writer; } @@ -93,22 +93,52 @@ public class SWRLRendererVisitor implements AlignmentVisitor } public void visit( EquivRelation rel ) throws AlignmentException { - // This is a very partial implementation since the code will depends - // on properties and classes. - // JE... + // JE: It sounds that the alignment and cell variables are taken as global... + // But it seems that this is not the case... + // JE: We should send warnings when dataproperties are mapped to individual properties and vice versa... try { writer.println(" <ruleml:imp>"); writer.println(" <ruleml:_body>"); - writer.println(" <swrl:classAtom>"); - writer.println(" <owllx:Class owllx:name=\""+((OWLEntity)cell.getObject1()).getURI().toString()+"\"/>"); - writer.println(" <ruleml:var>x</ruleml:var>"); - writer.println(" </swrl:classAtom>"); + OWLOntology onto1 = (OWLOntology)alignment.getOntology1(); + OWLEntity obj1 = (OWLEntity)cell.getObject1(); + URI uri1 = obj1.getURI(); + if ( onto1.getClass( uri1 ) != null ){ + writer.println(" <swrl:classAtom>"); + writer.println(" <owllx:Class owllx:name=\""+uri1.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" </swrl:classAtom>"); + } else if ( onto1.getDataProperty( uri1 ) != null ){ + writer.println(" <swrl:datavaluedPropertyAtom swrlx:property=\""+uri1.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" <ruleml:var>y</ruleml:var>"); + writer.println(" <swrl:datavaluedPropertyAtom>"); + } else { + writer.println(" <swrl:individualPropertyAtom swrlx:property=\""+uri1.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" <ruleml:var>y</ruleml:var>"); + writer.println(" </swrl:individualPropertyAtom>"); + } writer.println(" </ruleml:_body>"); writer.println(" <ruleml:_head>"); - writer.println(" <swrlx:classAtom>"); - writer.println(" <owlx:Class owlx:name=\""+((OWLEntity)cell.getObject2()).getURI().toString()+"\"/>"); - writer.println(" <ruleml:var>x</ruleml:var>"); - writer.println(" </swrlx:classAtom>"); + OWLOntology onto2 = (OWLOntology)alignment.getOntology2(); + OWLEntity obj2 = (OWLEntity)cell.getObject2(); + URI uri2 = obj2.getURI(); + if ( onto2.getClass( uri2 ) != null ){ + writer.println(" <swrlx:classAtom>"); + writer.println(" <owllx:Class owllx:name=\""+uri2.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" </swrl:classAtom>"); + } else if ( onto2.getDataProperty( uri2 ) != null ){ + writer.println(" <swrl:datavaluedPropertyAtom swrlx:property=\""+uri2.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" <ruleml:var>y</ruleml:var>"); + writer.println(" </swrl:datavaluedPropertyAtom>"); + } else { + writer.println(" <swrl:individualPropertyAtom swrlx:property=\""+uri2.toString()+"\"/>"); + writer.println(" <ruleml:var>x</ruleml:var>"); + writer.println(" <ruleml:var>y</ruleml:var>"); + writer.println(" </swrl:individualPropertyAtom>"); + } writer.println(" </ruleml:_head>"); writer.println(" </ruleml:imp>\n"); } catch (Exception e) { throw new AlignmentException("getURI problem", e); }; diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java index 84e5a3e828606dadee58d1a2cd83d679f8fda74c..e57acea1906b9bbfc77d4f87ab52474b7b035580 100644 --- a/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java +++ b/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java @@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer; import java.util.Hashtable; import java.util.Enumeration; -import java.io.PrintStream; +import java.io.PrintWriter; import java.io.IOException; import java.lang.reflect.Method; @@ -53,11 +53,11 @@ import fr.inrialpes.exmo.align.impl.rel.*; public class XSLTRendererVisitor implements AlignmentVisitor { - PrintStream writer = null; + PrintWriter writer = null; Alignment alignment = null; Cell cell = null; - public XSLTRendererVisitor( PrintStream writer ){ + public XSLTRendererVisitor( PrintWriter writer ){ this.writer = writer; }