You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/12/05 16:09:32 UTC
svn commit: r1042370 - in
/openjpa/sandboxes/jest/openjpa-persistence/src/main:
java/org/apache/openjpa/persistence/jest/
resources/org/apache/openjpa/persistence/jest/
Author: ppoddar
Date: Sun Dec 5 15:09:31 2010
New Revision: 1042370
URL: http://svn.apache.org/viewvc?rev=1042370&view=rev
Log:
OPENJPA-1851: Support FetchPlan in JEST
Modified:
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/AbstractCommand.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/FindCommand.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/ProcessingException.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/PropertiesCommand.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/QueryCommand.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/XMLFormatter.java
openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.css
openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.html
openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.js
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/AbstractCommand.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/AbstractCommand.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/AbstractCommand.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/AbstractCommand.java Sun Dec 5 15:09:31 2010
@@ -21,6 +21,7 @@ package org.apache.openjpa.persistence.j
import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
import static org.apache.openjpa.persistence.jest.Constants.QUALIFIER_FORMAT;
+import static org.apache.openjpa.persistence.jest.Constants.QUALIFIER_PLAN;
import static org.apache.openjpa.persistence.jest.Constants._loc;
import java.io.IOException;
@@ -38,7 +39,12 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse;
import org.apache.openjpa.enhance.PersistenceCapable;
+import org.apache.openjpa.kernel.BrokerImpl;
import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.persistence.FetchPlan;
+import org.apache.openjpa.persistence.JPAFacadeHelper;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.OpenJPAQuery;
/**
* The abstract base class for all commands available to JEST.
@@ -266,7 +272,40 @@ abstract class AbstractCommand implement
return sms;
}
+ protected void pushFetchPlan(Object target) {
+ if (!hasQualifier(QUALIFIER_PLAN))
+ return;
+ OpenJPAEntityManager em = ctx.getPersistenceContext();
+ FetchPlan plan = em.pushFetchPlan();
+ BrokerImpl broker = (BrokerImpl)JPAFacadeHelper.toBroker(em);
+ if (target instanceof OpenJPAEntityManager) {
+ broker.setCacheFinderQuery(false);
+ } else if (target instanceof OpenJPAQuery) {
+ broker.setCachePreparedQuery(false);
+ }
+
+ String[] plans = getQualifier(QUALIFIER_PLAN).split(",");
+ for (String p : plans) {
+ p = p.trim();
+ if (p.charAt(0) == '-') {
+ plan.removeFetchGroup(p.substring(1));
+ } else {
+ plan.addFetchGroup(p);
+ }
+ }
+ }
+ protected void popFetchPlan(boolean finder) {
+ if (!hasQualifier(QUALIFIER_PLAN))
+ return;
+ OpenJPAEntityManager em = ctx.getPersistenceContext();
+ BrokerImpl broker = (BrokerImpl)JPAFacadeHelper.toBroker(em);
+ if (finder) {
+ broker.setCacheFinderQuery(false);
+ } else {
+ broker.setCachePreparedQuery(false);
+ }
+ }
protected void debug(HttpServletRequest request, HttpServletResponse response, JPAServletContext ctx)
throws IOException {
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/FindCommand.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/FindCommand.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/FindCommand.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/FindCommand.java Sun Dec 5 15:09:31 2010
@@ -33,6 +33,7 @@ import javax.persistence.EntityManager;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.util.ApplicationIds;
@@ -64,7 +65,7 @@ class FindCommand extends AbstractComman
@Override
public void process() throws ProcessingException {
- EntityManager em = ctx.getPersistenceContext();
+ OpenJPAEntityManager em = ctx.getPersistenceContext();
String type = getMandatoryArgument(ARG_TYPE);
ClassMetaData meta = ctx.resolve(type);
Map<String,String> parameters = getArguments();
@@ -74,21 +75,26 @@ class FindCommand extends AbstractComman
pks[i] = params.next().getKey();
}
Object oid = ApplicationIds.fromPKValues(pks, meta);
- Object pc = em.find(meta.getDescribedType(), oid);
- if (pc != null) {
- OpenJPAStateManager sm = toStateManager(pc);
- ObjectFormatter<?> formatter = getObjectFormatter();
- ctx.getResponse().setContentType(formatter.getMimeType());
- try {
- formatter.writeOut(Collections.singleton(sm), em.getMetamodel(),
- _loc.get("find-title").toString(), _loc.get("find-desc").toString(), ctx.getRequestURI(),
- ctx.getResponse().getOutputStream());
- } catch (IOException e) {
- throw new ProcessingException(ctx, e);
+ pushFetchPlan(em);
+ try {
+ Object pc = em.find(meta.getDescribedType(), oid);
+ if (pc != null) {
+ OpenJPAStateManager sm = toStateManager(pc);
+ ObjectFormatter<?> formatter = getObjectFormatter();
+ ctx.getResponse().setContentType(formatter.getMimeType());
+ try {
+ formatter.writeOut(Collections.singleton(sm), em.getMetamodel(),
+ _loc.get("find-title").toString(), _loc.get("find-desc").toString(), ctx.getRequestURI(),
+ ctx.getResponse().getOutputStream());
+ } catch (IOException e) {
+ throw new ProcessingException(ctx, e);
+ }
+ } else {
+ throw new ProcessingException(ctx, _loc.get("entity-not-found", type, Arrays.toString(pks)),
+ HttpURLConnection.HTTP_NOT_FOUND);
}
- } else {
- throw new ProcessingException(ctx, _loc.get("entity-not-found", type, Arrays.toString(pks)),
- HttpURLConnection.HTTP_NOT_FOUND);
+ } finally {
+ popFetchPlan(true);
}
}
}
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/ProcessingException.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/ProcessingException.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/ProcessingException.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/ProcessingException.java Sun Dec 5 15:09:31 2010
@@ -88,7 +88,7 @@ public class ProcessingException extends
ExceptionFormatter formatter = new ExceptionFormatter();
Document xml = formatter.createXML("Request URI: " + uri, t);
try {
- formatter.write(xml, response.getOutputStream(), false);
+ formatter.write(xml, response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Request URI: " + uri, e);
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/PropertiesCommand.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/PropertiesCommand.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/PropertiesCommand.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/PropertiesCommand.java Sun Dec 5 15:09:31 2010
@@ -59,7 +59,7 @@ public class PropertiesCommand extends A
PropertiesFormatter formatter = new PropertiesFormatter();
String caption = _loc.get("properties-caption", ctx.getPersistenceUnitName()).toString();
Document xml = formatter.createXML(caption, "", "", properties);
- formatter.write(xml, response.getOutputStream(), false);
+ formatter.write(xml, response.getOutputStream());
response.setStatus(HttpURLConnection.HTTP_OK);
}
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/QueryCommand.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/QueryCommand.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/QueryCommand.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/QueryCommand.java Sun Dec 5 15:09:31 2010
@@ -30,6 +30,8 @@ import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.persistence.ArgumentException;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+
import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;;
/**
@@ -65,13 +67,14 @@ class QueryCommand extends AbstractComma
@Override
public void process() throws ProcessingException {
String spec = getMandatoryArgument(ARG_QUERY);
+ OpenJPAEntityManager em = ctx.getPersistenceContext();
try {
- EntityManager em = ctx.getPersistenceContext();
Query query = isBooleanQualifier(QUALIFIER_NAMED) ? em.createNamedQuery(spec) : em.createQuery(spec);
if (hasQualifier(QUALIFIER_FIRSTRESULT))
query.setFirstResult(Integer.parseInt(getQualifier(QUALIFIER_FIRSTRESULT)));
if (hasQualifier(QUALIFIER_MAXRESULT))
query.setMaxResults(Integer.parseInt(getQualifier(QUALIFIER_MAXRESULT)));
+ pushFetchPlan(query);
Map<String, String> args = getArguments();
for (Map.Entry<String, String> entry : args.entrySet()) {
@@ -87,6 +90,8 @@ class QueryCommand extends AbstractComma
throw new ProcessingException(ctx, e1, _loc.get("query-execution-error", spec), HTTP_BAD_REQUEST);
} catch (Exception e) {
throw new ProcessingException(ctx, e, _loc.get("query-execution-error", spec));
+ } finally {
+ popFetchPlan(false);
}
}
}
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/XMLFormatter.java
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/XMLFormatter.java?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/XMLFormatter.java (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/jest/XMLFormatter.java Sun Dec 5 15:09:31 2010
@@ -98,7 +98,7 @@ public class XMLFormatter implements Obj
_xsd = factory.newSchema(new StreamSource(xsd));
_transformer.setOutputProperty(OutputKeys.METHOD, "xml");
- _transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ _transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
_transformer.setOutputProperty(OutputKeys.INDENT, "yes");
_transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
_transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
@@ -169,7 +169,7 @@ public class XMLFormatter implements Obj
URI uri, OutputStream out) throws IOException {
Document doc = encode(objs, model);
decorate(doc, title, desc, uri);
- write(doc, out, true);
+ write(doc, out);
return doc;
}
@@ -178,7 +178,7 @@ public class XMLFormatter implements Obj
throws IOException {
Document doc = encode(model);
decorate(doc, title, desc, uri);
- write(doc, out, true);
+ write(doc, out);
return doc;
}
@@ -194,18 +194,16 @@ public class XMLFormatter implements Obj
return doc;
}
- public void write(Document doc, OutputStream out, boolean standalone) throws IOException {
+ public void write(Document doc, OutputStream out) throws IOException {
try {
- _transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, standalone ? "yes" : "no");
_transformer.transform(new DOMSource(doc), new StreamResult(out));
} catch (Exception e) {
throw new IOException(e);
}
}
- public void write(Document doc, Writer writer, boolean standalone) throws IOException {
+ public void write(Document doc, Writer writer) throws IOException {
try {
- _transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, standalone ? "yes" : "no");
_transformer.transform(new DOMSource(doc), new StreamResult(writer));
} catch (Exception e) {
throw new IOException(e);
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.css
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.css?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.css (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.css Sun Dec 5 15:09:31 2010
@@ -201,6 +201,10 @@ p.small {
.ref {
color : blue;
}
+.null {
+ color : red;
+}
+
.delimiter {
color:lightgray;
font-weight:bold;
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.html
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.html?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.html (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.html Sun Dec 5 15:09:31 2010
@@ -185,13 +185,13 @@ The response always contains the <em>clo
<tr>
<th width="30%" class="mandatory" title="Name of a persistent entity to find.">Entity Name</th>
<th width="30%" class="mandatory" title="Primary Key of the entity.">Identifier</th>
- <th width="30%" title="Fetch Plan to use.">Fetch Plan</th>
+ <th width="30%" title="Fetch Plan(s) to use. Separate each plan with comma.">Fetch Plan</th>
<th width="10%" title="Format of the response.">Format</th>
</tr>
<tr>
<td><input id="find.type" onblur="javascript:toURI('find');"></td>
<td><input id="find.pk" onblur="javascript:toURI('find');"></td>
- <td><input id="find.plan" disabled="disabled" onblur="javascript:toURI('find');" ></td>
+ <td><input id="find.plan" onblur="javascript:toURI('find');" ></td>
<td>
<select id="find.format" onchange="javascript:toURI('find');" >
<option value=""></option>
@@ -236,14 +236,14 @@ The response always contains the <em>clo
<th width="10%"style="display: hidden"></th>
<th width="5%" title="Is it a named query?">Single</th>
<th width="5%" title="Returns single result?">Named</th>
- <th width="30%" title="Fetch Plan to use.">Fetch Plan</th>
+ <th width="30%" title="Fetch Plan(s) to use. Separate each plan with comma.">Fetch Plan</th>
<th width="10%" title="Format of the response.">Format</th>
</tr>
<tr>
<td colspan="4"><input id="query.q" onblur="javascript:toURI('query');"></td>
<td><input id="query.single" type="checkbox" value="true" onblur="javascript:toURI('query');"></td>
<td><input id="query.named" type="checkbox" value="true" onblur="javascript:toURI('query');"></td>
- <td><input id="query.plan" disabled="disabled" onblur="javascript:toURI('query');" ></td>
+ <td><input id="query.plan" onblur="javascript:toURI('query');" ></td>
<td>
<select id="query.format" onchange="javascript:toURI('query');" >
<option value=""></option>
Modified: openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.js
URL: http://svn.apache.org/viewvc/openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.js?rev=1042370&r1=1042369&r2=1042370&view=diff
==============================================================================
--- openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.js (original)
+++ openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest/jest.js Sun Dec 5 15:09:31 2010
@@ -795,9 +795,7 @@ function renderDomainFromXMLAsDojo(/*XML
* @returns a div with zero or more tables.
*/
function renderInstancesFromXMLAsHTML(/* XML DOM */data) {
- var empty = document.createElement('div');
- empty.innerHTML = "<b>renderInstancesFromXMLAsHTML</b> not implemented";
- return empty;
+ return unimplemented("Rendering Instances as HTML is not implemented");
}
/**
@@ -808,8 +806,13 @@ function renderInstancesFromXMLAsHTML(/*
* @returns a div with zero or more tables.
*/
function renderDomainFromXMLAsHTML(/* XML DOM */data) {
- var empty = document.createElement('div');
- empty.innerHTML = "<b>renderDomainFromXMLAsHTML</b> not implemented";
+ return unimplemented("Rendering Domain as HTML is not implemented");
+}
+
+function unimplemented(/*string*/message) {
+ var empty = document.createElement('img');
+ empty.setAttribute("src", "images/underconstruction.jpg");
+ empty.setAttribute("alt", message);
return empty;
}
@@ -902,14 +905,30 @@ function createInstanceDojoWidget(/*XML
var valueColumn = document.createElement("td");
nameColumn.className = item.nodeName.toLowerCase(); /* May be cross-browser trouble */
nameColumn.innerHTML = item.getAttribute("name");
- var ref = item.getElementsByTagName("ref");
- if (ref.length > 0) {
- valueColumn.innerHTML = ref[0].getAttribute("id");
- valueColumn.className = ref[0].nodeName.toLowerCase();
- attrRow.appendChild(nameColumn);
- attrRow.appendChild(valueColumn);
- instanceTable.appendChild(attrRow);
- }
+// var ref = item.getElementsByTagName("ref");
+// if (ref.length > 0) {
+// valueColumn.innerHTML = ref[0].getAttribute("id");
+// valueColumn.className = ref[0].nodeName.toLowerCase();
+// attrRow.appendChild(nameColumn);
+// attrRow.appendChild(valueColumn);
+// instanceTable.appendChild(attrRow);
+// }
+// var nulls = item.getElementsByTagName("null");
+// if (nulls.length > 0) {
+// valueColumn.innerHTML = 'null';
+// valueColumn.className = 'null';
+// attrRow.appendChild(nameColumn);
+// attrRow.appendChild(valueColumn);
+// instanceTable.appendChild(attrRow);
+// }
+ dojo.query('ref, null', instanceNode)
+ .forEach(function(ref) {
+ valueColumn.innerHTML = ref.nodeName == 'null' ? 'null' : ref.getAttribute("id");
+ valueColumn.className = ref.nodeName.toLowerCase();
+ attrRow.appendChild(nameColumn);
+ attrRow.appendChild(valueColumn);
+ instanceTable.appendChild(attrRow);
+ });
});
dojo.query('one-to-many, many-to-many', instanceNode).forEach(function(item) {
var attrRow = document.createElement("tr");