You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2008/03/13 08:31:03 UTC
svn commit: r636656 - in /incubator/sling/trunk/sling/servlets-default:
pom.xml src/main/java/org/apache/sling/servlets/JsonQueryServlet.java
Author: fmeschbe
Date: Thu Mar 13 00:31:02 2008
New Revision: 636656
URL: http://svn.apache.org/viewvc?rev=636656&view=rev
Log:
SLING-307 Adapt the servlet to the Sling Resource paradigm
Modified:
incubator/sling/trunk/sling/servlets-default/pom.xml
incubator/sling/trunk/sling/servlets-default/src/main/java/org/apache/sling/servlets/JsonQueryServlet.java
Modified: incubator/sling/trunk/sling/servlets-default/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlets-default/pom.xml?rev=636656&r1=636655&r2=636656&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlets-default/pom.xml (original)
+++ incubator/sling/trunk/sling/servlets-default/pom.xml Thu Mar 13 00:31:02 2008
@@ -90,6 +90,11 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.jcr.resource</artifactId>
+ <version>2.0.0-incubator-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.json</artifactId>
<version>2.0.0-incubator-SNAPSHOT</version>
</dependency>
Modified: incubator/sling/trunk/sling/servlets-default/src/main/java/org/apache/sling/servlets/JsonQueryServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/sling/servlets-default/src/main/java/org/apache/sling/servlets/JsonQueryServlet.java?rev=636656&r1=636655&r2=636656&view=diff
==============================================================================
--- incubator/sling/trunk/sling/servlets-default/src/main/java/org/apache/sling/servlets/JsonQueryServlet.java (original)
+++ incubator/sling/trunk/sling/servlets-default/src/main/java/org/apache/sling/servlets/JsonQueryServlet.java Thu Mar 13 00:31:02 2008
@@ -18,59 +18,42 @@
*/
package org.apache.sling.servlets;
-import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.query.Query;
+
+import org.apache.sling.api.SlingException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.SlingException;
-import org.apache.sling.commons.json.io.JSONWriter;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.io.JSONWriter;
+import org.apache.sling.jcr.resource.JcrResourceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.jcr.Session;
-import javax.jcr.Node;
-import javax.jcr.Value;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.RowIterator;
-import javax.jcr.query.Row;
-import java.io.IOException;
-import java.util.List;
-import java.util.ArrayList;
-
/**
* A SlingSafeMethodsServlet that renders the search results as JSON data
- *
- * @scr.service
- * interface="javax.servlet.Servlet"
- *
- * @scr.component
- * immediate="true"
- * metatype="false"
- *
- * @scr.property
- * name="service.description"
- * value="Default Query Servlet"
- *
- * @scr.property
- * name="service.vendor"
- * value="The Apache Software Foundation"
- *
- * Use this as the default query servlet for json get requests for Sling
- * @scr.property
- * name="sling.servlet.resourceTypes"
- * value="sling/servlet/default"
- *
- * @scr.property
- * name="sling.servlet.extensions"
- * value="json"
- *
- * @scr.property
- * name="sling.servlet.selectors"
- * value="query"
+ *
+ * @scr.service interface="javax.servlet.Servlet"
+ * @scr.component immediate="true" metatype="false"
+ * @scr.property name="service.description" value="Default Query Servlet"
+ * @scr.property name="service.vendor" value="The Apache Software Foundation"
+ * Use this as the default query servlet for json get requests for
+ * Sling
+ * @scr.property name="sling.servlet.resourceTypes"
+ * value="sling/servlet/default"
+ * @scr.property name="sling.servlet.extensions" value="json"
+ * @scr.property name="sling.servlet.selectors" value="query"
*/
public class JsonQueryServlet extends SlingSafeMethodsServlet {
private final Logger log = LoggerFactory.getLogger(JsonQueryServlet.class);
@@ -104,35 +87,37 @@
/**
* Dumps the result as JSON object.
- *
+ *
* @param req request
* @param resp response
* @throws IOException in case the search will unexpectedly fail
*/
private void dumpResult(SlingHttpServletRequest req,
- SlingHttpServletResponse resp) throws IOException {
+ SlingHttpServletResponse resp) throws IOException {
try {
- Session s = req.getResourceResolver().adaptTo(Session.class);
- if (s == null) {
- throw new IOException("No JCR Session available");
- }
+ ResourceResolver resolver = req.getResourceResolver();
+
String statement = req.getParameter(STATEMENT);
- String queryType =
- (req.getParameter(QUERY_TYPE) != null &&
- req.getParameter(QUERY_TYPE).equals(Query.SQL)) ?
- Query.SQL : Query.XPATH;
- QueryManager qm = s.getWorkspace().getQueryManager();
- Query query = qm.createQuery(statement, queryType);
- QueryResult result = query.execute();
- RowIterator rows = result.getRows();
- String cols[] = result.getColumnNames();
- resp.setContentType(JsonRendererServlet.responseContentType);
- final JSONWriter w = new JSONWriter(resp.getWriter());
- w.array();
+ String queryType = (req.getParameter(QUERY_TYPE) != null && req.getParameter(
+ QUERY_TYPE).equals(Query.SQL)) ? Query.SQL : Query.XPATH;
+
+ Iterator<Map<String, Object>> result = resolver.queryResources(
+ statement, queryType);
+
if (req.getParameter(OFFSET) != null) {
long skip = Long.parseLong(req.getParameter(OFFSET));
- rows.skip(skip);
+ while (skip > 0 && result.hasNext()) {
+ result.next();
+ skip--;
+ }
}
+
+ resp.setContentType(JsonRendererServlet.responseContentType);
+ resp.setCharacterEncoding("UTF-8");
+
+ final JSONWriter w = new JSONWriter(resp.getWriter());
+ w.array();
+
long count = -1;
if (req.getParameter(ROWS) != null) {
count = Long.parseLong(req.getParameter(ROWS));
@@ -140,7 +125,7 @@
List<String> properties = new ArrayList<String>();
if (req.getParameterValues(PROPERTY) != null) {
- for (String property: req.getParameterValues(PROPERTY)) {
+ for (String property : req.getParameterValues(PROPERTY)) {
properties.add(property);
}
}
@@ -151,64 +136,99 @@
}
// iterate through the result set and build the "json result"
- while (rows.hasNext() && count != 0) {
- Row row = rows.nextRow();
- String path = row.getValue("jcr:path").getString();
- Node node = (Node) s.getItem(path);
- String name = node.getName();
+ while (result.hasNext() && count != 0) {
+ Map<String, Object> row = result.next();
w.object();
+ String path = row.get("jcr:path").toString();
+
w.key("name");
- w.value(name);
- for (String colName: cols) {
+ w.value(JcrResourceUtil.getName(path));
+
+ // dump columns
+ for (String colName : row.keySet()) {
w.key(colName);
String strValue = "";
if (colName.equals(REP_EXCERPT)) {
- Value ev = row.getValue("rep:excerpt(" + exerptPath + ")");
- strValue = ev == null ? "" : ev.getString();
+ Object ev = row.get("rep:excerpt(" + exerptPath + ")");
+ strValue = (ev == null) ? "" : ev.toString();
} else {
- Value value = row.getValue(colName);
- strValue = formatValue(value);
+ strValue = formatValue(row.get(colName));
}
w.value(strValue);
}
// load properties and add it to the result set
- for (String property: properties) {
- if (node.hasProperty(property)) {
- Value value = node.getProperty(property).getValue();
- String strValue = formatValue(value);
- w.key(property);
- w.value(strValue);
- }
+ if (!properties.isEmpty()) {
+ Resource nodeRes = resolver.getResource(path);
+ dumpProperties(w, nodeRes, properties);
}
+
w.endObject();
count--;
}
w.endArray();
} catch (JSONException je) {
throw wrapException(je);
- } catch (RepositoryException re) {
- throw wrapException(re);
}
}
- private String formatValue(Value value) {
- String strValue = "";
- try {
- if (value != null) {
- switch (value.getType()) {
- case PropertyType.DATE: strValue = value.getDate().toString(); break;
- case PropertyType.LONG: strValue = String.valueOf(value.getLong());break;
- case PropertyType.DOUBLE: strValue = String.valueOf(value.getDouble()); break;
- case PropertyType.BINARY: strValue = "[binary]"; break;
- default:
- strValue = value.getString();
+ private void dumpProperties(JSONWriter w, Resource nodeRes,
+ List<String> properties) throws JSONException {
+
+ // nothing to do if there is no resource
+ if (nodeRes == null) {
+ return;
+ }
+
+
+ ResourceResolver resolver = nodeRes.getResourceResolver();
+ for (String property : properties) {
+ Resource prop = resolver.getResource(nodeRes, property);
+ if (prop != null) {
+ String strValue;
+ Value value = prop.adaptTo(Value.class);
+ if (value != null) {
+ strValue = formatValue(value);
+ } else {
+ strValue = prop.adaptTo(String.class);
+ if (strValue == null) {
+ strValue = "";
+ }
}
+ w.key(property);
+ w.value(strValue);
}
+ }
+
+ }
+
+ private String formatValue(Value value) {
+ try {
+ return formatValue(JcrResourceUtil.toJavaObject(value));
} catch (RepositoryException re) {
- // ignore
+ // might log
}
+ return "";
+ }
+
+ private String formatValue(Object value) {
+ String strValue;
+ if (value instanceof InputStream) {
+ // binary value comes as a LazyInputStream
+ strValue = "[binary]";
+
+ // just to be clean, close the stream
+ try {
+ ((InputStream) value).close();
+ } catch (IOException ignore) {
+ }
+ } else if (value != null) {
+ strValue = value.toString();
+ } else {
+ strValue = "";
+ }
+
return strValue;
}