Create a js module for client side javascripts. Move client component script to that module and add a few utility scripts.

git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1042535 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
jsdelfino 2010-12-06 07:19:24 +00:00
commit 5b6af38117
23 changed files with 964 additions and 20 deletions

View file

@ -890,6 +890,7 @@ AC_CONFIG_FILES([Makefile
modules/scheme/Makefile modules/scheme/Makefile
modules/atom/Makefile modules/atom/Makefile
modules/rss/Makefile modules/rss/Makefile
modules/js/Makefile
modules/json/Makefile modules/json/Makefile
modules/scdl/Makefile modules/scdl/Makefile
modules/http/Makefile modules/http/Makefile

View file

@ -15,5 +15,5 @@
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
SUBDIRS = scheme atom rss json scdl http server python java openid oauth wsgi SUBDIRS = scheme atom rss js json scdl http server python java openid oauth wsgi

View file

@ -0,0 +1,21 @@
# 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.
moddir = $(prefix)/modules/js
nobase_dist_mod_DATA = htdocs/*.js
EXTRA_DIST = htdocs/*.js

View file

@ -0,0 +1,578 @@
/*
* 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 JSON-RPC client code is based on Jan-Klaas' JavaScript
* o lait library (jsolait).
*
* $Id: jsonrpc.js,v 1.36.2.3 2006/03/08 15:09:37 mclark Exp $
*
* Copyright (c) 2003-2004 Jan-Klaas Kollhof
* Copyright (c) 2005 Michael Clark, Metaparadigm Pte Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License").
*/
/**
* Client component wiring API, supporting JSON and ATOM bindings.
*/
/**
* Escape a character.
*/
var JSONClient = new Object();
JSONClient.escapeJSONChar = function(c) {
if(c == "\"" || c == "\\") return "\\" + c;
else if (c == "\b") return "\\b";
else if (c == "\f") return "\\f";
else if (c == "\n") return "\\n";
else if (c == "\r") return "\\r";
else if (c == "\t") return "\\t";
var hex = c.charCodeAt(0).toString(16);
if(hex.length == 1) return "\\u000" + hex;
else if(hex.length == 2) return "\\u00" + hex;
else if(hex.length == 3) return "\\u0" + hex;
else return "\\u" + hex;
};
/**
* Encode a string into JSON format.
*/
JSONClient.escapeJSONString = function(s) {
/* The following should suffice but Safari's regex is broken
(doesn't support callback substitutions)
return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g,
JSONClient.escapeJSONChar) + "\"";
*/
/* Rather inefficient way to do it */
var parts = s.split("");
for(var i = 0; i < parts.length; i++) {
var c = parts[i];
if(c == '"' ||
c == '\\' ||
c.charCodeAt(0) < 32 ||
c.charCodeAt(0) >= 128)
parts[i] = JSONClient.escapeJSONChar(parts[i]);
}
return "\"" + parts.join("") + "\"";
};
/**
* Marshall objects to JSON format.
*/
JSONClient.toJSON = function(o) {
if(o == null) {
return "null";
} else if(o.constructor == String) {
return JSONClient.escapeJSONString(o);
} else if(o.constructor == Number) {
return o.toString();
} else if(o.constructor == Boolean) {
return o.toString();
} else if(o.constructor == Date) {
return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
} else if(o.constructor == Array) {
var v = [];
for(var i = 0; i < o.length; i++) v.push(JSONClient.toJSON(o[i]));
return "[" + v.join(", ") + "]";
} else {
var v = [];
for(attr in o) {
if(o[attr] == null) v.push("\"" + attr + "\": null");
else if(typeof o[attr] == "function"); /* skip */
else v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
}
return "{" + v.join(", ") + "}";
}
};
/**
* HTTPBindingClient.Exception.
*/
HTTPBindingClient.Exception = function(code, message, javaStack) {
this.code = code;
var name;
if(javaStack) {
this.javaStack = javaStack;
var m = javaStack.match(/^([^:]*)/);
if(m) name = m[0];
}
if(name) this.name = name;
else this.name = "HTTPBindingClientException";
this.message = message;
};
HTTPBindingClient.Exception.CODE_REMOTE_EXCEPTION = 490;
HTTPBindingClient.Exception.CODE_ERR_CLIENT = 550;
HTTPBindingClient.Exception.CODE_ERR_PARSE = 590;
HTTPBindingClient.Exception.CODE_ERR_NOMETHOD = 591;
HTTPBindingClient.Exception.CODE_ERR_UNMARSHALL = 592;
HTTPBindingClient.Exception.CODE_ERR_MARSHALL = 593;
HTTPBindingClient.Exception.prototype = new Error();
HTTPBindingClient.Exception.prototype.toString = function(code, msg) {
return this.name + ": " + this.message;
};
/**
* Default top level exception handler.
*/
HTTPBindingClient.default_ex_handler = function(e) {
alert(e);
};
/**
* Client settable variables
*/
HTTPBindingClient.toplevel_ex_handler = HTTPBindingClient.default_ex_handler;
HTTPBindingClient.profile_async = false;
HTTPBindingClient.max_req_active = 1;
HTTPBindingClient.requestId = 1;
/**
* HTTPBindingClient implementation
*/
HTTPBindingClient.prototype._createApplyMethod = function() {
var fn = function() {
var args = [];
var callback = null;
var methodName = arguments[0];
for(var i = 1; i < arguments.length; i++) args.push(arguments[i]);
if(typeof args[args.length - 1] == "function") callback = args.pop();
var req = fn.client._makeRequest.call(fn.client, methodName, args, callback);
if(callback == null) {
return fn.client._sendRequest.call(fn.client, req);
} else {
HTTPBindingClient.async_requests.push(req);
HTTPBindingClient.kick_async();
return req.requestId;
}
};
fn.client = this;
return fn;
};
HTTPBindingClient._getCharsetFromHeaders = function(http) {
try {
var contentType = http.getResponseHeader("Content-type");
var parts = contentType.split(/\s*;\s*/);
for(var i = 0; i < parts.length; i++) {
if(parts[i].substring(0, 8) == "charset=")
return parts[i].substring(8, parts[i].length);
}
} catch (e) {}
return "UTF-8";
};
/**
* Async queue globals
*/
HTTPBindingClient.async_requests = [];
HTTPBindingClient.async_inflight = {};
HTTPBindingClient.async_responses = [];
HTTPBindingClient.async_timeout = null;
HTTPBindingClient.num_req_active = 0;
HTTPBindingClient._async_handler = function() {
HTTPBindingClient.async_timeout = null;
while(HTTPBindingClient.async_responses.length > 0) {
var res = HTTPBindingClient.async_responses.shift();
if(res.canceled) continue;
if(res.profile) res.profile.dispatch = new Date();
try {
res.cb(res.result, res.ex, res.profile);
} catch(e) {
HTTPBindingClient.toplevel_ex_handler(e);
}
}
while(HTTPBindingClient.async_requests.length > 0 && HTTPBindingClient.num_req_active < HTTPBindingClient.max_req_active) {
var req = HTTPBindingClient.async_requests.shift();
if(req.canceled) continue;
req.client._sendRequest.call(req.client, req);
}
};
HTTPBindingClient.kick_async = function() {
if(HTTPBindingClient.async_timeout == null)
HTTPBindingClient.async_timeout = setTimeout(HTTPBindingClient._async_handler, 0);
};
HTTPBindingClient.cancelRequest = function(requestId) {
/* If it is in flight then mark it as canceled in the inflight map
and the XMLHttpRequest callback will discard the reply. */
if(HTTPBindingClient.async_inflight[requestId]) {
HTTPBindingClient.async_inflight[requestId].canceled = true;
return true;
}
/* If its not in flight yet then we can just mark it as canceled in
the the request queue and it will get discarded before being sent. */
for(var i in HTTPBindingClient.async_requests) {
if(HTTPBindingClient.async_requests[i].requestId == requestId) {
HTTPBindingClient.async_requests[i].canceled = true;
return true;
}
}
/* It may have returned from the network and be waiting for its callback
to be dispatched, so mark it as canceled in the response queue
and the response will get discarded before calling the callback. */
for(var i in HTTPBindingClient.async_responses) {
if(HTTPBindingClient.async_responses[i].requestId == requestId) {
HTTPBindingClient.async_responses[i].canceled = true;
return true;
}
}
return false;
};
HTTPBindingClient.prototype._makeRequest = function(methodName, args, cb) {
var req = {};
req.client = this;
req.requestId = HTTPBindingClient.requestId++;
var obj = {};
obj.id = req.requestId;
if (this.objectID)
obj.method = ".obj#" + this.objectID + "." + methodName;
else
obj.method = methodName;
obj.params = args;
if (cb) req.cb = cb;
if (HTTPBindingClient.profile_async)
req.profile = { "submit": new Date() };
req.data = JSONClient.toJSON(obj);
return req;
};
HTTPBindingClient.prototype._sendRequest = function(req) {
if(req.profile) req.profile.start = new Date();
/* Get free http object from the pool */
var http = HTTPBindingClient.poolGetHTTPRequest();
HTTPBindingClient.num_req_active++;
/* Send the request */
http.open("POST", this.uri, (req.cb != null));
/* setRequestHeader is missing in Opera 8 Beta */
try {
http.setRequestHeader("Content-type", "text/plain");
} catch(e) {}
/* Construct call back if we have one */
if(req.cb) {
var self = this;
http.onreadystatechange = function() {
if(http.readyState == 4) {
http.onreadystatechange = function () {};
var res = { "cb": req.cb, "result": null, "ex": null};
if (req.profile) {
res.profile = req.profile;
res.profile.end = new Date();
}
try { res.result = self._handleResponse(http); }
catch(e) { res.ex = e; }
if(!HTTPBindingClient.async_inflight[req.requestId].canceled)
HTTPBindingClient.async_responses.push(res);
delete HTTPBindingClient.async_inflight[req.requestId];
HTTPBindingClient.kick_async();
}
};
} else {
http.onreadystatechange = function() {};
}
HTTPBindingClient.async_inflight[req.requestId] = req;
try {
http.send(req.data);
} catch(e) {
HTTPBindingClient.poolReturnHTTPRequest(http);
HTTPBindingClient.num_req_active--;
throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT, "Connection failed");
}
if(!req.cb) return this._handleResponse(http);
};
HTTPBindingClient.prototype._handleResponse = function(http) {
/* Get the charset */
if(!this.charset) {
this.charset = HTTPBindingClient._getCharsetFromHeaders(http);
}
/* Get request results */
var status, statusText, data;
try {
status = http.status;
statusText = http.statusText;
data = http.responseText;
} catch(e) {
HTTPBindingClient.poolReturnHTTPRequest(http);
HTTPBindingClient.num_req_active--;
HTTPBindingClient.kick_async();
throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT, "Connection failed");
}
/* Return http object to the pool; */
HTTPBindingClient.poolReturnHTTPRequest(http);
HTTPBindingClient.num_req_active--;
/* Unmarshall the response */
if(status != 200) {
throw new HTTPBindingClient.Exception(status, statusText);
}
var obj;
try {
eval("obj = " + data);
} catch(e) {
throw new HTTPBindingClient.Exception(550, "error parsing result");
}
if(obj.error)
throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg, obj.error.trace);
var res = obj.result;
/* Handle CallableProxy */
if(res && res.objectID && res.JSONRPCType == "CallableReference")
return new HTTPBindingClient(this.uri, res.objectID);
return res;
};
/**
* XMLHttpRequest wrapper code
*/
HTTPBindingClient.http_spare = [];
HTTPBindingClient.http_max_spare = 8;
HTTPBindingClient.poolGetHTTPRequest = function() {
if(HTTPBindingClient.http_spare.length > 0) {
return HTTPBindingClient.http_spare.pop();
}
return HTTPBindingClient.getHTTPRequest();
};
HTTPBindingClient.poolReturnHTTPRequest = function(http) {
if(HTTPBindingClient.http_spare.length >= HTTPBindingClient.http_max_spare)
delete http;
else
HTTPBindingClient.http_spare.push(http);
};
HTTPBindingClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP" ];
HTTPBindingClient.getHTTPRequest = function() {
/* Mozilla XMLHttpRequest */
try {
HTTPBindingClient.httpObjectName = "XMLHttpRequest";
return new XMLHttpRequest();
} catch(e) {}
/* Microsoft MSXML ActiveX */
for (var i=0; i < HTTPBindingClient.msxmlNames.length; i++) {
try {
HTTPBindingClient.httpObjectName = HTTPBindingClient.msxmlNames[i];
return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);
} catch (e) {}
}
/* None found */
HTTPBindingClient.httpObjectName = null;
throw new HTTPBindingClient.Exception(0, "Can't create XMLHttpRequest object");
};
HTTPBindingClient.prototype.get = function(id, responseFunction) {
var xhr = this.createXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var strDocument = xhr.responseText;
var xmlDocument = xhr.responseXML;
if(!xmlDocument || xmlDocument.childNodes.length==0){
xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
}
if (responseFunction != null) responseFunction(xmlDocument);
} else {
alert("get - Error getting data from the server");
}
}
}
xhr.open("GET", this.uri + '/' + id, true);
xhr.send(null);
};
HTTPBindingClient.prototype.post = function (entry, responseFunction) {
var xhr = this.createXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 201) {
var strDocument = xhr.responseText;
var xmlDocument = xhr.responseXML;
if(!xmlDocument || xmlDocument.childNodes.length==0){
xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
}
if (responseFunction != null) responseFunction(xmlDocument);
} else {
alert("post - Error getting data from the server");
}
}
}
xhr.open("POST", this.uri, true);
xhr.setRequestHeader("Content-Type", "application/atom+xml");
xhr.send(entry);
};
HTTPBindingClient.prototype.put = function (id, entry, responseFunction) {
var xhr = this.createXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var strDocument = xhr.responseText;
var xmlDocument = xhr.responseXML;
if(!xmlDocument || xmlDocument.childNodes.length==0){
xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
}
if (responseFunction != null) responseFunction(xmlDocument);
} else {
alert("put - Error getting data from the server");
}
}
}
xhr.open("PUT", this.uri + '/' + id, true);
xhr.setRequestHeader("Content-Type", "application/atom+xml");
xhr.send(entry);
};
HTTPBindingClient.prototype.del = function (id, responseFunction) {
var xhr = this.createXMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if (responseFunction != null) responseFunction();
} else {
alert("delete - Error getting data from the server");
}
}
}
xhr.open("DELETE", this.uri + '/' + id, true);
xhr.send(null);
};
HTTPBindingClient.prototype.createXMLHttpRequest = function () {
/* Mozilla XMLHttpRequest */
try { return new XMLHttpRequest(); } catch(e) {}
/* Microsoft MSXML ActiveX */
for (var i = 0; i < HTTPBindingClient.msxmlNames.length; i++) {
try { return new ActiveXObject(HTTPBindingClient.msxmlNames[i]); } catch (e) {}
}
alert("XML http request not supported");
return null;
}
/**
* Construct an HTTPBindingClient.
*/
function HTTPBindingClient(cname, uri, objectID) {
this.uri = "/references/" + cname + "/" + uri;
this.objectID = objectID;
this.apply = this._createApplyMethod();
if (typeof DOMParser == "undefined") {
DOMParser = function () {}
DOMParser.prototype.parseFromString = function (str, contentType) {
if (typeof ActiveXObject != "undefined") {
var d = new ActiveXObject("MSXML.DomDocument");
d.loadXML(str);
return d;
} else if (typeof XMLHttpRequest != "undefined") {
var req = new XMLHttpRequest;
req.open("GET", "data:" + (contentType || "application/xml") +
";charset=utf-8," + encodeURIComponent(str), false);
if (req.overrideMimeType) {
req.overrideMimeType(contentType);
}
req.send(null);
return req.responseXML;
}
}
}
};
/**
* Construct a component.
*/
function ClientComponent(name) {
this.name = name;
}
/**
* Public API.
*/
/**
* Return a component.
*/
function component(name) {
return new ClientComponent(name);
}
/**
* Return a reference proxy.
*/
function reference(comp, name) {
return new HTTPBindingClient(comp.name, name);
};
/**
* Add proxy functions to a reference proxy.
*/
function defun(ref) {
function defapply(name) {
return function() {
var args = new Array();
args[0] = name;
for (i = 0, n = arguments.length; i < n; i++)
args[i + 1] = arguments[i];
return this.apply.apply(this, args);
};
}
for (f = 1; f < arguments.length; f++) {
var fn = arguments[f];
ref[fn]= defapply(fn);
}
return ref;
};

