summaryrefslogtreecommitdiffstats
path: root/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java
diff options
context:
space:
mode:
authordims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
committerdims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
commitbdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a (patch)
tree38a92061c0793434c4be189f1d70c3458b6bc41d /sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java
Move Tuscany from Incubator to top level.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java')
-rw-r--r--sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java115
1 files changed, 115 insertions, 0 deletions
diff --git a/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java
new file mode 100644
index 0000000000..baae50677a
--- /dev/null
+++ b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/AbstractDestination.java
@@ -0,0 +1,115 @@
+/*
+ * 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.hessian.destination;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.spi.model.physical.PhysicalOperationDefinition;
+import org.apache.tuscany.spi.wire.InvocationChain;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.apache.tuscany.spi.wire.Wire;
+
+import com.caucho.hessian.io.AbstractHessianInput;
+import com.caucho.hessian.io.AbstractHessianOutput;
+import org.apache.tuscany.hessian.Destination;
+import org.apache.tuscany.hessian.InvocationException;
+import org.apache.tuscany.hessian.TypeNotFoundException;
+
+/**
+ * Base implementation of a Destination
+ *
+ * @version $Rev$ $Date$
+ */
+public class AbstractDestination implements Destination {
+ protected Map<String, ChainHolder> chains;
+ private ClassLoader loader;
+
+ protected AbstractDestination(Wire wire, ClassLoader loader) throws TypeNotFoundException {
+ this.loader = loader;
+ chains = new HashMap<String, ChainHolder>();
+ for (Map.Entry<PhysicalOperationDefinition, InvocationChain> entry : wire.getPhysicalInvocationChains()
+ .entrySet()) {
+ PhysicalOperationDefinition operation = entry.getKey();
+ String operationName = operation.getName();
+ InvocationChain chain = entry.getValue();
+ List<String> params = operation.getParameters();
+ Class<?>[] paramTypes = new Class<?>[params.size()];
+ // load the param types in the target's classloader
+ for (int i = 0; i < params.size(); i++) {
+ String param = params.get(i);
+ try {
+ paramTypes[i] = loader.loadClass(param);
+ } catch (ClassNotFoundException e) {
+ throw new TypeNotFoundException("Operation parameter type not found", operationName, e);
+ }
+ }
+ AbstractDestination.ChainHolder holder =
+ new AbstractDestination.ChainHolder(paramTypes, chain);
+ chains.put(operationName, holder);
+ }
+ }
+
+ public void invoke(AbstractHessianInput in, AbstractHessianOutput out) throws InvocationException {
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ // ensure serialization is done on the target classloader
+ Thread.currentThread().setContextClassLoader(loader);
+ in.readCall();
+ String m = in.readMethod();
+ ChainHolder holder = chains.get(m);
+ if (holder == null) {
+ out.startReply();
+ out.writeFault("OperationNotFound", "The service has no method named: " + m, null);
+ out.completeReply();
+ return;
+ }
+ Class<?>[] paramType = holder.types;
+ Object[] values = new Object[paramType.length];
+ for (int n = 0; n < paramType.length; n++) {
+ values[n] = in.readObject(paramType[n]);
+ }
+ in.completeCall();
+ Message msg = new MessageImpl();
+ InvocationChain chain = holder.chain;
+ Message ret = chain.getHeadInterceptor().invoke(msg);
+ out.startReply();
+ Object o = ret.getBody();
+ out.writeObject(o);
+ out.completeReply();
+ } catch (IOException e) {
+ throw new InvocationException(e);
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+
+ protected class ChainHolder {
+ Class<?>[] types;
+ InvocationChain chain;
+
+ public ChainHolder(Class<?>[] types, InvocationChain chain) {
+ this.types = types;
+ this.chain = chain;
+ }
+ }
+}