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 00:05:32 UTC

svn commit: r1042259 - in /openjpa/sandboxes/jest/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/jest: jest.css jest.html jest.js

Author: ppoddar
Date: Sat Dec  4 23:05:32 2010
New Revision: 1042259

URL: http://svn.apache.org/viewvc?rev=1042259&view=rev
Log:
OPENJPA-1851: Pretty print XML

Modified:
    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/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=1042259&r1=1042258&r2=1042259&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 Sat Dec  4 23:05:32 2010
@@ -201,3 +201,32 @@ p.small {
 .ref {
 	color : blue;
 }
+.delimiter {
+  color:lightgray;
+  font-weight:bold;
+}
+.attr-name {
+	color:gray;
+}
+.attr-value {
+	color:green;
+}
+.node-value {
+	font-weight:bold;
+}
+.entity {
+	font-weight:bold;
+}
+.metamodel {
+	font-weight:bold;
+}
+
+.instances {
+	font-weight:bold;
+}
+.instance {
+	font-weight:bold;
+}
+
+
+	
\ No newline at end of file

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=1042259&r1=1042258&r2=1042259&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 Sat Dec  4 23:05:32 2010
@@ -269,8 +269,8 @@ The response always contains the <em>clo
 <!--    Command window for browsing persistent domain model                               -->
 <!-- ==================================================================================== -->
 <div id="domain"  class="highlight" style="display:none;" dojoType="dijit.TitlePane" 
-  title='<b><a href="http://openjpa.apache.org/jest-syntax.html" target="_blank">Browse</a> 
-  persistent domain model.</b>'>
+  title='<a href="http://openjpa.apache.org/jest-syntax.html" target="_blank">Browse</a> 
+  <b>persistent domain model.</b>'>
   
 	This command accepts no qualifier or arguments.	 <br>
 	
@@ -282,8 +282,8 @@ The response always contains the <em>clo
 <!--    Command window for viewing configuration of the persistence unit.                 -->
 <!-- ==================================================================================== -->
 <div id="properties"  class="highlight" style="display:none;" dojoType="dijit.TitlePane" 
- title='<b><a href="http://openjpa.apache.org/jest-syntax.html" target="_blank">View</a> 
- configuration properties of the persistence unit.</b>'>
+ title='<a href="http://openjpa.apache.org/jest-syntax.html" target="_blank">View</a> 
+ <b>configuration properties of the persistence unit.</b>'>
  
 	This command accepts no qualifier or arguments	 <br>
 		 

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=1042259&r1=1042258&r2=1042259&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 Sat Dec  4 23:05:32 2010
@@ -607,24 +607,22 @@ function getSupportedDisplayModes(/*enum
 function render(/* string */ uri, /* id */ targetId, /* enum */contentType, /* enum */iformat) {
     var targetNode = dojo.byId(targetId);
     clearElement(targetId);
-    var handleAsJSON = (iformat == 'json' && contentType == 'instances');
-    console.log("render(): content [" + contentType + "] response format [" + iformat + "] json? " + handleAsJSON);
+
     //The parameters to pass to xhrGet, the url, how to handle it, and the callbacks.
     var xhrArgs = {
         url: uri,
         handleAs: (iformat == 'json' && contentType == 'instances') ? 'json' : 'xml',
-        preventCache: true,
+        preventCache: contentType == 'instances',
         timeout : 1000,
         load: function(data, ioargs) {
-    		var displayModes = getSupportedDisplayModes(iformat, contentType);
     		var newDivs = null;
         	if (iformat == 'json') {
         		newDivs = renderJSONResponse(data, contentType);
         	} else {
         		newDivs = renderXMLResponse(data, contentType);
         	} 
-        	var displayMode = createDisplayModeControl(displayModes);
-        	targetNode.appendChild(displayMode);
+    		var displayModes = getSupportedDisplayModes(iformat, contentType);
+        	targetNode.appendChild(createDisplayModeControl(displayModes));
         	for (var i = 0; i < newDivs.length; i++) {
         		targetNode.appendChild(newDivs[i]);
         	}
@@ -710,7 +708,6 @@ function createModeSwitchFunction(/* str
 function renderXMLResponse(/*XML DOM*/dom, /*enum*/contentType) {
 	var displayModes = getSupportedDisplayModes('xml', contentType);
 	var newDivs = new Array(displayModes.length);
-	console.log("Display formats [" + displayModes + " Content Type [" + contentType + "]");
 	for (var i = 0; i < displayModes.length; i++) {
 		var displayMode = displayModes[i];
 		if (displayMode == 'xml') {
@@ -986,15 +983,129 @@ function createEntityTypeDojoWidget(node
  */
 function renderXMLasXML(/*XML DOM*/dom) {
 	var newDiv = document.createElement('div');
-	var pre    = document.createElement('pre');
-	newDiv.appendChild(pre);
-	// replace all < character to &lt; so that they display properly
-	var replaced = dojox.xml.parser.innerXML(dom).replace(/</g, '&lt;');
-	pre.innerHTML = replaced;
+//	var pre    = document.createElement('pre');
+//	newDiv.appendChild(pre);
+//	// replace all < character to &lt; so that they display properly
+//	var replaced = dojox.xml.parser.innerXML(dom).replace(/</g, '&lt;');
+//	pre.innerHTML = replaced;
+	
+	print(dom.documentElement, newDiv, 0);
 	return newDiv;
 }
 
 /**
+ * Renders a XML DOM node as a new child of the given HTML node.
+ * 
+ * CSS styles used: 
+ * node-value : The value of a text node
+ * attr-name  : The name of an attribute
+ * attr-value : The value of an attribute
+ * delimiter  : symbols such = " < \ > used in visual XML
+ * the XML element name : e.g. A <metamodel> tag will be decorated with .metamodel CSS style    
+ *  
+ */
+function print(/* XML node */xnode, /* HTML node*/ hnode, /*int*/counter) {
+	if (xnode.nodeName == '#text') {
+		addTextNode(hnode, xnode.nodeValue, "node-value");
+		return;
+	}
+	var root = document.createElement('div');
+	root.style.position = 'relative';
+	root.style.left = '2em';
+	addRoot(xnode, hnode, root, ++counter);
+	
+	var attrs = xnode.attributes;
+	if (attrs) {
+	 	for (var i = 0; i < attrs.length; i++) {
+			var attr = attrs[i];
+			addTextNode(root, ' ' + attr.nodeName, "attr-name");
+			addDelimiter(root, '=');
+			addTextNode(root, '"' + attr.nodeValue + '"', "attr-value");
+		}
+	 	addDelimiter(root, '>');
+	}
+	var children = xnode.childNodes;
+	if (children) {
+		for (var i = 0; i < children.length; i++) {
+			print(children[i], root, ++counter);
+		}
+	}
+	addDelimiter(root, '</');
+	addTextNode(root, xnode.nodeName, xnode.nodeName);
+	addDelimiter(root, '>');
+    return;	
+}
+
+/**
+ * Adds the given delimiter text with CSS style 'delimiter' to the given parent node
+ * @param parentNode
+ * @param text
+ */
+function addDelimiter(/* HTML node*/ parentNode, /* Delimiter String*/ delim) {
+	addTextNode(parentNode, delim, 'delimiter');
+}
+/**
+ * Adds a <span> node of given className to the given parentNode with the given text.
+ * 
+ * @param parentNode the parent node to which new text is added as a <span> element.
+ * @param text text to be added to the new <span> element
+ * @param className class of the new <span> element
+ * @returns the new <span> node
+ */
+function addTextNode(/* HTML node*/parentNode, /* String */text, /* String*/className) {
+	if (isEmpty(text)) return null;
+	newNode = document.createElement('span');
+	if (className) {  
+		newNode.className  = className;
+	}
+	if (text) { 
+		newNode.appendChild(document.createTextNode(text)); 
+	}
+	if (parentNode) { 
+		parentNode.appendChild(newNode); 
+	}
+	return newNode;		
+}
+function isTextNode(/* XML node */ xnode) {
+	return xnode == null || xnode.nodeName == '#text';
+}
+
+function isTogglable(/* XML node */ xnode) {
+	if (xnode == null) return false;
+	if (isTextNode(xnode)) return false;
+	var children = xnode.childNodes;
+	if (children == null || children.length == 0) return false;
+	if (children.length == 1 && isTextNode(children[0])) return false;
+	return true;
+}
+
+function addRoot(xnode, hnode, root, counter) {
+   if (isTogglable(xnode)) {
+	   hnode.appendChild(document.createElement('br'));
+		var ctrl = addTextNode(hnode, '-');
+		root.setAttribute("id", counter);
+		var moniker = '&lt;' + xnode.nodeName + '&gt;...';
+		ctrl.setAttribute("onclick", 'javascript:toggle(this, "' + moniker + '", "' + counter + '");');
+   } 
+   addDelimiter(root, '<');
+   addTextNode(root, xnode.nodeName, xnode.nodeName);
+   hnode.appendChild(root);
+   
+}
+
+function toggle(/* HTML node */ctrl, /* id */ moniker, /* id */ targetId) {
+	var visible = ctrl.innerHTML == '-';
+	ctrl.innerHTML = visible ? '+' + moniker : '-';
+	var target = document.getElementById(targetId);
+	if (visible) {
+		target.style.display = "none";
+	} else {
+		target.style.display = "block";
+	}
+}
+
+
+/**
  * Renders server response of JSON objects.
  * Server sends always an array of JSON objects.
  * @param json an array of hopefully non-empty array of JSON objects