Skip to Content.
Sympa Menu

idok-commit - [idok-commit] idok commit r230 - branches/rest/java/ch/idok/service/server/search/rest

idok-commit AT lists.psi.ch

Subject: Commit emails of the iDok project

List archive

[idok-commit] idok commit r230 - branches/rest/java/ch/idok/service/server/search/rest


Chronological Thread 
  • From: "AFS account Roman Geus" <geus AT savannah.psi.ch>
  • To: idok-commit AT lists.psi.ch
  • Subject: [idok-commit] idok commit r230 - branches/rest/java/ch/idok/service/server/search/rest
  • Date: Tue, 23 Sep 2008 17:50:43 +0200
  • List-archive: <https://lists.web.psi.ch/pipermail/idok-commit/>
  • List-id: Commit emails of the iDok project <idok-commit.lists.psi.ch>

Author: geus
Date: Tue Sep 23 17:50:43 2008
New Revision: 230

Log:
Implemented response suitable for JSONP callback, updated to match latest
JAX-RS draft

Modified:

branches/rest/java/ch/idok/service/server/search/rest/RestSearchServiceResource.java

Modified:
branches/rest/java/ch/idok/service/server/search/rest/RestSearchServiceResource.java
==============================================================================
---
branches/rest/java/ch/idok/service/server/search/rest/RestSearchServiceResource.java
(original)
+++
branches/rest/java/ch/idok/service/server/search/rest/RestSearchServiceResource.java
Tue Sep 23 17:50:43 2008
@@ -1,5 +1,6 @@
package ch.idok.service.server.search.rest;

+import java.io.StringWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
@@ -19,8 +20,13 @@
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;

+import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

@@ -32,6 +38,7 @@
import ch.idok.service.common.search.SearchService;
import ch.idok.service.server.admin.Admin;
import ch.idok.service.server.rest.IdokNegotiateFilter;
+import ch.idok.service.server.rest.RestExceptionResponse;
import ch.idok.service.server.rest.RestServer;

/**
@@ -86,15 +93,21 @@
* @return
*/
@GET
- @Path(value = "{path}", limited = false)
+ @Path(value = "{path:.+}")
@Produces("text/xml")
- public Response query(@PathParam("path") String path,
+ public Response queryXml(@PathParam("path") String path,
@QueryParam("q") String query,
@QueryParam("metafields") String metaFields,
@QueryParam("outputfields") String resultTypeString,
@QueryParam("start") @DefaultValue("0") String startString,
- @QueryParam("num") @DefaultValue("20") String numString) {
- logger.entering(this.getClass().getName(), "query");
+ @QueryParam("num") @DefaultValue("20") String numString,
+ @QueryParam("callback") String callback) {
+ logger.entering(this.getClass().getName(), "queryXml");
+
+ // Accept header is set to "*/*" when doing JSONP
+ if (callback != null)
+ return queryXmlJSONP(path, query, metaFields, resultTypeString,
+ startString, numString, callback);

// Parse project, repository and folder
String project;
@@ -204,7 +217,7 @@
Element idElement = doc.createElement("Id");
idElement.setTextContent(hit.getId());
hitElement.appendChild(idElement);
-
+
Element revElement = doc.createElement("Rev");
revElement.setTextContent(hit.getVersion());
hitElement.appendChild(revElement);
@@ -253,12 +266,64 @@
DOMSource source = new DOMSource(doc);
return Response.ok().entity(source).build();
} catch (DmsException e) {
- // TODO translate DmsException to an entity
- logger.log(Level.FINER, "Error in REST call", e);
- return Response.serverError().entity("DmsException: " +
e).build();
+ return RestExceptionResponse.generateXHTML(e);
} catch (ParserConfigurationException e) {
- logger.log(Level.FINER, "Error in REST call", e);
- return Response.serverError().entity("DmsException: " +
e).build();
+ return RestExceptionResponse.generateXHTML(e);
}
}
+
+ /**
+ * Resource method for JSNOP
+ *
+ * @param path
+ * @param query
+ * @param metaFields
+ * @param resultTypeString
+ * @param startString
+ * @param numString
+ * @param callback
+ * @return
+ */
+ @GET
+ @Path(value = "{path}")
+ @Produces("application/json")
+ public Response queryXmlJSONP(@PathParam("path") String path,
+ @QueryParam("q") String query,
+ @QueryParam("metafields") String metaFields,
+ @QueryParam("outputfields") String resultTypeString,
+ @QueryParam("start") @DefaultValue("0") String startString,
+ @QueryParam("num") @DefaultValue("20") String numString,
+ @QueryParam("callback") String callback) {
+ logger.entering(this.getClass().getName(), "queryJS");
+ Response response = queryXml(path, query, metaFields,
resultTypeString,
+ startString, numString, null);
+ if (response.getStatus() == Status.OK.getStatusCode()) {
+ Object entity = response.getEntity();
+ DOMSource source = (DOMSource) entity;
+ StringBuilder sb = new StringBuilder();
+ sb.append(callback);
+ sb.append("(");
+ StringWriter out = new StringWriter();
+ try {
+ StreamResult streamResult = new StreamResult(out);
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer serializer = tf.newTransformer();
+ serializer.setOutputProperty(OutputKeys.METHOD, "xml");
+ serializer.setOutputProperty(OutputKeys.ENCODING,
"ISO-8859-1");
+ // Use of a non-existing DTD will cause JSNOP to fail in IE6
+// serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
+// "users.dtd");
+ serializer.setOutputProperty(OutputKeys.INDENT, "no");
+ serializer.transform(source, streamResult);
+ String json = new JSONObject().put("xml",
out.toString()).toString();
+ sb.append(json);
+ } catch (Throwable e) {
+ logger.log(Level.FINER, "Could not render XML", e);
+ return RestExceptionResponse.generateXHTML(e);
+ }
+ sb.append(")");
+ return Response.ok().entity(sb).type("text/javascript").build();
+ } else
+ return response;
+ }
}



  • [idok-commit] idok commit r230 - branches/rest/java/ch/idok/service/server/search/rest, AFS account Roman Geus, 09/23/2008

Archive powered by MHonArc 2.6.19.

Top of Page