You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2010/02/28 21:01:44 UTC

svn commit: r917286 - in /tuscany/sca-cpp/trunk: ./ etc/ modules/ modules/python/ modules/wsgi/

Author: jsdelfino
Date: Sun Feb 28 20:01:44 2010
New Revision: 917286

URL: http://svn.apache.org/viewvc?rev=917286&view=rev
Log:
Strawman WSGI integration, allowing Python components to run in a Python WSGI server.

Added:
    tuscany/sca-cpp/trunk/modules/wsgi/
    tuscany/sca-cpp/trunk/modules/wsgi/Makefile.am
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/app.yaml
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/client-test.cpp
    tuscany/sca-cpp/trunk/modules/wsgi/client-test.py
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/composite.py   (with props)
    tuscany/sca-cpp/trunk/modules/wsgi/domain-test.composite
    tuscany/sca-cpp/trunk/modules/wsgi/runtime.py
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/scdl.py
    tuscany/sca-cpp/trunk/modules/wsgi/server-test   (contents, props changed)
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/server-test.py
    tuscany/sca-cpp/trunk/modules/wsgi/util.py
    tuscany/sca-cpp/trunk/modules/wsgi/wiring-test   (with props)
    tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start   (contents, props changed)
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop   (contents, props changed)
      - copied, changed from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am
Modified:
    tuscany/sca-cpp/trunk/configure.ac
    tuscany/sca-cpp/trunk/etc/git-exclude
    tuscany/sca-cpp/trunk/modules/Makefile.am
    tuscany/sca-cpp/trunk/modules/python/Makefile.am

Modified: tuscany/sca-cpp/trunk/configure.ac
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/configure.ac?rev=917286&r1=917285&r2=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/configure.ac (original)
+++ tuscany/sca-cpp/trunk/configure.ac Sun Feb 28 20:01:44 2010
@@ -277,14 +277,17 @@
 # Configure path to Python 2.6 includes and lib.
 AC_MSG_CHECKING([for python])
 AC_ARG_WITH([python], [AC_HELP_STRING([--with-python=PATH], [path to installed Python 2.6 [default=/usr]])], [
+  PYTHON_PREFIX="${withval}"
   PYTHON_INCLUDE="${withval}/include"
   PYTHON_LIB="${withval}/lib"
   AC_MSG_RESULT("${withval}")
 ], [
+  PYTHON_PREFIX="/usr"
   PYTHON_INCLUDE="/usr/include"
   PYTHON_LIB="/usr/lib"
   AC_MSG_RESULT(/usr)
 ])
+AC_SUBST(PYTHON_PREFIX)
 AC_SUBST(PYTHON_INCLUDE)
 AC_SUBST(PYTHON_LIB)
 
@@ -523,6 +526,7 @@
                  modules/python/Makefile
                  modules/java/Makefile
                  modules/server/Makefile
+                 modules/wsgi/Makefile
                  components/Makefile
                  components/cache/Makefile
                  components/log/Makefile

Modified: tuscany/sca-cpp/trunk/etc/git-exclude
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/etc/git-exclude?rev=917286&r1=917285&r2=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/etc/git-exclude (original)
+++ tuscany/sca-cpp/trunk/etc/git-exclude Sun Feb 28 20:01:44 2010
@@ -21,6 +21,7 @@
 .deployables/
 .wtpmodules/
 .pydevproject
+.buildpath
 .svn/
 .cvs/
 .dotest/

