You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/07/31 00:36:12 UTC

svn commit: r681232 - in /tuscany/java/sca/modules: binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/

Author: rfeng
Date: Wed Jul 30 15:36:12 2008
New Revision: 681232

URL: http://svn.apache.org/viewvc?rev=681232&view=rev
Log:
Add missing files for r681221

Added:
    tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java   (with props)
    tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java   (with props)
    tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java   (with props)
    tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java   (with props)

Added: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java?rev=681232&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java (added)
+++ tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java Wed Jul 30 15:36:12 2008
@@ -0,0 +1,149 @@
+/*
+ * 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.binding.corba.impl.service;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.sca.binding.corba.impl.exceptions.RequestConfigurationException;
+import org.apache.tuscany.sca.binding.corba.impl.types.TypeTree;
+import org.apache.tuscany.sca.binding.corba.impl.types.TypeTreeCreator;
+import org.apache.tuscany.sca.binding.corba.impl.util.OperationMapper;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+
+/**
+ * Invocation proxy for SCA components
+ */
+public class ComponentInvocationProxy implements InvocationProxy {
+
+    private RuntimeWire wire;
+    private RuntimeComponentService service;
+    private Map<Method, Operation> methodOperationMapping;
+    private Map<String, Method> operationsMap;
+    private Map<Operation, OperationTypes> operationsCache = new HashMap<Operation, OperationTypes>();
+    private Class<?> javaClass;
+
+    public ComponentInvocationProxy(RuntimeComponentService service, RuntimeWire wire, Class<?> javaClass)
+        throws RequestConfigurationException {
+        this.wire = wire;
+        this.service = service;
+        this.javaClass = javaClass;
+        operationsMap = OperationMapper.mapOperationToMethod(javaClass);
+        createMethod2OperationMapping();
+        cacheOperationTypes(service.getInterfaceContract().getInterface().getOperations());
+    }
+
+    /**
+     * Maps Java methods to Tuscany operations
+     */
+    private void createMethod2OperationMapping() {
+        // for every operation find all methods with the same name, then
+        // compare operations and methods parameters
+        this.methodOperationMapping = new HashMap<Method, Operation>();
+        for (Operation operation : service.getInterfaceContract().getInterface().getOperations()) {
+            List<DataType> inputTypes = operation.getInputType().getLogical();
+            Method[] methods = javaClass.getMethods();
+            for (int i = 0; i < methods.length; i++) {
+                if (methods[i].getName().equals(operation.getName()) && inputTypes.size() == methods[i]
+                    .getParameterTypes().length) {
+                    Class<?>[] parameterTypes = methods[i].getParameterTypes();
+                    int j = 0;
+                    boolean parameterMatch = true;
+                    for (DataType dataType : inputTypes) {
+                        if (!dataType.getPhysical().equals(parameterTypes[j])) {
+                            parameterMatch = false;
+                            break;
+                        }
+                        j++;
+                    }
+                    if (parameterMatch) {
+                        // match found
+                        methodOperationMapping.put(methods[i], operation);
+                        break;
+                    }
+                }
+            }
+
+        }
+    }
+
+    /**
+     * Caches TypeTree for every operation in backed component
+     * 
+     * @param operations
+     * @throws RequestConfigurationException
+     */
+    private void cacheOperationTypes(List<Operation> operations) throws RequestConfigurationException {
+        for (Operation operation : operations) {
+            try {
+                OperationTypes operationTypes = new OperationTypes();
+                List<TypeTree> inputInstances = new ArrayList<TypeTree>();
+                // cache output type tree
+                if (operation.getOutputType() != null && operation.getOutputType().getPhysical() != null
+                    && !operation.getOutputType().getPhysical().equals(void.class)) {
+                    TypeTree outputType =
+                        TypeTreeCreator.createTypeTree(operation.getOutputType().getPhysical(), false);
+                    operationTypes.setOutputType(outputType);
+                }
+                // cache input types trees
+                if (operation.getInputType() != null) {
+                    for (DataType<List<DataType>> type : operation.getInputType().getLogical()) {
+                        Class<?> forClass = type.getPhysical();
+                        TypeTree inputType = TypeTreeCreator.createTypeTree(forClass, false);
+                        inputInstances.add(inputType);
+                    }
+
+                }
+                operationTypes.setInputType(inputInstances);
+                operationsCache.put(operation, operationTypes);
+            } catch (RequestConfigurationException e) {
+                throw e;
+            }
+        }
+    }
+
+    private Operation getOperation4Name(String operationName) {
+        Method method = operationsMap.get(operationName);
+        return methodOperationMapping.get(method);
+    }
+
+    public OperationTypes getOperationTypes(String operationName) {
+        return operationsCache.get(getOperation4Name(operationName));
+    }
+
+    public Object invoke(String operationName, List<Object> arguments) throws InvocationException {
+        Object result = null;
+        try {
+            result = wire.invoke(getOperation4Name(operationName), arguments.toArray());
+        } catch (InvocationTargetException e) {
+            InvocationException exception = new InvocationException(e.getCause());
+            throw exception;
+        }
+        return result;
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/ComponentInvocationProxy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java?rev=681232&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java (added)
+++ tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java Wed Jul 30 15:36:12 2008
@@ -0,0 +1,42 @@
+/*
+ * 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.binding.corba.impl.service;
+
+/**
+ * Wrapper for exception thrown during target invocation 
+ */
+public class InvocationException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+    private Throwable targetException;
+
+    public InvocationException(Throwable targetException) {
+        this.targetException = targetException;
+    }
+    
+    public Throwable getTargetException() {
+        return targetException;
+    }
+
+    public void setTargetException(Throwable target) {
+        this.targetException = target;
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-corba-runtime/src/main/java/org/apache/tuscany/sca/binding/corba/impl/service/InvocationException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java?rev=681232&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java (added)
+++ tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java Wed Jul 30 15:36:12 2008
@@ -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.    
+ */
+
+package org.apache.tuscany.sca.binding.sca.corba.impl;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
+import org.apache.axis2.AxisFault;
+import org.apache.tuscany.sca.binding.corba.impl.exceptions.RequestConfigurationException;
+import org.apache.tuscany.sca.binding.corba.impl.reference.DynaCorbaRequest;
+import org.apache.tuscany.sca.binding.corba.impl.reference.DynaCorbaResponse;
+import org.apache.tuscany.sca.interfacedef.util.FaultException;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.omg.CORBA.Object;
+import org.osoa.sca.ServiceRuntimeException;
+
+public class CorbaSCAInvoker implements Invoker {
+
+    private Object remoteObject;
+    private Class<?> referenceClass;
+
+    public CorbaSCAInvoker(Object remoteObject,
+                           Class<?> referenceClass,
+                           Map<Method, String> operationsMap,
+                           boolean scaBindingRules) {
+        this.remoteObject = remoteObject;
+        this.referenceClass = referenceClass;
+    }
+
+    /**
+     * @see org.apache.tuscany.sca.invocation.Invoker#invoke(org.apache.tuscany.sca.invocation.Message)
+     */
+    public Message invoke(Message msg) {
+        try { 
+            DynaCorbaRequest request = new DynaCorbaRequest(remoteObject, "scaService", false);
+            request.setReferenceClass(referenceClass);
+            request.setOutputType(String.class);
+            request.addExceptionType(WrappedSCAException.class);
+            java.lang.Object[] args = msg.getBody();
+            OMElement omElement = (OMElement)args[0];
+            String arg = omElement.toStringWithConsume();
+            request.addArgument(arg);
+            DynaCorbaResponse response = request.invoke();
+            OMElement responseOM = AXIOMUtil.stringToOM((String)response.getContent());
+            msg.setBody(responseOM);
+        } catch (WrappedSCAException e) {
+            try {
+                OMElement exceptionOM = AXIOMUtil.stringToOM(e.getFault());
+                AxisFault axisFault = new AxisFault("");
+                axisFault.setDetail(exceptionOM);
+                FaultException f = new FaultException(axisFault.getMessage(), axisFault.getDetail(), axisFault);
+                f.setFaultName(axisFault.getDetail().getQName());
+                msg.setFaultBody(f);
+            } catch (XMLStreamException e1) {
+            }
+        } catch (RequestConfigurationException e) {
+            throw new ServiceRuntimeException(e);
+        } catch (Exception e) {
+            msg.setFaultBody(e);
+        }
+        return msg;
+    }
+}

Propchange: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/CorbaSCAInvoker.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java?rev=681232&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java (added)
+++ tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java Wed Jul 30 15:36:12 2008
@@ -0,0 +1,43 @@
+/*
+ * 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.binding.sca.corba.impl;
+
+public class WrappedSCAException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+    public String fault;
+
+    public WrappedSCAException() {
+
+    }
+
+    public WrappedSCAException(String fault) {
+        this.fault = fault;
+    }
+
+    public String getFault() {
+        return fault;
+    }
+
+    public void setFault(String fault) {
+        this.fault = fault;
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-sca-corba/src/main/java/org/apache/tuscany/sca/binding/sca/corba/impl/WrappedSCAException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date