diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2010-01-27 14:40:10 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2010-01-27 14:40:10 +0000 |
commit | 39ef9a4855c593f1ea3a6bb122d5c22a50b371cb (patch) | |
tree | f0e08aa22b6c9260d3cb3c7fb0e7b8dea72ae560 | |
parent | edce121c4ed65d77bdd4a66501b04fefc0c637f6 (diff) |
Copy of the Apache Wink HelloWorld example updated to show an approach to SCA integration
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@903659 13f79535-47bb-0310-9956-ffa450edef68
10 files changed, 497 insertions, 0 deletions
diff --git a/collaboration/wink-helloworld-sca/build.xml b/collaboration/wink-helloworld-sca/build.xml new file mode 100644 index 0000000000..5461b36423 --- /dev/null +++ b/collaboration/wink-helloworld-sca/build.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> + +<project name="HelloWorld" default="dist" basedir="."> + <description> + Ant build file for Wink example Hello World + </description> + + <property name="final.war.name" value="HelloWorld.war" /> + <property name="sdk.jar.name" value="@SDK_JAR_NAME@" /> + + + <!-- set global properties for this build --> + <property name="build" location="build" /> + <property name="build.classes" location="${build}/classes" /> + <property name="sdk.base" location="${basedir}/../../.." /> + <property name="sdk.lib" location="${sdk.base}/lib" /> + <property name="sdk.dist" location="${sdk.base}/dist" /> + <property name="sdk.jar" location="${sdk.dist}/${sdk.jar.name}" /> + <property name="final.war" location="${basedir}/${final.war.name}" /> + <property name="main" location="${basedir}/src/main" /> + <property name="webapp" location="${main}/webapp" /> + <property name="resources" location="${main}/resources" /> + + + <target name="init"> + <!-- Create the build directory structure used by compile --> + <mkdir dir="${build.classes}" /> + </target> + + + <target name="compile" depends="init" description="compile the source "> + <!-- Set classpath for SDK lib --> + <path id="sdk.classpath"> + <fileset dir="${sdk.lib}" includes="**/*.jar" /> + <pathelement path="${sdk.jar}" /> + </path> + + <!-- Compile the java code --> + <javac srcdir="${main}/java" destdir="${build.classes}"> + <classpath refid="sdk.classpath" /> + </javac> + </target> + + + <target name="dist" depends="compile" description="generate the distribution"> + + <!-- Create the war file --> + <war destfile="${final.war}" webxml="${webapp}/WEB-INF/web.xml"> + <webinf dir="${webapp}/WEB-INF" includes="**/*" /> + <classes dir="${build.classes}" includes="**/*" /> + <lib dir="${sdk.lib}" includes="*.jar" /> + <lib file="${sdk.jar}" /> + </war> + </target> + + + <target name="clean" description="clean up"> + <!-- Delete the ${build} and ${dist} directory trees --> + <delete dir="${build}" /> + <delete file="${final.war}" /> + </target> + +</project> diff --git a/collaboration/wink-helloworld-sca/pom.xml b/collaboration/wink-helloworld-sca/pom.xml new file mode 100644 index 0000000000..1f2bd0b053 --- /dev/null +++ b/collaboration/wink-helloworld-sca/pom.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <!-- Project detailes --> + <modelVersion>4.0.0</modelVersion> + <artifactId>HelloWorld</artifactId> + <packaging>war</packaging> + <name>Apache Wink Examples Apps :: HelloWorld</name> + <parent> + <groupId>org.apache.wink.example</groupId> + <artifactId>apps</artifactId> + <version>1.0-incubating</version> + </parent> + <build> + <finalName>HelloWorld</finalName> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <additionalClasspathElements> + <additionalClasspathElement>${basedir}/src/main/webapp/WEB-INF</additionalClasspathElement> + </additionalClasspathElements> + </configuration> + </plugin> + </plugins> + </build> + <!-- Dependency on Wink SDK library --> + <dependencies> + <dependency> + <groupId>org.apache.wink</groupId> + <artifactId>wink-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.wink</groupId> + <artifactId>wink-component-test-support</artifactId> + </dependency> + <dependency> + <groupId>org.apache.wink</groupId> + <artifactId>wink-server</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-j2ee_1.4_spec</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.sca</groupId> + <artifactId>tuscany-sca-api</artifactId> + <version>2.0-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.sca.shades</groupId> + <artifactId>tuscany-base</artifactId> + <version>2.0-SNAPSHOT</version> + <scope>runtime</scope> + </dependency> + </dependencies> +</project> diff --git a/collaboration/wink-helloworld-sca/readme.txt b/collaboration/wink-helloworld-sca/readme.txt new file mode 100644 index 0000000000..939b22cef2 --- /dev/null +++ b/collaboration/wink-helloworld-sca/readme.txt @@ -0,0 +1,15 @@ +HelloWorld Example +=============================================================================== + +Description +=============================================================================== +- This example demonstrate the most basic implementation of a simple service +- A simple Atom feed with a "Hello World!" title is returned from this URL: + http://localhost:8080/HelloWorld/rest/world + + +Build +=============================================================================== +- see build instructions in examples/readme.txt file + +--- readme.txt EOF --- diff --git a/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/HelloWorld.java b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/HelloWorld.java new file mode 100644 index 0000000000..17e72ee05c --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/HelloWorld.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * 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.wink.example.helloworld; + +import java.util.Date; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.apache.wink.common.model.synd.SyndEntry; +import org.apache.wink.common.model.synd.SyndText; + +import org.oasisopen.sca.annotation.Reference; + +/** + * Simple example - Hello World! + * <p/> + * The SDK dispatches HTTP requests for URI + * <code>http://[host]:[port]/HelloWorld/rest/world</code>, where + * <code>HelloWorld</code> is the context root, to this class. A simple Atom + * entry is returned in HTTP response. + * <p/> + * The service document is available at URI + * <code>http://[host]:[port]/HelloWorld/rest</code> but it is empty because + * this simple demo doesn't contain any collection of resources. + * <p/> + * This resource must be registered within a JAX-RS application, this example + * uses the default usage of application /WEB-INF/application + */ +@Path("/world") +public class HelloWorld { + public static final String ID = "helloworld:1"; + + @Reference + protected SomeSCAService service; + + /** + * This method is called by the SDK for HTTP GET method requests where the + * Accept header allows the Atom media type application/atom+xml. A + * SyndEntry is created with basic information. Serialization of the + * SyndEntry to Atom entry is performed by the SDK automatically. The + * default status code of 200 (OK) is returned in the response. + * + * @return SyndEntry of the requested resource + */ + @GET + @Produces(MediaType.APPLICATION_ATOM_XML) + public SyndEntry getGreeting() { + // create and return a syndication entry with a "Hello World!" title, + // some ID and the current time. + String text = service == null ? "SCA reference not injected" : service.getGreeting("World"); + SyndEntry synd = new SyndEntry(new SyndText(text), ID, new Date()); + return synd; + } + +} diff --git a/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAService.java b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAService.java new file mode 100644 index 0000000000..e88d087f12 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAService.java @@ -0,0 +1,27 @@ +/*******************************************************************************
+ * 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.wink.example.helloworld;
+
+public interface SomeSCAService {
+
+ public String getGreeting(String name);
+
+}
diff --git a/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAServiceImpl.java b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAServiceImpl.java new file mode 100644 index 0000000000..ac69311aa4 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/java/org/apache/wink/example/helloworld/SomeSCAServiceImpl.java @@ -0,0 +1,29 @@ +/*******************************************************************************
+ * 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.wink.example.helloworld;
+
+public class SomeSCAServiceImpl implements SomeSCAService {
+
+ public String getGreeting(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/application b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/application new file mode 100644 index 0000000000..2d13210560 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/application @@ -0,0 +1,14 @@ +# 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. +org.apache.wink.example.helloworld.HelloWorld
\ No newline at end of file diff --git a/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.composite b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.composite new file mode 100644 index 0000000000..86e8937631 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples"
+ name="Helloworld">
+
+ <component name="MyWebComponent">
+ <implementation.web web-uri=""/>
+ <reference name="service" target="ServiceComponent"/>
+ </component>
+
+ <component name="ServiceComponent">
+ <implementation.java class="org.apache.wink.example.helloworld.SomeSCAServiceImpl"/>
+ </component>
+
+</composite>
diff --git a/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.xml b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..53cb501c40 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<!DOCTYPE web-app PUBLIC + "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" + "http://java.sun.com/dtd/web-app_2_3.dtd" > + +<web-app> + <display-name>Wink demo</display-name> + <description>Demonstration of SDK features</description> + + <!-- Listener to start the Tuscany webapp embedded runtime --> + <listener><listener-class>org.apache.tuscany.sca.host.webapp.TuscanyContextListener</listener-class></listener> + + <!-- + Wink SDK servlet configuration. This servlet handles HTTP requests + of SDK web service on application server. + --> + <servlet> + <servlet-name>restSdkService</servlet-name> + <servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class> + <init-param> + <param-name>applicationConfigLocation</param-name> + <param-value>/WEB-INF/application</param-value> + </init-param> + </servlet> + + <servlet-mapping> + <servlet-name>restSdkService</servlet-name> + <url-pattern>/rest/*</url-pattern> + </servlet-mapping> +</web-app> diff --git a/collaboration/wink-helloworld-sca/src/test/java/org/apache/wink/example/helloworld/HelloWorldTest.java b/collaboration/wink-helloworld-sca/src/test/java/org/apache/wink/example/helloworld/HelloWorldTest.java new file mode 100644 index 0000000000..ed121ffe29 --- /dev/null +++ b/collaboration/wink-helloworld-sca/src/test/java/org/apache/wink/example/helloworld/HelloWorldTest.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * 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.wink.example.helloworld; + +import java.io.FileNotFoundException; +import java.io.StringReader; +import java.util.Set; + +import org.apache.wink.common.http.HttpStatus; +import org.apache.wink.common.internal.application.ApplicationFileLoader; +import org.apache.wink.common.internal.utils.MediaTypeUtils; +import org.apache.wink.common.model.atom.AtomEntry; +import org.apache.wink.server.internal.servlet.MockServletInvocationTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +/** + * Test of response from HelloWorld Resource. + */ +public class HelloWorldTest extends MockServletInvocationTest { + + @Override + protected Class<?>[] getClasses() { + try { + Set<Class<?>> classes = new ApplicationFileLoader("application").getClasses(); + Class<?>[] classesArray = new Class[classes.size()]; + return classes.toArray(classesArray); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + public void testHelloWorld() throws Exception { + // prepare a mock request and an empty mock response + MockHttpServletRequest request = + constructMockRequest("GET", "/world", MediaTypeUtils.ATOM_ENTRY); + MockHttpServletResponse response = invoke(request); + + // check resulting mock response + assertEquals("HTTP status", HttpStatus.OK.getCode(), response.getStatus()); + AtomEntry entry = AtomEntry.unmarshal(new StringReader(response.getContentAsString())); + String id = entry.getId(); + assertEquals("entry id", HelloWorld.ID, id); + } + + // test helper + private MockHttpServletRequest constructMockRequest(String method, + String requestURI, + String acceptHeader) { + MockHttpServletRequest mockRequest = new MockHttpServletRequest() { + + public String getPathTranslated() { + return null; // prevent Spring to resolve the file on the + // filesystem which fails + } + + }; + mockRequest.setMethod(method); + mockRequest.setRequestURI(requestURI); + mockRequest.addHeader("Accept", acceptHeader); + return mockRequest; + } +} |