Author: fchrist
Date: Fri Jul  1 14:24:04 2011
New Revision: 1141952

URL: http://svn.apache.org/viewvc?rev=1141952&view=rev
Log:
STANBOL-244 Add JAX-RS QueryResource and Query model plus basic tests

Added:
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/CompareOperator.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Query.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/ResultSet.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/WhereClause.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/model/QueryTest.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/QueryResourceTest.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/test/java/org/apache/stanbol/factstore/FactStoreMock.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=1141952&r1=1141951&r2=1141952&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
 Fri Jul  1 14:24:04 2011
@@ -4,6 +4,8 @@ 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;
 
 public interface FactStore {
 
@@ -18,4 +20,7 @@ public interface FactStore {
     public void addFact(Fact fact) throws Exception;
     
     public void addFacts(Set<Fact> factSet) throws Exception;
+
+    public ResultSet query(Query query);
+
 }

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=1141952&r1=1141951&r2=1141952&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
 Fri Jul  1 14:24:04 2011
@@ -20,6 +20,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.stanbol.factstore.api.FactStore;
 import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
+import org.apache.stanbol.factstore.model.Query;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -430,4 +431,10 @@ public class DerbyFactStore implements F
         }
     }
 
+    @Override
+    public org.apache.stanbol.factstore.model.ResultSet query(Query query) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/CompareOperator.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/CompareOperator.java?rev=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/CompareOperator.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/CompareOperator.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,17 @@
+package org.apache.stanbol.factstore.model;
+
+public enum CompareOperator {
+
+    EQ("=");
+    
+    private String literal;
+    
+    private CompareOperator(String name) {
+        this.literal = name;
+    }
+
+    public String getLiteral() {
+        return literal;
+    }
+    
+}

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Query.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Query.java?rev=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Query.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Query.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,121 @@
+package org.apache.stanbol.factstore.model;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+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;
+
+public class Query {
+
+    public static final String SELECT = "SELECT";
+    public static final String FROM = "FROM";
+    public static final String WHERE = "WHERE";
+
+    private Set<String> roles = new HashSet<String>();
+    private String fromSchemaURN;
+    private Set<WhereClause> whereClauses = new HashSet<WhereClause>();
+
+    public Set<String> getRoles() {
+        return roles;
+    }
+
+    public String getFromSchemaURN() {
+        return fromSchemaURN;
+    }
+
+    
+    public Set<WhereClause> getWhereClauses() {
+        return whereClauses;
+    }
+
+    public static Query toQueryFromJsonLd(JsonLd jsonLdQuery) throws Exception 
{
+        Query query = null;
+        if (jsonLdQuery != null) {
+            if (jsonLdQuery.getResourceSubjects() != null) {
+                if (jsonLdQuery.getResourceSubjects().size() == 1) {
+                    JsonLdResource subject = 
jsonLdQuery.getResource(jsonLdQuery.getResourceSubjects()
+                            .iterator().next());
+                    if (subject.hasPropertyIgnorecase(SELECT)) {
+                        if (subject.hasPropertyIgnorecase(FROM)) {
+                            if (subject.hasPropertyIgnorecase(WHERE)) {
+                                query = new Query();
+                                handleSelect(subject, query);
+                                handleFrom(jsonLdQuery, subject, query);
+                                handleWhere(jsonLdQuery, subject, query);
+                            }
+                            else {
+                                throw new Exception("Query does not define a 
WHERE");
+                            }
+                        }
+                        else {
+                            throw new Exception("Query does not define a 
FROM");
+                        }
+                    }
+                    else {
+                        throw new Exception("Query does not define a SELECT");
+                    }
+                }
+                else {
+                    throw new Exception("Query does not consist of exactly 1 
JSON-LD subject");
+                }
+            }
+        }
+        return query;
+    }
+
+    private static void handleSelect(JsonLdResource subject, Query query) 
throws Exception {
+        JSONArray selects = 
(JSONArray)subject.getPropertyValueIgnoreCase(SELECT);
+        for (int i=0; i<selects.length(); i++) {
+            String role = selects.getString(i);
+            query.roles.add(role);
+        }
+    }
+
+    private static void handleFrom(JsonLd jsonLd, JsonLdResource subject, 
Query query) {
+        query.fromSchemaURN = (String)subject.getPropertyValueIgnoreCase(FROM);
+        query.fromSchemaURN = jsonLd.unCURIE(query.fromSchemaURN);
+    }
+
+    private static void handleWhere(JsonLd jsonLd, JsonLdResource subject, 
Query query) throws Exception {
+        JSONArray wheres = 
(JSONArray)subject.getPropertyValueIgnoreCase(WHERE);
+        for (int i=0; i<wheres.length(); i++) {
+            JSONObject whereObj = wheres.getJSONObject(i);
+            Iterator<?> whereIt = whereObj.keys();
+            while (whereIt.hasNext()) {
+                String operator = (String)whereIt.next();
+                if 
(operator.equalsIgnoreCase(CompareOperator.EQ.getLiteral())) {
+                    JSONObject compareValues = 
whereObj.getJSONObject(operator);
+                    Iterator<?> compareIt = compareValues.keys();
+                    if (compareIt.hasNext()) {
+                        String comparedRole = (String)compareIt.next();
+                        String searchedValue = null;
+                        
+                        Object searchedValueObj = 
compareValues.get(comparedRole);
+                        if (searchedValueObj instanceof JsonLdIRI) {
+                            JsonLdIRI iri = (JsonLdIRI) searchedValueObj;
+                            searchedValue = jsonLd.unCURIE(iri.getIRI());
+                        }
+                        else {
+                            searchedValue = searchedValueObj.toString();
+                        }
+                        
+                        WhereClause wc = new WhereClause();
+                        wc.setCompareOperator(CompareOperator.EQ);
+                        wc.setComparedRole(comparedRole);
+                        wc.setSearchedValue(searchedValue);
+                        query.whereClauses.add(wc);
+                    }
+                }
+                else {
+                    throw new Exception("Unknown compare operator '" + 
operator + "' in WHERE clause");
+                }
+            }
+        }
+    }
+
+}

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/ResultSet.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/ResultSet.java?rev=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/ResultSet.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/ResultSet.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,8 @@
+package org.apache.stanbol.factstore.model;
+
+public class ResultSet {
+
+    public String toJSON() {
+        return null;
+    }
+}

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/WhereClause.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/WhereClause.java?rev=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/WhereClause.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/WhereClause.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,33 @@
+package org.apache.stanbol.factstore.model;
+
+public class WhereClause {
+
+    private CompareOperator compareOperator;
+    private String comparedRole;
+    private String searchedValue;
+
+    public CompareOperator getCompareOperator() {
+        return compareOperator;
+    }
+
+    public void setCompareOperator(CompareOperator compareOperator) {
+        this.compareOperator = compareOperator;
+    }
+
+    public String getComparedRole() {
+        return comparedRole;
+    }
+
+    public void setComparedRole(String comparedValue) {
+        this.comparedRole = comparedValue;
+    }
+
+    public String getSearchedValue() {
+        return searchedValue;
+    }
+
+    public void setSearchedValue(String searchedValue) {
+        this.searchedValue = searchedValue;
+    }
+
+}

Added: 
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=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/QueryResource.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,72 @@
+package org.apache.stanbol.factstore.web.resource;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.stanbol.commons.jsonld.JsonLd;
+import org.apache.stanbol.commons.jsonld.JsonLdParser;
+import org.apache.stanbol.commons.web.base.ContextHelper;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Path("factstore/query")
+public class QueryResource extends BaseStanbolResource {
+
+    private static Logger logger = 
LoggerFactory.getLogger(QueryResource.class);
+
+    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();
+        }
+    }
+}

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=1141952&r1=1141951&r2=1141952&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
 Fri Jul  1 14:24:04 2011
@@ -6,6 +6,8 @@ import org.apache.stanbol.commons.jsonld
 import org.apache.stanbol.factstore.api.FactStore;
 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;
 
 public class FactStoreMock implements FactStore {
 
@@ -44,4 +46,10 @@ public class FactStoreMock implements Fa
         
     }
 
+    @Override
+    public ResultSet query(Query query) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Added: 
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=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/QueryTest.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,102 @@
+package org.apache.stanbol.factstore.model;
+
+import static org.junit.Assert.*;
+
+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 {
+
+    @Test
+    public void testToQueryFromJsonLd() throws Exception {
+        JsonLd jldq = new JsonLd();
+        jldq.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        
+        JsonLdResource subject = new JsonLdResource();
+        JSONArray select = new JSONArray();
+        select.put("person");
+        subject.putProperty("select", select);
+        subject.putProperty("from", "iks:employeeOf");
+
+        JSONObject orga = new JSONObject();
+        orga.put("organization", new JsonLdIRI("http://upb.de";));
+
+        JSONObject eq = new JSONObject();
+        eq.put("=", orga);
+        
+        JSONArray where = new JSONArray();
+        where.put(eq);
+        
+        subject.putProperty("where", where);
+        
+        jldq.put(subject);
+        
+        Query query = Query.toQueryFromJsonLd(jldq);
+        assertNotNull(query);
+        
+        assertNotNull(query.getFromSchemaURN());
+        assertEquals("http://iks-project.eu/ont/employeeOf";, 
query.getFromSchemaURN());
+        
+        assertNotNull(query.getRoles());
+        assertEquals(1, query.getRoles().size());
+        assertEquals("person", query.getRoles().iterator().next());
+        
+        assertNotNull(query.getWhereClauses());
+        assertEquals(1, query.getWhereClauses().size());
+        
+        WhereClause wc = query.getWhereClauses().iterator().next();
+        assertNotNull(wc);
+        assertEquals(CompareOperator.EQ,wc.getCompareOperator());
+        assertEquals("organization", wc.getComparedRole());
+        assertEquals("http://upb.de";, wc.getSearchedValue());
+    }
+
+    @Test
+    public void testToQueryFromJsonLd2() throws Exception {
+        JsonLd jldq = new JsonLd();
+        jldq.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        jldq.addNamespacePrefix("http://upd.de/persons/";, "upb");
+        
+        JsonLdResource subject = new JsonLdResource();
+        JSONArray select = new JSONArray();
+        select.put("person");
+        subject.putProperty("select", select);
+        subject.putProperty("from", "iks:employeeOf");
+
+        JSONObject orga = new JSONObject();
+        orga.put("person", new JsonLdIRI("upb:fchrist"));
+
+        JSONObject eq = new JSONObject();
+        eq.put("=", orga);
+        
+        JSONArray where = new JSONArray();
+        where.put(eq);
+        
+        subject.putProperty("where", where);
+        
+        jldq.put(subject);
+        
+        Query query = Query.toQueryFromJsonLd(jldq);
+        assertNotNull(query);
+        
+        assertNotNull(query.getFromSchemaURN());
+        assertEquals("http://iks-project.eu/ont/employeeOf";, 
query.getFromSchemaURN());
+        
+        assertNotNull(query.getRoles());
+        assertEquals(1, query.getRoles().size());
+        assertEquals("person", query.getRoles().iterator().next());
+        
+        assertNotNull(query.getWhereClauses());
+        assertEquals(1, query.getWhereClauses().size());
+        
+        WhereClause wc = query.getWhereClauses().iterator().next();
+        assertNotNull(wc);
+        assertEquals(CompareOperator.EQ,wc.getCompareOperator());
+        assertEquals("person", wc.getComparedRole());
+        assertEquals("http://upd.de/persons/fchrist";, wc.getSearchedValue());
+    }
+}

Added: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/QueryResourceTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/QueryResourceTest.java?rev=1141952&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/QueryResourceTest.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/QueryResourceTest.java
 Fri Jul  1 14:24:04 2011
@@ -0,0 +1,38 @@
+package org.apache.stanbol.factstore.web.resource;
+
+import static org.junit.Assert.assertTrue;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.stanbol.commons.testing.http.BundleContextMock;
+import org.apache.stanbol.commons.testing.http.ServletContextMock;
+import org.apache.stanbol.factstore.FactStoreMock;
+import org.apache.stanbol.factstore.api.FactStore;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+
+
+public class QueryResourceTest {
+    
+    private ServletContextMock servletContext;
+
+    @Before
+    public void initMocks() {
+        this.servletContext = new ServletContextMock();
+        BundleContextMock bc = (BundleContextMock) 
this.servletContext.getAttribute(BundleContext.class
+                .getName());
+        bc.putService(FactStore.class.getName(), new FactStoreMock());
+    }
+    
+    @Test
+    public void testValidQuery() {
+        QueryResource qr = new QueryResource(this.servletContext);
+        
+        String queryString = 
"{\"@context\":{\"iks\":\"http://iks-project.eu/ont/\"},\"select\":[\"person\"],\"from\":\"iks:employeeOf\",\"where\":[{\"=\":{\"organization\":{\"@iri\":\"http://upb.de\"}}}]}";;
+        
+        Response response = qr.query(queryString);
+        assertTrue(response.getStatus() == Status.OK.getStatusCode());
+    }
+}


Reply via email to