diff options
Diffstat (limited to 'sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination')
3 files changed, 221 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; + } + } +} diff --git a/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/HttpDestination.java b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/HttpDestination.java new file mode 100644 index 0000000000..cd6281e8bd --- /dev/null +++ b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/HttpDestination.java @@ -0,0 +1,71 @@ +/* + * 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 javax.servlet.Servlet; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.apache.tuscany.spi.wire.Wire; + +import com.caucho.hessian.io.HessianInput; +import com.caucho.hessian.io.HessianOutput; +import org.apache.tuscany.hessian.InvocationException; +import org.apache.tuscany.hessian.TypeNotFoundException; + +/** + * A Destination implementation which receives requests over HTTP using a servlet engine + * + * @version $Rev$ $Date$ + */ +public class HttpDestination extends AbstractDestination implements Servlet { + + public HttpDestination(Wire wire, ClassLoader loader) + throws TypeNotFoundException { + super(wire, loader); + } + + public void service(ServletRequest req, ServletResponse resp) + throws ServletException, IOException { + try { + invoke(new HessianInput(req.getInputStream()), new HessianOutput(resp.getOutputStream())); + } catch (InvocationException e) { + throw new ServletException(e); + } + } + + public void init(ServletConfig servletConfig) throws ServletException { + + } + + public ServletConfig getServletConfig() { + return null; + } + + public String getServletInfo() { + return null; + } + + public void destroy() { + + } +} diff --git a/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/LocalDestination.java b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/LocalDestination.java new file mode 100644 index 0000000000..55946f96e7 --- /dev/null +++ b/sandbox/old/contrib/binding-hessian/binding/src/main/java/org/apache/tuscany/hessian/destination/LocalDestination.java @@ -0,0 +1,35 @@ +/* + * 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 org.apache.tuscany.spi.wire.Wire; + +import org.apache.tuscany.hessian.TypeNotFoundException; + +/** + * A Destination implementation which receives requests over an in-VM transport + * + * @version $Rev$ $Date$ + */ +public class LocalDestination extends AbstractDestination { + + public LocalDestination(Wire wire, ClassLoader loader) throws TypeNotFoundException { + super(wire, loader); + } +} |