diff --git a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java index b6b76e542e5a8518a2f9da33ec90eea51ea65f89..fcd6509a3181649b3e69656a9291ae1aac28a1d9 100644 --- a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java +++ b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java @@ -355,6 +355,7 @@ public class AServProtocolManager { // ABSOLUTELY NOT IMPLEMENTED // Implements: find + // This may be useful when calling WATSON public Message find(Message mess){ //\prul{search-success}{a - request ( find (O, T) ) \rightarrow S}{O' \Leftarrow Match(O,T)\\S - inform (O') \rightarrow a}{reachable(O)\wedge Match(O,T)\not=\emptyset} @@ -365,12 +366,24 @@ public class AServProtocolManager { } // Implements: translate + // This should be applied to many more kind of messages with different kind of translation public Message translate(Message mess){ - -//\prul{translate-success}{a - request ( translate ( M, n)) \rightarrow S}{\langle O, O', A\rangle \Leftarrow Retrieve(n)\\m'\Leftarrow Translate(m,A)\\S - inform ( m' ) \rightarrow a}{Retrieve(n)\not=\emptyset} - -//\prul{translate-unknown}{a - request ( translate ( M, n)) \rightarrow S}{S - failure ( unknown (n) ) \rightarrow a}{Retrieve(n)=\emptyset} - return new TranslatedMessage(newId(),mess,myId,mess.getSender(),"dummy//",(Parameters)null); + Parameters params = mess.getParameters(); + // Retrieve the alignment + String id = (String)params.getParameter("id"); + Alignment al = null; + try { + al = alignmentCache.getAlignment( id ); + } catch (Exception e) { + return new UnknownAlignment(newId(),mess,myId,mess.getSender(),id,(Parameters)null); + } + // Translate the query + try { + String translation = QueryMediator.rewriteQuery( (String)params.getParameter("query"), al ); + return new TranslatedMessage(newId(),mess,myId,mess.getSender(),translation,(Parameters)null); + } catch (AlignmentException e) { + return new ErrorMsg(newId(),mess,myId,mess.getSender(),e.toString(),(Parameters)null); + } } // DONE diff --git a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java index df9964daf5a2689a1db1e758070976677485602f..a62735ce1c282f9ed2e20f5ff5ccc56d854a5adb 100644 --- a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java +++ b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java @@ -272,7 +272,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile { } msg += "</ul>"; } else if ( perf.equals("prmsqlquery") ){ - msg = "<h1>SQL query</h1><form action=\"sqlquery\">Query: <input type=\"textarea\" name=\"query\" rows=\"8\"size=\"60\"/> (sql)<br /><small>An SQL SELECT query</small><br /><input type=\"submit\" value=\"Query\"/></form>"; + msg = "<h1>SQL query</h1><form action=\"sqlquery\">Query:<br /><textarea name=\"query\" rows=\"20\" cols=\"60\" size=\"60\">SELECT \nFROM \nWHERE </textarea> (sql)<br /><small>An SQL SELECT query</small><br /><input type=\"submit\" value=\"Query\"/></form>"; } else if ( perf.equals("sqlquery") ){ String answer = manager.query( (String)params.getParameter("query") ); msg = "<pre>"+answer+"</pre>"; @@ -430,6 +430,24 @@ public class HTMLAServProfile implements AlignmentServiceProfile { return new Response( HTTP_OK, MIME_HTML, answer.getContent() ); } // Metadata not done yet + } else if ( perf.equals("prmtranslate") ) { + msg = "<h1>Translate query</h1><form action=\"translate\">"; + msg += "Alignment id: <select name=\"id\">"; + for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){ + String id = ((Alignment)e.nextElement()).getExtension("id"); + msg += "<option value=\""+id+"\">"+id+"</option>"; + } + msg += "</select><br />"; + msg += "Turtle query:<br /> <textarea name=\"query\" rows=\"20\" cols=\"60\" size=\"60\">PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nSELECT *\nFROM <>\nWHERE {\n\n}</textarea> (turtle)<br /><small>A SPARQL query expressed in Turtle syntax (PREFIX prefix: <URI> SELECT variables FROM <URL> WHERE { triples })</small><br /><input type=\"submit\" value=\"Query\"/></form>"; + } else if ( perf.equals("translate") ) { + Message answer = manager.translate( new Message(newId(),(Message)null,myId,serverId,"", params) ); + if ( answer instanceof ErrorMsg ) { + msg = testErrorMessages( answer ); + } else { + // Depending on the type we should change the MIME type + // This should be returned in answer.getParameters() + return new Response( HTTP_OK, MIME_HTML, answer.getContent() ); + } } else if ( perf.equals("prmmetadata") ) { msg = "<h1>Retrieve alignment metadata</h1><form action=\"metadata\">"; msg += "Alignment id: <select name=\"id\">"; @@ -457,7 +475,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile { msg += "Alignment file: <form enctype=\"multipart/form-data\" action=\"loadfile\" method=\"POST\">"; msg += " <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\""+MAX_FILE_SIZE+"\"/>"; msg += "<input name=\"content\" type=\"file\" size=\"35\">"; - msg += "<br /><small>NOTE: Max file size is"+(MAX_FILE_SIZE/1024)+"KB</small><br />"; + msg += "<br /><small>NOTE: Max file size is "+(MAX_FILE_SIZE/1024)+"KB</small><br />"; msg += " <input type=\"submit\" Value=\"Upload\">"; msg += " </form>"; } else if ( perf.equals("load") ) { @@ -478,9 +496,6 @@ public class HTMLAServProfile implements AlignmentServiceProfile { msg = "<h1>Alignment loaded</h1>"; msg += displayAnswer( answer ); } - } else if ( perf.equals("prmtranslate") ) { - } else if ( perf.equals("translate") ) { - // translate( mess ) } else if ( perf.equals("") ) { msg = "<h1>Available commands</h1><ul compact=\"1\">"; msg += "<li><form action=\"prmfind\"><input type=\"submit\" value=\"Find an alignment for ontologies\"/></form></li>"; @@ -488,7 +503,8 @@ public class HTMLAServProfile implements AlignmentServiceProfile { msg += "<li><form action=\"prmcut\"><input type=\"submit\" value=\"Trim an alignment above some threshold\"/></form></li>"; msg += "<li><form action=\"prmload\"><input type=\"submit\" value=\"Load alignments\"/></form></li>"; msg += "<li><form action=\"prmstore\"><input type=\"submit\" value=\"Store an alignment in the server\"/></form></li>"; - msg += "<li><form action=\"prmretrieve\"><input type=\"submit\" value=\"Retrieve an alignment from its id\"/></form></li>"; + msg += "<li><form action=\"prmretrieve\"><input type=\"submit\" value=\"Retrieve an alignment from id\"/></form></li>"; + msg += "<li><form action=\"prmtranslate\"><input type=\"submit\" value=\"Translate a query\"/></form></li>"; msg += "<li><form action=\"../admin/\"><input type=\"submit\" value=\"Server management\"/></form></li>"; msg += "</ul>"; } else { diff --git a/src/fr/inrialpes/exmo/align/service/QueryMediator.java b/src/fr/inrialpes/exmo/align/service/QueryMediator.java index 99fa969f1cd5f19f195afb02e117695cf08b2b01..23669921a3b10a385c3407a4a805ffe6e0258531 100644 --- a/src/fr/inrialpes/exmo/align/service/QueryMediator.java +++ b/src/fr/inrialpes/exmo/align/service/QueryMediator.java @@ -148,6 +148,10 @@ public class QueryMediator implements QueryProcessor { * (use invert() in this case). */ public String rewriteQuery( String aQuery ) throws AlignmentException { + return rewriteQuery( aQuery, alignment ); + } + + public static String rewriteQuery( String aQuery, Alignment align ) throws AlignmentException { // The first part expands the prefixes of the query aQuery = aQuery.replaceAll("PREFIX", "prefix"); String mainQuery = ""; @@ -174,7 +178,7 @@ public class QueryMediator implements QueryProcessor { } } else mainQuery = aQuery; // The second part replaces the named items by their counterparts - for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){ + for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){ Cell cell = (Cell)e.nextElement(); mainQuery = mainQuery.replaceAll( cell.getObject1AsURI().toString(),