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());
+ }
+}