View file

@ -0,0 +1,24 @@
/*
* 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.
*/
/**
* SCDL parsing functions.
*/

View file

@ -0,0 +1,232 @@
/*
* 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.
*/
/**
* UI utility functions.
*/
/**
* Build a menu bar.
*/
function menu(name, href) {
function Menu(n, h) {
this.name = n;
this.href = h;
this.content = function() {
function complete(uri) {
if (uri.match('.*\.html$'))
return uri;
if (uri.match('.*/$'))
return uri + 'index.html';
return uri + '/index.html';
}
if (complete(this.href) != complete(window.top.location.pathname))
return '<a href="' + this.href + '" target="_parent">' + this.name + '</a>';
return '<span><b>' + this.name + '</b></span>';
};
}
return new Menu(name, href);
}
function menubar(left, right) {
var bar = '<table cellpadding="0" cellspacing="0" width="100%" class=tbar><tr>' +
'<td class=ltbar><table border="0" cellspacing="0" cellpadding="0"><tr>';
for (i in left)
bar = bar + '<td class=ltbar>' + left[i].content() + '</td>'
bar = bar + '</tr></table></td>' +
'<td class=rtbar><table border="0" cellpadding="0" cellspacing="0" align="right"><tr>';
for (i in right)
bar = bar + '<td class=rtbar>' + right[i].content() + '</td>'
bar = bar + '</tr></table></td></tr></table>';
return bar;
}
/**
* Autocomplete / suggest support for input fields
* To use it declare a 'suggest' function as follows:
* function suggestItems() {
* return new Array('abc', 'def', 'ghi');
* }
* then hook it to an input field as follows:
* suggest(document.yourForm.yourInputField, suggestItems);
*/
function selectSuggestion(node, value) {
for (;;) {
node = node.parentNode;
if (node.tagName.toLowerCase() == 'div')
break;
}
node.selectSuggestion(value);
}
function hilightSuggestion(node, over) {
if (over)
node.className = 'suggestHilighted';
node.className = 'suggestItem';
}
function suggest(input, suggestFunction) {
input.suggest = suggestFunction;
input.selectSuggestion = function(value) {
this.hideSuggestDiv();
this.value = value;
}
input.hideSuggestDiv = function() {
if (this.suggestDiv != null) {
this.suggestDiv.style.visibility = 'hidden';
}
}
input.showSuggestDiv = function() {
if (this.suggestDiv == null) {
this.suggestDiv = document.createElement('div');
this.suggestDiv.input = this;
this.suggestDiv.className = 'suggest';
input.parentNode.insertBefore(this.suggestDiv, input);
this.suggestDiv.style.visibility = 'hidden';
this.suggestDiv.style.zIndex = '99';
this.suggestDiv.selectSuggestion = function(value) {
this.input.selectSuggestion(value);
}
}
var values = this.suggest();
var items = '';
for (var i = 0; i < values.length; i++) {
if (values[i].indexOf(this.value) == -1)
continue;
if (items.length == 0)
items += '<table class=suggestTable>';
items += '<tr><td class="suggestItem" ' +
'onmouseover="hilightSuggestion(this, true)" onmouseout="hilightSuggestion(this, false)" ' +
'onmousedown="selectSuggestion(this, \'' + values[i] + '\')">' + values[i] + '</td></tr>';
}
if (items.length != 0)
items += '</table>';
this.suggestDiv.innerHTML = items;
if (items.length != 0) {
var node = input;
var left = 0;
var top = 0;
for (;;) {
left += node.offsetLeft;
top += node.offsetTop;
node = node.offsetParent;
if (node.tagName.toLowerCase() == 'body')
break;
}
this.suggestDiv.style.left = left;
this.suggestDiv.style.top = top + input.offsetHeight;
this.suggestDiv.style.visibility = 'visible';
} else
this.suggestDiv.style.visibility = 'hidden';
}
input.onkeydown = function(event) {
this.showSuggestDiv();
};
input.onkeyup = function(event) {
this.showSuggestDiv();
};
input.onmousedown = function(event) {
this.showSuggestDiv();
};
input.onblur = function(event) {
setTimeout(function() { input.hideSuggestDiv(); }, 50);
};
}
/**
* Return the content document of a window.
*/
function content(win) {
if (!isNil(win.document))
return win.document;
if (!isNil(win.contentDocument))
return win.contentDocument;
return null;
}
/**
* Return a child element of a node with the given id.
*/
function elementByID(node, id) {
for (var i in node.childNodes) {
var child = node.childNodes[i];
if (child.id == id)
return child;
var gchild = elementByID(child, id);
if (gchild != null)
return gchild;
}
return null;
}
/**
* Return the current document, or a child element with the given id.
*/
function $(id) {
if (id == document) {
if (!isNil(document.widget))
return widget;
return document;
}
return elementByID($(document), id);
}
/**
* Initialize a widget.
*/
function onloadwidget() {
if (isNil(window.parent) || isNil(window.parent.widgets))
return true;
var pdoc = content(window.parent);
for (w in window.parent.widgets) {
var ww = elementByID(pdoc, w).contentWindow;
if (ww == window) {
document.widget = elementByID(pdoc, window.parent.widgets[w]);
document.widget.innerHTML = document.body.innerHTML;
return true;
}
}
return true;
}
/**
* Load a widget into an element.
*/
var widgets = new Array();
function bindwidget(f, el) {
window.widgets[f] = el;
return f;
}

