diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..5e76215524893f00cebea2ea87b5b21e220dc0d6 --- /dev/null +++ b/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java @@ -0,0 +1,187 @@ +package fr.inrialpes.exmo.align.impl.renderer; + + +import java.io.PrintWriter; + +import org.semanticweb.owl.align.Alignment; +import org.semanticweb.owl.align.AlignmentException; +import org.semanticweb.owl.align.AlignmentVisitor; +import org.semanticweb.owl.align.Cell; +import org.semanticweb.owl.align.Relation; + + +import fr.inrialpes.exmo.align.impl.Annotations; +import fr.inrialpes.exmo.align.impl.BasicAlignment; +import fr.inrialpes.exmo.align.impl.Namespace; +import fr.inrialpes.exmo.align.parser.SyntaxElement; +import fr.inrialpes.exmo.align.impl.edoal.EDOALCell; +import fr.inrialpes.exmo.align.impl.edoal.Expression; +import fr.inrialpes.exmo.align.impl.edoal.Transformation; +import fr.inrialpes.exmo.ontowrap.Ontology; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.List; +import java.util.Properties; + + +public class SILKRendererVisitor extends GraphPatternRendererVisitor implements AlignmentVisitor{ + + + Alignment alignment = null; + Cell cell = null; + Hashtable<String,String> nslist = null; + boolean embedded = false; + + private static Namespace DEF = Namespace.ALIGNMENT; + + private List<String> listBGP1; + private List<String> listBGP2; + + private List<String> listCond1; + private List<String> listCond2; + + public SILKRendererVisitor(PrintWriter writer) { + super(writer); + } + + public SILKRendererVisitor(PrintWriter writer, String sub, String pred, String obj) { + super(writer); + + } + + public void init(Properties p) { + if ( p.getProperty( "embedded" ) != null + && !p.getProperty( "embedded" ).equals("") ) embedded = true; + if ( p.getProperty( "indent" ) != null ) + INDENT = p.getProperty( "indent" ); + if ( p.getProperty( "newline" ) != null ) + NL = p.getProperty( "newline" ); + } + + public void visit(Alignment align) throws AlignmentException { + + if ( subsumedInvocableMethod( this, align, Alignment.class ) ) return; + // default behaviour + String extensionString = ""; + alignment = align; + nslist = new Hashtable<String,String>(); + nslist.put( Namespace.RDF.prefix , Namespace.RDF.shortCut ); + nslist.put( Namespace.XSD.prefix , Namespace.XSD.shortCut ); + // Get the keys of the parameter + int gen = 0; + for ( String[] ext : align.getExtensions() ) { + String prefix = ext[0]; + String name = ext[1]; + String tag = nslist.get(prefix); + //if ( tag.equals("align") ) { tag = name; } + if ( prefix.equals( Namespace.ALIGNMENT.uri ) ) { tag = name; } + else { + if ( tag == null ) { + tag = "ns"+gen++; + nslist.put( prefix, tag ); + } + tag += ":"+name; + } + extensionString += INDENT+"<"+tag+">"+ext[2]+"</"+tag+">"+NL; + } + if ( embedded == false ) { + writer.print("<?xml version='1.0' encoding='utf-8"); + writer.print("' standalone='no'?>"+NL); + } + indentedOutputln("<SILK>"); + indentedOutputln("<Prefixes>"); + indentedOutputln("<Prefix id=\"rdf\" namespace=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" />"); + indentedOutputln("<Prefix id=\"rdfs\" namespace=\"http://www.w3.org/2000/01/rdf-schema#\" />"); + indentedOutputln("<Prefix id=\"owl\" namespace=\"http://www.w3.org/2002/07/owl#\" />"); + for ( Enumeration e = prefixList.keys() ; e.hasMoreElements(); ) { + String k = (String)e.nextElement(); + indentedOutputln("<Prefix id=\""+k+" namespace=\""+prefixList.get(k)+"\" />"); + } + indentedOutputln("</Prefixes>"+NL); + indentedOutputln("<DataSources>"+NL); + + indentedOutputln("</DataSources>"+NL); + indentedOutputln("<Interlinks>"); + for( Cell c : align ){ c.accept( this ); }; + decreaseIndent(); + indentedOutputln("</Interlinks>"); + writer.print("</SILK>"+NL); + + } + + public void visit(Cell cell) throws AlignmentException { + + if ( subsumedInvocableMethod( this, cell, Cell.class ) ) return; + // default behaviour + this.cell = cell; + + URI u1 = cell.getObject1AsURI(alignment); + URI u2 = cell.getObject2AsURI(alignment); + if ( ( u1 != null && u2 != null) + || alignment.getLevel().startsWith("2EDOAL") ){ //expensive test + + if ( alignment.getLevel().startsWith("2EDOAL") ) { + + resetVariables("s", "o"); + ((Expression)(cell.getObject1())).accept( this ); + + List<String> tempList = new ArrayList<String>(getBGP()); + listBGP1 = new ArrayList<String>(tempList); + tempList = new ArrayList<String>(getCondition()); + listCond1 = new ArrayList<String>(tempList); + + resetVariables("x", "y"); + ((Expression)(cell.getObject2())).accept( this ); + tempList = new ArrayList<String>(getBGP()); + listBGP2 = new ArrayList<String>(tempList); + tempList = new ArrayList<String>(getCondition()); + listCond2 = new ArrayList<String>(tempList); + + increaseIndent(); + indentedOutputln("<Interlink id=\"link\">"); + indentedOutputln("<LinkType>owl:sameAs</LinkType>"); + indentedOutputln("<SourceDataSet datasource=\"\"" + " var=\"s\">"); + indentedOutputln("<RestrictTo>"); + + indentedOutput(listBGP1.get(listBGP1.size()-1)); + + indentedOutputln("</RestrictTo>"); + indentedOutputln("</SourceDataSet>"); + + indentedOutputln("<TargetDataSet datasource=\"\"" + " var=\"x\">"); + indentedOutputln("<RestrictTo>"); + + indentedOutput(listBGP2.get(listBGP2.size()-1)); + + indentedOutputln("</RestrictTo>"); + indentedOutputln("</TargetDataSet>"+NL); + + indentedOutputln("<LinkageRule>"+NL); + indentedOutputln("</LinkageRule>"+NL); + indentedOutputln("<Filter />"+NL); + indentedOutputln("<Outputs>"); + indentedOutputln("<Output type=\"file\">"); + indentedOutputln("<Param name=\"file\" value=\"link.nt\"/>"); + indentedOutputln(" <Param name=\"format\" value=\"ntriples\"/>"); + indentedOutputln("</Output>"); + indentedOutputln("</Outputs>"); + indentedOutputln("</Interlink>"+NL); + decreaseIndent(); + + } + decreaseIndent(); + + } + + } + + public void visit( Relation rel ) throws AlignmentException { + if ( subsumedInvocableMethod( this, rel, Relation.class ) ) return; + // default behaviour + // rel.write( writer ); + } + +}