From 89880933c273c7bdb71d78370054254ea3a8775b Mon Sep 17 00:00:00 2001 From: antelder Date: Fri, 24 Apr 2009 11:08:18 +0000 Subject: 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 --- .../binding-rest-runtime/META-INF/MANIFEST.MF | 18 ++ java/sca/modules/binding-rest-runtime/pom.xml | 140 ++++++++++++++++ .../sca/binding/rest/RESTBindingForJersey.java | 181 +++++++++++++++++++++ .../binding/rest/provider/RESTBindingInvoker.java | 45 +++++ .../rest/provider/RESTBindingProviderFactory.java | 64 ++++++++ .../provider/RESTReferenceBindingProvider.java | 70 ++++++++ .../rest/provider/RESTServiceBindingProvider.java | 148 +++++++++++++++++ .../binding/rest/provider/RESTServiceServlet.java | 138 ++++++++++++++++ ...che.tuscany.sca.provider.BindingProviderFactory | 19 +++ java/sca/modules/binding-rest/META-INF/MANIFEST.MF | 18 ++ java/sca/modules/binding-rest/pom.xml | 62 +++++++ .../tuscany/sca/binding/rest/RESTBinding.java | 31 ++++ .../sca/binding/rest/RESTBindingFactory.java | 35 ++++ .../binding/rest/impl/RESTBindingFactoryImpl.java | 38 +++++ .../sca/binding/rest/impl/RESTBindingImpl.java | 62 +++++++ ...che.tuscany.sca.binding.rest.RESTBindingFactory | 19 +++ ...ca.contribution.processor.StAXArtifactProcessor | 19 +++ java/sca/samples/webapps/helloworld-rest/README | 37 +++++ java/sca/samples/webapps/helloworld-rest/pom.xml | 80 +++++++++ .../java/helloworldrest/ClientJavaTestService.java | 29 ++++ .../helloworldrest/ClientTestServiceWebapp.java | 105 ++++++++++++ .../java/helloworldrest/HelloWorldService.java | 11 ++ .../java/helloworldrest/HelloWorldServiceImpl.java | 47 ++++++ .../src/main/resources/rest.composite | 37 +++++ .../src/main/webapp/HelloWorldJSONRPC.html | 75 +++++++++ .../src/main/webapp/META-INF/sca-contribution.xml | 26 +++ .../src/main/webapp/WEB-INF/web.xml | 35 ++++ .../helloworld-rest/src/main/webapp/style.css | 22 +++ .../helloworld-rest/target/classes/rest.composite | 37 +++++ 29 files changed, 1648 insertions(+) create mode 100644 java/sca/modules/binding-rest-runtime/META-INF/MANIFEST.MF create mode 100644 java/sca/modules/binding-rest-runtime/pom.xml create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingForJersey.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingInvoker.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTBindingProviderFactory.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTReferenceBindingProvider.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceBindingProvider.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/java/org/apache/tuscany/sca/binding/rest/provider/RESTServiceServlet.java create mode 100644 java/sca/modules/binding-rest-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory create mode 100644 java/sca/modules/binding-rest/META-INF/MANIFEST.MF create mode 100644 java/sca/modules/binding-rest/pom.xml create mode 100644 java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBinding.java create mode 100644 java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingFactory.java create mode 100644 java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingFactoryImpl.java create mode 100644 java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java create mode 100644 java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.rest.RESTBindingFactory create mode 100644 java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor create mode 100644 java/sca/samples/webapps/helloworld-rest/README create mode 100644 java/sca/samples/webapps/helloworld-rest/pom.xml create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientJavaTestService.java create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientTestServiceWebapp.java create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldService.java create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldServiceImpl.java create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/resources/rest.composite create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/webapp/HelloWorldJSONRPC.html create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/webapp/META-INF/sca-contribution.xml create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/webapp/WEB-INF/web.xml create mode 100644 java/sca/samples/webapps/helloworld-rest/src/main/webapp/style.css create mode 100644 java/sca/samples/webapps/helloworld-rest/target/classes/rest.composite (limited to 'java/sca') diff --git a/java/sca/modules/binding-rest-runtime/META-INF/MANIFEST.MF b/java/sca/modules/binding-rest-runtime/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..f4f7d9fb4b --- /dev/null +++ b/java/sca/modules/binding-rest-runtime/META-INF/MANIFEST.MF @@ -0,0 +1,18 @@ +Manifest-Version: 1.0 +Export-Package: org.apache.tuscany.sca.binding.rest.runtime;version="2.0.0";uses:="org.apache.tuscany.sca.assembly" +Tool: Bnd-0.0.255 +Bundle-Name: Apache Tuscany SCA REST Binding Runtime +Created-By: 1.6.0_07 (Sun Microsystems Inc.) +Bundle-Vendor: The Apache Software Foundation +Bundle-Version: 2.0.0 +Bnd-LastModified: 1225397320062 +Bundle-ManifestVersion: 2 +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-Description: Apache Tuscany SCA REST Binding Model +Import-Package: org.apache.tuscany.sca.assembly;version="2.0.0", + org.apache.tuscany.sca.assembly.xml;version="2.0.0";resolution:=optional, + org.apache.tuscany.sca.binding.jsonp.runtime;version="2.0.0". + org.apache.tuscany.sca.binding.jsonp;version="2.0.0" +Bundle-SymbolicName: org.apache.tuscany.sca.binding.rest.runtime +Bundle-DocURL: http://www.apache.org/ +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/java/sca/modules/binding-rest-runtime/pom.xml b/java/sca/modules/binding-rest-runtime/pom.xml new file mode 100644 index 0000000000..326a5cdee7 --- /dev/null +++ b/java/sca/modules/binding-rest-runtime/pom.xml @@ -0,0 +1,140 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-modules + 2.0-SNAPSHOT + ../pom.xml + + + tuscany-binding-rest-runtime + Apache Tuscany SCA REST Binding Runtime + + + + org.apache.tuscany.sca + tuscany-binding-rest + 2.0-SNAPSHOT + + + jersey-bundle + jersey-bundle + 1.0.1-SNAPSHOT + compile + + + org.apache.tuscany.sca + tuscany-core-spi + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-core + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-databinding + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-host-http + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-host-webapp + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-host-jetty + 2.0-SNAPSHOT + test + + + + javax.servlet + servlet-api + 2.5 + provided + + + + commons-logging + commons-logging + 1.1.1 + + + commons-logging + commons-logging + + + javax.servlet + servlet-api + + + + + + + + org.apache.tuscany.sca + tuscany-host-embedded + 2.0-SNAPSHOT + test + + + + org.apache.tuscany.sca + tuscany-implementation-java-runtime + 2.0-SNAPSHOT + test + + + + junit + junit + 4.5 + test + + + + httpunit + httpunit + 1.6.1 + test + + + + + + + + + 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 interfacenameServletMap = new HashMap(); + + /** + * 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 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 { + + 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 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 servletMappings = new ArrayList(); + + 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 + */ +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 diff --git a/java/sca/modules/binding-rest/META-INF/MANIFEST.MF b/java/sca/modules/binding-rest/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..bd8e7e4972 --- /dev/null +++ b/java/sca/modules/binding-rest/META-INF/MANIFEST.MF @@ -0,0 +1,18 @@ +Manifest-Version: 1.0 +Export-Package: org.apache.tuscany.sca.binding.rest;version="2.0.0";uses:="org.apache.tuscany.sca.assembly" +Private-Package: org.apache.tuscany.sca.binding.rest.impl;version="2.0.0" +Tool: Bnd-0.0.255 +Bundle-Name: Apache Tuscany SCA REST Binding Model +Created-By: 1.6.0_07 (Sun Microsystems Inc.) +Bundle-Vendor: The Apache Software Foundation +Bundle-Version: 2.0.0 +Bnd-LastModified: 1225397320062 +Bundle-ManifestVersion: 2 +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-Description: Apache Tuscany SCA REST Binding Model +Import-Package: org.apache.tuscany.sca.assembly;version="2.0.0", + org.apache.tuscany.sca.assembly.xml;version="2.0.0";resolution:=optional, + org.apache.tuscany.sca.binding.jsonp;version="2.0.0" +Bundle-SymbolicName: org.apache.tuscany.sca.binding.rest +Bundle-DocURL: http://www.apache.org/ +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/java/sca/modules/binding-rest/pom.xml b/java/sca/modules/binding-rest/pom.xml new file mode 100644 index 0000000000..26ddb173d2 --- /dev/null +++ b/java/sca/modules/binding-rest/pom.xml @@ -0,0 +1,62 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-modules + 2.0-SNAPSHOT + ../pom.xml + + + tuscany-binding-rest + Apache Tuscany SCA REST Binding Model + + + + org.apache.tuscany.sca + tuscany-assembly + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-policy + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-interface-java + 2.0-SNAPSHOT + + + + junit + junit + 4.5 + test + + + + + + + diff --git a/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBinding.java b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBinding.java new file mode 100644 index 0000000000..6a3df42cc0 --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBinding.java @@ -0,0 +1,31 @@ +/* + * 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; + +import org.apache.tuscany.sca.assembly.Binding; + +/** + * A model for the REST binding. + * + * @version $Rev: 705760 $ $Date: 2008-10-17 22:29:28 +0100 (Fri, 17 Oct 2008) $ + */ +public interface RESTBinding extends Binding { + +} diff --git a/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingFactory.java b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingFactory.java new file mode 100644 index 0000000000..0db1c827a1 --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/RESTBindingFactory.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.sca.binding.rest; + + +/** + * Factory for the REST binding model. + * + * @version $Rev: 705760 $ $Date: 2008-10-17 22:29:28 +0100 (Fri, 17 Oct 2008) $ +*/ +public interface RESTBindingFactory { + + /** + * Creates a new REST Binding + * @return a new REST Binding + */ + RESTBinding createRESTBinding(); +} diff --git a/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingFactoryImpl.java b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingFactoryImpl.java new file mode 100644 index 0000000000..3e68bc1cbd --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingFactoryImpl.java @@ -0,0 +1,38 @@ +/* + * 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.impl; + +import org.apache.tuscany.sca.binding.rest.RESTBinding; +import org.apache.tuscany.sca.binding.rest.RESTBindingFactory; + + +/** + * Factory for the REST binding model. + * + * @version $Rev: 705760 $ $Date: 2008-10-17 22:29:28 +0100 (Fri, 17 Oct 2008) $ +*/ +public class RESTBindingFactoryImpl implements RESTBindingFactory { + + public RESTBinding createRESTBinding() { + return new RESTBindingImpl(); + } + + +} diff --git a/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java new file mode 100644 index 0000000000..f7903c3842 --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/java/org/apache/tuscany/sca/binding/rest/impl/RESTBindingImpl.java @@ -0,0 +1,62 @@ +/* + * 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.impl; + +import org.apache.tuscany.sca.binding.rest.RESTBinding; + +/** + * A model for the REST binding. + * + * @version $Rev: 705760 $ $Date: 2008-10-17 22:29:28 +0100 (Fri, 17 Oct 2008) $ + */ +public class RESTBindingImpl implements RESTBinding { + private String name; + private String uri; + + public String getName() { + return name; + } + + public String getURI() { + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isUnresolved() { + // The binding is always resolved + return false; + } + + public void setUnresolved(boolean unresolved) { + // The binding is always resolved + } + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.rest.RESTBindingFactory b/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.rest.RESTBindingFactory new file mode 100644 index 0000000000..8b3c1c1420 --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.rest.RESTBindingFactory @@ -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 model factory +org.apache.tuscany.sca.binding.rest.impl.RESTBindingFactoryImpl diff --git a/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor new file mode 100644 index 0000000000..1a922c4621 --- /dev/null +++ b/java/sca/modules/binding-rest/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor @@ -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 artifact processor extension +org.apache.tuscany.sca.assembly.xml.DefaultBeanModelProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#binding.rest,model=org.apache.tuscany.sca.binding.rest.RESTBinding,factory=org.apache.tuscany.sca.binding.rest.RESTBindingFactory diff --git a/java/sca/samples/webapps/helloworld-rest/README b/java/sca/samples/webapps/helloworld-rest/README new file mode 100644 index 0000000000..00568d9bb0 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/README @@ -0,0 +1,37 @@ +Hello World REST Sample +======================= + +Sample Overview +--------------- +The service 'HelloWorldService' is exposed using the REST binding. + +helloworld-jsonrpc-webapp/ + src/ + main/ + java/ + helloworldjsonrpc/ + HelloWorldService.java - service interface + HelloWorldServiceImpl.java - service implementation + ClientTestServiceWebapp.java - Test class; uses java.net.HttpURLConnection to make 'GET', 'PUT', 'POST requests + resources/ + rest.composite - the SCA assembly for this sample + webapp + META-INF/ + sca-contribution.xml - specifies the composite to be deployed + WEB-INF/ + web.xml - defines the listener that starts up the + Tuscany SCA runtime + pom.xml - the Maven build file + +Build the sample using Maven. +A war 'helloworld-rest-webapp.war' will be created in the target directory. Deploy it in your web container. +You can access the service from the browser by making a simple GET request using the following URL: +http://:/helloworld-rest-webapp/HelloWorldService/helloworld/getname + +Use the test class 'ClientTestServiceWebapp' to test PUT, POST operations. + + + + + + diff --git a/java/sca/samples/webapps/helloworld-rest/pom.xml b/java/sca/samples/webapps/helloworld-rest/pom.xml new file mode 100644 index 0000000000..5513f6eb27 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/pom.xml @@ -0,0 +1,80 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-sca + 2.0-SNAPSHOT + ../../pom.xml + + helloworld-rest + war + + + + org.apache.tuscany.sca + tuscany-sca-api + 2.0-SNAPSHOT + compile + + + + org.apache.tuscany.sca + tuscany-implementation-web-runtime + 2.0-SNAPSHOT + runtime + + + + org.apache.tuscany.sca + tuscany-binding-rest-runtime + 2.0-SNAPSHOT + runtime + + + + javax.ws.rs + jsr311-api + 1.0 + compile + + + + jersey-bundle + jersey-bundle + 1.0.1-SNAPSHOT + compile + + + + junit + junit + 4.5 + test + + + + + + ${artifactId} + + + diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientJavaTestService.java b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientJavaTestService.java new file mode 100644 index 0000000000..f54472b3d7 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientJavaTestService.java @@ -0,0 +1,29 @@ +package helloworldrest; + +import org.apache.tuscany.sca.host.embedded.SCADomain; + +import helloworldrest.HelloWorldService; + +/* + * To test, simply run the program + * Access the service by invoking the getName() method of HelloWorldService + */ + +public class ClientJavaTestService { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + SCADomain scaDomain = SCADomain.newInstance("rest.composite"); + HelloWorldService helloService = + scaDomain.getService(HelloWorldService.class, "HelloWorldRESTServiceComponent"); + + //HelloWorldService helloService = new HelloWorldServiceImpl(); + System.out.println("### Message from REST service " + helloService.getName()); + + scaDomain.close(); + } + +} diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientTestServiceWebapp.java b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientTestServiceWebapp.java new file mode 100644 index 0000000000..ce087d7e53 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/ClientTestServiceWebapp.java @@ -0,0 +1,105 @@ +package helloworldrest; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Formatter; +import java.io.InputStreamReader; +import java.io.BufferedReader; + +/** + * + * To test, deploy the application as a webapp. + * Then, run this file to access the REST web service by making HTTP GET/POST requests + * + */ +public class ClientTestServiceWebapp { + + final static String UrlBase = "http://localhost:8080/helloworld-rest-webapp/HelloWorldService"; + + final static class HttpResponse { + Object content; + int code; + String message; + } + + static HttpResponse makeHttpGetRequest(String method, String url, String contentType) throws Exception { + HttpResponse response = new HttpResponse(); + URL urlAddress = new URL(url); + HttpURLConnection huc = (HttpURLConnection) urlAddress.openConnection(); + huc.setRequestMethod(method); + huc.setRequestProperty("Content-type", contentType); + huc.connect(); + InputStreamReader isr = new InputStreamReader(huc.getInputStream()); + + BufferedReader in = new BufferedReader(isr); + String uline = in.readLine(); + response.content = uline; + +// huc.disconnect(); +// System.out.println("#### huc disconnected ###"); + + return response; + } + + static HttpResponse makeHttpRequest(String method, String url, String contentType, InputStream is) throws Exception { + HttpResponse response = new HttpResponse(); + URL urlAddress = new URL(url); + HttpURLConnection huc = (HttpURLConnection) urlAddress.openConnection(); + huc.setRequestMethod(method); + if (null != is) { + huc.setDoOutput(true); + huc.setRequestProperty("Content-Type", contentType); + OutputStream os = huc.getOutputStream(); + byte[] buf = new byte[1024]; + int read; + while ((read = is.read(buf)) != -1) { + os.write(buf, 0, read); + } + } + InputStreamReader isr = new InputStreamReader(huc.getInputStream()); + BufferedReader in = new BufferedReader(isr); + String uline = in.readLine(); + response.content = uline; + return response; + } + + static HttpResponse makeHttpGetRequest(String method, String url, String contentType, String content) throws Exception { + return makeHttpRequest(method, url, contentType, new ByteArrayInputStream(content.getBytes("UTF-8"))); + } + + static HttpResponse makeHttpRequest(String method, String url) throws Exception { + return makeHttpRequest(method, url, null, (InputStream)null); + } + + public static void main(String[] args) { + try { + + HttpResponse response; + + System.out.println("Getting the name *BEFORE* setting it:"); + response = makeHttpGetRequest("GET", UrlBase + "/helloworld/getname", "text/plain"); + System.out.println(new Formatter().format("---- Received String:\n%s", response.content.toString())); + + System.out.println("Setting the name:"); + String newText = "Morpheus"; + InputStream inputStream = new ByteArrayInputStream(newText.getBytes()); + response = makeHttpRequest("PUT", UrlBase + "/helloworld/setname", "text/plain", inputStream); + + System.out.println("Getting the name *AFTER* setting it:"); + response = makeHttpGetRequest("GET", UrlBase + "/helloworld/getname", "text/plain"); + System.out.println(new Formatter().format("---- Received String:\n%s", response.content.toString())); + + System.out.println("POST Operation:"); + response = makeHttpGetRequest("POST", UrlBase + "/helloworld/postoperation/prateek", "text/plain"); + //System.out.println(new Formatter().format("---- Received String:\n%s", response.content.toString())); + + System.out.println("Getting the name *AFTER* the POST operation:"); + response = makeHttpGetRequest("GET", UrlBase + "/helloworld/getname", "text/plain"); + System.out.println(new Formatter().format("---- Received String:\n%s", response.content.toString())); + } catch (Exception e){ + System.out.println("TEST FAILED! :-("); + e.printStackTrace(System.out); + } + } +} diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldService.java b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldService.java new file mode 100644 index 0000000000..072a26e3d0 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldService.java @@ -0,0 +1,11 @@ +package helloworldrest; + +import org.osoa.sca.annotations.Remotable; + +@Remotable +public interface HelloWorldService { + + public void setName(String name); + public String getName(); + public void postOperationTest(String name); +} diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldServiceImpl.java b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldServiceImpl.java new file mode 100644 index 0000000000..6489bfaabc --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/java/helloworldrest/HelloWorldServiceImpl.java @@ -0,0 +1,47 @@ +package helloworldrest; + +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.Path; + + +@Service(HelloWorldService.class) +@Scope("Composite") +@Path("/helloworld") + +public class HelloWorldServiceImpl implements HelloWorldService { + + private String name = new String("original!"); + + @Path("/setname") + @PUT + @Consumes("text/plain") + + public void setName(String name){ + this.name = name; + + } + + //http://:/helloworld-rest-webapp/HelloWorldService/helloworld/getname + @Path("/getname") + @GET + @Produces("text/plain") + public String getName(){ + return this.name; + } + + @POST + @Path("/postoperation/{name}/") + @Consumes("text/plain") + public void postOperationTest(@PathParam("name")String name){ + this.name = name; + } + +} diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/resources/rest.composite b/java/sca/samples/webapps/helloworld-rest/src/main/resources/rest.composite new file mode 100644 index 0000000000..70b83fd986 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/resources/rest.composite @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/webapp/HelloWorldJSONRPC.html b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/HelloWorldJSONRPC.html new file mode 100644 index 0000000000..745164bf8d --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/HelloWorldJSONRPC.html @@ -0,0 +1,75 @@ + + + + Tuscany JSON-RPC HelloWorld Example + + + + + + + + + + +

