Add support for properties.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@965722 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
08f6c248d0
commit
c857c88725
5 changed files with 96 additions and 11 deletions
|
|
@ -61,8 +61,9 @@ public class JSONRPCBindingInvoker implements Invoker {
|
||||||
String requestId = "1";
|
String requestId = "1";
|
||||||
post = new HttpPost(uri);
|
post = new HttpPost(uri);
|
||||||
|
|
||||||
String req;
|
final String db = msg.getOperation().getWrapper().getDataBinding();
|
||||||
if (!msg.getOperation().getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
|
String req;
|
||||||
|
if (!db.equals(JSONDataBinding.NAME)) {
|
||||||
|
|
||||||
|
|
||||||
JSONObject jsonRequest = null;;
|
JSONObject jsonRequest = null;;
|
||||||
|
|
@ -97,7 +98,7 @@ public class JSONRPCBindingInvoker implements Invoker {
|
||||||
//success
|
//success
|
||||||
try {
|
try {
|
||||||
String entityResponse = EntityUtils.toString(response.getEntity());
|
String entityResponse = EntityUtils.toString(response.getEntity());
|
||||||
if (!msg.getOperation().getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
|
if (!db.equals(JSONDataBinding.NAME)) {
|
||||||
JSONObject jsonResponse = new JSONObject(entityResponse);
|
JSONObject jsonResponse = new JSONObject(entityResponse);
|
||||||
|
|
||||||
//check requestId
|
//check requestId
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,12 @@ package org.apache.tuscany.sca.implementation.python.provider;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.assembly.ComponentProperty;
|
||||||
import org.apache.tuscany.sca.assembly.ComponentReference;
|
import org.apache.tuscany.sca.assembly.ComponentReference;
|
||||||
import org.apache.tuscany.sca.core.invocation.ProxyFactory;
|
import org.apache.tuscany.sca.core.invocation.ProxyFactory;
|
||||||
import org.apache.tuscany.sca.implementation.python.PythonEval;
|
import org.apache.tuscany.sca.implementation.python.PythonEval;
|
||||||
import org.apache.tuscany.sca.implementation.python.PythonImplementation;
|
import org.apache.tuscany.sca.implementation.python.PythonImplementation;
|
||||||
|
import org.apache.tuscany.sca.implementation.python.PythonProperty;
|
||||||
import org.apache.tuscany.sca.interfacedef.Operation;
|
import org.apache.tuscany.sca.interfacedef.Operation;
|
||||||
import org.apache.tuscany.sca.invocation.Invoker;
|
import org.apache.tuscany.sca.invocation.Invoker;
|
||||||
import org.apache.tuscany.sca.provider.ImplementationProvider;
|
import org.apache.tuscany.sca.provider.ImplementationProvider;
|
||||||
|
|
@ -65,7 +67,7 @@ class PythonImplementationProvider implements ImplementationProvider {
|
||||||
python.exec("from invoker import *");
|
python.exec("from invoker import *");
|
||||||
|
|
||||||
final List<PyObject> px = new ArrayList<PyObject>();
|
final List<PyObject> px = new ArrayList<PyObject>();
|
||||||
for (ComponentReference r: component.getReferences()) {
|
for (final ComponentReference r: component.getReferences()) {
|
||||||
final PythonEval pe = pxFactory.createProxy(PythonEval.class, (RuntimeEndpointReference)r.getEndpointReferences().get(0));
|
final PythonEval pe = pxFactory.createProxy(PythonEval.class, (RuntimeEndpointReference)r.getEndpointReferences().get(0));
|
||||||
px.add(Py.java2py(new PythonEval() {
|
px.add(Py.java2py(new PythonEval() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -75,9 +77,19 @@ class PythonImplementationProvider implements ImplementationProvider {
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
final List<PyObject> pr = new ArrayList<PyObject>();
|
||||||
|
for (final ComponentProperty p: component.getProperties()) {
|
||||||
|
final String v = String.valueOf(p.getValue());
|
||||||
|
pr.add(Py.java2py(new PythonProperty() {
|
||||||
|
@Override
|
||||||
|
public String eval() {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
PyObject mkc = python.get("mkcomponent");
|
PyObject mkc = python.get("mkcomponent");
|
||||||
callable = mkc.__call__(new PyString(component.getName()), new PyString(implementation.getScript()), new PyTuple(px.toArray(new PyObject[0])));
|
callable = mkc.__call__(new PyString(component.getName()), new PyString(implementation.getScript()), new PyTuple(px.toArray(new PyObject[0])), new PyTuple(pr.toArray(new PyObject[0])));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
|
|
|
||||||
|
|
@ -52,19 +52,37 @@ def mkproxies(jpx):
|
||||||
return ()
|
return ()
|
||||||
return cons(proxy(car(jpx)), mkproxies(cdr(jpx)))
|
return cons(proxy(car(jpx)), mkproxies(cdr(jpx)))
|
||||||
|
|
||||||
|
class prop:
|
||||||
|
def __init__(self, jpy):
|
||||||
|
self.jpy = jpy
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
# Eval the property
|
||||||
|
res = self.jpy.eval()
|
||||||
|
return res
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return repr((jpy,))
|
||||||
|
|
||||||
|
def mkprops(jpy):
|
||||||
|
if isNil(jpy):
|
||||||
|
return ()
|
||||||
|
return cons(prop(car(jpy)), mkprops(cdr(jpy)))
|
||||||
|
|
||||||
# Make a callable component
|
# Make a callable component
|
||||||
class component:
|
class component:
|
||||||
def __init__(self, name, impl, jpx):
|
def __init__(self, name, impl, jpx, jpy):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.impl = impl[0:len(impl) - 3]
|
self.impl = impl[0:len(impl) - 3]
|
||||||
self.mod = __import__(self.impl)
|
self.mod = __import__(self.impl)
|
||||||
self.proxies = mkproxies(jpx)
|
self.proxies = mkproxies(jpx)
|
||||||
|
self.props = mkprops(jpy)
|
||||||
|
|
||||||
def __call__(self, func, *args):
|
def __call__(self, func, *args):
|
||||||
return self.mod.__getattribute__(func)(*(args + self.proxies))
|
return self.mod.__getattribute__(func)(*(args + self.proxies + self.props))
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return repr((self.name, self.impl, self.mod, self.svcs, self.refs, self.props, self.proxies))
|
return repr((self.name, self.impl, self.mod, self.props, self.proxies))
|
||||||
|
|
||||||
# Converts the args received in a JSON request to a list of key value pairs
|
# Converts the args received in a JSON request to a list of key value pairs
|
||||||
def jsonArgs(a):
|
def jsonArgs(a):
|
||||||
|
|
@ -84,6 +102,7 @@ def apply(jsreq, comp):
|
||||||
return jsonResult(jid, v)[0]
|
return jsonResult(jid, v)[0]
|
||||||
|
|
||||||
# Make a component that can be called with a JSON function request
|
# Make a component that can be called with a JSON function request
|
||||||
def mkcomponent(name, impl, jpx):
|
def mkcomponent(name, impl, jpx, jpy):
|
||||||
comp = component(name, impl, jpx)
|
comp = component(name, impl, jpx, jpy)
|
||||||
return lambda jsreq: apply(jsreq, comp)
|
return lambda jsreq: apply(jsreq, comp)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,16 @@ package org.apache.tuscany.sca.implementation.python;
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.assembly.Property;
|
||||||
import org.apache.tuscany.sca.assembly.Reference;
|
import org.apache.tuscany.sca.assembly.Reference;
|
||||||
import org.apache.tuscany.sca.assembly.Service;
|
import org.apache.tuscany.sca.assembly.Service;
|
||||||
import org.apache.tuscany.sca.assembly.impl.ImplementationImpl;
|
import org.apache.tuscany.sca.assembly.impl.ImplementationImpl;
|
||||||
|
import org.apache.tuscany.sca.assembly.impl.PropertyImpl;
|
||||||
import org.apache.tuscany.sca.assembly.impl.ReferenceImpl;
|
import org.apache.tuscany.sca.assembly.impl.ReferenceImpl;
|
||||||
import org.apache.tuscany.sca.assembly.impl.ServiceImpl;
|
import org.apache.tuscany.sca.assembly.impl.ServiceImpl;
|
||||||
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
|
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.util.XMLType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The model representing a Python implementation in an SCA assembly.
|
* The model representing a Python implementation in an SCA assembly.
|
||||||
|
|
@ -79,5 +83,21 @@ public class PythonImplementation extends ImplementationImpl {
|
||||||
final Reference nr = new DynReference();
|
final Reference nr = new DynReference();
|
||||||
getReferences().add(nr);
|
getReferences().add(nr);
|
||||||
return nr;
|
return nr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Property getProperty(final String n) {
|
||||||
|
final Property p = super.getProperty(n);
|
||||||
|
if (p != null)
|
||||||
|
return p;
|
||||||
|
class DynProperty extends PropertyImpl {
|
||||||
|
public DynProperty() {
|
||||||
|
setName(n);
|
||||||
|
setDataType(new DataTypeImpl<XMLType>(null, String.class, String.class, XMLType.UNKNOWN));
|
||||||
|
setXSDType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final Property np = new DynProperty();
|
||||||
|
getProperties().add(np);
|
||||||
|
return np;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
package org.apache.tuscany.sca.implementation.python;
|
||||||
|
|
||||||
|
import org.oasisopen.sca.annotation.Remotable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Python component property evaluation interface.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
@Remotable
|
||||||
|
public interface PythonProperty {
|
||||||
|
|
||||||
|
public String eval();
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue