From e84a08a0455b5e377c6b98a3c3d31fa3fdf113fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Euzenat?= <Jerome.Euzenat@inria.fr>
Date: Sat, 26 Jan 2008 16:32:12 +0000
Subject: [PATCH] - modifed extension interface for better dealing with
 namespaces

---
 .../exmo/align/impl/BasicAlignment.java       | 56 +++--------
 .../inrialpes/exmo/align/impl/BasicCell.java  | 18 ++--
 .../exmo/align/impl/OWLAPIAlignment.java      | 19 ++--
 .../exmo/align/impl/URIAlignment.java         | 11 +--
 .../align/impl/eval/PRGraphEvaluator.java     |  8 +-
 .../exmo/align/impl/eval/PRecEvaluator.java   |  4 +-
 .../impl/renderer/HTMLRendererVisitor.java    | 12 ++-
 .../impl/renderer/RDFRendererVisitor.java     | 82 ++++++++-------
 .../exmo/align/parser/AlignmentParser.java    | 19 ++--
 .../align/service/AServProtocolManager.java   | 22 ++---
 .../exmo/align/service/CacheImpl.java         | 99 ++++++++++---------
 .../exmo/align/service/HTMLAServProfile.java  | 21 ++--
 .../inrialpes/exmo/align/util/GroupAlign.java |  4 +-
 .../inrialpes/exmo/align/util/Procalign.java  |  4 +-
 src/org/semanticweb/owl/align/Alignment.java  |  6 +-
 15 files changed, 189 insertions(+), 196 deletions(-)

diff --git a/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java b/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
index b985535c..5c4b57ed 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2003-2007
+ * Copyright (C) INRIA Rhône-Alpes, 2003-2008
  * Copyright (C) CNR Pisa, 2005
  *
  * This program is free software; you can redistribute it and/or modify
@@ -61,14 +61,11 @@ public class BasicAlignment implements Alignment {
 	visitor.visit(this);
     }
 
-    //public static String METHOD = "http://knowledgeweb.semanticweb.org/heterogeneity/alignment:method";
+    public static String ALIGNNS = "http://knowledgeweb.semanticweb.org/heterogeneity/alignment#";
     public static String METHOD = "method";
-    //public static String TIME = "http://knowledgeweb.semanticweb.org/heterogeneity/alignment:time";
     public static String TIME = "time";
+    public static String ID = "id";
 
-    // JE: OMWG1
-    //protected Object onto1 = null;
-    //protected Object onto2 = null;
     protected Ontology onto1 = null;
     protected Ontology onto2 = null;
 
