Move samples to samples directory.

git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@943805 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
jsdelfino 2010-05-13 05:28:37 +00:00
commit d97c0ec46c
101 changed files with 13 additions and 35 deletions

View file

@ -0,0 +1,19 @@
# 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.
TESTS = server-test

View file

@ -0,0 +1,27 @@
; 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.
; Currency converter implementation
(define (convert from to amount)
(if (equal? to "EUR") (* amount 0.70) amount)
)
(define (symbol currency)
(if (equal? currency "EUR") "E" "$")
)

View file

@ -0,0 +1,33 @@
; 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.
; Catalog implementation
(define (get converter currencyCode)
(define code (currencyCode))
(define (convert price) (converter "convert" "USD" code price))
(define symbol (converter "symbol" code))
(list
(list (list 'javaClass "services.Item") (list 'name "Apple") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 2.99)))
(list (list 'javaClass "services.Item") (list 'name "Orange") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 3.55)))
(list (list 'javaClass "services.Item") (list 'name "Pear") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 1.55)))
)
)
; TODO remove these JSON-RPC specific functions
(define (listMethods converter currencyCode) (list "Service.get"))

View file

@ -0,0 +1,19 @@
#
# 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.
DirectoryIndex store.html

View file

@ -0,0 +1,169 @@
<!--
* 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.
-->
<html>
<head>
<title>Store</title>
<script type="text/javascript" src="store.js"></script>
<script language="JavaScript">
//@Reference
var catalog = new tuscany.sca.Reference("catalog");
//@Reference
var shoppingCart = new tuscany.sca.Reference("shoppingCart");
//@Reference
var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
var catalogItems;
function catalog_getResponse(items,exception) {
if(exception){
alert(exception.message);
return;
}
var catalog = "";
for (var i=0; i<items.length; i++) {
var item = items[i].name + ' - ' + items[i].price;
catalog += '<input name="items" type="checkbox" value="' +
item + '">' + item + ' <br>';
}
document.getElementById('catalog').innerHTML=catalog;
catalogItems = items;
// TEMP
shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
}
function shoppingCart_getResponse(feed) {
if (feed != null) {
var entries = feed.getElementsByTagName("entry");
var list = "";
for (var i=0; i<entries.length; i++) {
var content = entries[i].getElementsByTagName("content")[0];
var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
list += name + ' - ' + price + ' <br>';
}
document.getElementById("shoppingCart").innerHTML = list;
if (entries.length != 0) {
try {
shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
}
catch(e){
alert(e);
}
}
}
}
function shoppingTotal_getTotalResponse(total,exception) {
if(exception) {
alert(exception.message);
return;
}
document.getElementById('total').innerHTML = total;
}
function shoppingCart_postResponse(entry) {
shoppingCart.get("", shoppingCart_getResponse);
}
function addToCart() {
var items = document.catalogForm.items;
var j = 0;
for (var i=0; i<items.length; i++)
if (items[i].checked) {
var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
'<item>' +
'<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
'<name>' + catalogItems[i].name + '</name>' +
'<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
'<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
'<price>' + catalogItems[i].price + '</price>' +
'</item>' +
'</content></entry>';
shoppingCart.post(entry, shoppingCart_postResponse);
items[i].checked = false;
}
}
function checkoutCart() {
document.getElementById('store').innerHTML='<h2>' +
'Thanks for Shopping With Us!</h2>'+
'<h2>Your Order</h2>'+
'<form name="orderForm">'+
document.getElementById('shoppingCart').innerHTML+
'<br>'+
document.getElementById('total').innerHTML+
'<br>'+
'<br>'+
'<input type="submit" value="Continue Shopping">'+
'</form>';
shoppingCart.del("", null);
}
function deleteCart() {
shoppingCart.del("", null);
document.getElementById('shoppingCart').innerHTML = "";
document.getElementById('total').innerHTML = "";
}
function init() {
try {
catalog.get(catalog_getResponse);
shoppingCart.get("", shoppingCart_getResponse);
}
catch(e){
alert(e);
}
}
</script>
</head>
<body onload="init()">
<h1>Store</h1>
<div id="store">
<h2>Catalog</h2>
<form name="catalogForm">
<div id="catalog" ></div>
<br>
<input type="button" onClick="addToCart()" value="Add to Cart">
</form>
<br>
<h2>Your Shopping Cart</h2>
<form name="shoppingCartForm">
<div id="shoppingCart"></div>
<br>
<div id="total"></div>
<br>
<input type="button" onClick="checkoutCart()" value="Checkout">
<input type="button" onClick="deleteCart()" value="Empty">
<a href="../shoppingCart/">(feed)</a>
</form>
</div>
</body>
</html>