View file

@ -0,0 +1,85 @@
/*
* 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.
*/
/**
* Utility functions.
*/
/**
* Simple scheme-like lists.
*/
function cons(car, cdr) {
return new Array(car).concat(cdr);
}
function car(l) {
return l[0];
}
function cdr(l) {
return l.slice(1);
}
function mklist() {
var a = new Array();
for (i = 0; i < arguments.length; i++)
a[i] = arguments[i];
return a;
}
function isList(v) {
return toString.call(v) === '[object Array]';
}
function isNil(v) {
return v == 'undefined' || v == null;
}
function isEmpty(l) {
return l.length == 0;
}
/**
* convert an array or object to a non-sparse array.
*/
function array(obj) {
if (isNil(obj.length)) {
var a = new Array();
a[0] = obj;
return a;
} else {
var a = new Array();
var n = 0;
for (var i in obj)
a[n++] = obj[i];
return a;
}
}
/**
* Dump an object to the console.
*/
function dump(o) {
for (f in o) {
try {
console.log(f + '=' + o[f]);
} catch (e) {}
}
}

View file

@ -19,7 +19,7 @@
<html> <html>
<head> <head>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var protected = component("Protected"); var protected = component("Protected");
var userInfo = defun(reference(protected, "userInfo"), "getuser", "getemail", "getnickname", "getfullname", "getfirstname", "getlastname", "getrealm"); var userInfo = defun(reference(protected, "userInfo"), "getuser", "getemail", "getnickname", "getfullname", "getfirstname", "getlastname", "getrealm");

