Author: fchrist
Date: Wed Jul 13 07:28:04 2011
New Revision: 1145892

URL: http://svn.apache.org/viewvc?rev=1145892&view=rev
Log:
STANBOL-244 Implemented Query for Single Fact, STANBOL-252 Added context element

Added:
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactContext.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResult.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResultSet.java
Modified:
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactSchema.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/FactStoreWebFragment.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/derby/DerbyFactStoreTest.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
 Wed Jul 13 07:28:04 2011
@@ -5,7 +5,7 @@ import java.util.Set;
 import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 import org.apache.stanbol.factstore.model.Query;
-import org.apache.stanbol.factstore.model.ResultSet;
+import org.apache.stanbol.factstore.model.FactResultSet;
 
 public interface FactStore {
 
@@ -21,6 +21,6 @@ public interface FactStore {
     
     public void addFacts(Set<Fact> factSet) throws Exception;
 
-    public ResultSet query(Query query);
+    public FactResultSet query(Query query) throws Exception;
 
 }

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
 Wed Jul 13 07:28:04 2011
@@ -19,14 +19,18 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.stanbol.factstore.api.FactStore;
 import org.apache.stanbol.factstore.model.Fact;
+import org.apache.stanbol.factstore.model.FactResult;
+import org.apache.stanbol.factstore.model.FactResultSet;
 import org.apache.stanbol.factstore.model.FactSchema;
 import org.apache.stanbol.factstore.model.Query;
+import org.apache.stanbol.factstore.model.WhereClause;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Implementation of the FactStore interface based on an Apache Derby 
relational database.
+ * Implementation of the FactStore interface based on an Apache Derby 
relational
+ * database.
  * 
  * @author Fabian Christ
  */
@@ -34,407 +38,579 @@ import org.slf4j.LoggerFactory;
 @Service
 public class DerbyFactStore implements FactStore {
 
-    private static Logger logger = 
LoggerFactory.getLogger(DerbyFactStore.class);
+       private static Logger logger = LoggerFactory
+                       .getLogger(DerbyFactStore.class);
 
-    private static int MAX_FACTSCHEMAURN_LENGTH = 96;
+       private static int MAX_FACTSCHEMAURN_LENGTH = 96;
 
-    private static final String CreateTableFactSchemata = "CREATE TABLE 
factschemata ( id INT GENERATED ALWAYS AS IDENTITY CONSTRAINT factschema_id 
PRIMARY KEY, name VARCHAR(128) NOT NULL )";
-    private static final String CreateTableFactRoles = "CREATE TABLE factroles 
( id INT GENERATED ALWAYS AS IDENTITY CONSTRAINT factrole_id PRIMARY KEY, 
factschema_id INT NOT NULL CONSTRAINT factschema_foreign_key REFERENCES 
factschemata ON DELETE CASCADE ON UPDATE RESTRICT, name VARCHAR(128) NOT NULL, 
type VARCHAR(512) NOT NULL )";
-
-    public static final String DB_URL = "jdbc:derby:factstore;create=true";
-
-    @Activate
-    protected void activate(ComponentContext cc) throws Exception {
-        logger.info("Activating FactStore...");
-
-        logger.info("Connecting to Derby DB {}", DB_URL);
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-
-            if (con != null) {
-                logger.info("Derby connection established.");
-
-                try {
-                    if (!existsTable("factschemata", con)) {
-                        List<String> sqls = new ArrayList<String>();
-                        sqls.add(CreateTableFactSchemata);
-                        sqls.add(CreateTableFactRoles);
-
-                        this.executeUpdate(sqls, con);
-
-                        logger.info("Created FactStore meta tables.");
-                    }
-                } catch (Exception e) {
-                    throw new Exception("Error creating meta data tables", e);
-                }
-            }
-        } catch (Exception e) {
-            throw new Exception("Derby DB error. Can't activate.", e);
-        } finally {
-            if (con != null) {
-                try {
-                    con.close();
-                } catch (SQLException e) {
-                    /* ignore */
-                }
-            }
-        }
-
-        logger.info("FactStore activated.");
-    }
-
-    @Override
-    public int getMaxFactSchemaURNLength() {
-        return MAX_FACTSCHEMAURN_LENGTH;
-    }
-
-    @Override
-    public boolean existsFactSchema(String factSchemaURN) throws Exception {
-        String factSchemaB64 = 
Base64.encodeBase64URLSafeString(factSchemaURN.getBytes());
-        boolean tableExists = false;
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            tableExists = this.existsTable(factSchemaB64, con);
-        } catch (Exception e) {
-            throw new Exception("Error checking table existence", e);
-        } finally {
-            if (con != null) {
-                try {
-                    con.close();
-                } catch (SQLException e) {
-                    /* ignore */
-                }
-            }
-        }
-
-        return tableExists;
-    }
-
-    private boolean existsTable(String tableName, Connection con) throws 
Exception {
-        boolean exists = false;
-
-        ResultSet res = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            DatabaseMetaData meta = con.getMetaData();
-            res = meta.getTables(null, null, null, new String[] {"TABLE"});
-            while (res.next()) {
-                if (res.getString("TABLE_NAME").equalsIgnoreCase(tableName)) {
-                    exists = true;
-                    break;
-                }
-            }
-        } catch (SQLException e) {
-            logger.error("Error while reading tables' metadata to check if 
table '{}' exists", tableName);
-            throw new Exception("Error while reading tables' metadata", e);
-        } finally {
-            try {
-                res.close();
-            } catch (Throwable t) { /* ignore */}
-        }
-
-        return exists;
-    }
-
-    @Override
-    public FactSchema getFactSchema(String factSchemaURN) {
-        FactSchema factSchema = null;
-
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            factSchema = loadFactSchema(factSchemaURN, con);
-        } catch (Exception e) {
-            logger.error("Error while loading fact schema", e);
-            factSchema = null;
-        } finally {
-            try {
-                con.close();
-            } catch (Throwable t) { /* ignore */}
-        }
-
-        return factSchema;
-    }
-
-    private FactSchema loadFactSchema(String factSchemaURN, Connection con) 
throws Exception {
-        FactSchema factSchema = null;
-        PreparedStatement ps = null;
-        ResultSet rs = null;
-        try {
-            String selectFactSchema = "SELECT factschemata.name AS schemaURN, 
factroles.name AS role, factroles.type AS type FROM factroles JOIN factschemata 
ON ( factschemata.id = factroles.factschema_id ) WHERE factschemata.name = ?";
-            ps = con.prepareStatement(selectFactSchema);
-            ps.setString(1, factSchemaURN);
-            rs = ps.executeQuery();
-
-            boolean first = true;
-            while (rs.next()) {
-                if (first) {
-                    factSchema = new FactSchema();
-                    factSchema.setFactSchemaURN(rs.getString("schemaURN"));
-                    first = false;
-                }
-                String typeFromDB = rs.getString("type");
-                String[] types = typeFromDB.split(",");
-                if (types.length > 0) {
-                    for (String type : types) {
-                        factSchema.addRole(rs.getString("role"), type);
-                    }
-                } else {
-                    factSchema.addRole(rs.getString("role"), typeFromDB);
-                }
-            }
-        } catch (SQLException e) {
-            throw new Exception("Error while selecting fact schema meta data", 
e);
-        } finally {
-            if (rs != null) {
-                try {
-                    rs.close();
-                } catch (SQLException e) {
-                    /* ignore */
-                }
-            }
-            if (ps != null) {
-                try {
-                    ps.close();
-                } catch (SQLException e) {
-                    /* ignore */
-                }
-            }
-        }
-
-        return factSchema;
-    }
-
-    @Override
-    public void createFactSchema(FactSchema factSchema) throws Exception {
-        // TODO Implement roll back behavior (transaction)
-
-        String factSchemaB64 = 
Base64.encodeBase64URLSafeString(factSchema.getFactSchemaURN().getBytes());
-
-        List<String> createFactSchemaTable = 
this.toSQLfromSchema(factSchemaB64, factSchema);
-
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            this.executeUpdate(createFactSchemaTable, con);
-            this.insertFactSchemaMetadata(factSchema, con);
-        } catch (Exception e) {
-            throw new Exception("Error while creating fact schema", e);
-        } finally {
-            try {
-                con.close();
-            } catch (Throwable t) { /* ignore */}
-        }
-
-        logger.info("Fact schema {} created as {}", 
factSchema.getFactSchemaURN(), factSchemaB64);
-    }
-
-    private void insertFactSchemaMetadata(FactSchema factSchema, Connection 
con) throws Exception {
-        PreparedStatement ps = null;
-        try {
-            String insertFactSchema = "INSERT INTO factschemata (name) VALUES 
( ? )";
-            ps = con.prepareStatement(insertFactSchema, 
PreparedStatement.RETURN_GENERATED_KEYS);
-            ps.setString(1, factSchema.getFactSchemaURN());
-            ps.executeUpdate();
-            ResultSet rs = ps.getGeneratedKeys();
-
-            int factSchemaId = -1;
-            if (rs.next()) {
-                factSchemaId = rs.getInt(1);
-            }
-            if (factSchemaId < 0) {
-                throw new Exception("Could not obtain fact schema ID after 
insert");
-            }
-
-            logger
-                    .info("Inserted new fact schema {} with ID {}", 
factSchema.getFactSchemaURN(),
-                        factSchemaId);
-
-            String insertFactRoles = "INSERT INTO factroles (factschema_id, 
name, type) VALUES ( ?, ?, ? )";
-            ps = con.prepareStatement(insertFactRoles);
-            for (String role : factSchema.getRoles()) {
-                ps.setInt(1, factSchemaId);
-                ps.setString(2, role);
-
-                StringBuilder typeList = new StringBuilder();
-                boolean first = true;
-                for (String type : factSchema.getTypesOfRole(role)) {
-                    if (!first) {
-                        typeList.append(",");
-                    }
-                    typeList.append(type);
-                    first = false;
-                }
-                ps.setString(3, typeList.toString());
-
-                ps.addBatch();
-            }
-            ps.executeBatch();
-        } catch (SQLException e) {
-            throw new Exception("Error while inserting fact schema meta data", 
e);
-        } finally {
-            if (ps != null) {
-                try {
-                    ps.close();
-                } catch (SQLException e) {
-                    /* ignore */
-                }
-            }
-        }
-    }
-
-    protected List<String> toSQLfromSchema(String factSchemaB64, FactSchema 
factSchema) throws Exception {
-        List<String> sqls = new ArrayList<String>();
-
-        // TODO Add SQL command for index creation
-
-        StringBuilder createTableSQL = new StringBuilder("CREATE TABLE ");
-        createTableSQL.append(factSchemaB64).append(' ');
-        createTableSQL.append('(');
-        createTableSQL.append("id INT GENERATED ALWAYS AS IDENTITY");
-
-        for (String role : factSchema.getRoles()) {
-            createTableSQL.append(", ");
-            createTableSQL.append(role);
-            createTableSQL.append(" VARCHAR(1024)");
-        }
-        createTableSQL.append(')');
-
-        sqls.add(createTableSQL.toString());
-
-        return sqls;
-    }
-
-    private void executeUpdate(List<String> sqls, Connection con) throws 
Exception {
-        for (String sql : sqls) {
-            int res = -1;
-            Statement statement = null;
-            try {
-                statement = con.createStatement();
-                res = statement.executeUpdate(sql);
-                if (res < 0) {
-                    logger.error("Negative result after executing SQL '{}'", 
sql);
-                    throw new Exception("Negative result after executing SQL");
-                }
-            } catch (SQLException e) {
-                logger.error("Error executing SQL '{}'", sql, e);
-                throw new Exception("Error executing SQL", e);
-            } finally {
-                try {
-                    statement.close();
-                } catch (Throwable t) { /* ignore */}
-            }
-        }
-    }
-
-    @Override
-    public void addFact(Fact fact) throws Exception {
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            this.addFact(fact, con);
-        } catch (Exception e) {
-            throw e;
-        } finally {
-            try {
-                con.close();
-            } catch (Throwable t) { /* ignore */}
-        }
-
-        logger.info("Fact created for {}", fact.getFactSchemaURN());
-    }
-
-    private void addFact(Fact fact, Connection con) throws Exception {
-        FactSchema factSchema = this.loadFactSchema(fact.getFactSchemaURN(), 
con);
-        if (factSchema != null) {
-            String factSchemaB64 = 
Base64.encodeBase64URLSafeString(fact.getFactSchemaURN().getBytes());
-
-            StringBuilder insertSB = new StringBuilder("INSERT INTO 
").append(factSchemaB64).append('(');
-            StringBuilder valueSB = new StringBuilder(" VALUES (");
-            Map<String,Integer> roleIndexMap = new HashMap<String,Integer>();
-            boolean firstRole = true;
-            int roleIndex = 0;
-            for (String role : factSchema.getRoles()) {
-                if (!firstRole) {
-                    insertSB.append(',');
-                    valueSB.append(',');
-                }
-                insertSB.append(role);
-                valueSB.append('?');
-                firstRole = false;
-
-                roleIndex++;
-                roleIndexMap.put(role, roleIndex);
-            }
-            insertSB.append(')').append(valueSB).append(')');
-
-            PreparedStatement ps = null;
-            try {
-                ps = con.prepareStatement(insertSB.toString(), 
PreparedStatement.RETURN_GENERATED_KEYS);
-                for (String role : fact.getRoles()) {
-                    Integer roleIdx = roleIndexMap.get(role);
-                    if (roleIdx == null) {
-                        throw new Exception("Unknown role '" + role + "' for 
fact schema "
-                                            + fact.getFactSchemaURN());
-                    } else {
-                        ps.setString(roleIdx, role);
-                    }
-                }
-                ps.executeUpdate();
-                ResultSet rs = ps.getGeneratedKeys();
-                int factId = -1;
-                if (rs.next()) {
-                    factId = rs.getInt(1);
-                }
-                if (factId < 0) {
-                    throw new Exception("Could not obtain fact ID after 
insert");
-                }
-
-                logger.info("Inserted new fact with ID {} into fact schema 
table {}", factId, factSchemaB64);
-            } catch (SQLException e) {
-                throw new Exception("Error while writing fact into database", 
e);
-            } finally {
-                if (ps != null) {
-                    try {
-                        ps.close();
-                    } catch (SQLException e) {
-                        /* ignore */
-                    }
-                }
-            }
-
-        } else {
-            throw new Exception("Unknown fact schema " + 
fact.getFactSchemaURN());
-        }
-    }
-
-    @Override
-    public void addFacts(Set<Fact> factSet) throws Exception {
-        
-        // TODO Improve roll back behavior if single fact of set could not be 
committed
-
-        Connection con = null;
-        try {
-            con = DriverManager.getConnection(DB_URL);
-            for (Fact fact : factSet) {
-                this.addFact(fact, con);
-                logger.info("Fact created for {}", fact.getFactSchemaURN());
-            }
-        } catch (Exception e) {
-            throw new Exception("Error while inserting new facts", e);
-        } finally {
-            try {
-                con.close();
-            } catch (Throwable t) { /* ignore */}
-        }
-    }
-
-    @Override
-    public org.apache.stanbol.factstore.model.ResultSet query(Query query) {
-        // TODO Auto-generated method stub
-        return null;
-    }
+       private static final String CreateTableFactSchemata = "CREATE TABLE 
factschemata ( id INT GENERATED ALWAYS AS IDENTITY CONSTRAINT factschema_id 
PRIMARY KEY, name VARCHAR(128) NOT NULL )";
+       private static final String CreateTableFactRoles = "CREATE TABLE 
factroles ( id INT GENERATED ALWAYS AS IDENTITY CONSTRAINT factrole_id PRIMARY 
KEY, factschema_id INT NOT NULL CONSTRAINT factschema_foreign_key REFERENCES 
factschemata ON DELETE CASCADE ON UPDATE RESTRICT, name VARCHAR(128) NOT NULL, 
type VARCHAR(512) NOT NULL )";
+       private static final String CreateTableFactContexts = "CREATE TABLE 
factcontexts ( id INT GENERATED ALWAYS AS IDENTITY CONSTRAINT context_id 
PRIMARY KEY, validFrom TIMESTAMP, validTo TIMESTAMP, contextURN VARCHAR(1024) 
)";
+
+       public static final String DB_URL = "jdbc:derby:factstore;create=true";
+
+       @Activate
+       protected void activate(ComponentContext cc) throws Exception {
+               logger.info("Activating FactStore...");
+
+               logger.info("Connecting to Derby DB {}", DB_URL);
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+
+                       if (con != null) {
+                               logger.info("Derby connection established.");
+
+                               try {
+                                       if (!existsTable("factschemata", con)) {
+                                               List<String> sqls = new 
ArrayList<String>();
+                                               
sqls.add(CreateTableFactSchemata);
+                                               sqls.add(CreateTableFactRoles);
+                                               
sqls.add(CreateTableFactContexts);
+
+                                               this.executeUpdate(sqls, con);
+
+                                               logger.info("Created FactStore 
meta tables.");
+                                       }
+                               } catch (Exception e) {
+                                       throw new Exception("Error creating 
meta data tables", e);
+                               }
+                       }
+               } catch (Exception e) {
+                       throw new Exception("Derby DB error. Can't activate.", 
e);
+               } finally {
+                       if (con != null) {
+                               try {
+                                       con.close();
+                               } catch (SQLException e) {
+                                       /* ignore */
+                               }
+                       }
+               }
+
+               logger.info("FactStore activated.");
+       }
+
+       @Override
+       public int getMaxFactSchemaURNLength() {
+               return MAX_FACTSCHEMAURN_LENGTH;
+       }
+
+       @Override
+       public boolean existsFactSchema(String factSchemaURN) throws Exception {
+               String factSchemaB64 = 
Base64.encodeBase64URLSafeString(factSchemaURN
+                               .getBytes());
+               boolean tableExists = false;
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       tableExists = this.existsTable(factSchemaB64, con);
+               } catch (Exception e) {
+                       throw new Exception("Error checking table existence", 
e);
+               } finally {
+                       if (con != null) {
+                               try {
+                                       con.close();
+                               } catch (SQLException e) {
+                                       /* ignore */
+                               }
+                       }
+               }
+
+               return tableExists;
+       }
+
+       private boolean existsTable(String tableName, Connection con)
+                       throws Exception {
+               boolean exists = false;
+
+               ResultSet res = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       DatabaseMetaData meta = con.getMetaData();
+                       res = meta.getTables(null, null, null, new String[] { 
"TABLE" });
+                       while (res.next()) {
+                               if 
(res.getString("TABLE_NAME").equalsIgnoreCase(tableName)) {
+                                       exists = true;
+                                       break;
+                               }
+                       }
+               } catch (SQLException e) {
+                       logger
+                                       .error(
+                                                       "Error while reading 
tables' metadata to check if table '{}' exists",
+                                                       tableName);
+                       throw new Exception("Error while reading tables' 
metadata", e);
+               } finally {
+                       try {
+                               res.close();
+                       } catch (Throwable t) { /* ignore */
+                       }
+               }
+
+               return exists;
+       }
+
+       @Override
+       public FactSchema getFactSchema(String factSchemaURN) {
+               FactSchema factSchema = null;
+
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       factSchema = loadFactSchema(factSchemaURN, con);
+               } catch (Exception e) {
+                       logger.error("Error while loading fact schema", e);
+                       factSchema = null;
+               } finally {
+                       try {
+                               con.close();
+                       } catch (Throwable t) { /* ignore */
+                       }
+               }
+
+               return factSchema;
+       }
+
+       private FactSchema loadFactSchema(String factSchemaURN, Connection con)
+                       throws Exception {
+               FactSchema factSchema = null;
+               PreparedStatement ps = null;
+               ResultSet rs = null;
+               try {
+                       String selectFactSchema = "SELECT factschemata.name AS 
schemaURN, factroles.name AS role, factroles.type AS type FROM factroles JOIN 
factschemata ON ( factschemata.id = factroles.factschema_id ) WHERE 
factschemata.name = ?";
+                       ps = con.prepareStatement(selectFactSchema);
+                       ps.setString(1, factSchemaURN);
+                       rs = ps.executeQuery();
+
+                       boolean first = true;
+                       while (rs.next()) {
+                               if (first) {
+                                       factSchema = new FactSchema();
+                                       
factSchema.setFactSchemaURN(rs.getString("schemaURN"));
+                                       first = false;
+                               }
+                               String typeFromDB = rs.getString("type");
+                               String[] types = typeFromDB.split(",");
+                               if (types.length > 0) {
+                                       for (String type : types) {
+                                               
factSchema.addRole(rs.getString("role"), type);
+                                       }
+                               } else {
+                                       
factSchema.addRole(rs.getString("role"), typeFromDB);
+                               }
+                       }
+               } catch (SQLException e) {
+                       throw new Exception("Error while selecting fact schema 
meta data",
+                                       e);
+               } finally {
+                       if (rs != null) {
+                               try {
+                                       rs.close();
+                               } catch (SQLException e) {
+                                       /* ignore */
+                               }
+                       }
+                       if (ps != null) {
+                               try {
+                                       ps.close();
+                               } catch (SQLException e) {
+                                       /* ignore */
+                               }
+                       }
+               }
+
+               return factSchema;
+       }
+
+       @Override
+       public void createFactSchema(FactSchema factSchema) throws Exception {
+               // TODO Implement roll back behavior (transaction)
+
+               String factSchemaB64 = 
Base64.encodeBase64URLSafeString(factSchema
+                               .getFactSchemaURN().getBytes());
+
+               List<String> createFactSchemaTable = this.toSQLfromSchema(
+                               factSchemaB64, factSchema);
+
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       this.executeUpdate(createFactSchemaTable, con);
+                       this.insertFactSchemaMetadata(factSchema, con);
+               } catch (Exception e) {
+                       throw new Exception("Error while creating fact schema", 
e);
+               } finally {
+                       try {
+                               con.close();
+                       } catch (Throwable t) { /* ignore */
+                       }
+               }
+
+               logger.info("Fact schema {} created as {}", factSchema
+                               .getFactSchemaURN(), factSchemaB64);
+       }
+
+       protected List<String> toSQLfromSchema(String factSchemaB64,
+                       FactSchema factSchema) throws Exception {
+               List<String> sqls = new ArrayList<String>();
+
+               // TODO Add SQL command for index creation
+
+               StringBuilder createTableSQL = new StringBuilder("CREATE TABLE 
");
+               createTableSQL.append(factSchemaB64).append(' ');
+               createTableSQL.append('(');
+               createTableSQL.append("id INT GENERATED ALWAYS AS IDENTITY");
+               createTableSQL.append(", context_id INT CONSTRAINT ");
+               createTableSQL.append(factSchemaB64).append("_CFK");
+               createTableSQL
+                               .append(" REFERENCES factcontexts ON DELETE 
CASCADE ON UPDATE RESTRICT");
+
+               for (String role : factSchema.getRoles()) {
+                       createTableSQL.append(", ");
+                       createTableSQL.append(role);
+                       createTableSQL.append(" VARCHAR(1024)");
+               }
+
+               // Append created time stamp
+               createTableSQL
+                               .append(", created TIMESTAMP NOT NULL WITH 
DEFAULT CURRENT TIMESTAMP)");
+
+               sqls.add(createTableSQL.toString());
+
+               return sqls;
+       }
+
+       private void insertFactSchemaMetadata(FactSchema factSchema, Connection 
con)
+                       throws Exception {
+               PreparedStatement ps = null;
+               try {
+                       String insertFactSchema = "INSERT INTO factschemata 
(name) VALUES ( ? )";
+                       ps = con.prepareStatement(insertFactSchema,
+                                       
PreparedStatement.RETURN_GENERATED_KEYS);
+                       ps.setString(1, factSchema.getFactSchemaURN());
+                       ps.executeUpdate();
+                       ResultSet rs = ps.getGeneratedKeys();
+
+                       int factSchemaId = -1;
+                       if (rs.next()) {
+                               factSchemaId = rs.getInt(1);
+                       }
+                       if (factSchemaId < 0) {
+                               throw new Exception(
+                                               "Could not obtain fact schema 
ID after insert");
+                       }
+
+                       logger.info("Inserted new fact schema {} with ID {}", 
factSchema
+                                       .getFactSchemaURN(), factSchemaId);
+
+                       String insertFactRoles = "INSERT INTO factroles 
(factschema_id, name, type) VALUES ( ?, ?, ? )";
+                       ps = con.prepareStatement(insertFactRoles);
+                       for (String role : factSchema.getRoles()) {
+                               ps.setInt(1, factSchemaId);
+                               ps.setString(2, role);
+
+                               StringBuilder typeList = new StringBuilder();
+                               boolean first = true;
+                               for (String type : 
factSchema.getTypesOfRole(role)) {
+                                       if (!first) {
+                                               typeList.append(",");
+                                       }
+                                       typeList.append(type);
+                                       first = false;
+                               }
+                               ps.setString(3, typeList.toString());
+
+                               ps.addBatch();
+                       }
+                       ps.executeBatch();
+               } catch (SQLException e) {
+                       throw new Exception("Error while inserting fact schema 
meta data",
+                                       e);
+               } finally {
+                       if (ps != null) {
+                               try {
+                                       ps.close();
+                               } catch (SQLException e) {
+                                       /* ignore */
+                               }
+                       }
+               }
+       }
+
+       private void executeUpdate(List<String> sqls, Connection con)
+                       throws Exception {
+               for (String sql : sqls) {
+                       int res = -1;
+                       Statement statement = null;
+                       try {
+                               statement = con.createStatement();
+                               res = statement.executeUpdate(sql);
+                               if (res < 0) {
+                                       logger.error("Negative result after 
executing SQL '{}'",
+                                                       sql);
+                                       throw new Exception("Negative result 
after executing SQL");
+                               }
+                       } catch (SQLException e) {
+                               logger.error("Error executing SQL '{}'", sql, 
e);
+                               throw new Exception("Error executing SQL", e);
+                       } finally {
+                               try {
+                                       statement.close();
+                               } catch (Throwable t) { /* ignore */
+                               }
+                       }
+               }
+       }
+
+       @Override
+       public void addFact(Fact fact) throws Exception {
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       this.addFact(fact, con);
+               } catch (Exception e) {
+                       throw e;
+               } finally {
+                       try {
+                               con.close();
+                       } catch (Throwable t) { /* ignore */
+                       }
+               }
+
+               logger.info("Fact created for {}", fact.getFactSchemaURN());
+       }
+
+       private void addFact(Fact fact, Connection con) throws Exception {
+               FactSchema factSchema = 
this.loadFactSchema(fact.getFactSchemaURN(),
+                               con);
+               if (factSchema != null) {
+                       if (fact.getContext() != null) {
+                               // TODO Create the context if present
+                       }
+
+                       // Create the fact
+                       String factSchemaB64 = 
Base64.encodeBase64URLSafeString(fact
+                                       .getFactSchemaURN().getBytes());
+
+                       StringBuilder insertFact = new StringBuilder("INSERT 
INTO ")
+                                       .append(factSchemaB64).append('(');
+                       StringBuilder valueSB = new StringBuilder(" VALUES (");
+                       Map<String, Integer> roleIndexMap = new HashMap<String, 
Integer>();
+                       boolean firstRole = true;
+                       int roleIndex = 0;
+                       for (String role : factSchema.getRoles()) {
+                               if (!firstRole) {
+                                       insertFact.append(',');
+                                       valueSB.append(',');
+                               }
+                               insertFact.append(role);
+                               valueSB.append('?');
+                               firstRole = false;
+
+                               roleIndex++;
+                               roleIndexMap.put(role, roleIndex);
+                       }
+                       insertFact.append(')').append(valueSB).append(')');
+
+                       PreparedStatement ps = null;
+                       try {
+                               ps = con.prepareStatement(insertFact.toString(),
+                                               
PreparedStatement.RETURN_GENERATED_KEYS);
+                               for (String role : fact.getRoles()) {
+                                       Integer roleIdx = 
roleIndexMap.get(role);
+                                       if (roleIdx == null) {
+                                               throw new Exception("Unknown 
role '" + role
+                                                               + "' for fact 
schema "
+                                                               + 
fact.getFactSchemaURN());
+                                       } else {
+                                               ps.setString(roleIdx, 
fact.getValueOfRole(role));
+                                       }
+                               }
+                               ps.executeUpdate();
+                               ResultSet rs = ps.getGeneratedKeys();
+                               int factId = -1;
+                               if (rs.next()) {
+                                       factId = rs.getInt(1);
+                               }
+                               if (factId < 0) {
+                                       throw new Exception("Could not obtain 
fact ID after insert");
+                               }
+
+                               logger
+                                               .info(
+                                                               "Inserted new 
fact with ID {} into fact schema table {}",
+                                                               factId, 
factSchemaB64);
+                       } catch (SQLException e) {
+                               throw new Exception("Error while writing fact 
into database", e);
+                       } finally {
+                               if (ps != null) {
+                                       try {
+                                               ps.close();
+                                       } catch (SQLException e) {
+                                               /* ignore */
+                                       }
+                               }
+                       }
+
+               } else {
+                       throw new Exception("Unknown fact schema "
+                                       + fact.getFactSchemaURN());
+               }
+       }
+
+       @Override
+       public void addFacts(Set<Fact> factSet) throws Exception {
+
+               // TODO Improve roll back behavior if single fact of set could 
not be
+               // committed
+
+               Connection con = null;
+               try {
+                       con = DriverManager.getConnection(DB_URL);
+                       for (Fact fact : factSet) {
+                               this.addFact(fact, con);
+                               logger.info("Fact created for {}", 
fact.getFactSchemaURN());
+                       }
+               } catch (Exception e) {
+                       throw new Exception("Error while inserting new facts", 
e);
+               } finally {
+                       try {
+                               con.close();
+                       } catch (Throwable t) { /* ignore */
+                       }
+               }
+       }
+
+       @Override
+       public FactResultSet query(Query query) throws Exception {
+               FactResultSet frs = null;
+               if (query != null) {
+
+                       Connection con = null;
+                       PreparedStatement ps = null;
+                       ResultSet rs = null;
+                       try {
+                               con = DriverManager.getConnection(DB_URL);
+
+                               validateQuery(query, con);
+
+                               // from here on we have valid data
+
+                               String factSchemaB64 = 
Base64.encodeBase64URLSafeString(query
+                                               .getFromSchemaURN().getBytes());
+
+                               StringBuilder querySql = new 
StringBuilder("SELECT ");
+
+                               boolean firstRole = true;
+                               for (String role : query.getRoles()) {
+                                       if (!firstRole) {
+                                               querySql.append(",");
+                                       }
+                                       querySql.append(role);
+                                       firstRole = false;
+                               }
+
+                               querySql.append(" FROM ").append(factSchemaB64);
+
+                               List<String> queryParams = new 
ArrayList<String>();
+                               querySql.append(" WHERE ");
+                               for (WhereClause wc : query.getWhereClauses()) {
+                                       querySql.append('(');
+                                       querySql.append(wc.getComparedRole());
+                                       switch (wc.getCompareOperator()) {
+                                       case EQ:
+                                               querySql.append(" = 
").append('?');
+                                               
queryParams.add(wc.getSearchedValue());
+                                               break;
+                                       }
+                               }
+                               querySql.append(')');
+
+                               
+                               logger.info("performing query {}", querySql);
+
+                               ps = con.prepareStatement(querySql.toString());
+                               for (int i = 0; i < queryParams.size(); i++) {
+                                       ps.setString(i + 1, queryParams.get(i));
+                               }
+
+                               rs = ps.executeQuery();
+                               if (rs != null) {
+                                       List<String> header = new 
ArrayList<String>();
+                                       for (int i = 1; i <= 
rs.getMetaData().getColumnCount(); i++) {
+                                               
header.add(rs.getMetaData().getColumnName(i));
+                                       }
+
+                                       frs = new FactResultSet();
+                                       frs.setHeader(header);
+
+                                       while (rs.next()) {
+                                               FactResult result = new 
FactResult();
+                                               List<String> values = new 
ArrayList<String>();
+                                               for (String head : header) {
+                                                       
values.add(rs.getString(head));
+                                               }
+                                               result.setValues(values);
+                                               frs.addFactResult(result);
+                                       }
+                               }
+
+                       } catch (Exception e) {
+                               throw e;
+                       } finally {
+                               if (rs != null) {
+                                       try {
+                                               rs.close();
+                                       } catch (Throwable t) {
+                                               // ignore
+                                       }
+                               }
+                               if (ps != null) {
+                                       try {
+                                               ps.close();
+                                       } catch (Throwable t) {
+                                               // ignore
+                                       }
+
+                               }
+                               if (con != null) {
+                                       try {
+                                               con.close();
+                                       } catch (Throwable t) {
+                                               // ignore
+                                       }
+                               }
+                       }
+
+               }
+
+               return frs;
+       }
+
+       private void validateQuery(Query query, Connection con) throws 
Exception {
+               FactSchema schema = 
this.loadFactSchema(query.getFromSchemaURN(), con);
+
+               if (schema == null) {
+                       throw new Exception("Fact schema " + 
query.getFromSchemaURN()
+                                       + " does not exist.");
+               }
+
+               StringBuilder unknownRoles = new StringBuilder();
+               for (String role : query.getRoles()) {
+                       if (!schema.hasRole(role)) {
+                               if (!unknownRoles.toString().isEmpty()) {
+                                       unknownRoles.append(',');
+                               }
+                               unknownRoles.append("role");
+                       }
+               }
+               if (!unknownRoles.toString().isEmpty()) {
+                       throw new Exception(
+                                       "The following roles are unknown for 
the fact schema '"
+                                                       + 
query.getFromSchemaURN() + "': "
+                                                       + 
unknownRoles.toString());
+               }
+       }
 
 }

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
 Wed Jul 13 07:28:04 2011
@@ -1,9 +1,7 @@
 package org.apache.stanbol.factstore.model;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -14,8 +12,8 @@ import org.apache.stanbol.commons.jsonld
 public class Fact {
 
     private String factSchemaURN;
-    
-    private Map<String, List<String>> roleMap = new 
HashMap<String,List<String>>();
+    private Map<String, String> roleMap = new HashMap<String,String>();
+    private FactContext context;
     
     public String getFactSchemaURN() {
         return factSchemaURN;
@@ -25,23 +23,27 @@ public class Fact {
         this.factSchemaURN = factSchemaURN;
     }
 
-    public void addRole(String role, String type) {
-        if (this.roleMap.get(role) == null) {
-            this.roleMap.put(role, new ArrayList<String>());
-        }
-        List<String> types = this.roleMap.get(role);
-        types.add(type);
+    public void addRole(String role, String value) {
+       this.roleMap.put(role, value);
     }
     
     public Set<String> getRoles() {
         return this.roleMap.keySet();
     }
 
-    public List<String> getTypesOfRole(String role) {
+    public String getValueOfRole(String role) {
         return this.roleMap.get(role);
     }
+    
+    public FactContext getContext() {
+               return context;
+       }
+
+       public void setContext(FactContext context) {
+               this.context = context;
+       }
 
-    public static Fact factFromJsonLd(JsonLd jsonLd) {
+       public static Fact factFromJsonLd(JsonLd jsonLd) {
         Fact fact = null;
         
         if (jsonLd.getResourceSubjects().size() == 1) {
@@ -94,4 +96,5 @@ public class Fact {
         
         return fact;
     }
+    
 }

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactContext.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactContext.java?rev=1145892&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactContext.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactContext.java
 Wed Jul 13 07:28:04 2011
@@ -0,0 +1,12 @@
+package org.apache.stanbol.factstore.model;
+
+import java.util.Date;
+
+public class FactContext {
+
+       private int id;
+       private Date validFrom;
+       private Date vaildTo;
+       private String contextURN;
+       
+}

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResult.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResult.java?rev=1145892&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResult.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResult.java
 Wed Jul 13 07:28:04 2011
@@ -0,0 +1,17 @@
+package org.apache.stanbol.factstore.model;
+
+import java.util.List;
+
+public class FactResult {
+
+       private List<String> values;
+       
+       public void setValues(List<String> values) {
+               this.values = values;
+       }
+
+       public List<String> getValues() {
+               return values;
+       }
+
+}

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResultSet.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResultSet.java?rev=1145892&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResultSet.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactResultSet.java
 Wed Jul 13 07:28:04 2011
@@ -0,0 +1,65 @@
+package org.apache.stanbol.factstore.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.stanbol.commons.jsonld.JsonLd;
+import org.apache.stanbol.commons.jsonld.JsonLdResource;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FactResultSet {
+       private static Logger logger = 
LoggerFactory.getLogger(FactResultSet.class);
+
+       private List<String> header;
+       private List<FactResult> rows;
+
+       public List<String> getHeader() {
+               return header;
+       }
+
+       public List<FactResult> getRows() {
+               return rows;
+       }
+
+       public void setHeader(List<String> header) {
+               this.header = header;
+       }
+
+       public void addFactResult(FactResult result) {
+               if (this.rows == null) {
+                       rows = new ArrayList<FactResult>();
+               }
+               rows.add(result);
+       }
+
+       public String toJSON() {
+               JsonLd root = new JsonLd();
+
+               JsonLdResource subject = new JsonLdResource();
+               JSONArray resultset = new JSONArray();
+
+               if (rows != null && !rows.isEmpty()) {
+                       for (FactResult result : rows) {
+                               JSONObject value = new JSONObject();
+                               for (int i = 0; i < header.size(); i++) {
+                                       try {
+                                               value.put(header.get(i), 
result.getValues().get(i));
+                                       } catch (JSONException e) {
+                                               logger.warn("Error creating 
JSON from FactResultSet. {}", e
+                                                               .getMessage());
+                                       }
+                               }
+                               resultset.put(value);
+                       }
+               }
+
+               subject.putProperty("resultset", resultset);
+               root.put(subject);
+
+               return root.toString();
+       }
+}

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactSchema.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactSchema.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactSchema.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/FactSchema.java
 Wed Jul 13 07:28:04 2011
@@ -67,5 +67,9 @@ public class FactSchema {
 
         return factSchema;
     }
+
+       public boolean hasRole(String role) {
+               return this.roleMap.keySet().contains(role);
+       }
     
 }

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/FactStoreWebFragment.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/FactStoreWebFragment.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/FactStoreWebFragment.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/FactStoreWebFragment.java
 Wed Jul 13 07:28:04 2011
@@ -17,6 +17,7 @@ import org.apache.stanbol.commons.web.ba
 import org.apache.stanbol.factstore.api.FactStore;
 import org.apache.stanbol.factstore.web.resource.FactStoreRootResource;
 import org.apache.stanbol.factstore.web.resource.FactsResource;
+import org.apache.stanbol.factstore.web.resource.QueryResource;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
 
@@ -59,6 +60,7 @@ public class FactStoreWebFragment implem
         Set<Class<?>> classes = new HashSet<Class<?>>();
         classes.add(FactStoreRootResource.class);
         classes.add(FactsResource.class);
+        classes.add(QueryResource.class);
         return classes;
     }
 

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
 Wed Jul 13 07:28:04 2011
@@ -16,57 +16,69 @@ import org.apache.stanbol.commons.web.ba
 import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
 import org.apache.stanbol.factstore.api.FactStore;
 import org.apache.stanbol.factstore.model.Query;
-import org.apache.stanbol.factstore.model.ResultSet;
+import org.apache.stanbol.factstore.model.FactResultSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Path("factstore/query")
 public class QueryResource extends BaseStanbolResource {
 
-    private static Logger logger = 
LoggerFactory.getLogger(QueryResource.class);
+       private static Logger logger = 
LoggerFactory.getLogger(QueryResource.class);
 
-    private final FactStore factStore;
+       private final FactStore factStore;
 
-    public QueryResource(@Context ServletContext context) {
-        this.factStore = ContextHelper.getServiceFromContext(FactStore.class, 
context);
-    }
-    
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response query(@QueryParam("q") String q) {
-        if (this.factStore == null) {
-            return Response.status(Status.INTERNAL_SERVER_ERROR).entity(
-                "The FactStore is not configured properly").build();
-        }
-        
-        if (q == null || q.isEmpty()) {
-            return Response.status(Status.BAD_REQUEST).entity("No query 
sent.").build();
-        }
-
-        JsonLd jsonLdQuery = null;
-        try {
-            jsonLdQuery = JsonLdParser.parse(q);
-        } catch (Exception e) {
-            logger.info("Could not parse query", e);
-            return Response.status(Status.BAD_REQUEST).entity("Could not parse 
query: " + e.getMessage())
-                    .build();
-        }
-
-        Query query = null;
-        try {
-            query = Query.toQueryFromJsonLd(jsonLdQuery);
-        } catch (Exception e) {
-            logger.info("Could not extract Query from JSON-LD", e);
-            return Response.status(Status.BAD_REQUEST).entity(
-            "Could not extract FactStore query from JSON-LD: " + 
e.getMessage()).build();
-        }
-        
-        ResultSet rs = this.factStore.query(query);
-        if (rs != null) {
-            return Response.ok(rs.toJSON()).build();
-        }
-        else {
-            return Response.ok().build();
-        }
-    }
+       public QueryResource(@Context ServletContext context) {
+               this.factStore = 
ContextHelper.getServiceFromContext(FactStore.class,
+                               context);
+       }
+
+       @GET
+       @Produces(MediaType.APPLICATION_JSON)
+       public Response query(@QueryParam("q") String q) {
+        logger.info("Query for fact: {}", q);
+               
+               if (this.factStore == null) {
+                       return 
Response.status(Status.INTERNAL_SERVER_ERROR).entity(
+                                       "The FactStore is not configured 
properly").build();
+               }
+
+               if (q == null || q.isEmpty()) {
+                       return Response.status(Status.BAD_REQUEST).entity("No 
query sent.")
+                                       .build();
+               }
+
+               JsonLd jsonLdQuery = null;
+               try {
+                       jsonLdQuery = JsonLdParser.parse(q);
+               } catch (Exception e) {
+                       logger.info("Could not parse query", e);
+                       return Response.status(Status.BAD_REQUEST).entity(
+                                       "Could not parse query: " + 
e.getMessage()).build();
+               }
+
+               Query query = null;
+               try {
+                       query = Query.toQueryFromJsonLd(jsonLdQuery);
+               } catch (Exception e) {
+                       logger.info("Could not extract Query from JSON-LD", e);
+                       return Response.status(Status.BAD_REQUEST).entity(
+                                       "Could not extract FactStore query from 
JSON-LD: "
+                                                       + 
e.getMessage()).build();
+               }
+
+               FactResultSet rs = null;
+               try {
+                       rs = this.factStore.query(query);
+               } catch (Exception e) {
+                       logger.info("Error while performing the query.", e);
+                       return 
Response.status(Status.INTERNAL_SERVER_ERROR).entity(
+                                       "Error while performing the query. " + 
e.getMessage()).build();
+               }
+
+               if (rs != null) {
+                       return Response.ok(rs.toJSON()).build();
+               } else {
+                       return Response.ok().build();
+               }
+       }
 }

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
 Wed Jul 13 07:28:04 2011
@@ -7,7 +7,7 @@ import org.apache.stanbol.factstore.api.
 import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 import org.apache.stanbol.factstore.model.Query;
-import org.apache.stanbol.factstore.model.ResultSet;
+import org.apache.stanbol.factstore.model.FactResultSet;
 
 public class FactStoreMock implements FactStore {
 
@@ -47,7 +47,7 @@ public class FactStoreMock implements Fa
     }
 
     @Override
-    public ResultSet query(Query query) {
+    public FactResultSet query(Query query) {
         // TODO Auto-generated method stub
         return null;
     }

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/derby/DerbyFactStoreTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/derby/DerbyFactStoreTest.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/derby/DerbyFactStoreTest.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/derby/DerbyFactStoreTest.java
 Wed Jul 13 07:28:04 2011
@@ -22,7 +22,7 @@ public class DerbyFactStoreTest {
         String profile = "http://iks-project.eu/ont/employeeOf";;
         String profileB64 = 
Base64.encodeBase64URLSafeString(profile.getBytes());
         
-        String expected = "CREATE TABLE 
aHR0cDovL2lrcy1wcm9qZWN0LmV1L29udC9lbXBsb3llZU9m (id INT GENERATED ALWAYS AS 
IDENTITY, person VARCHAR(1024), organization VARCHAR(1024))";
+        String expected = "CREATE TABLE 
aHR0cDovL2lrcy1wcm9qZWN0LmV1L29udC9lbXBsb3llZU9m (id INT GENERATED ALWAYS AS 
IDENTITY, context_id INT CONSTRAINT 
aHR0cDovL2lrcy1wcm9qZWN0LmV1L29udC9lbXBsb3llZU9m_CFK REFERENCES factcontexts ON 
DELETE CASCADE ON UPDATE RESTRICT, person VARCHAR(1024), organization 
VARCHAR(1024), created TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP)";
         List<String> sqls = fs.toSQLfromSchema(profileB64, 
FactSchema.fromJsonLdProfile(profile, jsonLd));
         Assert.assertEquals(1, sqls.size());
         Assert.assertEquals(expected, sqls.get(0));

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
 Wed Jul 13 07:28:04 2011
@@ -31,13 +31,11 @@ public class FactTest {
         boolean roleOrgaOK = false;
         for (String role : fact.getRoles()) {
             if (role.equals("person")) {
-                assertEquals(1, fact.getTypesOfRole(role).size());
-                assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                assertEquals("http://upb.de/persons/bnagel";, 
fact.getValueOfRole(role));
                 rolePersonOK = true;
             }
             if (role.equals("organization")) {
-                assertEquals(1, fact.getTypesOfRole(role).size());
-                assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                assertEquals("http://uni-paderborn.de";, 
fact.getValueOfRole(role));
                 roleOrgaOK = true;
             }
         }
@@ -100,13 +98,11 @@ public class FactTest {
             boolean roleOrgaOK = false;
             for (String role : fact.getRoles()) {
                 if (role.equals("person")) {
-                    assertEquals(1, fact.getTypesOfRole(role).size());
-                    
assertTrue(fact.getTypesOfRole(role).get(0).startsWith("http://upb.de/persons/";));
+                    
assertTrue(fact.getValueOfRole(role).startsWith("http://upb.de/persons/";));
                     rolePersonOK = true;
                 }
                 if (role.equals("organization")) {
-                    assertEquals(1, fact.getTypesOfRole(role).size());
-                    assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                    assertEquals("http://uni-paderborn.de";, 
fact.getValueOfRole(role));
                     roleOrgaOK = true;
                 }
             }
@@ -149,13 +145,11 @@ public class FactTest {
                 boolean roleOrgaOK = false;
                 for (String role : fact.getRoles()) {
                     if (role.equals("person")) {
-                        assertEquals(1, fact.getTypesOfRole(role).size());
-                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getValueOfRole(role));
                         rolePersonOK = true;
                     }
                     if (role.equals("organization")) {
-                        assertEquals(1, fact.getTypesOfRole(role).size());
-                        assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                        assertEquals("http://uni-paderborn.de";, 
fact.getValueOfRole(role));
                         roleOrgaOK = true;
                     }
                 }
@@ -171,13 +165,11 @@ public class FactTest {
                 boolean roleFriendOK = false;
                 for (String role : fact.getRoles()) {
                     if (role.equals("person")) {
-                        assertEquals(1, fact.getTypesOfRole(role).size());
-                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getValueOfRole(role));
                         rolePersonOK = true;
                     }
                     if (role.equals("friend")) {
-                        assertEquals(1, fact.getTypesOfRole(role).size());
-                        assertEquals("http://upb.de/persons/fchrist";, 
fact.getTypesOfRole(role).get(0));
+                        assertEquals("http://upb.de/persons/fchrist";, 
fact.getValueOfRole(role));
                         roleFriendOK = true;
                     }
                 }

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java?rev=1145892&r1=1145891&r2=1145892&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java
 Wed Jul 13 07:28:04 2011
@@ -1,12 +1,16 @@
 package org.apache.stanbol.factstore.model;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.stanbol.commons.jsonld.JsonLd;
 import org.apache.stanbol.commons.jsonld.JsonLdIRI;
 import org.apache.stanbol.commons.jsonld.JsonLdResource;
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONObject;
 import org.junit.Test;
 
 public class QueryTest {
@@ -17,19 +21,19 @@ public class QueryTest {
         jldq.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
         
         JsonLdResource subject = new JsonLdResource();
-        JSONArray select = new JSONArray();
-        select.put("person");
+        List<String> select = new ArrayList<String>();
+        select.add("person");
         subject.putProperty("select", select);
         subject.putProperty("from", "iks:employeeOf");
 
-        JSONObject orga = new JSONObject();
+        Map<String, Object> orga = new HashMap<String, Object>();
         orga.put("organization", new JsonLdIRI("http://upb.de";));
 
-        JSONObject eq = new JSONObject();
+        Map<String, Object> eq = new HashMap<String, Object>();
         eq.put("=", orga);
         
-        JSONArray where = new JSONArray();
-        where.put(eq);
+        List<Object> where = new ArrayList<Object>();
+        where.add(eq);
         
         subject.putProperty("where", where);
         
@@ -62,19 +66,19 @@ public class QueryTest {
         jldq.addNamespacePrefix("http://upd.de/persons/";, "upb");
         
         JsonLdResource subject = new JsonLdResource();
-        JSONArray select = new JSONArray();
-        select.put("person");
+        List<String> select = new ArrayList<String>();
+        select.add("person");
         subject.putProperty("select", select);
         subject.putProperty("from", "iks:employeeOf");
 
-        JSONObject orga = new JSONObject();
+        Map<String, Object> orga = new HashMap<String, Object>();
         orga.put("person", new JsonLdIRI("upb:fchrist"));
 
-        JSONObject eq = new JSONObject();
+        Map<String, Object> eq = new HashMap<String, Object>();
         eq.put("=", orga);
         
-        JSONArray where = new JSONArray();
-        where.put(eq);
+        List<Object> where = new ArrayList<Object>();
+        where.add(eq);
         
         subject.putProperty("where", where);
         


Reply via email to