Author: uncled
Date: Sun May 10 19:47:29 2009
New Revision: 773395

URL: http://svn.apache.org/viewvc?rev=773395&view=rev
Log:
CMIS-15: Getting started on the JS Client

Added:
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt   (with 
props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-body.png  
 (with props)
    
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-twocols.png   
(with props)
    
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js   
(with props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js   
(with props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js   
(with props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html   
(with props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/logo.png   
(with props)
    incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css   
(with props)

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt?rev=773395&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt Sun May 
10 19:47:29 2009
@@ -0,0 +1,8 @@
+Contains the JavaScript Client, Tests and Examples.
+
+The JavaScript Client library is designed to run from the same server (URL) as 
+your CMIS Server. Depending on the implementation the cmisclient.js (and the 
additional
+html files) can be dropped into the repository and accessed with a browser.
+
+To get started just drop all the files in the webroot in your repository and 
access
+the index.html.
\ No newline at end of file

Propchange: incubator/chemistry/trunk/chemistry/chemistry-jsclient/README.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-body.png
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-body.png?rev=773395&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-body.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-twocols.png
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-twocols.png?rev=773395&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/bg-twocols.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js?rev=773395&view=auto
==============================================================================
--- 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js 
(added)
+++ 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js 
Sun May 10 19:47:29 2009
@@ -0,0 +1,281 @@
+/* 
+ * 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.
+ */
+
+/**
+ *     The CMIS javascript client gives access to a CMIS document management 
system
+ *     from client-side java script code.         
+ *      
+ * @version $Rev: $, $Date: 2007-03-27 16:30:52 +0200 (Tue, 27 Mar 2007) $
+ */
+
+CMISClient = function (url) {
+       this.CMIS_SERVICE_URL=url;
+       this.info = this.getRepositoryInfo();
+}
+
+CMISClient.NAME_OF_THIS_FILE = "cmisclient.js";
+
+/** trim helper */
+CMISClient.trim = function(s) {
+       return s.replace(/^\s*/, "").replace(/\s*$/, "");
+}
+       
+
+/** implements transformation from an xml document to a reasonable js object 
+essentially poor mans jquery
+*/
+CMISClient.flatten = function(elem, obj) {
+       if (!obj) obj=new Object();
+       var i=0;
+       while (i<elem.childNodes.length) {
+               
+               /* iterate through all the child nodes of the atom structure */
+               
+               var child=elem.childNodes[i];
+               
+               var value="";
+               
+               switch (child.nodeType) {
+
+                       /* found an element */
+                       case Node.ELEMENT_NODE:
+                               if (child.attributes.length==0 && 
child.childNodes.length==1 && child.childNodes[0].nodeType==Node.TEXT_NODE && 
child.childNodes[0].nodeValue) {
+                                       /* fold simple cdata into a property */
+                                       
obj[child.nodeName]=this.trim(child.childNodes[0].nodeValue);
+                               } else {
+                                       if (!obj[child.nodeName]) {
+
+                                               /* proper substructure without 
same name sibling */
+                                               obj[child.nodeName]=new 
Object();
+                                               this.flatten(child, 
obj[child.nodeName]);
+                                       } else {
+                                               /* ugly same name sibling 
handling needs fixing */
+                                               var j=1;
+                                               while 
(obj[child.nodeName+"_"+j]) {
+                                                       j++;
+                                               }
+                                               obj[child.nodeName+"_"+j]=new 
Object();
+                                               CMISClient.flatten(child, 
obj[child.nodeName+"_"+j]);
+                                       }
+                               }
+                               break;
+
+
+                       case Node.TEXT_NODE:
+                               /* cdata in unexpected place */
+                               var val=CMISClient.trim(child.nodeValue);
+                               if (val) {
+                                       
obj["text"]=CMISClient.trim(child.nodeValue);
+                               }
+
+                               break;
+
+               }
+               
+               
+               
+               i++;
+       }
+       var i=0;
+       if (elem.attributes) {
+               while (i<elem.attributes.length) {
+
+                       /* place attribute values with their names */
+                       var child=elem.attributes[i];
+                       obj[child.nodeName]=child.nodeValue;
+
+                       i++;
+               }
+       }
+       return (obj);
+}
+/** Processes an Atom entry into a usable js object */
+CMISClient.processEntry = function(node) {
+       var entry=new Object();
+       for (var a in node) {
+               var elem=node[a];
+               if (a.indexOf("link")==0) {
+                       entry[elem.rel]=elem.href;
+               } else if (a=="cmis:object") {
+                       var props=elem["cmis:properties"];
+                       for (var b in props) {
+                               var prop=props[b];
+                               entry[prop["cmis:name"]]=prop["cmis:value"];
+                       }
+               } else {
+                       entry[a]=elem;
+               }
+       }
+       
+       entry.author=node.author.name;
+       entry.content=node.content;
+       entry.id=node.id;
+       return (entry);
+}
+
+/** Gets a folder from via atom url */
+CMISClient.prototype.getFolder = function(url) {
+       
+       if (url=="/" || !url) {
+               url=this.info.collections["rootchildren"];
+       }
+       var htcon=this.httpGet(url);
+       var doc=htcon.responseXML;
+       var flatres=CMISClient.flatten(doc);
+
+       var feed=flatres.feed;
+       
+       var res=new Object();
+       res.author=feed.author.name;
+       res.id=feed.id;
+       res.title=feed.title;
+       res.updated=feed.updated;
+       
+       res.links=new Object();
+       res.entries=new Object();
+
+       var linkcount=0;
+       var entrycount=0;
+       
+       for (var a in feed) {
+               var node=feed[a];
+               if (a.indexOf("entry")==0) {
+                       res.entries[entrycount++]=CMISClient.processEntry(node);
+               }
+               if (a.indexOf("link")==0) {
+                       
+               }
+
+       }
+
+       return(res);
+}
+
+/** This method reads the repository Info */
+CMISClient.prototype.getRepositoryInfo = function() {
+       var htcon=this.httpGet(this.CMIS_URL);
+       var doc=htcon.responseXML;
+       var flatres=CMISClient.flatten(doc);
+       var res=new Object();
+       
+       var repoinfo=flatres.service.workspace["cmis:repositoryInfo"];
+       
+       res.repositoryId = repoinfo["cmis:repositoryId"];
+       res.repositoryName = repoinfo["cmis:repositoryName"];
+       res.repositoryRelationship = repoinfo["cmis:repositoryRelationship"];
+       res.repositoryDescription = repoinfo["cmis:repositoryDescription"];
+       res.vendorName = repoinfo["cmis:vendorName"];
+       res.productName = repoinfo["cmis:productName"];
+       res.productVersion = repoinfo["cmis:productVersion"];
+       res.rootFolderId= repoinfo["cmis:rootFolderId"];
+       
+       var caps=repoinfo["cmis:capabilities"];
+       res.capabilities = new Object();
+       res.capabilities.multifiling = caps["cmis:capabilityMultifiling"];
+       res.capabilities.unfiling = caps["cmis:capabilityUnfiling"];
+       
+       res.cmisVersionsSupported = repoinfo["cmis:cmisVersionsSupported"];
+       
+       res.collections = new Object();
+       
+       for (var a in flatres.service.workspace) {
+               if (a.indexOf("collection")==0) {
+                       var collection=flatres.service.workspace[a];
+                       
res.collections[collection["cmis:collectionType"]]=collection.href;
+               }
+       }
+       return (res);
+}
+       
+/**
+ *     Get an XMLHttpRequest in a portable way
+ *
+ */
+CMISClient.prototype.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, cmis client will 
not work!");
+       }
+       
+       return xhr;
+}
+
+/**
+ * HTTP GET XHR Helper
+ * @param {String} url The URL
+ * @return the XHR object, use .responseText for the data
+ * @type String
+ */
+CMISClient.prototype.httpGet = function(url) {
+    var httpcon = this.getXHR();
+    if (httpcon) {
+               httpcon.open('GET', url, false);
+               httpcon.send(null);
+               return httpcon;
+    } else {
+               return null;
+    }
+}
+       
+/**
+ * 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
+ */
+CMISClient.dumpObj = function(obj, level) {
+       var res="";
+       for (var a in obj) {
+               if (typeof(obj[a])!="object") {
+                       res+=a+":"+obj[a]+"  ";
+               } else {
+                       res+=a+": { ";
+                       res+=this.dumpObj(obj[a])+"} ";
+               }
+       }
+       return (res);
+}

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/cmisclient.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js?rev=773395&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js 
(added)
+++ incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js 
Sun May 10 19:47:29 2009
@@ -0,0 +1,2 @@
+document.write('<div class="footer"><a 
href="http://www.apache.org/licenses/";>License</a> | Powered by <a 
href="http://jackrabbit.apache.org/";>Apache Jackrabbit</a></div>');
+

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/footer.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js?rev=773395&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js 
(added)
+++ incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js 
Sun May 10 19:47:29 2009
@@ -0,0 +1 @@
+document.write('<div class="header"><div class="logo"><a 
href="http://jackrabbit.apache.org/"; align="right"><img src="logo.png" 
align="right"></a></div><a href="index.html">CMIS v0.61+ JavaScript 
Client</a><br>Content Management Interoperability Services (CMIS) draft 
implementation</div>');

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/header.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html?rev=773395&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html 
(added)
+++ incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html 
Sun May 10 19:47:29 2009
@@ -0,0 +1,67 @@
+<html>
+<head>
+<title>CMIS JavaScript Client / Example</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8"></meta>
+<link rel="stylesheet" type="text/css" href="main.css"></link>
+</head>
+
+<body>
+       <!-- poor mans client side include for header layout -->
+    <script src="header.js"></script>
+
+       <!-- cmis client include -->
+    <script src="cmisclient.js"></script>
+
+<script>
+function traverse (cmisclient, folder) {
+       var tree=document.getElementById("tree");
+       for (var a in folder.entries) {
+               var entry=folder.entries[a];
+               var newdiv = document.createElement("div");
+               newdiv.innerHTML = entry.title.text + (entry["children"]?(":" + 
entry["children"]):"");
+               tree.appendChild(newdiv);
+               if (entry.children) {
+                       var childfolder=cmisclient.getFolder(entry["children"]);
+                       traverse(cmisclient, childfolder);
+               }
+       }
+}
+
+function start() {
+       /* get url from form */
+       var cmisurl=document.getElementById("url").value; 
+
+       /* instantiate cmisclient */
+       var cmisclient= new CMISClient(cmisurl);
+
+       /* get root folder */
+       var rootfolder=cmisclient.getFolder("/");
+
+       /* start traversal */
+       traverse(cmisclient, rootfolder);
+       }
+</script>
+<style>
+</style>
+    <div class="content">
+        <h1>CMIS JavaScript Client Traversal Example</h1>
+               <h2>Setup Instructions</h2>
+               <p>To make this work the CMISClient.js needs to be located / 
accessible on the same server
+                       as the CMIS service document due to XSS limitations of 
the browser.
+               </p>
+        <form method="GET" action="getRepositoryInfo.xml" target="result">
+            <table class="formtable">
+            <tr>
+                <td>Service document / Connection URL</td>
+                <td><input class="text" type="text" 
value="/chemistry/repository" name="url" id="url"></td>
+            </tr><tr><td>&nbsp;</td><td>
+            <input type="button" value="Start Traversal" 
onClick="start()"><br></td></tr></table>
+        </form>
+               <div id="tree">
+                       
+               </div>
+               <!-- poor mans client side include for footer layout -->
+        <script src="footer.js"></script>
+    </div>
+</body>
+</html>

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/index.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/logo.png
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/logo.png?rev=773395&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/logo.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css
URL: 
http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css?rev=773395&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css 
(added)
+++ incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css Sun 
May 10 19:47:29 2009
@@ -0,0 +1,151 @@
+body {
+       background: #eee url(bg-body.png) top center repeat-y;
+       color: #333;
+       font-family: Georgia, Times New Roman;
+       margin: 0 auto 0;
+       padding: 0;
+}
+
+.logo {
+       float: right;
+}
+
+.twocols {
+       background: #eee url(bg-twocols.png) top center repeat-y;
+}
+
+a, a:visited {
+       color: #58a;
+       text-decoration: none;
+}
+
+a:hover {
+       background-color: #ffc;
+       text-decoration: underline;
+}
+
+img {
+       border-style: none;
+}
+
+.header {
+       background: #fff;
+       margin: 0 auto 0;
+       text-align: left;
+       padding: 9px 0 29px 0;
+       width: 960px;
+       border-top: 10px solid #ccc;
+}
+
+.header a {
+       font-family: Helvetica, Verdana;
+       letter-spacing: -1px;
+       font-size: 31px;
+       font-weight: bold;
+       color: #58a;
+       text-decoration: none;
+       padding: 0 10px 0 0;
+       margin: 0;
+}
+
+.header a:hover {
+       color: #69d;
+       text-decoration: underline;
+}
+
+.leftcol {
+       width: 440px;
+       margin: 0 20px 0 0;
+       padding: 5px 0 5px 0;
+}
+
+.rightcol {
+       width: 440px;
+       margin: 0 20px 0 0;
+       padding: 5px 0 5px 0;
+}
+
+.formtable {
+       margin-top: 20px;
+       width: 600px;
+       padding: 0;
+       clear: both;
+}
+
+.formtable td {
+       padding: 5px;
+       width: 300px;
+       border-top: dotted #ddd 1px;
+}
+
+.formtable input.text {
+       width: 300px;
+}
+
+
+.content {
+       width: 960px;
+       margin: 0 auto 0;
+       padding: 0;
+       clear: both;
+}
+
+.content p {
+       padding: 0 0 15px 0;
+       margin: 0;
+       line-height: 20px;
+       font-size: 14px;
+}
+
+.content p img {
+       float: left;
+       border: none;
+       margin-right: 15px;
+       margin-bottom: 10px;
+}
+
+.content h1 {
+       border-top: 2px solid olive;
+       color: #58a;
+       font-family: Helvetica,Verdana;
+       font-size: 18px;
+       font-weight: bold;
+       line-height: 20px;
+       margin: 0;
+       padding: 5px 0;
+}
+
+.content h1 a {
+       color: #58a;
+       margin-left: -5px;
+       padding: 0 10px 0 5px;
+       text-decoration: none;
+}
+
+.content h1 a:hover {
+       background-color: #ffc;
+       color: #68b;
+}
+
+.content h2 {
+       color: olive;
+       font-size: 12px;
+       font-family: Helvetica, Verdana;
+       font-weight: bold;
+       margin: 20px 0 5px 0;
+       padding: 3px 0 3px 0;
+       border-top: 2px solid olive;
+       border-bottom: 1px dotted #ccc;
+}
+
+.footer {
+       font-size: 12px;
+       background: #fff;
+       width: 960px;
+       margin: 0 auto 0;
+       padding: 10px 0 10px 0;
+       text-align: left;
+       border-top: 1px solid #ccc;
+       clear: both;
+}
+

Propchange: 
incubator/chemistry/trunk/chemistry/chemistry-jsclient/webroot/main.css
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to