View file

@ -19,7 +19,7 @@
<html> <html>
<head> <head>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var protected = component("Protected"); var protected = component("Protected");
var userInfo = defun(reference(protected, "userInfo"), "getuser", "getemail", "getrealm"); var userInfo = defun(reference(protected, "userInfo"), "getuser", "getemail", "getrealm");

View file

@ -23,9 +23,7 @@ incldir = $(prefix)/include/modules/server
dist_mod_SCRIPTS = cpp-conf scheme-conf server-conf dist_mod_SCRIPTS = cpp-conf scheme-conf server-conf
moddir = $(prefix)/modules/server moddir = $(prefix)/modules/server
nobase_dist_mod_DATA = htdocs/wiring/*.js EXTRA_DIST = domain-test.composite client-test.scm server-test.scm htdocs/*.xml htdocs/*.txt htdocs/*.html
EXTRA_DIST = domain-test.composite client-test.scm server-test.scm htdocs/*.xml htdocs/*.txt htdocs/*.html htdocs/wiring/*.js
mod_LTLIBRARIES = libmod_tuscany_eval.la libmod_tuscany_wiring.la mod_LTLIBRARIES = libmod_tuscany_eval.la libmod_tuscany_wiring.la
noinst_DATA = libmod_tuscany_eval.so libmod_tuscany_wiring.so noinst_DATA = libmod_tuscany_eval.so libmod_tuscany_wiring.so

View file

@ -22,6 +22,8 @@ here=`readlink -f $0`; here=`dirname $here`
mkdir -p $1 mkdir -p $1
root=`readlink -f $1` root=`readlink -f $1`
jsprefix=`readlink -f $here/../js`
conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"` conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
host=`echo $conf | awk '{ print $6 }'` host=`echo $conf | awk '{ print $6 }'`
port=`echo $conf | awk '{ print $7 }' | awk -F "/" '{ print $1 }'` port=`echo $conf | awk '{ print $7 }' | awk -F "/" '{ print $1 }'`
@ -53,8 +55,11 @@ cat >>$root/conf/httpd.conf <<EOF
# Route all wiring through the configured server name # Route all wiring through the configured server name
SCAWiringServerName $servername SCAWiringServerName $servername
# Serve HTTP binding JavaScript client code # Serve JavaScript client scripts
Alias /wiring/ref.js $here/htdocs/wiring/ref.js Alias /component.js $jsprefix/htdocs/component.js
Alias /scdl.js $jsprefix/htdocs/scdl.js
Alias /util.js $jsprefix/htdocs/util.js
Alias /ui.js $jsprefix/htdocs/ui.js
EOF EOF

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var component = new tuscany.sca.Component("Store"); var component = new tuscany.sca.Component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");

View file

@ -20,7 +20,7 @@
<head> <head>
<title>Store</title> <title>Store</title>
<script type="text/javascript" src="/wiring/ref.js"></script> <script type="text/javascript" src="/component.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var store = component("Store"); var store = component("Store");