diff --git a/src/fr/inrialpes/exmo/align/service/CacheImpl.java b/src/fr/inrialpes/exmo/align/service/CacheImpl.java index 811f4049d72c96852f5cde04e21dc4983d4eba4b..1fad9412ddf7f10e03d1acb372fe258582ff831b 100644 --- a/src/fr/inrialpes/exmo/align/service/CacheImpl.java +++ b/src/fr/inrialpes/exmo/align/service/CacheImpl.java @@ -1,677 +1,677 @@ -/* - * $Id$ - * - * Copyright (C) Seungkeun Lee, 2006 - * Copyright (C) INRIA Rhône-Alpes, 2006-2008 - * - * 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.service; - -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Hashtable; -import java.util.Vector; -import java.util.Set; -import java.util.HashSet; -import java.util.Date; -import java.util.Random; -import java.net.URI; -import java.net.URISyntaxException; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.Statement; -import java.sql.SQLException; - -import fr.inrialpes.exmo.align.impl.BasicRelation; -import fr.inrialpes.exmo.align.impl.Annotations; -import fr.inrialpes.exmo.align.impl.BasicParameters; -import fr.inrialpes.exmo.align.impl.URIAlignment; -import fr.inrialpes.exmo.align.impl.URICell; - -import org.semanticweb.owl.align.Alignment; -import org.semanticweb.owl.align.AlignmentException; -import org.semanticweb.owl.align.Cell; -import org.semanticweb.owl.align.Parameters; - -/** - * This class caches the content of the alignment database. I.e., - * It loads the metadata in the hash table - * It stores the alignment when requested - * It - */ - -public class CacheImpl { - Hashtable<String,Alignment> alignmentTable = null; - Hashtable<URI,Set<Alignment>> ontologyTable = null; - - String host = null; - String port = null; - int rights = 1; // writing rights in the database (default is 1) - - final int VERSION = 310; // Version of the API to be stored in the database - /* 300: initial database format - 301: added alignment id as primary key - 302: changed cached/stored/ouri tag forms - 310: changed extension table with added URIs and method -> val - */ - - Connection conn = null; - - final int CONNECTION_ERROR = 1; - final int SUCCESS = 2; - final int INIT_ERROR = 3; - - static public final String SVCNS = "http://exmo.inrialpes.fr/align/service#"; - static public final String CACHED = "cached"; - static public final String STORED = "stored"; - static public final String OURI1 = "ouri1"; - static public final String OURI2 = "ouri2"; - - //********************************************************************** - public CacheImpl( DBService service ) { - try { - this.conn = service.getConnection(); - } catch(Exception e) { - // Rather raise an exception - System.err.println(e.toString()); - } - alignmentTable = new Hashtable<String,Alignment>(); - ontologyTable = new Hashtable<URI,Set<Alignment>>(); - } - - /** - * loads the alignment descriptions from the database and put them in the - * alignmentTable hashtable - */ - public void init( Parameters p ) throws SQLException, AlignmentException { - port = (String)p.getParameter("http"); // bad idea - host = (String)p.getParameter("host"); - Statement st = (Statement) conn.createStatement(); - // test if a database is here, otherwise create it - ResultSet rs = (ResultSet)st.executeQuery("SHOW TABLES LIKE 'server'"); - if ( !rs.next() ) { - initDatabase(); - } else { - updateDatabase(); // in case it is necessart to upgrade - } - // register by the database - st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")"); - // load alignment descriptions - loadAlignments( true ); - } - - public void close() throws SQLException { - Statement st = (Statement) conn.createStatement(); - // unregister by the database - st.executeUpdate("DELETE FROM server WHERE host='"+host+"' AND port='"+port+"'"); - } - - // ********************************************************************** - // LOADING FROM DATABASE - /** - * loads the alignment descriptions from the database and put them in the - * alignmentTable hashtable - * index them under the ontology URIs - */ - private void loadAlignments( boolean force ) throws SQLException { - String query = null; - String id = null; - Alignment alignment = null; - Vector<String> idInfo = new Vector<String>(); - Statement st = (Statement) conn.createStatement(); - - if (force) { - // Retrieve the alignment ids - ResultSet rs = (ResultSet) st.executeQuery("SELECT id FROM alignment"); - while(rs.next()) { - id = rs.getString("id"); - idInfo.add(id); - } - - // For each alignment id store metadata - for( int i = 0; i < idInfo.size(); i ++ ) { - id = idInfo.get(i); - alignment = retrieveDescription( id ); - recordAlignment( id, alignment, true ); - } - } - } - - protected Enumeration<Alignment> listAlignments() { - return alignmentTable.elements(); - } - - /** - * loads the description of alignments from the database and set them - * in an alignment object - * - * Beware, the Alignment API has two attributes: - * onto1 is the Ontology object - * uri1 is the URI object from which loading the ontologies - * In the database we store: - * owlontology1 the URI string of the ontology - * file1 the URI string from which loading the ontologies - * uri1 which should be the same as the last one... - * Since alignments are indexed by the URI of the ontologies, we use - * the "ouri1" temporary extension to contain this URI. - */ - protected Alignment retrieveDescription( String id ){ - String query; - ResultSet rs; - String tag; - String value; - - URIAlignment result = new URIAlignment(); - - try { - Statement st = (Statement) conn.createStatement(); - // Get basic ontology metadata - query = "SELECT * FROM alignment WHERE id = '" + id +"'"; - rs = (ResultSet) st.executeQuery(query); - while(rs.next()) { - // Either uri1 or file1 - result.setFile1( new URI( rs.getString("file1") ) ); - result.setFile2( new URI( rs.getString("file2") ) ); - result.getOntologyObject1().setURI( new URI(rs.getString("owlontology1")) ); - result.getOntologyObject2().setURI( new URI(rs.getString("owlontology2")) ); - result.setExtension( SVCNS, OURI1, rs.getString("owlontology1") ); - result.setExtension( SVCNS, OURI2, rs.getString("owlontology2") ); - result.setLevel(rs.getString("level")); - result.setType(rs.getString("type")); - } - - // Get extension metadata - query = "SELECT * FROM extension WHERE id = '" + id + "'"; - rs = (ResultSet) st.executeQuery(query); - while(rs.next()) { - tag = rs.getString("tag"); - value = rs.getString("val"); - result.setExtension( rs.getString("uri"), tag, value); - } - } catch (Exception e) { // URI exception that should not occur - System.err.println("Unlikely URI exception!"); - e.printStackTrace(); - return null; - } - // should be there - //result.setExtension( SVCNS, STORED, "DATE"); - // not yet cached - result.setExtension(SVCNS, CACHED, ""); - return result; - } - - /** - * loads the full alignments from the database and put them in the - * alignmentTable hastable - * - * should be invoked when: - * ( result.getExtension(CACHED) == "" - * && result.getExtension(STORED) != "") { - - */ - protected Alignment retrieveAlignment( String id, Alignment alignment ) throws SQLException, AlignmentException, URISyntaxException { - String query; - URI ent1 = null, ent2 = null; - Cell cell = null; - - Statement st = (Statement) conn.createStatement(); - - alignment.setOntology1( new URI( alignment.getExtension( SVCNS, OURI1 ) ) ); - alignment.setOntology2( new URI( alignment.getExtension( SVCNS, OURI2 ) ) ); - - // Get cells - query = "SELECT * FROM cell WHERE id = '" + id + "'"; - ResultSet rs = (ResultSet) st.executeQuery(query); - while(rs.next()) { - ent1 = new URI(rs.getString("uri1")); - ent2 = new URI(rs.getString("uri2")); - if(ent1 == null || ent2 == null) break; - cell = alignment.addAlignCell(ent1, ent2, rs.getString("relation"), Double.parseDouble(rs.getString("measure"))); - cell.setId(rs.getString("cell_id")); - cell.setSemantics(rs.getString("semantics")); - - } - - // JE: I must now retrieve all the extensions - for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){ - cell = (Cell)e.nextElement(); - String cid = cell.getId(); - if ( cid != null && !cid.equals("") ){ - query = "SELECT * FROM extension WHERE id = '" + cid + "'"; - ResultSet rse = (ResultSet) st.executeQuery(query); - while ( rse.next() ){ - cell.setExtension( rse.getString("uri"), - rse.getString("tag"), - rse.getString("val") ); - } - } - } - // reset - resetCacheStamp(alignment); - - return alignment; - } - - // Public because this is now used by AServProtocolManager - public String generateAlignmentId() { - // Generate an id based on a URI prefix + Date + random number - return "http://"+host+":"+port+"/alid/" + new Date().getTime() + "/" + randomNum(); - } - - private String generateCellId( String alId ) { - // Generate an id based on a URI prefix + Date + random number - int end = alId.indexOf("/alid/"); - if ( end == -1 || alId.indexOf( '#' ) != -1 ) { - return "http://"+host+":"+port+"/cellid/" + new Date().getTime() + "/" + randomNum(); - } else { - return alId + "#" + randomNum(); - } - } - - private int randomNum() { - Random rand = new Random(System.currentTimeMillis()); - return Math.abs(rand.nextInt(1000)); - } - - //********************************************************************** - // FETCHING FROM CACHE - /** - * retrieve alignment metadata from id - * This is more difficult because we return the alignment we have - * disreagarding if it is complete o only metadata - */ - public Alignment getMetadata( String id ) throws Exception { - Alignment result = alignmentTable.get( id ); - if ( result == null ) - throw new Exception("getMetadata: Cannot find alignment"); - return result; - } - - /** - * retrieve full alignment from id (and cache it) - */ - public Alignment getAlignment( String id ) throws Exception { - Alignment result = alignmentTable.get( id ); - - if ( result == null ) - throw new Exception("getAlignment: Cannot find alignment"); - - // If not cached, retrieve it now - if ( result.getExtension( SVCNS, CACHED) == "" - && result.getExtension(SVCNS, STORED) != "") { - retrieveAlignment( id, result ); - } - - return result; - } - - public Set<Alignment> getAlignments( URI uri ) { - return ontologyTable.get( uri ); - } - - public Set<Alignment> getAlignments( URI uri1, URI uri2 ) { - // Create the set and compare - Set<Alignment> result = new HashSet<Alignment>(); - Set<Alignment> potentials = ontologyTable.get( uri1 ); - if ( potentials != null ) { - String uri2String = uri2.toString(); - for( Iterator it = potentials.iterator(); it.hasNext(); ) { - Alignment al = (Alignment)it.next(); - // This is not the best because URI are not resolved here... - if ( al.getExtension(SVCNS, OURI2).equals( uri2String ) ) result.add( al ); - } - } - return result; - } - - //********************************************************************** - // RECORDING ALIGNMENTS - /** - * records newly created alignment - */ - public String recordNewAlignment( Alignment alignment, boolean force ) { - try { return recordNewAlignment( generateAlignmentId(), alignment, force ); - } catch (AlignmentException ae) { return (String)null; } - } - - /** - * records alignment identified by id - */ - public String recordNewAlignment( String id, Alignment al, boolean force ) throws AlignmentException { +/* + * $Id$ + * + * Copyright (C) Seungkeun Lee, 2006 + * Copyright (C) INRIA Rhône-Alpes, 2006-2008 + * + * 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.service; + +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Hashtable; +import java.util.Vector; +import java.util.Set; +import java.util.HashSet; +import java.util.Date; +import java.util.Random; +import java.net.URI; +import java.net.URISyntaxException; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.sql.SQLException; + +import fr.inrialpes.exmo.align.impl.BasicRelation; +import fr.inrialpes.exmo.align.impl.Annotations; +import fr.inrialpes.exmo.align.impl.BasicParameters; +import fr.inrialpes.exmo.align.impl.URIAlignment; +import fr.inrialpes.exmo.align.impl.URICell; + +import org.semanticweb.owl.align.Alignment; +import org.semanticweb.owl.align.AlignmentException; +import org.semanticweb.owl.align.Cell; +import org.semanticweb.owl.align.Parameters; + +/** + * This class caches the content of the alignment database. I.e., + * It loads the metadata in the hash table + * It stores the alignment when requested + * It + */ + +public class CacheImpl { + Hashtable<String,Alignment> alignmentTable = null; + Hashtable<URI,Set<Alignment>> ontologyTable = null; + + String host = null; + String port = null; + int rights = 1; // writing rights in the database (default is 1) + + final int VERSION = 310; // Version of the API to be stored in the database + /* 300: initial database format + 301: added alignment id as primary key + 302: changed cached/stored/ouri tag forms + 310: changed extension table with added URIs and method -> val + */ + + Connection conn = null; + + final int CONNECTION_ERROR = 1; + final int SUCCESS = 2; + final int INIT_ERROR = 3; + + static public final String SVCNS = "http://exmo.inrialpes.fr/align/service#"; + static public final String CACHED = "cached"; + static public final String STORED = "stored"; + static public final String OURI1 = "ouri1"; + static public final String OURI2 = "ouri2"; + + //********************************************************************** + public CacheImpl( DBService service ) { + try { + this.conn = service.getConnection(); + } catch(Exception e) { + // Rather raise an exception + System.err.println(e.toString()); + } + alignmentTable = new Hashtable<String,Alignment>(); + ontologyTable = new Hashtable<URI,Set<Alignment>>(); + } + + /** + * loads the alignment descriptions from the database and put them in the + * alignmentTable hashtable + */ + public void init( Parameters p ) throws SQLException, AlignmentException { + port = (String)p.getParameter("http"); // bad idea + host = (String)p.getParameter("host"); + Statement st = (Statement) conn.createStatement(); + // test if a database is here, otherwise create it + ResultSet rs = (ResultSet)st.executeQuery("SHOW TABLES LIKE 'server'"); + if ( !rs.next() ) { + initDatabase(); + } else { + updateDatabase(); // in case it is necessart to upgrade + } + // register by the database + st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")"); + // load alignment descriptions + loadAlignments( true ); + } + + public void close() throws SQLException { + Statement st = (Statement) conn.createStatement(); + // unregister by the database + st.executeUpdate("DELETE FROM server WHERE host='"+host+"' AND port='"+port+"'"); + } + + // ********************************************************************** + // LOADING FROM DATABASE + /** + * loads the alignment descriptions from the database and put them in the + * alignmentTable hashtable + * index them under the ontology URIs + */ + private void loadAlignments( boolean force ) throws SQLException { + String query = null; + String id = null; + Alignment alignment = null; + Vector<String> idInfo = new Vector<String>(); + Statement st = (Statement) conn.createStatement(); + + if (force) { + // Retrieve the alignment ids + ResultSet rs = (ResultSet) st.executeQuery("SELECT id FROM alignment"); + while(rs.next()) { + id = rs.getString("id"); + idInfo.add(id); + } + + // For each alignment id store metadata + for( int i = 0; i < idInfo.size(); i ++ ) { + id = idInfo.get(i); + alignment = retrieveDescription( id ); + recordAlignment( id, alignment, true ); + } + } + } + + protected Enumeration<Alignment> listAlignments() { + return alignmentTable.elements(); + } + + /** + * loads the description of alignments from the database and set them + * in an alignment object + * + * Beware, the Alignment API has two attributes: + * onto1 is the Ontology object + * uri1 is the URI object from which loading the ontologies + * In the database we store: + * owlontology1 the URI string of the ontology + * file1 the URI string from which loading the ontologies + * uri1 which should be the same as the last one... + * Since alignments are indexed by the URI of the ontologies, we use + * the "ouri1" temporary extension to contain this URI. + */ + protected Alignment retrieveDescription( String id ){ + String query; + ResultSet rs; + String tag; + String value; + + URIAlignment result = new URIAlignment(); + + try { + Statement st = (Statement) conn.createStatement(); + // Get basic ontology metadata + query = "SELECT * FROM alignment WHERE id = '" + id +"'"; + rs = (ResultSet) st.executeQuery(query); + while(rs.next()) { + // Either uri1 or file1 + result.setFile1( new URI( rs.getString("file1") ) ); + result.setFile2( new URI( rs.getString("file2") ) ); + result.getOntologyObject1().setURI( new URI(rs.getString("owlontology1")) ); + result.getOntologyObject2().setURI( new URI(rs.getString("owlontology2")) ); + result.setExtension( SVCNS, OURI1, rs.getString("owlontology1") ); + result.setExtension( SVCNS, OURI2, rs.getString("owlontology2") ); + result.setLevel(rs.getString("level")); + result.setType(rs.getString("type")); + } + + // Get extension metadata + query = "SELECT * FROM extension WHERE id = '" + id + "'"; + rs = (ResultSet) st.executeQuery(query); + while(rs.next()) { + tag = rs.getString("tag"); + value = rs.getString("val"); + result.setExtension( rs.getString("uri"), tag, value); + } + } catch (Exception e) { // URI exception that should not occur + System.err.println("Unlikely URI exception!"); + e.printStackTrace(); + return null; + } + // should be there + //result.setExtension( SVCNS, STORED, "DATE"); + // not yet cached + result.setExtension(SVCNS, CACHED, ""); + return result; + } + + /** + * loads the full alignments from the database and put them in the + * alignmentTable hastable + * + * should be invoked when: + * ( result.getExtension(CACHED) == "" + * && result.getExtension(STORED) != "") { + + */ + protected Alignment retrieveAlignment( String id, Alignment alignment ) throws SQLException, AlignmentException, URISyntaxException { + String query; + URI ent1 = null, ent2 = null; + Cell cell = null; + + Statement st = (Statement) conn.createStatement(); + + alignment.setOntology1( new URI( alignment.getExtension( SVCNS, OURI1 ) ) ); + alignment.setOntology2( new URI( alignment.getExtension( SVCNS, OURI2 ) ) ); + + // Get cells + query = "SELECT * FROM cell WHERE id = '" + id + "'"; + ResultSet rs = (ResultSet) st.executeQuery(query); + while(rs.next()) { + ent1 = new URI(rs.getString("uri1")); + ent2 = new URI(rs.getString("uri2")); + if(ent1 == null || ent2 == null) break; + cell = alignment.addAlignCell(ent1, ent2, rs.getString("relation"), Double.parseDouble(rs.getString("measure"))); + cell.setId(rs.getString("cell_id")); + cell.setSemantics(rs.getString("semantics")); + + } + + // JE: I must now retrieve all the extensions + for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){ + cell = (Cell)e.nextElement(); + String cid = cell.getId(); + if ( cid != null && !cid.equals("") ){ + query = "SELECT * FROM extension WHERE id = '" + cid + "'"; + ResultSet rse = (ResultSet) st.executeQuery(query); + while ( rse.next() ){ + cell.setExtension( rse.getString("uri"), + rse.getString("tag"), + rse.getString("val") ); + } + } + } + // reset + resetCacheStamp(alignment); + + return alignment; + } + + // Public because this is now used by AServProtocolManager + public String generateAlignmentId() { + // Generate an id based on a URI prefix + Date + random number + return "http://"+host+":"+port+"/alid/" + new Date().getTime() + "/" + randomNum(); + } + + private String generateCellId( String alId ) { + // Generate an id based on a URI prefix + Date + random number + int end = alId.indexOf("/alid/"); + if ( end == -1 || alId.indexOf( '#' ) != -1 ) { + return "http://"+host+":"+port+"/cellid/" + new Date().getTime() + "/" + randomNum(); + } else { + return alId + "#" + randomNum(); + } + } + + private int randomNum() { + Random rand = new Random(System.currentTimeMillis()); + return Math.abs(rand.nextInt(1000)); + } + + //********************************************************************** + // FETCHING FROM CACHE + /** + * retrieve alignment metadata from id + * This is more difficult because we return the alignment we have + * disreagarding if it is complete o only metadata + */ + public Alignment getMetadata( String id ) throws Exception { + Alignment result = alignmentTable.get( id ); + if ( result == null ) + throw new Exception("getMetadata: Cannot find alignment"); + return result; + } + + /** + * retrieve full alignment from id (and cache it) + */ + public Alignment getAlignment( String id ) throws Exception { + Alignment result = alignmentTable.get( id ); + + if ( result == null ) + throw new Exception("getAlignment: Cannot find alignment"); + + // If not cached, retrieve it now + if ( result.getExtension( SVCNS, CACHED) == "" + && result.getExtension(SVCNS, STORED) != "") { + retrieveAlignment( id, result ); + } + + return result; + } + + public Set<Alignment> getAlignments( URI uri ) { + return ontologyTable.get( uri ); + } + + public Set<Alignment> getAlignments( URI uri1, URI uri2 ) { + // Create the set and compare + Set<Alignment> result = new HashSet<Alignment>(); + Set<Alignment> potentials = ontologyTable.get( uri1 ); + if ( potentials != null ) { + String uri2String = uri2.toString(); + for( Iterator it = potentials.iterator(); it.hasNext(); ) { + Alignment al = (Alignment)it.next(); + // This is not the best because URI are not resolved here... + if ( al.getExtension(SVCNS, OURI2).equals( uri2String ) ) result.add( al ); + } + } + return result; + } + + //********************************************************************** + // RECORDING ALIGNMENTS + /** + * records newly created alignment + */ + public String recordNewAlignment( Alignment alignment, boolean force ) { + try { return recordNewAlignment( generateAlignmentId(), alignment, force ); + } catch (AlignmentException ae) { return (String)null; } + } + + /** + * records alignment identified by id + */ + public String recordNewAlignment( String id, Alignment al, boolean force ) throws AlignmentException { Alignment alignment = al; - - alignment.setExtension(SVCNS, OURI1, alignment.getOntology1URI().toString()); - alignment.setExtension(SVCNS, OURI2, alignment.getOntology2URI().toString()); - // Index - recordAlignment( id, alignment, force ); - // Not yet stored - alignment.setExtension(SVCNS, STORED, ""); - // Cached now - resetCacheStamp(alignment); - return id; - } - - /** - * records alignment identified by id - */ - public String recordAlignment( String id, Alignment alignment, boolean force ){ + + alignment.setExtension(SVCNS, OURI1, alignment.getOntology1URI().toString()); + alignment.setExtension(SVCNS, OURI2, alignment.getOntology2URI().toString()); + // Index + recordAlignment( id, alignment, force ); + // Not yet stored + alignment.setExtension(SVCNS, STORED, ""); + // Cached now + resetCacheStamp(alignment); + return id; + } + + /** + * records alignment identified by id + */ + public String recordAlignment( String id, Alignment alignment, boolean force ){ // record the Id! - //CLD put in comment this line for allowing to create a new ID for any alignment - //if ( alignment.getExtension( Annotations.ALIGNNS, Annotations.ID ) == null ) + //CLD put in comment this line for allowing to create a new ID for any alignment + //if ( alignment.getExtension( Annotations.ALIGNNS, Annotations.ID ) == null ) alignment.setExtension( Annotations.ALIGNNS, Annotations.ID, id ); - - // Store it - try { - URI ouri1 = new URI( alignment.getExtension( SVCNS, OURI1) ); - URI ouri2 = new URI( alignment.getExtension( SVCNS, OURI2) ); - if ( force || alignmentTable.get( id ) == null ) { - Set<Alignment> s1 = ontologyTable.get( ouri1 ); - if ( s1 == null ) { - s1 = new HashSet<Alignment>(); - ontologyTable.put( ouri1, s1 ); - } - s1.add( alignment ); - Set<Alignment> s2 = ontologyTable.get( ouri2 ); - if ( s2 == null ) { - s2 = new HashSet<Alignment>(); - ontologyTable.put( ouri2, s2 ); - } + + // Store it + try { + URI ouri1 = new URI( alignment.getExtension( SVCNS, OURI1) ); + URI ouri2 = new URI( alignment.getExtension( SVCNS, OURI2) ); + if ( force || alignmentTable.get( id ) == null ) { + Set<Alignment> s1 = ontologyTable.get( ouri1 ); + if ( s1 == null ) { + s1 = new HashSet<Alignment>(); + ontologyTable.put( ouri1, s1 ); + } + s1.add( alignment ); + Set<Alignment> s2 = ontologyTable.get( ouri2 ); + if ( s2 == null ) { + s2 = new HashSet<Alignment>(); + ontologyTable.put( ouri2, s2 ); + } s2.add( alignment ); - + alignmentTable.put( id, alignment ); - - } - return id; - } catch (Exception e) { - //System.err.println("Unlikely URI exception!"); - e.printStackTrace(); - return null; - } - } - - //********************************************************************** - // STORING IN DATABASE - /** - * quote: - * Prepare a string to be used in SQL queries by preceeding occurences of - * "'", """, and "\" by a "\". - * This should be implemented at a lower level within Java itself - * (or the sql package). - * This function is used here for protecting everything to be entered in - * the database - */ - public String quote( String s ) { - String result = null; - char[] chars = s.toCharArray(); - int j = 0; - int i = 0; - char c; - for ( ; i < chars.length; i++ ){ - c = chars[i]; - if ( c == '\'' || c == '"' || c == '\\' ) { - result += new String( chars, j, i-j ) + "\\" + c; - j = i+1; - }; - } - if ( result != null ) { - return result + new String( chars, j, i-j ); - } else { - return s; - } - } - - public boolean isAlignmentStored( Alignment alignment ) { - if ( alignment.getExtension( SVCNS, STORED ) != null && - !alignment.getExtension( SVCNS, STORED ).equals("") ) - return false; - else return true; - } - - public void storeAlignment( String id ) throws Exception { - String query = null; - Alignment alignment = getAlignment( id ); - Statement st = (Statement) conn.createStatement(); - - // We store stored date - alignment.setExtension( SVCNS, STORED, new Date().toString()); - // We empty cached date - alignment.setExtension( SVCNS, CACHED, ""); - - try { - String s_O1 = alignment.getExtension(SVCNS, OURI1); - String s_O2 = alignment.getExtension(SVCNS, OURI2); - - // file attribute - String s_File1 = null; - String s_File2 = null; - if (alignment.getFile1() != null) - s_File1 = alignment.getFile1().toString(); - if (alignment.getFile2() != null) - s_File2 = alignment.getFile2().toString(); - - // uri attribute - String s_uri1 = alignment.getOntology1URI().toString(); - String s_uri2 = alignment.getOntology2URI().toString(); - - String type = alignment.getType(); - String level = alignment.getLevel(); - - query = "INSERT INTO alignment " + - "(id, owlontology1, owlontology2, type, level, file1, file2, uri1, uri2) " + - "VALUES ('" + quote(id) + "','" + quote(s_O1) + "','" + quote(s_O2) + "','" + quote(type) + "','" + quote(level) + "','" + quote(s_File1) + "','" + quote(s_File2) + "','" + quote(s_uri1) + "','" + quote(s_uri2) + "')"; - st.executeUpdate(query); - for ( Object ext : ((BasicParameters)alignment.getExtensions()).getValues() ){ - String uri = ((String[])ext)[0]; - String tag = ((String[])ext)[1]; - String val = ((String[])ext)[2]; - query = "INSERT INTO extension " + - "(id, uri, tag, val) " + - "VALUES ('" + quote(id) + "','" + quote(uri) + "','" + quote(tag) + "','" + quote(val) + "')"; - st.executeUpdate(query); - } - - for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){ - Cell c = (Cell)e.nextElement(); - String cellid = null; - if ( c.getObject1() != null && c.getObject2() != null ){ - cellid = c.getId(); - if ( cellid != null ){ - if ( cellid.startsWith("#") ) { - cellid = alignment.getExtension( Annotations.ALIGNNS, Annotations.ID ) + cellid; - } - } else if ( c.getExtensions() != null ) { - // JE: In case of extensions create an ID - c.setId( generateCellId( id ) ); - cellid = c.getId(); - } - else cellid = ""; - String uri1 = c.getObject1AsURI().toString(); - String uri2 = c.getObject2AsURI().toString(); - String strength = c.getStrength() + ""; // crazy Java - String sem; - if ( !c.getSemantics().equals("first-order") ) - sem = c.getSemantics(); - else sem = ""; - String rel = ((BasicRelation)c.getRelation()).getRelation(); - query = "INSERT INTO cell " + - "(id, cell_id, uri1, uri2, measure, semantics, relation) " + - "VALUES ('" + quote(id) + "','" + quote(cellid) + "','" + quote(uri1) + "','" + quote(uri2) + "','" + quote(strength) + "','" + quote(sem) + "','" + quote(rel) + "')"; - st.executeUpdate(query); - } - if ( cellid != null && !cellid.equals("") && c.getExtensions() != null ) { - // JE: I must now store all the extensions - // JE:EXT - for ( Object ext : ((BasicParameters)c.getExtensions()).getValues() ){ - String uri = ((String[])ext)[0]; - String tag = ((String[])ext)[1]; - String val = ((String[])ext)[2]; - query = "INSERT INTO extension " + - "(id, uri, tag, val) " + - "VALUES ('" + quote(cellid) + "','" + quote(uri) + "','" + quote(tag) + "','" + quote(val) + "')"; - st.executeUpdate(query); - } - } - } - } catch (Exception e) { e.printStackTrace(); }; - // We reset cached date - resetCacheStamp(alignment); - } - - //********************************************************************** - // CACHE MANAGEMENT (Not implemented yet) - public void resetCacheStamp( Alignment result ){ - result.setExtension(SVCNS, CACHED, new Date().toString() ); - } - - public void cleanUpCache() { - // for each alignment in the table - // set currentDate = Date(); - // if ( DateFormat.parse( result.getExtension(SVCNS, CACHED) ).before( ) ) { - // - for each ontology if no other alignment => unload - // - clean up cells - // } - } - - // ********************************************************************** - // DATABASE CREATION AND UPDATING - /* - # server info - - create table server ( - host varchar(50), - port varchar(5), - edit varchar(5) - ); - - - # alignment info - - create table alignment ( - id varchar(100), - owlontology1 varchar(250), - owlontology2 varchar(250), - type varchar(5), - level varchar(1), - file1 varchar(250), - file2 varchar(250), - uri1 varchar(250), - uri2 varchar(250), - primary key (id)); - - # cell info - - create table cell( - id varchar(100), - cell_id varchar(250), - uri1 varchar(250), - uri2 varchar(250), - semantics varchar(30), - measure varchar(20), - relation varchar(5)); - - # extension info - - create table extension( - id varchar(100), - uri varchar(200), - tag varchar(50), - val varchar(500)); - - */ - - public void initDatabase() throws SQLException { - Statement st = (Statement) conn.createStatement(); - // Create tables - st.executeUpdate("CREATE TABLE alignment (id VARCHAR(100), owlontology1 VARCHAR(250), owlontology2 VARCHAR(250), type VARCHAR(5), level VARCHAR(1), file1 VARCHAR(250), file2 VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), primary key (id))"); - st.executeUpdate("CREATE TABLE cell(id VARCHAR(100), cell_id VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), semantics VARCHAR(30), measure VARCHAR(20), relation VARCHAR(5))"); - st.executeUpdate("CREATE TABLE extension(id VARCHAR(100), uri VARCHAR(200), tag VARCHAR(50), val VARCHAR(500))"); - st.executeUpdate("CREATE TABLE server (host VARCHAR(50), port VARCHAR(5), edit BOOLEAN, version VARCHAR(5))"); - st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('dbms', 'port', 0, '"+VERSION+"')"); - } - - public void resetDatabase( boolean force ) throws SQLException, AlignmentException { - Statement st = (Statement) conn.createStatement(); - // Check that no one else is connected... - if ( force != true ){ - ResultSet rs = (ResultSet) st.executeQuery("SELECT COUNT(*) AS rowcount FROM server WHERE edit=1"); - rs.next(); - int count = rs.getInt("rowcount") ; - rs.close() ; - if ( count > 1 ) { - throw new AlignmentException("Cannot init database: other processes use it"); - } - } - // Suppress old database if exists - st.executeUpdate("DROP TABLE IF EXISTS server"); - st.executeUpdate("DROP TABLE IF EXISTS alignment"); - st.executeUpdate("DROP TABLE IF EXISTS cell"); - st.executeUpdate("DROP TABLE IF EXISTS extension"); - // Redo it - initDatabase(); - // Register this server, etc. characteristics (incl. version name) - st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")"); - } - - public void updateDatabase( ) throws SQLException, AlignmentException { - Statement st = (Statement) conn.createStatement(); - // get the version number - ResultSet rs = (ResultSet) st.executeQuery("SELECT version FROM server WHERE port='port'"); - rs.next(); - int version = rs.getInt("version") ; - if ( version < VERSION ) { - if ( version >= 302 ) { - // Change database - st.executeUpdate("ALTER TABLE extension CHANGE method val VARCHAR(500)"); - st.executeUpdate("ALTER TABLE extension ADD uri VARCHAR(200);"); - // Modify extensions - ResultSet rse = (ResultSet) st.executeQuery("SELECT * FROM extension"); - Statement st2 = (Statement) conn.createStatement(); - while ( rse.next() ){ - String tag = rse.getString("tag"); - System.err.println(" Treating tag "+tag+" of "+rse.getString("id")); - if ( !tag.equals("") ){ - int pos; - String ns; - String name; - if ( (pos = tag.lastIndexOf('#')) != -1 ) { - ns = tag.substring( 0, pos ); - name = tag.substring( pos+1 ); - } else if ( (pos = tag.lastIndexOf(':')) != -1 && pos > 5 ) { - ns = tag.substring( 0, pos )+"#"; - name = tag.substring( pos+1 ); - } else if ( (pos = tag.lastIndexOf('/')) != -1 ) { - ns = tag.substring( 0, pos+1 ); - name = tag.substring( pos+1 ); - } else { - ns = Annotations.ALIGNNS; - name = tag; - } - System.err.println(" >> "+ns+" : "+name); - st2.executeUpdate("UPDATE extension SET tag='"+name+"', uri='"+ns+"' WHERE id='"+rse.getString("id")+"' AND tag='"+tag+"'"); - } - } - // Change version - st.executeUpdate("UPDATE server SET version='"+VERSION+"' WHERE port='port'"); - } else { - throw new AlignmentException("Database must be upgraded ("+version+" -> "+VERSION+")"); - } - } - } - -} + + } + return id; + } catch (Exception e) { + //System.err.println("Unlikely URI exception!"); + e.printStackTrace(); + return null; + } + } + + //********************************************************************** + // STORING IN DATABASE + /** + * quote: + * Prepare a string to be used in SQL queries by preceeding occurences of + * "'", """, and "\" by a "\". + * This should be implemented at a lower level within Java itself + * (or the sql package). + * This function is used here for protecting everything to be entered in + * the database + */ + public String quote( String s ) { + String result = null; + char[] chars = s.toCharArray(); + int j = 0; + int i = 0; + char c; + for ( ; i < chars.length; i++ ){ + c = chars[i]; + if ( c == '\'' || c == '"' || c == '\\' ) { + result += new String( chars, j, i-j ) + "\\" + c; + j = i+1; + }; + } + if ( result != null ) { + return result + new String( chars, j, i-j ); + } else { + return s; + } + } + + public boolean isAlignmentStored( Alignment alignment ) { + if ( alignment.getExtension( SVCNS, STORED ) != null && + !alignment.getExtension( SVCNS, STORED ).equals("") ) + return false; + else return true; + } + + public void storeAlignment( String id ) throws Exception { + String query = null; + Alignment alignment = getAlignment( id ); + Statement st = (Statement) conn.createStatement(); + + // We store stored date + alignment.setExtension( SVCNS, STORED, new Date().toString()); + // We empty cached date + alignment.setExtension( SVCNS, CACHED, ""); + + try { + String s_O1 = alignment.getExtension(SVCNS, OURI1); + String s_O2 = alignment.getExtension(SVCNS, OURI2); + + // file attribute + String s_File1 = null; + String s_File2 = null; + if (alignment.getFile1() != null) + s_File1 = alignment.getFile1().toString(); + if (alignment.getFile2() != null) + s_File2 = alignment.getFile2().toString(); + + // uri attribute + String s_uri1 = alignment.getOntology1URI().toString(); + String s_uri2 = alignment.getOntology2URI().toString(); + + String type = alignment.getType(); + String level = alignment.getLevel(); + + query = "INSERT INTO alignment " + + "(id, owlontology1, owlontology2, type, level, file1, file2, uri1, uri2) " + + "VALUES ('" + quote(id) + "','" + quote(s_O1) + "','" + quote(s_O2) + "','" + quote(type) + "','" + quote(level) + "','" + quote(s_File1) + "','" + quote(s_File2) + "','" + quote(s_uri1) + "','" + quote(s_uri2) + "')"; + st.executeUpdate(query); + for ( Object ext : ((BasicParameters)alignment.getExtensions()).getValues() ){ + String uri = ((String[])ext)[0]; + String tag = ((String[])ext)[1]; + String val = ((String[])ext)[2]; + query = "INSERT INTO extension " + + "(id, uri, tag, val) " + + "VALUES ('" + quote(id) + "','" + quote(uri) + "','" + quote(tag) + "','" + quote(val) + "')"; + st.executeUpdate(query); + } + + for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){ + Cell c = (Cell)e.nextElement(); + String cellid = null; + if ( c.getObject1() != null && c.getObject2() != null ){ + cellid = c.getId(); + if ( cellid != null ){ + if ( cellid.startsWith("#") ) { + cellid = alignment.getExtension( Annotations.ALIGNNS, Annotations.ID ) + cellid; + } + } else if ( c.getExtensions() != null ) { + // JE: In case of extensions create an ID + c.setId( generateCellId( id ) ); + cellid = c.getId(); + } + else cellid = ""; + String uri1 = c.getObject1AsURI().toString(); + String uri2 = c.getObject2AsURI().toString(); + String strength = c.getStrength() + ""; // crazy Java + String sem; + if ( !c.getSemantics().equals("first-order") ) + sem = c.getSemantics(); + else sem = ""; + String rel = ((BasicRelation)c.getRelation()).getRelation(); + query = "INSERT INTO cell " + + "(id, cell_id, uri1, uri2, measure, semantics, relation) " + + "VALUES ('" + quote(id) + "','" + quote(cellid) + "','" + quote(uri1) + "','" + quote(uri2) + "','" + quote(strength) + "','" + quote(sem) + "','" + quote(rel) + "')"; + st.executeUpdate(query); + } + if ( cellid != null && !cellid.equals("") && c.getExtensions() != null ) { + // JE: I must now store all the extensions + // JE:EXT + for ( Object ext : ((BasicParameters)c.getExtensions()).getValues() ){ + String uri = ((String[])ext)[0]; + String tag = ((String[])ext)[1]; + String val = ((String[])ext)[2]; + query = "INSERT INTO extension " + + "(id, uri, tag, val) " + + "VALUES ('" + quote(cellid) + "','" + quote(uri) + "','" + quote(tag) + "','" + quote(val) + "')"; + st.executeUpdate(query); + } + } + } + } catch (Exception e) { e.printStackTrace(); }; + // We reset cached date + resetCacheStamp(alignment); + } + + //********************************************************************** + // CACHE MANAGEMENT (Not implemented yet) + public void resetCacheStamp( Alignment result ){ + result.setExtension(SVCNS, CACHED, new Date().toString() ); + } + + public void cleanUpCache() { + // for each alignment in the table + // set currentDate = Date(); + // if ( DateFormat.parse( result.getExtension(SVCNS, CACHED) ).before( ) ) { + // - for each ontology if no other alignment => unload + // - clean up cells + // } + } + + // ********************************************************************** + // DATABASE CREATION AND UPDATING + /* + # server info + + create table server ( + host varchar(50), + port varchar(5), + edit varchar(5) + ); + + + # alignment info + + create table alignment ( + id varchar(100), + owlontology1 varchar(250), + owlontology2 varchar(250), + type varchar(5), + level varchar(1), + file1 varchar(250), + file2 varchar(250), + uri1 varchar(250), + uri2 varchar(250), + primary key (id)); + + # cell info + + create table cell( + id varchar(100), + cell_id varchar(250), + uri1 varchar(250), + uri2 varchar(250), + semantics varchar(30), + measure varchar(20), + relation varchar(5)); + + # extension info + + create table extension( + id varchar(100), + uri varchar(200), + tag varchar(50), + val varchar(500)); + + */ + + public void initDatabase() throws SQLException { + Statement st = (Statement) conn.createStatement(); + // Create tables + st.executeUpdate("CREATE TABLE alignment (id VARCHAR(100), owlontology1 VARCHAR(250), owlontology2 VARCHAR(250), type VARCHAR(5), level VARCHAR(1), file1 VARCHAR(250), file2 VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), primary key (id))"); + st.executeUpdate("CREATE TABLE cell(id VARCHAR(100), cell_id VARCHAR(250), uri1 VARCHAR(250), uri2 VARCHAR(250), semantics VARCHAR(30), measure VARCHAR(20), relation VARCHAR(5))"); + st.executeUpdate("CREATE TABLE extension(id VARCHAR(100), uri VARCHAR(200), tag VARCHAR(50), val VARCHAR(500))"); + st.executeUpdate("CREATE TABLE server (host VARCHAR(50), port VARCHAR(5), edit BOOLEAN, version VARCHAR(5))"); + st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('dbms', 'port', 0, '"+VERSION+"')"); + } + + public void resetDatabase( boolean force ) throws SQLException, AlignmentException { + Statement st = (Statement) conn.createStatement(); + // Check that no one else is connected... + if ( force != true ){ + ResultSet rs = (ResultSet) st.executeQuery("SELECT COUNT(*) AS rowcount FROM server WHERE edit=1"); + rs.next(); + int count = rs.getInt("rowcount") ; + rs.close() ; + if ( count > 1 ) { + throw new AlignmentException("Cannot init database: other processes use it"); + } + } + // Suppress old database if exists + st.executeUpdate("DROP TABLE IF EXISTS server"); + st.executeUpdate("DROP TABLE IF EXISTS alignment"); + st.executeUpdate("DROP TABLE IF EXISTS cell"); + st.executeUpdate("DROP TABLE IF EXISTS extension"); + // Redo it + initDatabase(); + // Register this server, etc. characteristics (incl. version name) + st.executeUpdate("INSERT INTO server (host, port, edit, version) VALUES ('"+host+"','"+port+"','"+rights+"',"+VERSION+")"); + } + + public void updateDatabase( ) throws SQLException, AlignmentException { + Statement st = (Statement) conn.createStatement(); + // get the version number + ResultSet rs = (ResultSet) st.executeQuery("SELECT version FROM server WHERE port='port'"); + rs.next(); + int version = rs.getInt("version") ; + if ( version < VERSION ) { + if ( version >= 302 ) { + // Change database + st.executeUpdate("ALTER TABLE extension CHANGE method val VARCHAR(500)"); + st.executeUpdate("ALTER TABLE extension ADD uri VARCHAR(200);"); + // Modify extensions + ResultSet rse = (ResultSet) st.executeQuery("SELECT * FROM extension"); + Statement st2 = (Statement) conn.createStatement(); + while ( rse.next() ){ + String tag = rse.getString("tag"); + System.err.println(" Treating tag "+tag+" of "+rse.getString("id")); + if ( !tag.equals("") ){ + int pos; + String ns; + String name; + if ( (pos = tag.lastIndexOf('#')) != -1 ) { + ns = tag.substring( 0, pos ); + name = tag.substring( pos+1 ); + } else if ( (pos = tag.lastIndexOf(':')) != -1 && pos > 5 ) { + ns = tag.substring( 0, pos )+"#"; + name = tag.substring( pos+1 ); + } else if ( (pos = tag.lastIndexOf('/')) != -1 ) { + ns = tag.substring( 0, pos+1 ); + name = tag.substring( pos+1 ); + } else { + ns = Annotations.ALIGNNS; + name = tag; + } + System.err.println(" >> "+ns+" : "+name); + st2.executeUpdate("UPDATE extension SET tag='"+name+"', uri='"+ns+"' WHERE id='"+rse.getString("id")+"' AND tag='"+tag+"'"); + } + } + // Change version + st.executeUpdate("UPDATE server SET version='"+VERSION+"' WHERE port='port'"); + } else { + throw new AlignmentException("Database must be upgraded ("+version+" -> "+VERSION+")"); + } + } + } + +}