summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/binding-rest-runtime/src/main
diff options
context:
space:
mode:
authorantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2009-04-24 11:08:18 +0000
committerantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2009-04-24 11:08:18 +0000
commit89880933c273c7bdb71d78370054254ea3a8775b (patch)
tree9832bd944316bc73d2110ce3096d4b494a2821be /java/sca/modules/binding-rest-runtime/src/main
parentff516ad9a8d2d95b00dc0a640478f0cb4af54860 (diff)
TUSCANY-2919: Start commiting contribution from Prateek Temkar for JAX-RS Support in Tuscany
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@768260 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingForJersey.java181
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java45
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java64
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTReferenceBindingProvider.java70
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java148
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceServlet.java138
-rw-r--r--java/sca/modules/binding-rest-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory19
7 files changed, 665 insertions, 0 deletions
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingForJersey.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingForJersey.java
new file mode 100644
index 0000000000..c25a629829
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingForJersey.java
@@ -0,0 +1,181 @@
+package org.apache.tuscany.sca.binding.rest;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.binding.rest.provider.RESTServiceServlet;
+
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+
+import com.sun.jersey.tuscany.common.CommonInterface;
+
+public class RESTBindingForJersey implements CommonInterface{
+
+ /**
+ * This map will save the mappings between the serviceInterface
+ * and the HttpServlet instance which will be passed by RESTServiceServlet
+ *
+ */
+ private static HashMap<String, RESTServiceServlet> interfacenameServletMap = new HashMap<String, RESTServiceServlet>();
+
+ /**
+ * This is used to store the contextPath for the web application.
+ * It will be set in RESTServiceServlet
+ * It is currently being used by org.apache.tuscany.sca.implementation.java.invocation.JavaImplementationInvoker
+ *
+ */
+ private static String contextPath;
+
+ /**
+ * updateInterfacenameServletMap() is called from RESTServiceServlet.
+ */
+ public static void updateInterfacenameServletMap(String interfaceName, RESTServiceServlet restServiceServlet){
+
+ //check if the class name already exists. if it does, do not add it.
+ Set set = interfacenameServletMap.entrySet();
+ Iterator hashIt = set.iterator();
+ boolean classFoundFlag = false;
+ while(hashIt.hasNext()){
+ Map.Entry me = (Map.Entry)hashIt.next();
+ if(interfaceName.equals( (String)me.getKey() )){
+ classFoundFlag = true;
+ }
+ }
+
+ //if it is not already in map, add it to the map
+ if(classFoundFlag == false){
+ interfacenameServletMap.put(interfaceName, restServiceServlet);
+ }
+
+ }
+
+ /**
+ * @param clazz The class whose method has been invoked
+ * @return restServiceServlet
+ * Find the matching interface for the class in the hashMap and return the corresponding RESTServiceServlet instance
+ */
+ public static RESTServiceServlet findRESTServiceServletFromClass(Class clazz){
+ RESTServiceServlet restServiceServlet = null;
+ Set set = interfacenameServletMap.entrySet();
+ Iterator hashIt = set.iterator();
+ while(hashIt.hasNext()){
+ Map.Entry me = (Map.Entry)hashIt.next();
+ if( (clazz.getSimpleName()).equals( (String)me.getKey() ) )
+ {
+ restServiceServlet = (RESTServiceServlet)me.getValue();
+ break;
+ }
+ }
+ return restServiceServlet;
+ }
+
+ /**
+ * @param interfaceList This will contain the list of all the interfaces the class (which declares the method) implements
+ * @return restServiceServlet
+ * Go through the interfaceList array and find the matching interface in the hashMap and return the corresponding RESTServiceServlet instance
+ */
+
+ public static RESTServiceServlet findRESTServiceServletFromInterfaceList(Class[] interfaceList){
+ RESTServiceServlet restServiceServlet = null;
+ Set set = interfacenameServletMap.entrySet();
+ Iterator hashIt = set.iterator();
+ //label the outer for loop so that when a match is found, just break out of the whole thing
+ outerForLoop:
+ for(int i=0; i<interfaceList.length; i++){
+ //if the name of the interface matches any key in the map, return the corresponding servlet
+ while(hashIt.hasNext()){
+ Map.Entry me = (Map.Entry)hashIt.next();
+ if( (interfaceList[i].getSimpleName()).equals( (String)me.getKey() ) )
+ {
+ restServiceServlet = (RESTServiceServlet)me.getValue();
+ break outerForLoop;
+ }
+ }
+ }
+ return restServiceServlet;
+ }
+
+
+ /**
+ * Prateek: This class implements CommonInterface.
+ * com.sun.jersey.impl.model.method.dispatch.EntityParamDispatchProvider (in Jersey)
+ * also implements this CommonInterface.
+ * EntityParamDispatchProvider invokes returnResult using a handle to the interface.
+ */
+ public Object returnResult(Method meth, Object[] params) throws InvocationTargetException{
+
+ //from the meth object, get the name of the class and then the interface
+ // look up interfacenameServletMap to get the HttpServlet instance and use the
+ //'componentService, binding, serviceContract from there
+ Class clazz = meth.getDeclaringClass();
+
+ Class[] interfaceList = clazz.getInterfaces();
+ RESTServiceServlet restServiceServlet = findRESTServiceServletFromInterfaceList(interfaceList);
+
+ //if the SCA service interface is not a Java Interface but a Java class, then restServiceServlet above will be null
+ //In that case the map will have the mapping of the Java Class and the RESTServiceServlet instance.
+ if(restServiceServlet == null){
+ restServiceServlet = findRESTServiceServletFromClass(clazz);
+ }
+
+ Binding binding = restServiceServlet.getBinding();
+ RuntimeComponentService componentService = restServiceServlet.getComponentService();
+ InterfaceContract serviceContract = restServiceServlet.getServiceContract();
+
+ String method = "Service." + meth.getName();
+
+ //invoke the request
+ RuntimeWire wire = componentService.getRuntimeWire(binding, serviceContract);
+ Operation restOperation = findOperation(method, serviceContract);
+
+ Object result = null;
+
+ try {
+ result = wire.invoke(restOperation, params);
+ return result;
+ } catch (InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private static Operation findOperation(String method,InterfaceContract serviceContract) {
+ if (method.contains(".")) {
+ method = method.substring(method.lastIndexOf(".") + 1);
+ }
+
+ List<Operation> operations = serviceContract.getInterface().getOperations();
+ //componentService.getBindingProvider(binding).getBindingInterfaceContract().getInterface().getOperations();
+
+
+ Operation result = null;
+ for (Operation o : operations) {
+ if (o.getName().equalsIgnoreCase(method)) {
+ result = o;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ public static String getContextPath() {
+ return contextPath;
+ }
+
+ public static void setContextPath(String contextPath) {
+ RESTBindingForJersey.contextPath = contextPath;
+ }
+
+}
+
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
new file mode 100644
index 0000000000..9b3f78133d
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java
@@ -0,0 +1,45 @@
+/*
+ * 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.rest.provider;
+
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+
+/**
+ * Invoker for the REST Binding
+ *
+ * @version $Rev: 665897 $ $Date: 2008-06-09 22:31:03 +0100 (Mon, 09 Jun 2008) $
+ */
+public class RESTBindingInvoker implements Invoker {
+ Operation operation;
+ String uri;
+
+ public RESTBindingInvoker(Operation operation, String uri) {
+ this.operation = operation;
+ this.uri = uri;
+ }
+
+ public Message invoke(Message msg) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java
new file mode 100644
index 0000000000..cf6b51e5bf
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java
@@ -0,0 +1,64 @@
+/*
+ * 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.rest.provider;
+
+import org.apache.tuscany.sca.binding.rest.RESTBinding;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.host.http.ServletHost;
+import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * REST Provider Factory
+ *
+ * @version $Rev: 665897 $ $Date: 2008-06-09 22:31:03 +0100 (Mon, 09 Jun 2008) $
+ */
+public class RESTBindingProviderFactory implements BindingProviderFactory<RESTBinding> {
+
+ private ServletHost servletHost;
+
+ public RESTBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
+ ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class);
+ this.servletHost = servletHosts.getServletHosts().get(0);
+ }
+
+ public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component,
+ RuntimeComponentReference reference,
+ RESTBinding binding) {
+
+ return new RESTReferenceBindingProvider(component, reference, binding);
+ }
+
+ public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component,
+ RuntimeComponentService service,
+ RESTBinding binding) {
+ return new RESTServiceBindingProvider(component, service, binding, servletHost);
+ }
+
+ public Class<RESTBinding> getModelType() {
+ return RESTBinding.class;
+ }
+
+}
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTReferenceBindingProvider.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTReferenceBindingProvider.java
new file mode 100644
index 0000000000..0770934769
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTReferenceBindingProvider.java
@@ -0,0 +1,70 @@
+/*
+ * 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.rest.provider;
+
+import org.apache.tuscany.sca.binding.rest.RESTBinding;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+
+/**
+ * Implementation of the REST Binding Provider for References
+ *
+ * @version $Rev: 665897 $ $Date: 2008-06-09 22:31:03 +0100 (Mon, 09 Jun 2008) $
+ */
+public class RESTReferenceBindingProvider implements ReferenceBindingProvider {
+
+ private RuntimeComponentReference reference;
+ private RESTBinding binding;
+
+ public RESTReferenceBindingProvider(RuntimeComponent component,
+ RuntimeComponentReference reference,
+ RESTBinding binding) {
+ this.reference = reference;
+ this.binding = binding;
+
+ }
+
+ public InterfaceContract getBindingInterfaceContract() {
+ return reference.getInterfaceContract();
+ }
+
+ public Invoker createInvoker(Operation operation) {
+ return new RESTBindingInvoker(operation, binding.getURI());
+ }
+
+ public void start() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void stop() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+}
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
new file mode 100644
index 0000000000..67604832fc
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java
@@ -0,0 +1,148 @@
+/*
+ * 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.rest.provider;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.sca.binding.rest.RESTBinding;
+import org.apache.tuscany.sca.host.http.ServletHost;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * Implementation of the REST Binding Provider for Services
+ *
+ * @version $Rev: 683451 $ $Date: 2008-08-07 00:59:24 +0100 (Thu, 07 Aug 2008) $
+ */
+public class RESTServiceBindingProvider implements ServiceBindingProvider {
+
+
+
+
+ private RuntimeComponent component;
+ private RuntimeComponentService service;
+ private InterfaceContract serviceContract;
+ private RESTBinding binding;
+ private ServletHost servletHost;
+ private List<String> servletMappings = new ArrayList<String>();
+
+ public RESTServiceBindingProvider(RuntimeComponent component,
+ RuntimeComponentService service,
+ RESTBinding binding,
+ ServletHost servletHost) {
+ this.component = component;
+ this.service = service;
+ this.binding = binding;
+ this.servletHost = servletHost;
+
+ //clone the service contract to avoid databinding issues
+ try {
+ this.serviceContract = (InterfaceContract)service.getInterfaceContract().clone();
+ } catch(CloneNotSupportedException e) {
+ this.serviceContract = service.getInterfaceContract();
+ }
+
+ }
+
+ public InterfaceContract getBindingInterfaceContract() {
+ return service.getInterfaceContract();
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+ public void start() {
+
+ // Determine the service business interface
+ Class<?> serviceInterface = getTargetJavaClass(serviceContract.getInterface());
+
+ // Create a Java proxy to the target service
+ //ProxyFactory proxyFactory = new JDKProxyFactory();
+ Object proxy = component.getComponentContext().createSelfReference(serviceInterface, service).getService();
+ //Object proxy = proxyFactory.createProxy(serviceInterface, service.getRuntimeWire(binding));
+
+ // Create and register a servlet for this service
+ RESTServiceServlet serviceServlet =
+ new RESTServiceServlet(binding, service, serviceContract, serviceInterface, proxy);
+
+ //Prateek: to add 'rest/' before the name of the service so that it could be added to url-pattern for the filter
+// String tempURI = binding.getURI();
+// binding.setURI("rest" + tempURI);
+
+ String mapping = binding.getURI();
+ if (!mapping.endsWith("/")) {
+ mapping += "/";
+ }
+ if (!mapping.endsWith("*")) {
+ mapping += "*";
+ }
+
+ servletHost.addServletMapping(mapping, serviceServlet);
+ servletMappings.add(mapping);
+ servletHost.addServletMapping(binding.getURI(), serviceServlet);
+ servletMappings.add(binding.getURI());
+
+ //Prateek: add /rest for reverse-compatibility
+ servletHost.addServletMapping("/rest" + mapping, serviceServlet);
+ servletMappings.add("/rest" + mapping);
+ servletHost.addServletMapping("/rest" + binding.getURI(), serviceServlet);
+ servletMappings.add("/rest" + binding.getURI());
+
+ // Save the actual binding URI
+ binding.setURI(servletHost.getURLMapping(binding.getURI()).toString());
+
+ // Register service to scaDomain.js
+ int port;
+ URI uri = URI.create(binding.getURI());
+ port = uri.getPort();
+ if (port == -1) {
+ port = servletHost.getDefaultPort();
+ }
+ }
+
+ public void stop() {
+
+ // Remove the servlet mappings we've added
+ for (String mapping: servletMappings) {
+ servletHost.removeServletMapping(mapping);
+
+ //Prateek: for /rest
+ servletHost.removeServletMapping("/rest" + mapping);
+ }
+
+ }
+
+ private Class<?> getTargetJavaClass(Interface targetInterface) {
+ // TODO: right now assume that the target is always a Java
+ // Implementation. Need to figure out how to generate Java
+ // Interface in cases where the target is not a Java Implementation
+ return ((JavaInterface)targetInterface).getJavaClass();
+ }
+
+
+
+}
diff --git a/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceServlet.java b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceServlet.java
new file mode 100644
index 0000000000..6a73f55649
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceServlet.java
@@ -0,0 +1,138 @@
+/*
+ * 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.rest.provider;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServlet;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.binding.rest.RESTBindingForJersey;
+import org.apache.tuscany.sca.host.webapp.WebAppServletHost;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+
+import com.sun.jersey.impl.container.servlet.ServletAdaptor;
+
+import com.sun.jersey.tuscany.common.CommonDataStructures;
+import com.sun.jersey.tuscany.common.CommonInterface;
+/**
+ * Servlet that handles REST requests invoking SCA services.
+ *
+ * There is an instance of this Servlet for each <binding.rest>
+ */
+public class RESTServiceServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ transient Binding binding;
+ transient String serviceName;
+ transient Object serviceInstance;
+ transient RuntimeComponentService componentService;
+ transient InterfaceContract serviceContract;
+ transient Class<?> serviceInterface;
+
+ private ServletConfig servletConfig;
+ private ServletContext servletContext;
+
+ private static ServletAdaptor jerseyServletContainer;
+
+ public RESTServiceServlet(Binding binding,
+ RuntimeComponentService componentService,
+ InterfaceContract serviceContract,
+ Class<?> serviceInterface,
+ Object serviceInstance) {
+ this.binding = binding;
+ this.serviceName = binding.getName();
+ this.componentService = componentService;
+ this.serviceContract = serviceContract;
+ this.serviceInterface = serviceInterface;
+ this.serviceInstance = serviceInstance;
+
+ //The interface name will be stored in a HashMap in the RESTBindingForJersey class along with a
+ //reference to this servlet
+ RESTBindingForJersey.updateInterfacenameServletMap(serviceInterface.getSimpleName(), this);
+
+ }
+
+
+ /* (non-Javadoc)
+ * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
+ */
+ @Override
+ public void init(ServletConfig config) {
+ try{
+
+ servletConfig = config;
+ servletContext = servletConfig.getServletContext();
+ String contextPath = servletContext.getContextPath();
+ RESTBindingForJersey.setContextPath(contextPath);
+
+ //The following code has been moved to the host-webapp modlue.
+ //(org.apache.tuscany.sca.host.webapp.WebAppServletHost)
+
+ //jerseyServletContainer.init(config);
+
+ //Setting the reference below in CommonDataStructures for
+ //com.sun.jersey.impl.model.method.dispatch.EntityParamDispatchProvider
+ //to be able to invoke the method returnResult() method.
+ CommonInterface commonInterface = new RESTBindingForJersey();
+ CommonDataStructures.setCommonInterface(commonInterface);
+
+ }catch(Exception e){
+ e.printStackTrace(System.out);
+ }
+ }
+
+ @Override
+ public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ try{
+ jerseyServletContainer = WebAppServletHost.getJerseyServletContainer();
+ jerseyServletContainer.service(request, response);
+ }catch(ServletException e){
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public Binding getBinding() {
+ return binding;
+ }
+
+
+ public RuntimeComponentService getComponentService() {
+ return componentService;
+ }
+
+
+ public InterfaceContract getServiceContract() {
+ return serviceContract;
+ }
+
+
+ public static void setJerseyServletContainer(
+ ServletAdaptor jerseyServletContainer) {
+ RESTServiceServlet.jerseyServletContainer = jerseyServletContainer;
+ }
+
+}
diff --git a/java/sca/modules/binding-rest-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory b/java/sca/modules/binding-rest-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory
new file mode 100644
index 0000000000..4a682c1cb6
--- /dev/null
+++ b/java/sca/modules/binding-rest-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the binding extension
+org.apache.tuscany.sca.binding.rest.provider.RESTBindingProviderFactory;model=org.apache.tuscany.sca.binding.rest.RESTBinding