View file

@ -0,0 +1,661 @@
/* Apache Tuscany SCA Widget header */
/*
* JSON-RPC JavaScript client
*
* $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
*
* This code is based on Jan-Klaas' JavaScript o lait library (jsolait).
*
* Licensed 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.
*
*/
/*
* Modifications for Apache Tuscany:
* - JSONRpcClient_createMethod changed so callback is last arg
*/
/* escape a character */
escapeJSONChar =
function escapeJSONChar(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 */
escapeJSONString =
function escapeJSONString(s)
{
/* The following should suffice but Safari's regex is b0rken
(doesn't support callback substitutions)
return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g,
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] = escapeJSONChar(parts[i]);
}
return "\"" + parts.join("") + "\"";
};
/* Marshall objects to JSON format */
toJSON = function toJSON(o)
{
if(o == null) {
return "null";
} else if(o.constructor == String) {
return 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(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(escapeJSONString(attr) + ": " + toJSON(o[attr]));
}
return "{" + v.join(", ") + "}";
}
};
/* JSONRpcClient constructor */
JSONRpcClient =
function JSONRpcClient_ctor(serverURL, user, pass, objectID)
{
this.serverURL = serverURL;
this.user = user;
this.pass = pass;
this.objectID = objectID;
/* Add standard methods */
if(this.objectID) {
this._addMethods(["listMethods"]);
var req = this._makeRequest("listMethods", []);
} else {
this._addMethods(["system.listMethods"]);
var req = this._makeRequest("system.listMethods", []);
}
var m = this._sendRequest(req);
this._addMethods(m);
};
/* JSONRpcCLient.Exception */
JSONRpcClient.Exception =
function JSONRpcClient_Exception_ctor(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 = "JSONRpcClientException";
this.message = message;
};
JSONRpcClient.Exception.CODE_REMOTE_EXCEPTION = 490;
JSONRpcClient.Exception.CODE_ERR_CLIENT = 550;
JSONRpcClient.Exception.CODE_ERR_PARSE = 590;
JSONRpcClient.Exception.CODE_ERR_NOMETHOD = 591;
JSONRpcClient.Exception.CODE_ERR_UNMARSHALL = 592;
JSONRpcClient.Exception.CODE_ERR_MARSHALL = 593;
JSONRpcClient.Exception.prototype = new Error();
JSONRpcClient.Exception.prototype.toString =
function JSONRpcClient_Exception_toString(code, msg)
{
return this.name + ": " + this.message;
};
/* Default top level exception handler */
JSONRpcClient.default_ex_handler =
function JSONRpcClient_default_ex_handler(e) { alert(e); };
/* Client settable variables */
JSONRpcClient.toplevel_ex_handler = JSONRpcClient.default_ex_handler;
JSONRpcClient.profile_async = false;
JSONRpcClient.max_req_active = 1;
JSONRpcClient.requestId = 1;
/* JSONRpcClient implementation */
JSONRpcClient.prototype._createMethod =
function JSONRpcClient_createMethod(methodName)
{
var fn=function()
{
var args = [];
var callback = null;
for(var i=0;i<arguments.length;i++) args.push(arguments[i]);
/* TUSCANY change callback to be last arg instead of first to match binding.ajax
if(typeof args[0] == "function") callback = args.shift();
*/
if(typeof args[arguments.length-1] == "function") callback = args.pop();
var req = fn.client._makeRequest.call(fn.client, fn.methodName,
args, callback);
if(callback == null) {
return fn.client._sendRequest.call(fn.client, req);
} else {
JSONRpcClient.async_requests.push(req);
JSONRpcClient.kick_async();
return req.requestId;
}
};
fn.client = this;
fn.methodName = methodName;
return fn;
};
JSONRpcClient.prototype._addMethods =
function JSONRpcClient_addMethods(methodNames)
{
for(var i=0; i<methodNames.length; i++) {
var obj = this;
var names = methodNames[i].split(".");
for(var n=0; n<names.length-1; n++) {
var name = names[n];
if(obj[name]) {
obj = obj[name];
} else {
obj[name] = new Object();
obj = obj[name];
}
}
var name = names[names.length-1];
if(!obj[name]) {
var method = this._createMethod(methodNames[i]);
obj[name] = method;
}
}
};
JSONRpcClient._getCharsetFromHeaders =
function JSONRpcClient_getCharsetFromHeaders(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"; /* default */
};
/* Async queue globals */
JSONRpcClient.async_requests = [];
JSONRpcClient.async_inflight = {};
JSONRpcClient.async_responses = [];
JSONRpcClient.async_timeout = null;
JSONRpcClient.num_req_active = 0;
JSONRpcClient._async_handler =
function JSONRpcClient_async_handler()
{
JSONRpcClient.async_timeout = null;
while(JSONRpcClient.async_responses.length > 0) {
var res = JSONRpcClient.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) {
JSONRpcClient.toplevel_ex_handler(e);
}
}
while(JSONRpcClient.async_requests.length > 0 &&
JSONRpcClient.num_req_active < JSONRpcClient.max_req_active) {
var req = JSONRpcClient.async_requests.shift();
if(req.canceled) continue;
req.client._sendRequest.call(req.client, req);
}
};
JSONRpcClient.kick_async =
function JSONRpcClient_kick_async()
{
if(JSONRpcClient.async_timeout == null)
JSONRpcClient.async_timeout =
setTimeout(JSONRpcClient._async_handler, 0);
};
JSONRpcClient.cancelRequest =
function JSONRpcClient_cancelRequest(requestId)
{
/* If it is in flight then mark it as canceled in the inflight map
and the XMLHttpRequest callback will discard the reply. */
if(JSONRpcClient.async_inflight[requestId]) {
JSONRpcClient.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 JSONRpcClient.async_requests) {
if(JSONRpcClient.async_requests[i].requestId == requestId) {
JSONRpcClient.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 JSONRpcClient.async_responses) {
if(JSONRpcClient.async_responses[i].requestId == requestId) {
JSONRpcClient.async_responses[i].canceled = true;
return true;
}
}
return false;
};
JSONRpcClient.prototype._makeRequest =
function JSONRpcClient_makeRequest(methodName, args, cb)
{
var req = {};
req.client = this;
req.requestId = JSONRpcClient.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 (JSONRpcClient.profile_async)
req.profile = { "submit": new Date() };
req.data = toJSON(obj);
return req;
};
JSONRpcClient.prototype._sendRequest =
function JSONRpcClient_sendRequest(req)
{
if(req.profile) req.profile.start = new Date();
/* Get free http object from the pool */
var http = JSONRpcClient.poolGetHTTPRequest();
JSONRpcClient.num_req_active++;
/* Send the request */
if (typeof(this.user) == "undefined") {
http.open("POST", this.serverURL, (req.cb != null));
} else {
http.open("POST", this.serverURL, (req.cb != null), this.user, this.pass);
}
/* 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(!JSONRpcClient.async_inflight[req.requestId].canceled)
JSONRpcClient.async_responses.push(res);
delete JSONRpcClient.async_inflight[req.requestId];
JSONRpcClient.kick_async();
}
};
} else {
http.onreadystatechange = function() {};
}
JSONRpcClient.async_inflight[req.requestId] = req;
try {
http.send(req.data);
} catch(e) {
JSONRpcClient.poolReturnHTTPRequest(http);
JSONRpcClient.num_req_active--;
throw new JSONRpcClient.Exception
(JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed");
}
if(!req.cb) return this._handleResponse(http);
};
JSONRpcClient.prototype._handleResponse =
function JSONRpcClient_handleResponse(http)
{
/* Get the charset */
if(!this.charset) {
this.charset = JSONRpcClient._getCharsetFromHeaders(http);
}
/* Get request results */
var status, statusText, data;
try {
status = http.status;
statusText = http.statusText;
data = http.responseText;
} catch(e) {
JSONRpcClient.poolReturnHTTPRequest(http);
JSONRpcClient.num_req_active--;
JSONRpcClient.kick_async();
throw new JSONRpcClient.Exception
(JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed");
}
/* Return http object to the pool; */
JSONRpcClient.poolReturnHTTPRequest(http);
JSONRpcClient.num_req_active--;
/* Unmarshall the response */
if(status != 200) {
throw new JSONRpcClient.Exception(status, statusText);
}
var obj;
try {
eval("obj = " + data);
} catch(e) {
throw new JSONRpcClient.Exception(550, "error parsing result");
}
if(obj.error)
throw new JSONRpcClient.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 JSONRpcClient(this.serverURL, this.user,
this.pass, res.objectID);
return res;
};
/* XMLHttpRequest wrapper code */
/* XMLHttpRequest pool globals */
JSONRpcClient.http_spare = [];
JSONRpcClient.http_max_spare = 8;
JSONRpcClient.poolGetHTTPRequest =
function JSONRpcClient_pool_getHTTPRequest()
{
if(JSONRpcClient.http_spare.length > 0) {
return JSONRpcClient.http_spare.pop();
}
return JSONRpcClient.getHTTPRequest();
};
JSONRpcClient.poolReturnHTTPRequest =
function JSONRpcClient_poolReturnHTTPRequest(http)
{
if(JSONRpcClient.http_spare.length >= JSONRpcClient.http_max_spare)
delete http;
else
JSONRpcClient.http_spare.push(http);
};
JSONRpcClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP" ];
JSONRpcClient.getHTTPRequest =
function JSONRpcClient_getHTTPRequest()
{
/* Mozilla XMLHttpRequest */
try {
JSONRpcClient.httpObjectName = "XMLHttpRequest";
return new XMLHttpRequest();
} catch(e) {}
/* Microsoft MSXML ActiveX */
for (var i=0;i < JSONRpcClient.msxmlNames.length; i++) {
try {
JSONRpcClient.httpObjectName = JSONRpcClient.msxmlNames[i];
return new ActiveXObject(JSONRpcClient.msxmlNames[i]);
} catch (e) {}
}
/* None found */
JSONRpcClient.httpObjectName = null;
throw new JSONRpcClient.Exception(0, "Can't create XMLHttpRequest object");
};
/*
* 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.
*/
function AtomClient(uri) {
this.msxmlNames = [ "MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP" ];
this.uri=uri;
this.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", uri + '/' + id, true);
xhr.send(null);
}
this.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", uri, true);
xhr.setRequestHeader("Content-Type", "application/atom+xml");
xhr.send(entry);
}
this.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", uri + '/' + id, true);
xhr.setRequestHeader("Content-Type", "application/atom+xml");
xhr.send(entry);
}
this.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", uri + '/' + id, true);
xhr.send(null);
}
this.createXMLHttpRequest = function () {
/* Mozilla XMLHttpRequest */
try {return new XMLHttpRequest();} catch(e) {}
/* Microsoft MSXML ActiveX */
for (var i=0;i < this.msxmlNames.length; i++) {
try {return new ActiveXObject(this.msxmlNames[i]);} catch (e) {}
}
alert("XML http request not supported");
return null;
}
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;
}
}
}
}
/* Tuscany Reference/Property injection code */
if (!tuscany) {
var tuscany = {};
}
if (!tuscany.sca) {
tuscany.sca = {};
}
tuscany.sca.propertyMap = new String();
tuscany.sca.Property = function (name) {
return tuscany.sca.propertyMap[name];
}
tuscany.sca.referenceMap = new Object();
tuscany.sca.referenceMap.catalog = new JSONRpcClient("/catalog").Service;
tuscany.sca.referenceMap.shoppingCart = new AtomClient("/shoppingCart");
tuscany.sca.referenceMap.shoppingTotal = new JSONRpcClient("/total").Service;
tuscany.sca.Reference = function (name) {
return tuscany.sca.referenceMap[name];
}
/** End of Apache Tuscany SCA Widget */