Modified: tuscany/sca-cpp/trunk/modules/Makefile.am
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/Makefile.am?rev=917286&r1=917285&r2=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/Makefile.am Sun Feb 28 20:01:44 2010
@@ -15,7 +15,7 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+SUBDIRS = scheme atom json scdl http server python wsgi java
 
 includedir = $(prefix)/include/modules
 nobase_include_HEADERS = */*.hpp

Modified: tuscany/sca-cpp/trunk/modules/python/Makefile.am
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/python/Makefile.am?rev=917286&r1=917285&r2=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/python/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/python/Makefile.am Sun Feb 28 20:01:44 2010
@@ -25,9 +25,13 @@
 lib_LTLIBRARIES = libmod_tuscany_python.la
 
 nobase_data_DATA = *.xsd
+data_DATA = python.prefix
 
 INCLUDES = -I${PYTHON_INCLUDE}
 
+python.prefix: $(top_builddir)/config.status
+	echo ${PYTHON_PREFIX} >python.prefix
+
 libmod_tuscany_python_la_SOURCES = mod-python.cpp
 libmod_tuscany_python_la_LDFLAGS = -lxml2 -lcurl -lmozjs -L${PYTHON_LIB} -R${PYTHON_LIB} -lpython2.6
 

Copied: tuscany/sca-cpp/trunk/modules/wsgi/Makefile.am (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/Makefile.am?p2=tuscany/sca-cpp/trunk/modules/wsgi/Makefile.am&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/Makefile.am Sun Feb 28 20:01:44 2010
@@ -15,8 +15,19 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+datadir=$(prefix)/modules/wsgi
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+if WANT_PYTHON
 
+noinst_PROGRAMS = client-test
+
+nobase_data_DATA = *.yaml
+
+INCLUDES = -I${PYTHON_INCLUDE}
+
+client_test_SOURCES = client-test.cpp
+client_test_LDFLAGS = -lxml2 -lcurl -lmozjs
+
+TESTS = server-test
+
+endif

Copied: tuscany/sca-cpp/trunk/modules/wsgi/app.yaml (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/app.yaml?p2=tuscany/sca-cpp/trunk/modules/wsgi/app.yaml&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/app.yaml Sun Feb 28 20:01:44 2010
@@ -1,22 +1,25 @@
-#  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.
-
-SUBDIRS = scheme atom json scdl http server python java
-
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
-
+#  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.
+
+application: wsgi-app
+version: 1
+runtime: python
+api_version: 1
+
+handlers:
+- url: /.*
+  script: composite.py

Added: tuscany/sca-cpp/trunk/modules/wsgi/client-test.cpp
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/client-test.cpp?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/client-test.cpp (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/client-test.cpp Sun Feb 28 20:01:44 2010
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+/**
+ * Test HTTP client functions.
+ */
+
+#include "stream.hpp"
+#include "string.hpp"
+#include "../server/client-test.hpp"
+
+namespace tuscany {
+namespace server {
+
+string testURI = "http://localhost:8090/wsgi";
+
+}
+}
+
+int main() {
+    tuscany::cout << "Testing..." << tuscany::endl;
+
+    tuscany::server::testServer();
+
+    tuscany::cout << "OK" << tuscany::endl;
+
+    return 0;
+}

