You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2007/11/27 14:11:42 UTC
svn commit: r598630 - in
/incubator/sling/trunk/microsling/microsling-core/src/main/webapp:
index.html microjax/microjax.js microjax/test/ microjax/test/assert.js
microjax/test/microjax-test.html
Author: bdelacretaz
Date: Tue Nov 27 05:11:40 2007
New Revision: 598630
URL: http://svn.apache.org/viewvc?rev=598630&view=rev
Log:
SLING-92 - microjax ported from former r-jax prototype, automated tests at http://localhost:8080/microjax/test/microjax-test.html pass (but some TODO left in there)
Added:
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js (with props)
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html (with props)
Modified:
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/microjax.js
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html?rev=598630&r1=598629&r2=598630&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html Tue Nov 27 05:11:40 2007
@@ -21,6 +21,11 @@
<h2>microsling test links</h2>
<ul>
<li>
+ Automated testing of the <a href="microjax/test/microjax-test.html">
+ microjax
+ </a> client-side javascript "JCR proxy" library.
+ </li>
+ <li>
<a href="content-creation-forms.html">
Content creation forms
</a>: use this page to create content and test the rendering mechanisms.
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/microjax.js
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/microjax.js?rev=598630&r1=598629&r2=598630&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/microjax.js (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/microjax.js Tue Nov 27 05:11:40 2007
@@ -21,3 +21,358 @@
*
* @version $Rev: $, $Date: 2007-03-27 16:30:52 +0200 (Tue, 27 Mar 2007) $
*/
+
+var microjax = null;
+
+// start microjax code scope
+(function() {
+
+ microjax = new Object();
+ microjax.NAME_OF_THIS_FILE = "microjax.js";
+
+ /** This method tries to figure out what to do with a page */
+ microjax.wizard = function() {
+ //TODO add lots of magic here
+ var form=document.getElementById("microjaxform");
+ if (!form) form=document.forms[0];
+ if (form) {
+ var sp=new Object();
+ sp.formElement=form;
+ microjax.setupPage(sp);
+ }
+
+ }
+ /** Call this to merge microjax data in an HTML page
+ TODO deprecate other functions
+ */
+ microjax.setupPage = function(options) {
+ var tree = microjax.getContent(microjax._getJsonUrl(),1);
+
+ if(options.formElement) {
+ microjax._setFormValues(options.formElement,microjax._getJsonUrl(),tree);
+ }
+
+ if(options.displayElement) {
+ microjax.displayValues(options.displayElement,tree);
+ }
+ }
+
+ /**
+ * HTTP GET XHR Helper
+ * @param {String} url The URL
+ * @return The response body
+ * @type String
+ */
+ microjax.httpGet = function(url) {
+ var httpcon = microjax.getXHR();
+ if (httpcon) {
+ httpcon.open('GET', url, false);
+ httpcon.send(null);
+ return httpcon.responseText;
+ } else {
+ return "";
+ }
+ }
+ /**
+ * Produces a "sort-of-json" string representation of a object
+ * for debugging purposes only
+ * @param {Object} obj The object
+ * @param {int} level The indentation level
+ * @return The result
+ * @type String
+ */
+ microjax.dumpObj = function(obj, level) {
+ var res="";
+ for (var a in obj) {
+ if (typeof(obj[a])!="object") {
+ res+=a+":"+obj[a]+" ";
+ } else {
+ res+=a+": { ";
+ res+=microjax.dumpObj(obj[a])+"} ";
+ }
+ }
+ return (res);
+ }
+
+ /** Produces an aggregate of get all the property names used
+ * in a tree as a helper for table oriented display
+ * @param {Object} obj The Content Tree object
+ * @param {Object} names internal object used for collecting all
+ * the names during the recursion
+ * @return An Array of names of properties that exist in a tree
+ * @type Array
+ */
+ microjax.getAllPropNames = function(obj, names) {
+ var root=false;
+ if (!names) {
+ names=new Object();
+ root=true;
+ }
+ for (var a in obj) {
+ if (typeof(obj[a])!="object") {
+ names[a]="1";
+ } else {
+ getAllPropNames(obj[a], names);
+ }
+ }
+ if (root) {
+ var ar=new Array();
+ var i=0;
+ for (var a in ar) {
+ ar[i]=a;
+ i++;
+ }
+ names=ar;
+ }
+ return (names);
+ }
+
+ /** Reads a tree of items given a maxlevel from the repository as JSON
+ * @param {String} path Path into the current workspace
+ * @param {int} maxlevel maximum depth to traverse to
+ * @param {Array} filters filter only these properties
+ * @return An Object tree of content nodes and properties
+ * @type Object
+ */
+ microjax.getContent = function(path, maxlevels) {
+ var obj=new Object();
+ if (!path) {
+ path=microjax.currentPath;
+ }
+ if (path.indexOf("/")==0) {
+ /*
+ this assumes that paths that start with a slash
+ are meant to be workspace paths rather than URLs
+ and therefore need some additions before they are sent
+ to the server
+ */
+ path=microjax.baseurl+path+".json";
+ }
+ //checking for a trailing "/*"
+ if (path.indexOf("/*")>=0) return obj;
+
+ // TODO for now we explicitely defeat caching on this...there must be a better way
+ // but in tests IE6 tends to cache too much
+ var passThroughCacheParam = "?clock=" + new Date().getTime();
+ var res=microjax.httpGet(path + passThroughCacheParam + (maxlevels?"&maxlevels="+maxlevels:""));
+
+ // TODO clarify how we pass objects/arrays via JSON
+ if(res.indexOf('[')==0) {
+ eval("obj="+res);
+ } else if(res.indexOf('{')==0) {
+ eval("obj="+res);
+ } else {
+ eval("obj={"+res+"}");
+ }
+ return (obj);
+ }
+
+ /** Get "session info" from repository. Mainly answers the question: "Who am I"
+ * and "Which workspace am I logged into.
+ * @return An Object tree containing the session information
+ * @type Object
+ */
+ microjax.getSessionInfo = function() {
+ /** TODO: automatically find the microjax URI without hardcoding, possibly based on
+ * the assumption that the microjax servlet is deployed relative to the servlet.
+ */
+ var res=microjax.httpGet(microjax.baseurl+"/microjax:sessionInfo.json");
+ var obj;
+ eval("obj={"+res+"}");
+ return (obj);
+ }
+
+ /** Replace extension in a path */
+ microjax._replaceExtension = function(path,newExtension) {
+ var i = path.lastIndexOf(".");
+ if(i >= 0) path = path.substring(0,i);
+ i = path.lastIndexOf(".");
+ if(i >= 0) path = path.substring(0,i);
+ return path + newExtension;
+ }
+
+ /** Get the JSON data URL that for the current page
+ * (assuming a .extension for the current page, .html or something else)
+ */
+ microjax._getJsonUrl = function() {
+ return microjax._replaceExtension(window.location.href,".json");
+ }
+
+ /** Get the content repository path from the URL
+ * (assuming a .extension for the current page, .html or something else)
+ */
+ microjax._getPath = function() {
+
+ var noextensions=microjax._replaceExtension(window.location.href,"");
+ var path=noextensions.substring(microjax.baseurl.length);
+ return (path);
+ }
+
+ /** Display values inside a container: an element inside given container,
+ * with an id like ./stuff, has its innerHTML set to the value of stuff
+ * in the tree, if it exists.
+ */
+ microjax.displayValues = function(container,tree) {
+ if(!tree) {
+ tree = microjax.getContent(microjax._getJsonUrl(),1);
+ }
+
+ var elements = container.getElementsByTagName("*");
+ var toSet = new Array();
+ for (var i = 0; i < elements.length; i++) {
+ var value = microjax._getElementValue(elements[i],tree);
+ if(value) {
+ toSet[toSet.length] = { e:elements[i], v:value };
+ }
+ }
+
+ for(var i = 0; i < toSet.length; i++) {
+ toSet[i].e.innerHTML = toSet[i].v;
+ }
+ }
+
+ /** If e has an ID that matches a property of tree, set e's innerHTML accordingly */
+ microjax._getElementValue = function(e,tree) {
+ var id = e.getAttribute("id");
+ if(id) {
+ return tree[id.substring(2)];
+ }
+ }
+
+
+ /** Set form elements based on the tree of items passed into the method
+ * @param {IdOrElement} form the Form element to set, or its id
+ * @param {String} path passes a string specifying the path
+ * @param {Object} tree optionally pass the content that you want the
+ * form to be populated with. This assumes an item tree as returned by
+ * getContent().
+ * Returns an object indicating whether data was found on the server.
+ *
+ */
+ microjax._setFormValues = function(form, path, tree) {
+ var result = new Object();
+
+ /** TODO: deal with abolute paths?
+ * TODO: deal with @ValueFrom
+ */
+ if (!path) return;
+
+ form.setAttribute("action", path);
+
+ if (!tree) {
+ tree=microjax.getContent(path,1);
+ }
+
+ var elems=form.elements;
+ var i=0;
+ formfieldprefix="";
+
+ while (elems.length > i) {
+ var elem=elems[i];
+ var a=elem.name;
+ if (a.indexOf("./")==0) {
+ formfieldprefix="./";
+ break;
+ }
+ i++;
+ }
+
+ var i=0;
+ while (elems.length > i) {
+ var elem=elems[i];
+ var a=elem.name;
+ if (a.indexOf(formfieldprefix)==0) {
+ var propname=a.substring(formfieldprefix.length);
+ if (tree[propname]) {
+ if (elem.type == "file") {
+ // cannot edit uplodaded files for now
+ } else if (elem.type == "checkbox") {
+ var vals;
+ if (typeof(tree[propname])=="object") vals=tree[a.substring(2)];
+ else {
+ vals=new Array();
+ vals[0]=tree[propname];
+ }
+ var j=0;
+ while (vals.length > j) {
+ if (vals[j] == elem.value) elem.checked=true;
+ j++;
+ }
+ } else {
+ elem.value=tree[propname];
+ }
+ }
+
+ }
+ i++;
+ }
+
+ }
+
+ /** return Path as specified as the URL Parameter
+ * @param URL
+ * @return The Path parameter isolated from the URL
+ * @type String
+ */
+ microjax.TODO_NOT_USED_isolatePathFromUrl = function(url) {
+ var pattern = "[\\?&]Path=([^&#]*)";
+ var regex = new RegExp( pattern );
+ var results = regex.exec( url );
+ if( results == null )
+ // none found
+ return "";
+ else
+ // found
+ return unescape(results[1]);
+ }
+
+ /**
+ * Get an XMLHttpRequest in a portable way
+ *
+ */
+ microjax.getXHR = function () {
+ var xhr=null;
+
+ if(!xhr) {
+ try {
+ // built-in (firefox, recent Opera versions, etc)
+ xhr=new XMLHttpRequest();
+ } catch (e) {
+ // ignore
+ }
+ }
+
+ if(!xhr) {
+ try {
+ // IE, newer versions
+ xhr=new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ // ignore
+ }
+ }
+
+ if(!xhr) {
+ try {
+ // IE, older versions
+ xhr=new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (e) {
+ // ignore
+ }
+ }
+
+ if(!xhr) {
+ alert("Unable to access XMLHttpRequest object, microjax will not work!");
+ }
+
+ return xhr;
+ }
+
+ // obtain the base_url to communicate with microjax on the server
+ var scripts = document.getElementsByTagName("SCRIPT")
+ var script = scripts[scripts.length-1].src
+ microjax.baseurl = script.substring(0,script.length - ("/" + microjax.NAME_OF_THIS_FILE.length));
+ microjax.currentPath = microjax._getPath();
+ microjax.isNew = (microjax.currentPath.indexOf("/*")>=0)?true:false;
+
+// end microjax code scope
+})();
\ No newline at end of file
Added: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js?rev=598630&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js Tue Nov 27 05:11:40 2007
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ Minimal javascript assertion framework, used for microjax automated testing.
+
+ $Id$
+ */
+
+function assert(message,condition) {
+ if(condition != true) {
+ alert("Assertion failed: " + message);
+ }
+}
+
+function assertEquals(message,a,b) {
+ if(a!=b) {
+ alert("assertEquals failed: " + message + ": " + a + "!=" + b);
+ }
+}
+
+function assertNotNull(message,o) {
+ if(o==null) {
+ alert("assertNotNull failed: " + message);
+ }
+}
Propchange: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/assert.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html?rev=598630&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html Tue Nov 27 05:11:40 2007
@@ -0,0 +1,118 @@
+<html>
+ <!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+ <head>
+ <title>microjax test page</title>
+ <link rel="stylesheet" type="text/css" href="../../microsling.css"/>
+ <script src="../microjax.js"></script>
+ <script src="assert.js"></script>
+
+ <style type="text/css">
+ .output {
+ background-color: #FFFF99;
+ border: solid black 1px;
+ padding: 2px;
+ }
+ </style>
+ </head>
+
+ <body onLoad="runTests()">
+
+ <h1>Automated microjax tests</h1>
+ <p>
+ Loading this page executes some simple automated javascript tests of the microjax library.
+ </p>
+
+ <h2>Test results</h2>
+ <p>
+ If all goes well, the paragraph styled <span class="output">like this</span> below should say "Done running tests".
+ </p>
+ <p>
+ Tests run quickly, this might have happened already.
+ </p>
+ <p>
+ To run the tests again click <a href="javascript:runTests()">here</a>.
+ </p>
+ <div id="output" class="output" style="padding:1em">
+ Tests are not running yet.
+ </div>
+
+ <h2>More info</h2>
+ <p>
+ After running the tests at least once,
+ <a href="/microjax-test/testhtml-nodes.json">/microjax-test/testhtml-nodes.json</a>
+ should show the JSON data of the nodes created by the test cases.
+ </p>
+ <p>
+ See the source code of this page for details.
+ </p>
+
+
+ <script language="javascript">
+ function microjaxPost(url,params) {
+ var httpcon = microjax.getXHR();
+ httpcon.open("POST", url, false);
+ httpcon.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ httpcon.setRequestHeader("Content-length", params.length);
+ httpcon.setRequestHeader("Connection", "close");
+ httpcon.send(params);
+ return httpcon;
+ }
+
+ var now = new Date().getTime();
+ var testPath = "/microjax-test/testhtml-nodes/test-" + now;
+
+ function testPost() {
+ var c = microjaxPost(testPath,"title=hello&created=&dummy=&time=" + now);
+ assert("Expected 200 status for POST",c.status == 200);
+ }
+
+ function verifyPostedElement() {
+ var data = microjax.getContent(testPath,1);
+ assertNotNull("data",data);
+ assertEquals("title matches","hello",data.title);
+ assertEquals("time matches",now,data.time);
+ assertEquals("created property is a string","string",typeof(data.created));
+ // TODO implement 'created' autoset property
+ // assert("created property is not empty",data.created.length > 0);
+ assertEquals("dummy property is a string","string",typeof(data.dummy));
+ assert("dummy property is empty",data.dummy.length == 0);
+ }
+
+ function testGetSessionInfo() {
+ /* TODO not implemented yet
+ var session = microjax.getSessionInfo();
+ assertEquals("session.userId is a string","string",typeof(session.userId));
+ assertEquals("session.workspace is a string","string",typeof(session.workspace));
+ assert("session.workspace contains 'default'",session.workspace.indexOf('default') >= 0);
+ */
+ }
+
+ function runTests() {
+ var out = document.getElementById("output");
+ out.innerHTML = "Tests are running...";
+ assert(null,2 + 2 == 4);
+ testPost();
+ verifyPostedElement();
+ testGetSessionInfo();
+ out.innerHTML = "<b>Done running tests, at " + new Date() + "</b>";
+ }
+ </script>
+
+ </body>
+</html>
Propchange: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/microjax/test/microjax-test.html
------------------------------------------------------------------------------
svn:eol-style = native