@@ -96,25 +93,18 @@ public class BasicAlignment implements Alignment {
      * This is NOT the Ontology URI which can be obtained by
      * getOntology1URI()
      */
-    // JE: OMWG1
-    //protected URI uri1 = null;
-    //protected URI uri2 = null;
 
     public BasicAlignment() {
 	hash1 = new Hashtable();
 	hash2 = new Hashtable();
 	extensions = new BasicParameters();
 	namespaces = new BasicParameters();
-	if ( this instanceof AlignmentProcess ) setExtension( METHOD, getClass().getName() );
-	// JE: OMWG1
+	if ( this instanceof AlignmentProcess ) setExtension( ALIGNNS, METHOD, getClass().getName() );
 	onto1 = new Ontology();
 	onto2 = new Ontology();
     }
 
     public void init( Object onto1, Object onto2, Object cache ) throws AlignmentException {
-	// JE: OMWG1
-	//this.onto1 = onto1;
-	//this.onto2 = onto2;
 	if ( onto1 instanceof Ontology ) {
 	    this.onto1 = (Ontology)onto1;
 	    this.onto2 = (Ontology)onto2;
@@ -158,7 +148,6 @@ public class BasicAlignment implements Alignment {
     };
 
     public URI getOntology1URI() throws AlignmentException {
-	// JE: OMWG1
 	Object ontology = onto1.getOntology();
 	if ( ontology != null && ontology instanceof URI ) {
 	    return (URI)ontology;
@@ -168,7 +157,6 @@ public class BasicAlignment implements Alignment {
     };
 
     public URI getOntology2URI() throws AlignmentException {
-	// JE: OMWG1
 	Object ontology = onto2.getOntology();
 	if ( ontology != null && ontology instanceof URI ) {
 	    return (URI)ontology;
@@ -178,16 +166,10 @@ public class BasicAlignment implements Alignment {
     };
 
     public void setOntology1(Object ontology) throws AlignmentException {
-	//*/onto1 = (OWLOntology)ontology;
-	// JE: OMWG1
-	//onto1 = ontology;
 	onto1.setOntology( ontology );
     };
 
     public void setOntology2(Object ontology) throws AlignmentException {
-	//*/onto2 = (OWLOntology)ontology;
-	// JE: OMWG1
-	//onto2 = ontology;
 	onto2.setOntology( ontology );
     };
 
@@ -199,12 +181,6 @@ public class BasicAlignment implements Alignment {
 
     public String getLevel() { return level; };
 
-    // JE: OMWG1
-    //public URI getFile1() { return uri1; };
-    //public void setFile1(URI u) { uri1 = u; };
-    //public URI getFile2() { return uri2; };
-    //public void setFile2(URI u) { uri2 = u; };
-
     public URI getFile1() { return onto1.getFile(); };
 
     public void setFile1(URI u) { onto1.setFile( u ); };
@@ -215,12 +191,14 @@ public class BasicAlignment implements Alignment {
 
     public Parameters getExtensions(){ return extensions; }
 
-    public void setExtension( String label, String value ) {
-	extensions.setParameter( label, value );
+    public void setExtension( String uri, String label, String value ) {
+	final String[] ext = { uri, label, value };
+	extensions.setParameter( uri+label, ext);
     };
 
-    public String getExtension( String label ) {
-	return (String)extensions.getParameter( label );
+    public String getExtension( String uri, String label ) {
+	String [] ext = (String [])extensions.getParameter( uri+label );
+	return (ext==null)?(String)null:ext[2];
     };
 
     public Parameters getXNamespaces(){ return namespaces; }
@@ -574,11 +552,10 @@ public class BasicAlignment implements Alignment {
 	result.setType( getType() );
 	result.setLevel( getLevel() );
 	// Must add an inverse to the method extension
-	for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    result.setExtension( label, getExtension( label ) );
+	for ( Object ext : ((BasicParameters)extensions).getValues() ){
+	    result.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	}
-	result.getExtensions().unsetParameter( "id" );
+	result.getExtensions().unsetParameter( ALIGNNS+"id" );
 	for ( Enumeration e = namespaces.getNames() ; e.hasMoreElements(); ){
 	    String label = (String)e.nextElement();
 	    result.setXNamespace( label, getXNamespace( label ) );
@@ -620,11 +597,10 @@ public class BasicAlignment implements Alignment {
 	align.setLevel( getLevel() );
 	align.setFile1( getFile1() );
 	align.setFile2( getFile2() );
-	for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    align.setExtension( label, getExtension( label ) );
+	for ( Object ext : ((BasicParameters)extensions).getValues() ){
+	    align.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	}
-	align.getExtensions().unsetParameter( "id" );
+	align.getExtensions().unsetParameter( ALIGNNS+"id" );
 	for ( Enumeration e = namespaces.getNames() ; e.hasMoreElements(); ){
 	    String label = (String)e.nextElement();
 	    align.setXNamespace( label, getXNamespace( label ) );
diff --git a/src/fr/inrialpes/exmo/align/impl/BasicCell.java b/src/fr/inrialpes/exmo/align/impl/BasicCell.java
index 165192d2..c97f3e19 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicCell.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicCell.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2003-2005, 2007
+ * Copyright (C) INRIA Rhône-Alpes, 2003-2005, 2007-2008
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -122,15 +122,16 @@ public class BasicCell implements Cell, Comparable {
 	extensions = p;
     }
 
-    public void setExtension( String label, String value ) {
+    public void setExtension( String uri, String label, String value ) {
 	if ( extensions == null )
 	    extensions = new BasicParameters();
-	extensions.setParameter( label, value );
+	String [] ext = { uri, label, value };
+	extensions.setParameter( uri+label, ext );
     };
 
-    public String getExtension( String label ) {
+    public String getExtension( String uri, String label ) {
 	if ( extensions != null ) {
-	    return (String)extensions.getParameter( label );
+	    return ((String [])extensions.getParameter( uri+label ))[2];
 	} else {
 	    return (String)null;
 	}
@@ -139,12 +140,11 @@ public class BasicCell implements Cell, Comparable {
     public Cell inverse() throws AlignmentException {
 	Cell result = (Cell)new BasicCell( (String)null, object2, object1, relation.inverse(), strength );
 	if ( extensions != null ) {
-	    for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-		String label = (String)e.nextElement();
-		result.setExtension( label, getExtension( label ) );
+	    for ( Object ext : ((BasicParameters)extensions).getValues() ){
+		result.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	    }
 	}
-	result.getExtensions().unsetParameter( "id" );
+	result.getExtensions().unsetParameter( BasicAlignment.ALIGNNS+BasicAlignment.ID );
 	// The sae should be done for the measure
 	return result;
     }
diff --git a/src/fr/inrialpes/exmo/align/impl/OWLAPIAlignment.java b/src/fr/inrialpes/exmo/align/impl/OWLAPIAlignment.java
index d91365cb..bd656fa4 100644
--- a/src/fr/inrialpes/exmo/align/impl/OWLAPIAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/OWLAPIAlignment.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2003-2007
+ * Copyright (C) INRIA Rhône-Alpes, 2003-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
@@ -224,11 +224,10 @@ public class OWLAPIAlignment extends BasicAlignment {
 	align.setLevel( getLevel() );
 	align.setFile1( getFile1() );
 	align.setFile2( getFile2() );
-	for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    align.setExtension( label, getExtension( label ) );
+	for ( Object ext : ((BasicParameters)extensions).getValues() ){
+	    align.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	}
-	align.getExtensions().unsetParameter( "id" );
+	align.getExtensions().unsetParameter( ALIGNNS+"id" );
 	try {
 	    align.ingest( this );
 	} catch (AlignmentException ex) { ex.printStackTrace(); }
@@ -246,9 +245,8 @@ public class OWLAPIAlignment extends BasicAlignment {
 	align.setLevel( getLevel() );
 	align.setFile1( getFile1() );
 	align.setFile2( getFile2() );
-	for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    align.setExtension( label, getExtension( label ) );
+	for ( Object ext : ((BasicParameters)extensions).getValues() ){
+	    align.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	}
 	for (Enumeration e = getElements(); e.hasMoreElements();) {
 	    Cell c = (Cell)e.nextElement();
@@ -270,9 +268,8 @@ public class OWLAPIAlignment extends BasicAlignment {
 	alignment.init( al.getFile1(), al.getFile2(), ontologies );
 	alignment.setType( al.getType() );
 	alignment.setLevel( al.getLevel() );
-	for ( Enumeration e = al.getExtensions().getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    alignment.setExtension( label, al.getExtension( label ) );
+	for ( Object ext : ((BasicParameters)al.getExtensions()).getValues() ){
+	    alignment.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
 	}
 	OWLOntology o1 = (OWLOntology)alignment.getOntology1();
 	OWLOntology o2 = (OWLOntology)alignment.getOntology2();
diff --git a/src/fr/inrialpes/exmo/align/impl/URIAlignment.java b/src/fr/inrialpes/exmo/align/impl/URIAlignment.java
index f286ef37..3deaba55 100644
--- a/src/fr/inrialpes/exmo/align/impl/URIAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/URIAlignment.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2003-2007
+ * Copyright (C) INRIA Rhône-Alpes, 2003-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
@@ -172,11 +172,10 @@ public class URIAlignment extends BasicAlignment {
 	align.setLevel( getLevel() );
 	align.setFile1( getFile1() );
 	align.setFile2( getFile2() );
-	for ( Enumeration e = extensions.getNames() ; e.hasMoreElements(); ){
-	    String label = (String)e.nextElement();
-	    align.setExtension( label, getExtension( label ) );
-	}
-	align.getExtensions().unsetParameter( "id" );
+	for ( Object ext : ((BasicParameters)extensions).getValues() ){
+	    align.setExtension( ((String[])ext)[0], ((String[])ext)[1], ((String[])ext)[2] );
+	    }
+	align.getExtensions().unsetParameter( ALIGNNS+"id" );
 	try {
 	    align.ingest( this );
 	} catch (AlignmentException ex) { ex.printStackTrace(); }
diff --git a/src/fr/inrialpes/exmo/align/impl/eval/PRGraphEvaluator.java b/src/fr/inrialpes/exmo/align/impl/eval/PRGraphEvaluator.java
index ebddc604..40af58c3 100644
--- a/src/fr/inrialpes/exmo/align/impl/eval/PRGraphEvaluator.java
+++ b/src/fr/inrialpes/exmo/align/impl/eval/PRGraphEvaluator.java
@@ -68,9 +68,15 @@ public class PRGraphEvaluator extends BasicEvaluator {
 
     private Vector points;
 
-    /** Creation **/
+    /** Creation:
+     * A priori, evaluators can deal with any kind of alignments.
+     * However, it will not work if these are not of the same type.
+     **/
     public PRGraphEvaluator(Alignment align1, Alignment align2) {
 	super(align1, align2);
+	if ( align1.getClass() != align2.getClass() ) {
+	    // This should throw an exception...
+	}
 	points = new Vector();
     }
 
diff --git a/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java b/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
index 2e38ce44..3f022da0 100644
--- a/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
+++ b/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2004-2007
+ * Copyright (C) INRIA Rhône-Alpes, 2004-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
@@ -133,7 +133,7 @@ public class PRecEvaluator extends BasicEvaluator {
 	fmeasure = 2 * precision * recall / (precision + recall);
 	overall = recall * (2 - (1 / precision));
 	result = recall / precision;
-	String timeExt = align2.getExtension("time");
+	String timeExt = align2.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.TIME );
 	if ( timeExt != null ) time = Long.parseLong(timeExt);
 	//System.err.println(">>>> " + nbcorrect + " : " + nbfound + " : " + nbexpected);
 	return (result);
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/HTMLRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/HTMLRendererVisitor.java
index 255ba11e..d74b4327 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/HTMLRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/HTMLRendererVisitor.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2006-2007
+ * 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
@@ -29,6 +29,9 @@ import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Relation;
 
+import fr.inrialpes.exmo.align.impl.BasicAlignment;
+import fr.inrialpes.exmo.align.impl.BasicParameters;
+
 /**
  * Renders an alignment in HTML
  *
@@ -66,9 +69,8 @@ public class HTMLRendererVisitor implements AlignmentVisitor
 	writer.print("<tr><td>level</td><td>"+align.getLevel()+"</td></tr>\n" );
 	writer.print("<tr><td>type</td><td>"+align.getType()+"</td></tr>\n" );
 	// Get the keys of the parameter
-	for( Enumeration e = align.getExtensions().getNames() ; e.hasMoreElements() ; ){
-	    String tag = (String)e.nextElement();
-	    writer.print("<tr><td>"+tag+"</td><td>"+align.getExtension(tag)+"</td></tr>\n");
+	for ( Object ext : ((BasicParameters)align.getExtensions()).getValues() ){
+	    writer.print("<tr><td>"+((String[])ext)[0]+" : "+((String[])ext)[1]+"</td><td>"+((String[])ext)[2]+"</td></tr>\n");
 	}
 	writer.print("</table>\n");
 	writer.print("<h2>Correspondences</h2>\n");
@@ -91,7 +93,7 @@ public class HTMLRendererVisitor implements AlignmentVisitor
 	if ( cell.getId() != null ) {
 	    String id = cell.getId();
 	    // Would be useful to test for the Alignment URI
-	    if ( id.startsWith( (String)alignment.getExtension( "id" ) ) ){
+	    if ( id.startsWith( (String)alignment.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID ) ) ){
 		writer.print("<td>"+id.substring( id.indexOf( '#' ) )+"</td>");
 	    } else {
 		writer.print("<td>"+id+"</td>");
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
index 68dc88eb..a59677e3 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
@@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer;
 
 import java.util.Enumeration;
 import java.io.PrintWriter;
-//import java.util.Set;
+import java.util.Hashtable;
 
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentVisitor;
@@ -33,16 +33,12 @@ import org.semanticweb.owl.align.Relation;
 // JE: this has been introduced here for the sole purpose of
 // using the namespace facility of BasicAlignment
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
+import fr.inrialpes.exmo.align.impl.BasicParameters;
 
 import org.omwg.mediation.language.export.omwg.OmwgSyntaxFormat;
-//import org.omwg.mediation.language.export.rdf.RdfSyntaxFormat;
 import org.omwg.mediation.parser.alignment.NamespaceDefs;
 import org.omwg.mediation.language.objectmodel.api.Expression;
 
-// JE: we need jena... only for this renderer!
-//import com.hp.hpl.jena.rdf.model.Model;
-//import com.hp.hpl.jena.rdf.model.ModelFactory;
-
 
 /**
  * Renders an alignment in its RDF format
@@ -58,39 +54,60 @@ public class RDFRendererVisitor implements AlignmentVisitor
     Alignment alignment = null;
     Cell cell = null;
     OmwgSyntaxFormat oMWGformatter = null;
-    //RdfSyntaxFormat oMWGformatter = null;
-    //Model model = null;
+    Hashtable nslist = null;
 
     public RDFRendererVisitor( PrintWriter writer ){
 	this.writer = writer;
-	//Model model = ModelFactory.createDefaultModel();
     }
 
     public void visit( Alignment align ) throws AlignmentException {
+	String extensionString = "";
 	alignment = align;
+	nslist = new Hashtable();
+	nslist.put(BasicAlignment.ALIGNNS,"align");
+	nslist.put("http://www.w3.org/1999/02/22-rdf-syntax-ns#","rdf");
+	nslist.put("http://www.w3.org/2001/XMLSchema#","xsd");
+	//nslist.put("http://www.omwg.org/TR/d7/ontology/alignment","omwg");
+	// Get the keys of the parameter
+	int gen = 0;
+	for ( Object ext : ((BasicParameters)align.getExtensions()).getValues() ){
+	    String prefix = ((String[])ext)[0];
+	    String name = ((String[])ext)[1];
+	    String tag = (String)nslist.get(prefix);
+	    if ( tag == null ) {
+		tag = "ns"+gen++;
+		nslist.put( prefix, tag );
+	    }
+	    if ( tag.equals("align") ) { tag = name; }
+	    else { tag += ":"+name; }
+	    extensionString += "  <"+tag+">"+((String[])ext)[2]+"</"+tag+">\n";
+	}
 	writer.print("<?xml version='1.0' encoding='utf-8");
 	writer.print("' standalone='no'?>\n");
-	writer.print("<rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment'\n         xmlns:align='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("<rdf:RDF xmlns='"+BasicAlignment.ALIGNNS+"'");
+	for ( Enumeration e = nslist.keys() ; e.hasMoreElements(); ) {
+	    String k = (String)e.nextElement();
+	    writer.print("\n         xmlns:"+nslist.get(k)+"='"+k+"'");
+	}
 	if ( align instanceof BasicAlignment ) {
 	    for ( Enumeration e = ((BasicAlignment)align).getXNamespaces().getNames() ; e.hasMoreElements(); ){
 	    String label = (String)e.nextElement();
 	    if ( !label.equals("rdf") && !label.equals("xsd")
 		 && !label.equals("<default>") ) 
-		writer.print("         xmlns:"+label+"='"+((BasicAlignment)align).getXNamespace( label )+"'\n");
+		writer.print("\n         xmlns:"+label+"='"+((BasicAlignment)align).getXNamespace( label )+"'");
 	    }
 	}
 	writer.print(">\n");
 	writer.print("<Alignment");
-	if ( align.getExtension("id") != null ) {
-	    writer.print(" rdf:about=\""+align.getExtension("id")+"\"");
+	String idext = align.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID );
+	if ( idext != null ) {
+	    writer.print(" rdf:about=\""+idext+"\"");
 	}
 	writer.print(">\n  <xml>yes</xml>\n");
 	writer.print("  <level>");
 	writer.print( align.getLevel() );
 	if ( align.getLevel().equals("2OMWG") ) {
 	    oMWGformatter = new OmwgSyntaxFormat( true, "  " );
-	    //oMWGformatter = new RdfSyntaxFormat();
-	    // Provide the list of declared namespaces (should be related to above)
 	    oMWGformatter.setDefaultNamespace( NamespaceDefs.ALIGNMENT );
 	    // Set the offset at which element starts (fortunately always the same)
 	    oMWGformatter.setPrefixCount(4);
@@ -98,25 +115,7 @@ public class RDFRendererVisitor implements AlignmentVisitor
 	writer.print("</level>\n  <type>");
 	writer.print( align.getType() );
 	writer.print("</type>\n");
-	// Get the keys of the parameter
-	for( Enumeration e = align.getExtensions().getNames() ; e.hasMoreElements() ; ){
-	    String tag = (String)e.nextElement();
-	    // Here I should reverse namespace
-	    writer.print("  <"+tag+">"+align.getExtension(tag)+"</"+tag+">\n");
-	}
-	// JE: real new version of the format...
-	/*
-	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( align.getOntology1URI().toString() );
-	writer.print("</uri1>\n");
-	writer.print("  <uri2>");
-	writer.print( align.getOntology2URI().toString() );
-	writer.print("</uri2>\n");
-	*/
+	writer.print(extensionString);
 	writer.print("  <onto1>\n    <Ontology");
 	if ( align.getOntology1URI() != null ) {
 	    writer.print(" rdf:about=\""+align.getOntology1URI()+"\">");
@@ -133,7 +132,7 @@ public class RDFRendererVisitor implements AlignmentVisitor
 	}
 	writer.print("\n      <location>"+align.getFile2()+"</location>");
 	if ( align instanceof BasicAlignment && ((BasicAlignment)align).getOntologyObject2().getFormalism() != null ) {
-	    writer.print("\n      <formalism>\n        <Formalism name=\""+((BasicAlignment)align).getOntologyObject2().getFormalism()+"\" uri=\""+((BasicAlignment)align).getOntologyObject2().getFormURI()+"\"/>\n      </formalism>");
+	    writer.print("\n      <formalism>\n        <Formalism align:name=\""+((BasicAlignment)align).getOntologyObject2().getFormalism()+"\" align:uri=\""+((BasicAlignment)align).getOntologyObject2().getFormURI()+"\"/>\n      </formalism>");
 	    
 	}
 	writer.print("\n    </Ontology>\n  </onto2>\n");
@@ -185,10 +184,17 @@ public class RDFRendererVisitor implements AlignmentVisitor
 		writer.print("      <semantics>"+cell.getSemantics()+"</semantics>\n");
 	    if ( cell.getExtensions() != null ) {
 		// could certainly be done better
-		for ( Enumeration e = cell.getExtensions().getNames() ; e.hasMoreElements(); ){
-		    String label = (String)e.nextElement();
+		for ( Object ext : ((BasicParameters)cell.getExtensions()).getValues() ){
+		    String uri = ((String[])ext)[0];
+		    String tag = (String)nslist.get( uri );
+		    if ( tag == null ){
+			tag = ((String[])ext)[1];
+		    } else {
+			tag += ":"+((String[])ext)[1];
+		    }
+		    // JE: Bug: namespace may not have been declared!
 		    // Here I should reverse namespace
-		    writer.print("      <"+label+">"+cell.getExtension(label)+"</"+label+">\n");
+		    writer.print("      <"+tag+">"+((String[])ext)[2]+"</"+tag+">\n");
 		}
 	    }
 	    writer.print("    </Cell>\n  </map>\n");
diff --git a/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java b/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
index 752551d3..fd7440d0 100644
--- a/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
+++ b/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
@@ -55,6 +55,7 @@ import org.semanticweb.owl.align.Parameters;
 import fr.inrialpes.exmo.align.impl.Ontology;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.BasicParameters;
+import fr.inrialpes.exmo.align.impl.BasicAlignment;
 
 /**
  * This class allows the creation of a parser for an Alignment file.
@@ -67,7 +68,7 @@ import fr.inrialpes.exmo.align.impl.BasicParameters;
 
 public class AlignmentParser extends DefaultHandler {
 
-    protected static String ALIGNNS = "http://knowledgeweb.semanticweb.org/heterogeneity/alignment";
+    private static String ALIGNNS = "http://knowledgeweb.semanticweb.org/heterogeneity/alignment#";
     /**
      * level of debug/warning information
      */
@@ -160,7 +161,7 @@ public class AlignmentParser extends DefaultHandler {
      * and can find metadata
      */
     protected int parselevel = 0;
-    
+
     /** 
      * Creates an XML Parser.
      * @param debugMode The value of the debug mode
@@ -309,7 +310,7 @@ public class AlignmentParser extends DefaultHandler {
 		onto1 = new Ontology();
 		onto2 = new Ontology();
 		if ( atts.getValue("rdf:about") != null && !atts.getValue("rdf:about").equals("") ) {
-		    alignment.setExtension( "id", atts.getValue("rdf:about") );
+		    alignment.setExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID, atts.getValue("rdf:about") );
 		};
 	    } else {
 		if ( debugMode > 0 ) System.err.println("[AlignmentParser] Unknown element name : "+pName);
@@ -458,9 +459,10 @@ public class AlignmentParser extends DefaultHandler {
 		} else if (pName.equals("Alignment")) {
 		} else {
 		    if ( parselevel == 3 ){
-			alignment.setExtension( pName, content );
+			alignment.setExtension( namespaceURI, pName, content );
 		    } else if ( parselevel == 5 ) {
-			    extensions.setParameter( pName, content );
+			String[] ext = {namespaceURI, pName, content};
+			extensions.setParameter( namespaceURI+pName, ext );
 		    } else //if ( debugMode > 0 )
 			System.err.println("[AlignmentParser] Unknown element name : "+pName);
 		    //throw new SAXException("[AlignmentParser] Unknown element name : "+pName);
@@ -471,12 +473,11 @@ public class AlignmentParser extends DefaultHandler {
 		throw new SAXException("[AlignmentParser] unknown element name: "+pName); };
 	} else {
 	    if ( parselevel == 3 ){
-		alignment.setExtension( qName, content );
-		//alignment.addNamespace( namespaceURI, );
+		alignment.setExtension( namespaceURI, pName, content );
 	    } else if ( parselevel == 5 ) {
 		if ( extensions == null ) extensions = new BasicParameters();
-		extensions.setParameter( qName, content );
-		//alignment.addNamespace( namespaceURI, );
+		String[] ext = {namespaceURI, pName, content};
+		extensions.setParameter( namespaceURI+pName, ext );
 	    } else throw new SAXException("[AlignmentParser] Unknown namespace : "+namespaceURI);
 	}
 	parselevel--;
diff --git a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
index 35877d96..607b6a9b 100644
--- a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
+++ b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2006-2007
+ * 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
@@ -232,7 +232,7 @@ public class AServProtocolManager {
 	Set alignments = alignmentCache.getAlignments( uri1, uri2 );
 	String msg = "";
 	for( Iterator it = alignments.iterator(); it.hasNext(); ){
-	    msg += ((Alignment)it.next()).getExtension( "id" );
+	    msg += ((Alignment)it.next()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID );
 	    msg += " ";
 	}
 	return new AlignmentIds(newId(),mess,myId,mess.getSender(),msg,(Parameters)null);
@@ -355,12 +355,10 @@ public class AServProtocolManager {
 	Parameters params = new BasicParameters();
 	params.setParameter( "file1", al.getFile1() );
 	params.setParameter( "file2", al.getFile2() );
-	params.setParameter( "level", al.getLevel() );
-	params.setParameter( "type", al.getType() );
-	Parameters extensions = al.getExtensions();
-	for ( Enumeration e = extensions.getNames(); e.hasMoreElements(); ){
-	    String name = (String)e.nextElement();
-	    params.setParameter( name, extensions.getParameter( name ) );
+	params.setParameter( BasicAlignment.ALIGNNS+"level", al.getLevel() );
+	params.setParameter( BasicAlignment.ALIGNNS+"type", al.getType() );
+	for ( Object ext : ((BasicParameters)al.getExtensions()).getValues() ){
+	    params.setParameter( ((String[])ext)[0]+((String[])ext)[1], ((String[])ext)[2] );
 	}
 	return new AlignmentMetadata(newId(),mess,myId,mess.getSender(),id,params);
     }
@@ -441,7 +439,7 @@ public class AServProtocolManager {
 	} catch (Exception e) {
 	    return false;
 	}
-	if ( al.getExtension(CacheImpl.STORED) != null && al.getExtension(CacheImpl.STORED) != "" ) {
+	if ( al.getExtension(CacheImpl.SVCNS, CacheImpl.STORED) != null && al.getExtension(CacheImpl.SVCNS, CacheImpl.STORED) != "" ) {
 	    return true;
 	} else {
 	    return false;
@@ -725,8 +723,8 @@ public class AServProtocolManager {
 	if ( alignments != null && params.getParameter("force") == null ) {
 	    for ( Iterator it = alignments.iterator(); it.hasNext() && (id == null); ){
 		Alignment al = ((Alignment)it.next());
-		if ( al.getExtension( "method" ).equals(method) )
-		    id = al.getExtension( "id" );
+		if ( al.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.METHOD ).equals(method) )
+		    id = al.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID );
 	    }
 	}
 	// Otherwise compute
@@ -755,7 +753,7 @@ public class AServProtocolManager {
 
 		}
 		long newTime = System.currentTimeMillis();
-		aresult.setExtension( "time", Long.toString(newTime - time) );
+		aresult.setExtension( BasicAlignment.ALIGNNS, BasicAlignment.TIME, Long.toString(newTime - time) );
 		// ask to store A'
 		id = alignmentCache.recordNewAlignment( aresult, true );
 	    } catch (ClassNotFoundException e) {
diff --git a/src/fr/inrialpes/exmo/align/service/CacheImpl.java b/src/fr/inrialpes/exmo/align/service/CacheImpl.java
index 5903fe77..4580fc02 100644
--- a/src/fr/inrialpes/exmo/align/service/CacheImpl.java
+++ b/src/fr/inrialpes/exmo/align/service/CacheImpl.java
@@ -2,7 +2,7 @@
  * $Id$
  *
  * Copyright (C) Seungkeun Lee, 2006
- * Copyright (C) INRIA Rhône-Alpes, 2006-2007
+ * 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
@@ -39,6 +39,7 @@ import java.sql.SQLException;
 
 import fr.inrialpes.exmo.align.impl.BasicRelation;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
+import fr.inrialpes.exmo.align.impl.BasicParameters;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.URICell;
 
@@ -62,10 +63,11 @@ public class CacheImpl implements Cache {
     String port = null;
     int rights = 1; // writing rights in the database (default is 1)
 	
-    final int VERSION = 302; // Version of the API to be stored in the database
+    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 
      */
 
     Statement st = null; // JE: not sure that this should persist
@@ -75,10 +77,11 @@ public class CacheImpl implements Cache {
     final int SUCCESS = 2;
     final int INIT_ERROR = 3;
 
-    static public final String CACHED = "http://exmo.inrialpes.fr/align/service:cached";
-    static public final String STORED = "http://exmo.inrialpes.fr/align/service:stored";
-    static public final String OURI1 = "http://exmo.inrialpes.fr/align/service:ouri1";
-    static public final String OURI2 = "http://exmo.inrialpes.fr/align/service:ouri2";
+    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 ) {
@@ -166,7 +169,7 @@ public class CacheImpl implements Cache {
 	String query;
 	ResultSet rs;
 	String tag;
-	String method;
+	String value;
 
 	Alignment result = new URIAlignment();
 		
@@ -178,8 +181,8 @@ public class CacheImpl implements Cache {
 		// Either uri1 or file1
 		result.setFile1( new URI( rs.getString("file1") ) ); 
 		result.setFile2( new URI( rs.getString("file2") ) );
-		result.setExtension( OURI1, rs.getString("owlontology1") );
-		result.setExtension( OURI2, 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"));	
 	    }
@@ -189,8 +192,8 @@ public class CacheImpl implements Cache {
 	    rs = (ResultSet) st.executeQuery(query);
 	    while(rs.next()) {
 		tag = rs.getString("tag");
-		method = rs.getString("method");
-		result.setExtension(tag, method);
+		value = rs.getString("val");
+		result.setExtension( rs.getString("ns"), tag, value);
 	    }
 	} catch (Exception e) { // URI exception that should not occur
 	    System.err.println("Unlikely URI exception!");
@@ -198,9 +201,9 @@ public class CacheImpl implements Cache {
 	    return null;
 	}
 	// should be there
-	//result.setExtension(STORED, "DATE");
+	//result.setExtension( SVCNS, STORED, "DATE");
 	// not yet cached
-	result.setExtension(CACHED, "");
+	result.setExtension(SVCNS, CACHED, "");
 	return result;
     }
 
@@ -218,8 +221,8 @@ public class CacheImpl implements Cache {
 	URI ent1 = null, ent2 = null;
 	Cell cell = null;
 
-	alignment.setOntology1( new URI( alignment.getExtension( OURI1 ) ) );
-	alignment.setOntology2( new URI( alignment.getExtension( OURI2 ) ) );
+	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 + "'";
@@ -242,8 +245,9 @@ public class CacheImpl implements Cache {
 		query = "SELECT * FROM extension WHERE id = '" + cid + "'";
 		ResultSet rse = (ResultSet) st.executeQuery(query);
 		while ( rse.next() ){
-		    cell.setExtension( rse.getString("tag"), 
-				       rse.getString("method") );
+		    cell.setExtension( rse.getString("ns"), 
+				       rse.getString("tag"), 
+				       rse.getString("val") );
 		}
 	    }
 	}
@@ -297,8 +301,8 @@ public class CacheImpl implements Cache {
 	    throw new Exception("getAlignment: Cannot find alignment");
 
 	// If not cached, retrieve it now
-	if ( result.getExtension(CACHED) == "" 
-	     && result.getExtension(STORED) != "") {
+	if ( result.getExtension( SVCNS, CACHED) == "" 
+	     && result.getExtension(SVCNS, STORED) != "") {
 	    retrieveAlignment( id, result );
 	}
 	
@@ -317,7 +321,7 @@ public class CacheImpl implements Cache {
 	    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(OURI2).equals( uri2.toString() ) ) result.add( al );
+		if ( al.getExtension(SVCNS, OURI2).equals( uri2.toString() ) ) result.add( al );
 	    }
 	}
 	return result;
@@ -338,12 +342,12 @@ public class CacheImpl implements Cache {
      */
     public String recordNewAlignment( String id, Alignment al, boolean force ) throws AlignmentException {
 	Alignment alignment = al;
-	alignment.setExtension(OURI1, alignment.getOntology1URI().toString());
-	alignment.setExtension(OURI2, alignment.getOntology2URI().toString());
+	alignment.setExtension(SVCNS, OURI1, alignment.getOntology1URI().toString());
+	alignment.setExtension(SVCNS, OURI2, alignment.getOntology2URI().toString());
 	// Index
 	recordAlignment( id, alignment, force );
 	// Not yet stored
-	alignment.setExtension(STORED, "");
+	alignment.setExtension(SVCNS, STORED, "");
 	// Cached now
 	resetCacheStamp(alignment);
 	return id;
@@ -354,12 +358,12 @@ public class CacheImpl implements Cache {
      */
     public String recordAlignment( String id, Alignment alignment, boolean force ){
 	// record the Id!
-	if ( alignment.getExtension("id") == null )
-	    alignment.setExtension( "id", id );
+	if ( alignment.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID ) == null )
+	    alignment.setExtension(  BasicAlignment.ALIGNNS, BasicAlignment.ID, id );
 	// Store it
 	try {
-	    URI ouri1 = new URI( alignment.getExtension(OURI1) );
-	    URI ouri2 = new URI( alignment.getExtension(OURI2) );
+	    URI ouri1 = new URI( alignment.getExtension( SVCNS, OURI1) );
+	    URI ouri2 = new URI( alignment.getExtension( SVCNS, OURI2) );
 	    if ( force || alignmentTable.get( id ) == null ) {
 		Set s1 = (Set)ontologyTable.get( ouri1 );
 		if ( s1 == null ) {
@@ -421,13 +425,13 @@ public class CacheImpl implements Cache {
 	alignment = getAlignment( id );
 
 	// We store stored date
-	alignment.setExtension(STORED, new Date().toString());
+	alignment.setExtension( SVCNS, STORED, new Date().toString());
 	// We empty cached date
-	alignment.setExtension(CACHED, "");
+	alignment.setExtension( SVCNS, CACHED, "");
 
 	try {
-	    String s_O1 = alignment.getExtension(OURI1);
-	    String s_O2 = alignment.getExtension(OURI2);
+	    String s_O1 = alignment.getExtension(SVCNS, OURI1);
+	    String s_O2 = alignment.getExtension(SVCNS, OURI2);
 	    
 	    // file attribute
 	    String s_File1 = null;
@@ -448,12 +452,13 @@ public class CacheImpl implements Cache {
 		"(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( Enumeration e = alignment.getExtensions().getNames() ; e.hasMoreElements() ; ){
-		String tag = (String)e.nextElement();
-		String s_method = alignment.getExtension(tag);
+	    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, tag, method) " +
-		    "VALUES ('" + quote(id) + "','" +  quote(tag) + "','" + quote(s_method) + "')";
+		    "(id, uri, tag, val) " +
+		    "VALUES ('" + quote(id) + "','" +  quote(uri) + "','" +  quote(tag) + "','" + quote(val) + "')";
 		st.executeUpdate(query);
 	    }
 
@@ -464,7 +469,7 @@ public class CacheImpl implements Cache {
 		    cellid = c.getId();
 		    if ( cellid != null ){
 			if ( cellid.startsWith("#") ) {
-			    cellid = alignment.getExtension("id") + cellid;
+			    cellid = alignment.getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID ) + cellid;
 			}
 		    } else if ( c.getExtensions() != null ) {
 			// JE: In case of extensions create an ID
@@ -487,12 +492,14 @@ public class CacheImpl implements Cache {
 		}
 		if ( cellid != null && !cellid.equals("") && c.getExtensions() != null ) {
 		    // JE: I must now store all the extensions
-		    for( Enumeration e2 = c.getExtensions().getNames() ; e2.hasMoreElements() ; ){
-			String tag = (String)e2.nextElement();
-			String s_method = c.getExtension(tag);
+		    // 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, tag, method) " +
-			    "VALUES ('" + quote(cellid) + "','" +  quote(tag) + "','" + quote(s_method) + "')";
+			    "(id, uri, tag, val) " +
+			    "VALUES ('" + quote(cellid) + "','" +  quote(uri) + "','" +  quote(tag) + "','" + quote(val) + "')";
 			st.executeUpdate(query);
 		    }
 		}
@@ -505,13 +512,13 @@ public class CacheImpl implements Cache {
     //**********************************************************************
     // CACHE MANAGEMENT (Not implemented yet)
     public void resetCacheStamp( Alignment result ){
-	result.setExtension(CACHED, new Date().toString() );
+	result.setExtension(SVCNS, CACHED, new Date().toString() );
     }
 
     public void cleanUpCache() {
 	// for each alignment in the table
 	// set currentDate = Date();
-	// if ( DateFormat.parse( result.getExtension(CACHED) ).before( ) ) {
+	// if ( DateFormat.parse( result.getExtension(SVCNS, CACHED) ).before( ) ) {
 	// - for each ontology if no other alignment => unload
 	// - clean up cells
 	// }
@@ -559,7 +566,7 @@ public class CacheImpl implements Cache {
       create table extension(
       id varchar(100),
       tag varchar(100),
-      method varchar(500));
+      val varchar(500));
 
     */
 
@@ -567,7 +574,7 @@ public class CacheImpl implements Cache {
 	// 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), tag VARCHAR(100), method VARCHAR(500))");
+	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+"')");
     }
diff --git a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
index 7e4a56ae..a83687db 100644
--- a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
+++ b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
@@ -1,7 +1,7 @@
  /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2006-2007.
+ * 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
@@ -21,6 +21,7 @@
 package fr.inrialpes.exmo.align.service;
 
 import fr.inrialpes.exmo.align.impl.BasicParameters;
+import fr.inrialpes.exmo.align.impl.BasicAlignment;
 
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.Parameters;
@@ -352,7 +353,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
         if ( perf.equals("listalignments") ){
 	    msg = "<h1>Available alignments</h1><ul compact=\"1\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID );
 		msg += "<li><a href=\"../html/retrieve?method=fr.inrialpes.exmo.align.impl.renderer.HTMLRendererVisitor&id="+id+"\">"+id+"</a></li>";
 	    }
 	    msg += "</ul>";
@@ -436,7 +437,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "Alignment id:  <select name=\"id\">";
 	    // JE: only those non stored please (retrieve metadata + stored)
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		params.setParameter("id", id);
 		if ( !manager.storedAlignment( new Message(newId(),(Message)null,myId,serverId,"", params ) ) ){
 		msg += "<option value=\""+id+"\">"+id+"</option>";
@@ -469,7 +470,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg ="<h1>Trim alignments</h1><form action=\"cut\">";
 	    msg += "Alignment id:  <select name=\"id\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br />";
@@ -490,7 +491,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg ="<h1>Inverse alignment</h1><form action=\"inv\">";
 	    msg += "Alignment id:  <select name=\"id\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br />";
@@ -514,7 +515,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    }
 	    msg += "</select><br />Initial alignment id:  <select name=\"id\"><option value=\"\" selected=\"1\"></option>";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br />";
@@ -542,7 +543,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg = "<h1>Retrieve alignment</h1><form action=\"retrieve\">";
 	    msg += "Alignment id:  <select name=\"id\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br />";
@@ -566,7 +567,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg = "<h1>Retrieve alignment metadata</h1><form action=\"metadata\">";
 	    msg += "Alignment id:  <select name=\"id\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br /><input type=\"submit\" value=\"Get metadata\"/></form>";
@@ -604,7 +605,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    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");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br />";
@@ -624,7 +625,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg = "<h1>Retrieve alignment metadata</h1><form action=\"metadata\">";
 	    msg += "Alignment id:  <select name=\"id\">";
 	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
-		String id = ((Alignment)e.nextElement()).getExtension("id");
+		String id = ((Alignment)e.nextElement()).getExtension( BasicAlignment.ALIGNNS, BasicAlignment.ID);
 		msg += "<option value=\""+id+"\">"+id+"</option>";
 	    }
 	    msg += "</select><br /><input type=\"submit\" value=\"Get metadata\"/></form>";
diff --git a/src/fr/inrialpes/exmo/align/util/GroupAlign.java b/src/fr/inrialpes/exmo/align/util/GroupAlign.java
index c5ad41ce..3145617e 100644
--- a/src/fr/inrialpes/exmo/align/util/GroupAlign.java
+++ b/src/fr/inrialpes/exmo/align/util/GroupAlign.java
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2003 The University of Manchester
  * Copyright (C) 2003 The University of Karlsruhe
- * Copyright (C) 2003-2007, INRIA Rhône-Alpes
+ * Copyright (C) 2003-2008, INRIA Rhône-Alpes
  * Copyright (C) 2004, Université de Montréal
  *
  * Modifications to the initial code base are copyright of their
@@ -331,7 +331,7 @@ public class GroupAlign {
 	long time = System.currentTimeMillis();
 	result.align(init, params); // add opts
 	long newTime = System.currentTimeMillis();
-	result.setExtension( BasicAlignment.TIME, Long.toString(newTime - time) );
+	result.setExtension( BasicAlignment.ALIGNNS, BasicAlignment.TIME, Long.toString(newTime - time) );
 
 	if (debug > 1) System.err.println(" Alignment performed");
 
diff --git a/src/fr/inrialpes/exmo/align/util/Procalign.java b/src/fr/inrialpes/exmo/align/util/Procalign.java
index ab809681..3b425b4d 100644
--- a/src/fr/inrialpes/exmo/align/util/Procalign.java
+++ b/src/fr/inrialpes/exmo/align/util/Procalign.java
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2003 The University of Manchester
  * Copyright (C) 2003 The University of Karlsruhe
- * Copyright (C) 2003-2007, INRIA Rhône-Alpes
+ * Copyright (C) 2003-2008, INRIA Rhône-Alpes
  * Copyright (C) 2004, Université de Montréal
  *
  * This program is free software; you can redistribute it and/or
@@ -247,7 +247,7 @@ public class Procalign {
 	    long time = System.currentTimeMillis();
 	    result.align(  init, params ); // add opts
 	    long newTime = System.currentTimeMillis();
-	    result.setExtension( BasicAlignment.TIME, Long.toString(newTime - time) );
+	    result.setExtension( BasicAlignment.ALIGNNS, BasicAlignment.TIME, Long.toString(newTime - time) );
 
 	    // Thresholding
 	    if (threshold != 0) result.cut( cutMethod, threshold );
diff --git a/src/org/semanticweb/owl/align/Alignment.java b/src/org/semanticweb/owl/align/Alignment.java
index 4cbf7ff7..90154ac0 100644
--- a/src/org/semanticweb/owl/align/Alignment.java
+++ b/src/org/semanticweb/owl/align/Alignment.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA Rhône-Alpes, 2003-2005, 2007
+ * Copyright (C) INRIA Rhône-Alpes, 2003-2005, 2007-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
@@ -146,8 +146,8 @@ public interface Alignment extends Cloneable
      * to the alignment structure itself.
      */
     public Parameters getExtensions();
-    public String getExtension( String label );
-    public void setExtension( String label, String value );
+    public String getExtension( String uri, String label );
+    public void setExtension( String uri, String label, String value );
 
     public Enumeration getElements();
     public int nbCells();
-- 
GitLab