Copied: tuscany/sca-cpp/trunk/modules/wsgi/client-test.py (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/client-test.py?p2=tuscany/sca-cpp/trunk/modules/wsgi/client-test.py&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/client-test.py Sun Feb 28 20:01:44 2010
@@ -15,8 +15,21 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+# JSON-RPC test case
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+def echo(x, ref):
+    return ref("echo", x)
 
+# ATOMPub test case
+
+def get(id, ref):
+    return ref("get", id)
+
+def post(collection, item, ref):
+    return ref("post", collection, item)
+
+def put(id, item, ref):
+    return ref("put", id, item)
+
+def delete(id, ref):
+    return ref("delete", id)

Added: tuscany/sca-cpp/trunk/modules/wsgi/composite.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/composite.py?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/composite.py (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/composite.py Sun Feb 28 20:01:44 2010
@@ -0,0 +1,103 @@
+#!/usr/bin/python
+#  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 deployment and integration with WSGI
+
+from wsgiref.simple_server import make_server
+from wsgiref.handlers import CGIHandler
+from os import environ
+from sys import stderr, argv
+from util import *
+from scdl import *
+
+def requestPath(e):
+    return e.get("PATH_INFO", "")
+
+def requestMethod(e):
+    return e.get("REQUEST_METHOD", "")
+
+def contentType(ct):
+    if ct == None:
+        return []
+    return [("Content-type", ct)]
+
+def status(st):
+    if st == 200:
+        return "200 OK"
+    if st == 404:
+        return "404 Not Found"
+    if st == 201:
+        return "201 Created"
+    return "500 Internal Server Error"
+
+def result(r, st, ct = None, b = ()):
+    r(status(st), contentType(ct))
+    return b
+
+# WSGI application function
+def application(e, r):
+
+    # Read the deployed composite
+    comps = components(parse("domain-test.composite"))
+    print >> stderr, comps
+    
+    # Find the requested component
+    path = tokens(requestPath(e))
+    uc = uriToComponent(path, comps)
+    uri = car(uc)
+    if uri == None:
+        return result(r, 404)
+    comp =  cadr(uc)
+    mod = __import__(cadr(comp))
+    
+    # Call the requested component function
+    id = path[len(uri):]
+    print >> stderr, id
+    m = requestMethod(e)
+    if (m == "GET"):
+        v = mod.get(id)
+        print >> stderr, v
+        
+        # write returned content-type / content pair
+        if not isinstance(cadr(v), basestring):
+            return result(r, 200, car(v), cadr(v))
+        
+        # TODO write an ATOM feed or entry
+        if nil(id):
+            return result(r, 200, "application/atom+xml;type=feed", ("Atom feed"))
+        return result(r, 200, "application/atom+xml;type=entry", ("Atom entry"))
+
+    if m == "DELETE":
+        v = mod.delete(id)
+        if v == False:
+            return result(r, 404)
+        return result(r, 200)
+    
+    # TODO implement POST and PUT methods
+    return result(r, 500)
+
+def serverType(e):
+    return e.get("SERVER_SOFTWARE", "")
+
+# Run the WSGI application
+if __name__ == "__main__":
+    st = serverType(environ)
+    if st == "":
+        make_server("", int(argv[1]), application).serve_forever()
+    else:
+        CGIHandler().run(application)

Propchange: tuscany/sca-cpp/trunk/modules/wsgi/composite.py
------------------------------------------------------------------------------
    svn:executable = *

Added: tuscany/sca-cpp/trunk/modules/wsgi/domain-test.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/domain-test.composite?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/domain-test.composite (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/domain-test.composite Sun Feb 28 20:01:44 2010
@@ -0,0 +1,42 @@
+<?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://domain/test"
+  name="domain-test">
+        
+    <component name="wsgi-test">
+        <t:implementation.python script="server-test.py"/>
+        <service name="test">
+            <t:binding.http uri="wsgi"/>
+        </service>
+    </component>     
+
+    <component name="client-test">
+        <t:implementation.python script="client-test.py"/>
+        <service name="client">
+            <t:binding.http uri="client"/>
+        </service>
+        <reference name="ref" target="wsgi-test">
+            <t:binding.http/>
+        </reference>
+    </component>
+
+</composite>

Copied: tuscany/sca-cpp/trunk/modules/wsgi/runtime.py (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/runtime.py?p2=tuscany/sca-cpp/trunk/modules/wsgi/runtime.py&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/runtime.py Sun Feb 28 20:01:44 2010
@@ -15,8 +15,16 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+# Component invocation functions
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+from util import *
 
+def apply(impl, refs, func, params):
+    m = __import__(impl)
+    f = m.__getattribute__(func)
+    p = refs + params
+    return f(*p)
+
+def refapply(comps, target):
+    return comps["target"]
+    

Added: tuscany/sca-cpp/trunk/modules/wsgi/scdl.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/scdl.py?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/scdl.py (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/scdl.py Sun Feb 28 20:01:44 2010
@@ -0,0 +1,89 @@
+#  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
+
+from util import *
+
+def mkcomponent(name, impl, svcs, refs):
+    return (name, impl, svcs, refs)
+
+def implementation(e):
+    if len(e) == 0 or match(car(e), "end", "component") == True:
+        return ""
+    if match(car(e), "start", "implementation.python") == False:
+        return implementation(cdr(e))
+    if "script" in att(car(e)):
+        s = att(car(e))["script"]
+        return s[0:len(s) - 3]
+    return None
+
+def binding(e):
+    if len(e) == 0 or match(car(e), "end", "reference") == True or match(car(e), "end", "service") == True:
+        return ()
+    if match(car(e), "start", "binding.") == False:
+        return binding(cdr(e))
+    return tokens(att(car(e))["uri"])
+
+def references(e):
+    if len(e) == 0 or match(car(e), "end", "component") == True:
+        return ()
+    if match(car(e), "start", "reference") == False:
+        return references(cdr(e))
+    if "target" in att(car(e)):
+        return (att(car(e))["target"],) + references(cdr(e))
+    return cons(binding(e), references(cdr(e)))
+
+def services(e):
+    if len(e) == 0 or match(car(e), "end", "component") == True:
+        return ()
+    if match(car(e), "start", "service") == False:
+        return services(cdr(e))
+    return cons(binding(e), services(cdr(e)))
+
+def name(e):
+    return att(car(e))["name"]    
+
+def components(e):
+    if len(e) == 0:
+        return ()
+    if match(car(e), "start", "component") == False:
+        return components(cdr(e))
+    n = name(e)
+    return cons(mkcomponent(n, implementation(e), cons(("components", n), services(e)), references(e)), components(cdr(e)))
+
+def nameToComponent(n, c):
+    if c == ():
+        return None
+    if car(car(c)) == n:
+        return car(c)
+    return nameToComponent(n, cdr(c))
+
+def matchingURI(u, s):
+    if s == ():
+        return None
+    if car(s) == u[0:len(car(s))]:
+        return car(s)
+    return matchingURI(u, cdr(s))
+
+def uriToComponent(u, c):
+    if c == ():
+        return (None, None)
+    m = matchingURI(u, caddr(car(c)))
+    if m != None:
+        return (m, car(c))
+    return uriToComponent(u, cdr(c))

Copied: tuscany/sca-cpp/trunk/modules/wsgi/server-test (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/server-test?p2=tuscany/sca-cpp/trunk/modules/wsgi/server-test&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/server-test Sun Feb 28 20:01:44 2010
@@ -1,3 +1,5 @@
+#!/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
@@ -15,8 +17,14 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+# Setup
+./wsgi-start 8090
+sleep 2
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+# Test
+./client-test 2>/dev/null
+rc=$?
 
+# Cleanup
+./wsgi-stop 8090
+return $rc

Propchange: tuscany/sca-cpp/trunk/modules/wsgi/server-test
------------------------------------------------------------------------------
    svn:executable = *

Added: tuscany/sca-cpp/trunk/modules/wsgi/server-test.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/server-test.py?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/server-test.py (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/server-test.py Sun Feb 28 20:01:44 2010
@@ -0,0 +1,44 @@
+#  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.
+
+# JSON-RPC test case
+
+def echo(x):
+    return x
+
+# ATOMPub test case
+
+def get(id):
+    if id == ("index.html",):
+        return ("text/plain", ("It works!",))
+    if id == ():
+        return ("Sample Feed", "123456789",
+            ("Item", "111", (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))),
+            ("Item", "222", (("'javaClass", "services.Item"), ("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55))),
+            ("Item", "333", (("'javaClass", "services.Item"), ("name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55))))
+        
+    entry = (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))
+    return ("Item", id[0], entry)
+
+def post(collection, item):
+    return ("123456789",)
+
+def put(id, item):
+    return true
+
+def delete(id):
+    return true

Added: tuscany/sca-cpp/trunk/modules/wsgi/util.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/util.py?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/util.py (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/util.py Sun Feb 28 20:01:44 2010
@@ -0,0 +1,74 @@
+#  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.
+
+# Simple utility functions
+
+from xml.etree.cElementTree import iterparse
+
+# Scheme-like lists
+def cons(a, b):
+    return (a,) + b
+
+def car(l):
+    return l[0]
+    
+def cdr(l):
+    return l[1:]
+
+def cadr(l):
+    return car(cdr(l))
+
+def cddr(l):
+    return cdr(cdr(l))
+
+def caddr(l):
+    return car(cddr(l))
+
+def nil(l):
+    return l == ()
+
+# Scheme-like associations
+def assoc(k, l):
+    if l == ():
+        return None
+    if k == car(car(l)):
+        return car(l)
+    return assoc(k, cdr(l))
+
+# Currying / partial function application
+def curry(f, *args):
+    return lambda *a: f(*(args + a))
+
+# Element tree utility functions
+def parse(file):
+    return map(lambda x: x, iterparse(file, events=("start", "end")))
+
+def evt(e):
+    return car(e)
+
+def elt(e):
+    return cadr(e)
+
+def att(e):
+    return elt(e).attrib
+
+def match(e, ev, tag):
+    return evt(e) == ev and elt(e).tag.find("}" + tag) != -1
+
+# Split a path
+def tokens(path):
+    return tuple(filter(lambda s: len(s) != 0, path.split("/")))

Added: tuscany/sca-cpp/trunk/modules/wsgi/wiring-test
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/wiring-test?rev=917286&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/wsgi/wiring-test (added)
+++ tuscany/sca-cpp/trunk/modules/wsgi/wiring-test Sun Feb 28 20:01:44 2010
@@ -0,0 +1,69 @@
+#!/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..."
+
+# Setup
+./wsgi-start 8090
+sleep 2
+
+# Test HTTP GET
+#curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html
+#diff tmp/index.html ../server/htdocs/index.html
+#rc=$?
+rc="0"
+
+# Test ATOMPub
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/ >tmp/feed.xml 2>/dev/null
+    diff tmp/feed.xml ../server/htdocs/feed.xml
+    rc=$?
+fi
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/111 >tmp/entry.xml 2>/dev/null
+    diff tmp/entry.xml ../server/htdocs/entry.xml
+    rc=$?
+fi
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/ -X POST -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null
+    rc=$?
+fi
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/111 -X PUT -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null
+    rc=$?
+fi
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/111 -X DELETE 2>/dev/null
+    rc=$?
+fi
+
+# Test JSON-RPC
+if [ "$rc" = "0" ]; then
+    curl http://localhost:8090/client/ -X POST -H "Content-type: application/json-rpc" --data @../server/htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null
+    diff tmp/json-result.txt ../server/htdocs/json-result.txt
+    rc=$?
+fi
+
+# Cleanup
+./wsgi-stop 8090
+sleep 2
+if [ "$rc" = "0" ]; then
+    echo "OK"
+fi
+return $rc

Propchange: tuscany/sca-cpp/trunk/modules/wsgi/wiring-test
------------------------------------------------------------------------------
    svn:executable = *

Copied: tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start?p2=tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start Sun Feb 28 20:01:44 2010
@@ -1,3 +1,5 @@
+#!/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
@@ -15,8 +17,10 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+# Start WSGI server
+here=`readlink -f $0`; here=`dirname $here`
+port=$1
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+python_prefix=`cat $here/../python/python.prefix`
+$python_prefix/bin/python composite.py $port &
 

Propchange: tuscany/sca-cpp/trunk/modules/wsgi/wsgi-start
------------------------------------------------------------------------------
    svn:executable = *

Copied: tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop (from r917285, tuscany/sca-cpp/trunk/modules/Makefile.am)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop?p2=tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop&p1=tuscany/sca-cpp/trunk/modules/Makefile.am&r1=917285&r2=917286&rev=917286&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop Sun Feb 28 20:01:44 2010
@@ -1,3 +1,5 @@
+#!/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
@@ -15,8 +17,11 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-SUBDIRS = scheme atom json scdl http server python java
+# Stop WSGI server
+here=`readlink -f $0`; here=`dirname $here`
+port=$1
 
-includedir = $(prefix)/include/modules
-nobase_include_HEADERS = */*.hpp
+python_prefix=`cat $here/../python/python.prefix`
+py="$python_prefix/bin/python composite.py $port"
 
+kill `ps -f | grep -v grep | grep "${py}" | awk '{ print $2 }'`

Propchange: tuscany/sca-cpp/trunk/modules/wsgi/wsgi-stop
------------------------------------------------------------------------------
    svn:executable = *