Tuscany JSON-RPC HelloWorld Sample

+ + + + + + + + + + + + + + + +
Non-Dojo Example
+ This example uses the JavaScript served from + SCADomain/scaDomain.js + to make JSON-RPC requests to the SCA service 'HelloWorldService' +
RequestResponse
+

+ Name please:     + + +

+ +
+
None Yet.
+
+ + + diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/webapp/META-INF/sca-contribution.xml b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/META-INF/sca-contribution.xml new file mode 100644 index 0000000000..ca18a360c2 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/META-INF/sca-contribution.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/webapp/WEB-INF/web.xml b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..ae1bd5252c --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,35 @@ + + + + + + + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + + + + tuscany + /* + + + diff --git a/java/sca/samples/webapps/helloworld-rest/src/main/webapp/style.css b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/style.css new file mode 100644 index 0000000000..0f1cea3aaf --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/src/main/webapp/style.css @@ -0,0 +1,22 @@ +/* + * 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. + */ +* { font-family: arial; } + +table, th, td { border: 2px solid blue; border-collapse: collapse; } +th { color: white; background-color: blue; } diff --git a/java/sca/samples/webapps/helloworld-rest/target/classes/rest.composite b/java/sca/samples/webapps/helloworld-rest/target/classes/rest.composite new file mode 100644 index 0000000000..70b83fd986 --- /dev/null +++ b/java/sca/samples/webapps/helloworld-rest/target/classes/rest.composite @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + -- cgit v1.2.3