View file

@ -0,0 +1,40 @@
#!/bin/sh
# 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.
echo "Testing..."
here=`readlink -f $0`; here=`dirname $here`
curl_prefix=`cat $here/../../modules/http/curl.prefix`
# Setup
./start
sleep 2
# Test HTTP GET
$curl_prefix/bin/curl http://localhost:8090/store.html 2>/dev/null >tmp/store.html
diff tmp/store.html htdocs/store.html
rc=$?
# Cleanup
./stop
sleep 2
if [ "$rc" = "0" ]; then
echo "OK"
fi
return $rc

View file

@ -0,0 +1,84 @@
; 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.
; Shopping cart implementation
(define cartId "1234")
; Get the shopping cart from the cache
; Return an empty cart if not found
(define (getcart id cache)
(define cart (cache "get" (list id)))
(if (nul cart)
(list)
cart)
)
; Post a new item to the cart, create a new cart if necessary
(define (post collection item cache)
(define id (uuid))
(define newItem (list (car item) id (caddr item)))
(define cart (cons newItem (getcart cartId cache)))
(cache "put" (list cartId) cart)
(list id)
)
; Find an item in the cart
(define (find id cart)
(if (nul cart)
(cons "Item" (list "0" (list)))
(if (= id (cadr (car cart)))
(car cart)
(find id (cdr cart))))
)
; Get items from the cart
(define (get id cache)
(if (nul id)
(cons "Your Cart" (cons cartId (getcart cartId cache)))
(find (car id) (getcart cartId cache))
)
)
; Delete items from the cart
(define (delete id cache)
(if (nul id)
(cache "delete" (list cartId))
true
)
)
; Return the price of an item
(define (price item)
(cadr (assoc 'price (caddr item)))
)
; Sum the prices of a list of items
(define (sum items)
(if (nul items)
0
(+ (price (car items)) (sum (cdr items))))
)
; Return the total price of the items in the cart
(define (gettotal cache)
(define cart (getcart cartId cache))
(sum cart)
)
; TODO remove these JSON-RPC specific functions
(define (listMethods cache) (list "Service.gettotal"))

View file

@ -0,0 +1,35 @@
#!/bin/sh
# 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.
../../modules/http/httpd-ca-conf tmp localhost
../../modules/http/httpd-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
../../modules/server/scheme-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
# Configure SCA Composite
SCAContribution `pwd`/
SCAComposite store.composite
EOF
../../components/sqldb/pgsql-start tmp
../../components/sqldb/pgsql "create table store(key text, value text);" 1>/dev/null 2>&1
../../modules/http/httpd-start tmp

View file

@ -0,0 +1,32 @@
#!/bin/sh
# 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.
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/server/server-conf tmp
../../modules/server/scheme-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
# Configure SCA Composite
SCAContribution `pwd`/
SCAComposite store.composite
EOF
../../components/sqldb/pgsql-start tmp
../../components/sqldb/pgsql "create table store(key text, value text);" 1>/dev/null 2>&1
../../modules/http/httpd-start tmp

View file

@ -0,0 +1,21 @@
#!/bin/sh
# 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.
../../modules/http/httpd-stop tmp
../../components/sqldb/pgsql-stop tmp

View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
* 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.
-->
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
targetNamespace="http://store"
name="store">
<component name="Store">
<t:implementation.scheme script="store.scm"/>
<service name="Widget">
<t:binding.http uri="store"/>
</service>
<reference name="catalog" target="Catalog"/>
<reference name="shoppingCart" target="ShoppingCart/Cart"/>
<reference name="shoppingTotal" target="ShoppingCart/Total"/>
</component>
<component name="Catalog">
<t:implementation.scheme script="fruits-catalog.scm"/>
<property name="currencyCode">USD</property>
<service name="Catalog">
<t:binding.jsonrpc uri="catalog"/>
</service>
<reference name="currencyConverter" target="CurrencyConverter"/>
</component>
<component name="ShoppingCart">
<t:implementation.scheme script="shopping-cart.scm"/>
<service name="ShoppingCart">
<t:binding.atom uri="shoppingCart"/>
</service>
<service name="Total">
<t:binding.jsonrpc uri="total"/>
</service>
<reference name="cache" target="Sqldb"/>
</component>
<component name="CurrencyConverter">
<t:implementation.scheme script="currency-converter.scm"/>
<service name="CurrencyConverter">
<t:binding.jsonrpc uri="currencyConverter"/>
</service>
</component>
<component name="Sqldb">
<implementation.cpp path="../../components/sqldb/.libs" library="libsqldb"/>
<property name="conninfo">dbname=db</property>
<property name="table">store</property>
<service name="Sqldb">
<t:binding.atom uri="sqldb"/>
</service>
</component>
</composite>

View file

@ -0,0 +1,50 @@
; 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.
; Store implementation
(define (post item catalog shoppingCart shoppingTotal)
(shoppingCart "post" item)
)
(define (getall catalog shoppingCart shoppingTotal)
(shoppingCart "getall")
)
(define (get id catalog shoppingCart shoppingTotal)
(shoppingCart "get" id)
)
(define (getcatalog catalog shoppingCart shoppingTotal)
(catalog "get")
)
(define (gettotal catalog shoppingCart shoppingTotal)
(shoppingCart "gettotal")
)
(define (deleteall catalog shoppingCart shoppingTotal)
(shoppingCart "deleteall")
)
(define (delete id catalog shoppingCart shoppingTotal)
(shoppingCart "delete" id)
)
; TODO remove these JSON-RPC specific functions
(define (listMethods catalog shoppingCart shoppingTotal) (list "Service.getcatalog" "Service.gettotal"))