You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2009/05/05 20:53:26 UTC

svn commit: r771968 - in /cocoon/cocoon3/trunk: cocoon-docs/src/docbkx/reference/ cocoon-rest/ cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/ cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/ cocoon-rest/src/main/java/org/apach...

Author: reinhard
Date: Tue May  5 18:53:25 2009
New Revision: 771968

URL: http://svn.apache.org/viewvc?rev=771968&view=rev
Log:
Initial work on a JAX-RS (JSR311) integration + basic documentation

Added:
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java   (with props)
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/
    cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java   (with props)
    cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java   (with props)
    cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/
    cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java   (with props)
    cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java   (with props)
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties   (with props)
Modified:
    cocoon/cocoon3/trunk/cocoon-docs/src/docbkx/reference/web-applications.xml
    cocoon/cocoon3/trunk/cocoon-rest/pom.xml
    cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ControllerTest.java
    cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/SaxPipelineTest.java
    cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/controller/demo.html
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/overview.html
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-jaxrs.xml
    cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-servlet-service.xml
    cocoon/cocoon3/trunk/parent/pom.xml

Modified: cocoon/cocoon3/trunk/cocoon-docs/src/docbkx/reference/web-applications.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-docs/src/docbkx/reference/web-applications.xml?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-docs/src/docbkx/reference/web-applications.xml (original)
+++ cocoon/cocoon3/trunk/cocoon-docs/src/docbkx/reference/web-applications.xml Tue May  5 18:53:25 2009
@@ -28,7 +28,7 @@
 
   <section id="webapps.servlet-service-fw">
     <title>Servlet-Service framework integration</title>
-    <para>TBW: Composition, servlet: protocol, inheritence</para>
+    <para>TBW: Composition, servlet: protocol, inheritance</para>
   </section>
 
   <section id="webapps.http-environments">
@@ -48,7 +48,251 @@
 
   <section id="webapps.rest">
     <title>RESTful web services</title>
-    <para>TBW: REST controller, Rendering views using StringTemplate, Request-wide transactions (incl. Subrequests)</para>
+    <para>
+    
+    </para>
+    <section id="webapps.rest.sitemap">
+      <title>Sitemap based RESTful web services</title>
+      <section>
+        <title>Introduction</title>
+        <para>
+          TBW: REST controller, Rendering views using StringTemplate, Request-wide transactions (incl. Subrequests) 
+        </para>
+      </section>
+    </section>
+    <section id="webapps.rest.jaxrs">
+      <title>JAX-RS based controllers (JSR311) </title>
+      <section>
+        <title>Introduction</title>
+        <para>
+          JAX-RS (JSR 311) is the Java standard for the development of RESTful web services. It provides a
+          set of annotations that, when being applied, define resources that are exposed by using Uniform Resource 
+          Identifiers (URIs).
+        </para>
+        <para>
+          The <ulink url="http://wikis.sun.com/display/Jersey/Main">wiki of the Jersey project</ulink> that provides 
+          the Reference Implementation of JAX-RS contains a lot of useful information about how to define REST resources.
+        </para>
+        <para>
+          The main pieces of the JAX-RS/Cocoon-integration are
+            <itemizedlist>
+              <listitem><para>the <literal>CocoonJAXRSServlet</literal> Servlet-Service, which is responsible for
+              the JAX-RS integration into the Cocoon Servlet-Service framework, and </para></listitem>
+              <listitem><para>the <literal>URLResponseBuilder</literal> class, which allows calling  resources
+              provided by other Servlet-Services (usually Cocoon pipelines exposed by sitemaps).
+              </para></listitem>
+            </itemizedlist>
+        </para>
+      </section>
+      
+      <section id="webapps.rest.jaxrs.sample">
+        <title>Cocoon and JAX-RS by example</title>
+        <para>
+          Adding support for JAX-RS services to your Cocoon application requires following three steps: 
+            <itemizedlist>
+              <listitem><para>Add the <literal>cocoon-rest</literal> module as a dependency.</para></listitem>
+              <listitem><para>Add the <literal>CocoonJAXRSServlet</literal> Servlet-Service</para></listitem>
+              <listitem><para>Add at least one JAX-RS root resource</para></listitem>
+            </itemizedlist>
+        </para>
+        
+        <section id="webapps.rest.jaxrs.sample.dependency">
+          <title>Cocoon-Rest dependency</title>
+          <para>
+            The first step is to add the <literal>cocoon-rest</literal> module to your Cocoon application:
+          </para>
+          <programlisting language="xml"><![CDATA[    <dependency>
+      <groupId>org.apache.cocoon.rest</groupId>
+      <artifactId>cocoon-rest</artifactId>
+    </dependency>]]></programlisting>
+        </section>
+        
+        <section id="webapps.rest.jaxrs.sample.resource">
+          <title>JAX-RS resource</title>
+          <para>
+            Then at least one JAX-RS resource is required:
+          </para>
+          <programlistingco>
+          <areaspec>
+            <area id="webapps.rest.jaxrs.sample.resource.path1" coords="1" />
+            <area id="webapps.rest.jaxrs.sample.resource.class" coords="2" />
+            <area id="webapps.rest.jaxrs.sample.resource.method" coords="6" />
+            <area id="webapps.rest.jaxrs.sample.resource.path2" coords="7" />
+            <area id="webapps.rest.jaxrs.sample.resource.param.id" coords="9" />
+            <area id="webapps.rest.jaxrs.sample.resource.param.req" coords="10" />
+            <area id="webapps.rest.jaxrs.sample.resource.param.uriinfo" coords="11" />
+            <area id="webapps.rest.jaxrs.sample.resource.param.request" coords="12" />
+            <area id="webapps.rest.jaxrs.sample.resource.data" coords="14" />
+            <area id="webapps.rest.jaxrs.sample.resource.responsebuilder" coords="20" />
+            <area id="webapps.rest.jaxrs.sample.resource.beansetter" coords="25" />
+          </areaspec>
+          <programlisting language="java"><![CDATA[@Path("/sample")
+public class SampleRestResource {
+
+    private Settings settings;
+
+    @GET
+    @Path("/parameter-passing/{id}")
+    public Response anotherService(
+        @PathParam("id") String id, 
+        @QueryParam("req-param") String reqParam,
+        @Context UriInfo uriInfo, 
+        @Context Request request) {
+        
+        Map<String, Object> data = new HashMap<String, Object>();
+        data.put("name", "Donald Duck");
+        data.put("id", id);
+        data.put("reqparam", reqParam);
+        data.put("runningMode", this.settings.getProperty("testProperty"));
+
+        return URLResponseBuilder.newInstance("servlet:sample:/controller/screen", data)
+          .build();
+    }
+
+    public void setSettings(Settings settings) {
+        this.settings = settings;
+    }
+}]]></programlisting>
+          <calloutlist>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.path1">
+              <para>The <literal>@javax.ws.rs.Path</literal> annotation identifies the URI path 
+                that this resource class or class method will serve requests for. The path is
+                relative to the mount point of the servlet-service that references this resource.
+              </para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.class">
+              <para>A JAX-RS root resource.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.method">
+              <para>The <literal>@javax.ws.rs.GET</literal> annotations indicates that
+              this method responds to HTTP GET requests.</para> 
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.path2">
+              <para>Again a <literal>@Path</literal> annotation, but this time at
+              method level. In this example requests for <literal>sample/parameter-passing/NNN</literal>
+              will be handled by the <literal>anotherService()</literal> method.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.param.id">
+              <para>The <literal>@PathParam</literal> annoation binds the URI template
+              value of <literal>id</literal> to the method parameter <literal>id</literal>.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.param.req">
+              <para>The <literal>@QueryParam</literal> annotation binds the request parameter
+              <literal>req-param</literal> to the method parameter <literal>reqParam</literal>.
+              </para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.param.uriinfo">
+              <para>By annotating the <literal>URIInfo</literal> method parameter with the 
+                <literal>@Context</literal> annotations, a current instance of <literal>URIInfo</literal>
+                is passed to the method.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.param.request">
+              <para>By annotating the <literal>Request</literal> method parameter with the 
+                <literal>@Context</literal> annotations, a current instance of <literal>Request</literal>
+                is passed to the method.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.data">
+              <para>A map of <literal>String/Object</literal> is collected.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.responsebuilder">
+              <para>The <literal>URLResponseBuilder</literal> sends the result of the
+                passed URL as response. It allows passing a map of <literal>String/Object</literal> 
+                which are available in the called resource (usually a pipeline).</para>
+              <para>In this case the <literal>servlet:</literal> protocol is used.
+                It allows accessing URLs (that usually expose pipelines) defined by other
+                Servlet-Services.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.resource.beansetter">
+              <para>A setter method to allow injecting the <literal>Setting</literal> bean.</para>
+            </callout>       
+          </calloutlist>
+          </programlistingco>        
+        </section>
+        
+        <section id="webapps.rest.jaxrs.sample.spring">
+          <title>JAX-RS resource as Spring bean</title>  
+          <para>This resource has to be configured as Spring bean:</para>
+          <programlistingco>
+          <areaspec>
+            <area id="webapps.rest.jaxrs.sample.bean.definition" coords="6" />
+          </areaspec>
+          <programlisting language="xml"><![CDATA[<beans xmlns="http://www.springframework.org/schema/beans" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans 
+    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+  <bean id="org.apache.cocoon.sample.rest.resource.one" 
+    class="org.apache.cocoon.sample.jaxrs.SampleRestResource">
+    <property name="settings" 
+      ref="org.apache.cocoon.configuration.Settings" />
+  </bean>
+
+</beans>]]></programlisting>
+          <calloutlist>
+            <callout arearefs="webapps.rest.jaxrs.sample.bean.definition">
+              <para>The <literal>SampleRestResource</literal> is a usual Spring bean and in this example it gets
+              the <literal>org.apache.cocoon.configuration.Settings</literal> bean injected.</para>
+            </callout>
+          </calloutlist>
+        </programlistingco>
+        </section>
+        
+        <section id="webapps.rest.jaxrs.sample.servlet-service">
+          <title>Servlet-Service integration</title>
+          <para>Finally the Spring bean has to be exposed by the <literal>CocoonJAXRSServlet</literal>:</para>   
+          <programlistingco>
+          <areaspec>
+            <area id="webapps.rest.jaxrs.sample.servlet-service.definition" coords="10" />
+            <area id="webapps.rest.jaxrs.sample.servlet-service.mount-path" coords="12" />
+            <area id="webapps.rest.jaxrs.sample.servlet-service.connections" coords="14" />
+            <area id="webapps.rest.jaxrs.sample.servlet-service.resources" coords="19" />
+          </areaspec>
+          <programlisting language="xml"><![CDATA[<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:servlet="http://cocoon.apache.org/schema/servlet"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans 
+    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+  http://cocoon.apache.org/schema/servlet 
+    http://cocoon.apache.org/schema/servlet/cocoon-servlet-1.0.xsd>
+  
+  <!-- A servlet-service that exposes JAX-RS REST endpoints. -->
+  <bean id="org.apache.cocoon.sample.rest.servlet" 
+    class="org.apache.cocoon.rest.jaxrs.container.CocoonJAXRSServlet">
+    <servlet:context mount-path="/jax-rs" 
+      context-path="blockcontext:/cocoon-sample/">
+      <servlet:connections>
+        <entry key="sample" value-ref="org.apache.cocoon.sample.servlet" />
+      </servlet:connections>      
+    </servlet:context>
+    
+    <property name="restResourcesList">
+      <list>
+        <ref bean="org.apache.cocoon.sample.rest.resource.one" />
+      </list>
+    </property>
+  </bean>
+</beans>]]></programlisting>
+          <calloutlist>
+            <callout arearefs="webapps.rest.jaxrs.sample.servlet-service.definition">
+              <para>The <literal>CocoonJAXRSServlet</literal> exposes REST resources.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.servlet-service.mount-path">
+              <para>The mount path of this Servlet-Service is <literal>/jax-rs</literal>.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.servlet-service.connections">
+              <para>Connections to other Servlet-Services.</para>
+            </callout>
+            <callout arearefs="webapps.rest.jaxrs.sample.servlet-service.resources">
+              <para>A list of JAX-RS resources, which also have to be Spring beans, is
+                exposed.</para>
+              <para>Alternativly a <literal>&lt;map&gt;</literal> of resources can be injected
+                by the <literal>restResourceMap</literal> property.</para>
+            </callout>
+          </calloutlist>
+          </programlistingco>
+        </section>
+      </section>
+    </section>
   </section>
 
   <section id="webapps.caching">

Modified: cocoon/cocoon3/trunk/cocoon-rest/pom.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/pom.xml?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/pom.xml (original)
+++ cocoon/cocoon3/trunk/cocoon-rest/pom.xml Tue May  5 18:53:25 2009
@@ -50,6 +50,16 @@
       <artifactId>servlet-api</artifactId>
       <scope>provided</scope>
     </dependency>    
+
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-server</artifactId>
+    </dependency> 
+
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>

Added: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java (added)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java Tue May  5 18:53:25 2009
@@ -0,0 +1,117 @@
+/*
+ * 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.cocoon.rest.jaxrs.container;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.util.ClassUtils;
+
+import com.sun.jersey.api.core.DefaultResourceConfig;
+import com.sun.jersey.api.core.ResourceConfig;
+import com.sun.jersey.spi.container.WebApplication;
+import com.sun.jersey.spi.container.servlet.ServletContainer;
+
+/**
+ * A {@link Servlet} that can be used in the Cocoon Servlet-Service framework. Extending the
+ * {@link ServletContainer} provided by Jersey it registers all passed REST resources (
+ * {@link #setRestResources(Map)} and {@link #setRestResourcesList(List)}.
+ */
+public class CocoonJAXRSServlet extends ServletContainer {
+
+    private static final long serialVersionUID = -8658985429213333769L;
+    private boolean lazyInit;
+    private final Log logger = LogFactory.getLog(this.getClass());
+    private ResourceConfig rc;
+    private List<Object> restResourcesList;
+    private Map<Object, Object> restResourcesMap;
+    private WebApplication wa;
+
+    @Override
+    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        if (!this.lazyInit) {
+            this.lazyInitiate();
+        }
+
+        super.service(request, response);
+    }
+
+    public void setRestResourcesMap(Map<Object, Object> restResourcesMap) {
+        this.restResourcesMap = restResourcesMap;
+    }
+
+    public void setRestResourcesList(List<Object> restResourcesList) {
+        this.restResourcesList = restResourcesList;
+    }
+
+    @Override
+    protected ResourceConfig getDefaultResourceConfig(Map<String, Object> props, ServletConfig servletConfig)
+            throws ServletException {
+        DefaultResourceConfig rc = new DefaultResourceConfig();
+        rc.setPropertiesAndFeatures(props);
+        return rc;
+    }
+
+    @Override
+    protected void initiate(ResourceConfig rc, WebApplication wa) {
+        this.rc = rc;
+        this.wa = wa;
+    }
+
+    /*
+     * Only initialize this servlet once.
+     */
+    private synchronized void lazyInitiate() {
+        if (this.lazyInit) {
+            return;
+        }
+
+        List<Object> restResources = new ArrayList<Object>();
+        if (this.restResourcesMap != null) {
+            restResources.addAll(this.restResourcesMap.values());
+        }
+        if (this.restResourcesList != null) {
+            restResources.addAll(this.restResourcesList);
+        }
+
+        for (Object bean : restResources) {
+            Class<?> type = ClassUtils.getUserClass(bean);
+            if (ResourceConfig.isProviderClass(type)) {
+                this.logger.info("Registering Spring bean of type " + type.getName() + " as a provider class");
+                // this.rc.getClasses().add(type);
+                this.rc.getSingletons().add(bean);
+            } else if (ResourceConfig.isRootResourceClass(type)) {
+                this.logger.info("Registering Spring bean of type " + type.getName() + " as a root resource class");
+                // this.rc.getClasses().add(type);
+                this.rc.getSingletons().add(bean);
+            }
+        }
+
+        this.wa.initiate(this.rc);
+        this.lazyInit = true;
+    }
+}
\ No newline at end of file

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/container/CocoonJAXRSServlet.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java (added)
+++ cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java Tue May  5 18:53:25 2009
@@ -0,0 +1,132 @@
+/*
+ * 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.cocoon.rest.jaxrs.response;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+import org.apache.cocoon.callstack.environment.CallFrameHelper;
+import org.apache.cocoon.rest.jaxrs.container.CocoonJAXRSServlet;
+import org.apache.cocoon.servlet.controller.ControllerContextHelper;
+import org.apache.commons.io.IOUtils;
+
+/**
+ * A class to get a {@link ResponseBuilder} that has all information set correctly that is provided
+ * by a {@link URLConnection}. It must be used when the JAX-RS container runs within the Cocoon
+ * Servlet-Service framework.
+ * 
+ * @see CocoonJAXRSServlet
+ */
+public abstract class URLResponseBuilder extends ResponseBuilder {
+
+    /**
+     * The same as {@link #newInstance(URL)} but the URL is passed as {@link String}.
+     */
+    @SuppressWarnings("unchecked")
+    public static ResponseBuilder newInstance(final String url) {
+        return newInstance(url, Collections.EMPTY_MAP);
+    }
+
+    /**
+     * The same as {@link #newInstance(URL, Map)} but the URL is passed as {@link String}.
+     */
+    public static ResponseBuilder newInstance(final String url, final Map<String, Object> data) {
+        try {
+            return newInstance(new URL(url), data);
+        } catch (MalformedURLException e) {
+            throw new WebApplicationException(500);
+        }
+    }
+
+    /**
+     * The same as {@link #newInstance(URL, Map)} but no objects are passed to the URL.
+     */
+    @SuppressWarnings("unchecked")
+    public static ResponseBuilder newInstance(final URL url) {
+        return newInstance(url, Collections.EMPTY_MAP);
+    }
+
+    /**
+     * Create a {@link ResponseBuilder} that retrieves all available information (header parameters,
+     * Last-Modified, Content-Type) from the {@link URLConnection} opened on the passed {@link URL}.
+     * 
+     * @param url The {@link URL} that provides the content for the entity.
+     * @param data A {@link Map} of objects passed to the {@link URL}.
+     * @return A {@link ResponseBuilder}
+     */
+    public static ResponseBuilder newInstance(final URL url, final Map<String, Object> data) {
+        ResponseBuilder builder = ResponseBuilder.newInstance();
+        URLConnection urlConnection = null;
+
+        try {
+            urlConnection = url.openConnection();
+            if (urlConnection instanceof HttpURLConnection) {
+                HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
+                HttpServletRequest request = CallFrameHelper.getRequest();
+                ControllerContextHelper.storeContext(data, request);
+
+                // content type
+                String contentType = httpUrlConnection.getContentType();
+                if (contentType != null && !"".equals(contentType) && !"content/unknown".equals(contentType)) {
+                    builder.type(contentType);
+                }
+
+                // headers
+                Map<String, List<String>> headerFields = httpUrlConnection.getHeaderFields();
+                for (Entry<String, List<String>> eachHeader : headerFields.entrySet()) {
+                    List<String> headerValueList = eachHeader.getValue();
+                    String value = null;
+                    if (!headerValueList.isEmpty()) {
+                        value = headerValueList.get(0);
+                    }
+                    builder.header(eachHeader.getKey(), value == null ? "" : value);
+                }
+
+                // status code
+                int statusCode = httpUrlConnection.getResponseCode();
+                builder.status(statusCode);
+
+                // last modified
+                long lastModified = urlConnection.getLastModified();
+                if (lastModified >= 0) {
+                    builder.lastModified(new Date(lastModified));
+                }
+
+                // entity
+                builder.entity(IOUtils.toString(httpUrlConnection.getInputStream()));
+
+                return builder;
+            }
+        } catch (IOException e) {
+            throw new WebApplicationException(e, 500);
+        }
+
+        throw new WebApplicationException(500);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/jaxrs/response/URLResponseBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ControllerTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ControllerTest.java?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ControllerTest.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/ControllerTest.java Tue May  5 18:53:25 2009
@@ -33,6 +33,6 @@
         this.assertXPath("/html/body/p[1]", "name=foo");
         this.assertXPath("/html/body/p[2]", "id=abc");
         this.assertXPath("/html/body/p[3]", "reqparam=1");
+        this.assertXPath("/html/body/p[4]", "testProperty=test");
     }
-
 }

Added: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java (added)
+++ cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java Tue May  5 18:53:25 2009
@@ -0,0 +1,75 @@
+/*
+ * 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.cocoon.it;
+
+/**
+ * Test the usage of servlet services in Cocoon sitemaps.
+ */
+public class JAXRSTest extends CocoonHtmlUnitTestCase {
+
+    public void testDummy() {
+    }
+
+    // public void test401StatusCode() throws Exception {
+    // this.loadResponse("/jax-rs/sample/sax-pipeline/unauthorized");
+    // int statusCode = this.response.getStatusCode();
+    // assertTrue(statusCode == 401);
+    //
+    // String lastModified = this.response.getResponseHeaderValue("Last-Modified");
+    // assertNotNull(lastModified);
+    // assertFalse(lastModified.equals(""));
+    //
+    // String cocoonVersion = this.response.getResponseHeaderValue("X-Cocoon-Version");
+    // assertNotNull(cocoonVersion);
+    // assertFalse(cocoonVersion.equals(""));
+    // }
+    //
+    // public void test404() throws Exception {
+    // this.loadResponse("/jax-rs/sample/not-exisiting");
+    // int statusCode = this.response.getStatusCode();
+    // assertTrue(statusCode == 404);
+    // }
+    //
+    // public void testPassingParameters() throws Exception {
+    // this.loadXmlPage("/jax-rs/sample/parameter-passing/1?req-param=1");
+    // int statusCode = this.response.getStatusCode();
+    // assertTrue(statusCode == 200);
+    // assertEquals("text/xml", this.response.getContentType());
+    //
+    // this.assertXPath("/html/body/p[1]", "name=Donald Duck");
+    // this.assertXPath("/html/body/p[2]", "id=1");
+    // this.assertXPath("/html/body/p[3]", "reqparam=1");
+    // this.assertXPath("/html/body/p[4]", "testProperty=test");
+    // }
+    //
+    // public void testAnotherResource() throws Exception {
+    // this.loadResponse("jax-rs/sample2/read/javascript-resource-implicit.js");
+    // assertTrue(this.response.getStatusCode() == 200);
+    // assertEquals(this.response.getContentType(), "application/x-javascript");
+    // }
+    //
+    // public void testConditionalGet() throws Exception {
+    // this.loadResponse("jax-rs/sample2/read/javascript-resource-implicit.js");
+    // String lastModified = this.response.getResponseHeaderValue("Last-Modified");
+    // assertNotNull("Last-Modified has to be set at this point!", lastModified);
+    // assertFalse("Last-Modified has to be set at this point!", "".equals(lastModified));
+    //
+    // this.webClient.addRequestHeader("If-Modified-Since", lastModified);
+    // this.loadResponse("read/javascript-resource-implicit.js");
+    // assertEquals(304, this.response.getStatusCode());
+    // }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/JAXRSTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/SaxPipelineTest.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/SaxPipelineTest.java?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/SaxPipelineTest.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sample-webapp/src/test/java/org/apache/cocoon/it/SaxPipelineTest.java Tue May  5 18:53:25 2009
@@ -32,8 +32,8 @@
     }
 
     /**
-     * A simple pipeline that produces an XHTML 1.0 document. This implicitly tests if the configuration of serializers
-     * works properly.
+     * A simple pipeline that produces an XHTML 1.0 document. This implicitly tests if the
+     * configuration of serializers works properly.
      */
     public void testSimplePipelineXhtml() throws Exception {
         this.loadResponse("/sax-pipeline/simple-xhtml");
@@ -63,5 +63,4 @@
         assertNotNull(lastModified);
         assertFalse(lastModified.equals(""));
     }
-
 }

Modified: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java Tue May  5 18:53:25 2009
@@ -19,12 +19,14 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.cocoon.configuration.Settings;
 import org.apache.cocoon.rest.controller.annotation.RESTController;
 import org.apache.cocoon.rest.controller.annotation.RequestParameter;
 import org.apache.cocoon.rest.controller.annotation.SitemapParameter;
 import org.apache.cocoon.rest.controller.method.Get;
 import org.apache.cocoon.rest.controller.response.RestResponse;
 import org.apache.cocoon.rest.controller.response.URLResponse;
+import org.springframework.beans.factory.annotation.Autowired;
 
 @RESTController
 public class DemoRESTController implements Get {
@@ -38,11 +40,15 @@
     @RequestParameter
     private String reqparam;
 
+    @Autowired
+    private Settings settings;
+
     public RestResponse doGet() throws Exception {
         Map<String, Object> data = new HashMap<String, Object>();
         data.put("id", this.id);
         data.put("name", this.name);
         data.put("reqparam", this.reqparam);
+        data.put("testProperty", this.settings.getProperty("testProperty"));
 
         return new URLResponse("servlet:/controller/screen", data);
     }

Added: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java (added)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java Tue May  5 18:53:25 2009
@@ -0,0 +1,61 @@
+/*
+ * 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.cocoon.sample.jaxrs;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.cocoon.configuration.Settings;
+import org.apache.cocoon.rest.jaxrs.response.URLResponseBuilder;
+
+@Path("/sample")
+public class SampleJaxRsResource1 {
+
+    private Settings settings;
+
+    @GET
+    @Path("/parameter-passing/{id}")
+    public Response anotherService(@PathParam("id") String id, @QueryParam("req-param") String reqParam,
+            @Context UriInfo uriInfo, @Context Request request) {
+        Map<String, Object> data = new HashMap<String, Object>();
+        data.put("name", "Donald Duck");
+        data.put("id", id);
+        data.put("reqparam", reqParam);
+        data.put("testProperty", this.settings.getProperty("testProperty"));
+
+        return URLResponseBuilder.newInstance("servlet:sample:/controller/screen", data).build();
+    }
+
+    @GET
+    @Path("/sax-pipeline/unauthorized")
+    public Response saxPipelineUnauthorized() {
+        return URLResponseBuilder.newInstance("servlet:sample:/sax-pipeline/unauthorized").build();
+    }
+
+    public void setSettings(Settings settings) {
+        this.settings = settings;
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource1.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java (added)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java Tue May  5 18:53:25 2009
@@ -0,0 +1,33 @@
+/*
+ * 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.cocoon.sample.jaxrs;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
+import org.apache.cocoon.rest.jaxrs.response.URLResponseBuilder;
+
+@Path("/sample2")
+public class SampleJaxRsResource2 {
+
+    @GET
+    @Path("/read/javascript-resource-implicit.js")
+    public Response conditionalGet() {
+        return URLResponseBuilder.newInstance("servlet:sample:/read/javascript-resource-implicit.js").build();
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/jaxrs/SampleJaxRsResource2.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/controller/demo.html
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/controller/demo.html?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/controller/demo.html (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/controller/demo.html Tue May  5 18:53:25 2009
@@ -19,12 +19,13 @@
  -->
 <html>
   <head>
-    <title>RESTController demo</title>
+    <title>REST demo</title>
   </head>
   <body>
-    <h3>RESTController demo</h3>
+    <h3>REST demo</h3>
     <p>name=$name$</p>
     <p>id=$id$</p>
     <p>reqparam=$reqparam$</p>
+    <p>testProperty=$testProperty$</p>
   </body>
 </html>

Modified: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/overview.html
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/overview.html?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/overview.html (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/COB-INF/overview.html Tue May  5 18:53:25 2009
@@ -97,10 +97,14 @@
   <ul>
     <li><a href="xslt/main">XSLT Transformation</a>: An XSLT transformation that includes stylesheets via file and servlet protocol.</li>
   </ul>
-  <h2>Controller</h2>
+  <h2>Sitemap REST Controller</h2>
   <ul>
     <li><a href="controller/abc/foo?reqparam=1">Invoke a controller</a>: Invoke a controller and pass two parameters</li>
   </ul>
+  <h2>JAX-RS REST Controller</h2>
+  <ul>
+    <li><a href="jax-rs/sample/parameter-passing/5?req-param=7">JAX-RS REST endpoint</a>: A JAX-RS resources as a controller that returns a Cocoon resources.</li>
+  </ul>
   <h2>FOP</h2>
   <ul>
   	<li><a href="fop/test.pdf">PDF</a>: Create a PDF document by using Apache FOP.</li>

Added: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties?rev=771968&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties (added)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties Tue May  5 18:53:25 2009
@@ -0,0 +1,16 @@
+# 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.
+
+testProperty=test
\ No newline at end of file

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/properties/cocoon-sample.properties
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-jaxrs.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-jaxrs.xml?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-jaxrs.xml (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-jaxrs.xml Tue May  5 18:53:25 2009
@@ -21,10 +21,8 @@
 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
-  <!-- 
-  <bean id="org.apache.cocoon.sample.rest.resource.one" class="org.apache.cocoon.sample.jaxrs.SampleRestResource">
+  <bean id="org.apache.cocoon.sample.rest.resource.one" class="org.apache.cocoon.sample.jaxrs.SampleJaxRsResource1">
     <property name="settings" ref="org.apache.cocoon.configuration.Settings" />
   </bean>
-  <bean id="org.apache.cocoon.sample.rest.resource.two" class="org.apache.cocoon.sample.jaxrs.Sample2RestResource" />
-  -->
+  <bean id="org.apache.cocoon.sample.rest.resource.two" class="org.apache.cocoon.sample.jaxrs.SampleJaxRsResource2" />
 </beans>

Modified: cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-servlet-service.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-servlet-service.xml?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-servlet-service.xml (original)
+++ cocoon/cocoon3/trunk/cocoon-sample/src/main/resources/META-INF/cocoon/spring/cocoon-sample-servlet-service.xml Tue May  5 18:53:25 2009
@@ -32,7 +32,6 @@
   </bean>
   
   <!-- A servlet-service that exposes JAX-RS REST endpoints. -->
-  <!-- 
   <bean id="org.apache.cocoon.sample.rest.servlet" class="org.apache.cocoon.rest.jaxrs.container.CocoonJAXRSServlet">
     <servlet:context mount-path="/jax-rs" context-path="blockcontext:/cocoon-sample/">
       <servlet:connections>
@@ -47,5 +46,4 @@
       </list>
     </property>
   </bean>
-  -->
 </beans>

Modified: cocoon/cocoon3/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/parent/pom.xml?rev=771968&r1=771967&r2=771968&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/parent/pom.xml (original)
+++ cocoon/cocoon3/trunk/parent/pom.xml Tue May  5 18:53:25 2009
@@ -186,6 +186,16 @@
 
       <!-- Other libraries -->
       <dependency>
+        <groupId>com.sun.jersey</groupId>
+        <artifactId>jersey-core</artifactId>
+        <version>1.0.3</version>
+      </dependency>
+      <dependency>
+        <groupId>com.sun.jersey</groupId>
+        <artifactId>jersey-server</artifactId>
+        <version>1.0.3</version>
+      </dependency>       
+      <dependency>
         <groupId>commons-betwixt</groupId>
         <artifactId>commons-betwixt</artifactId>
         <version>0.8</version>
@@ -355,6 +365,14 @@
     </dependencies>
   </dependencyManagement>
 
+  <repositories>
+    <repository>
+      <id>maven2-repository.dev.java.net</id>
+      <name>Java.net Repository for Maven</name>
+      <url>http://download.java.net/maven/2/</url>
+    </repository> 
+  </repositories>
+
   <build>
     <plugins>
       <plugin>
@@ -715,22 +733,22 @@
           <dependency>
             <groupId>org.apache.cocoon</groupId>
             <artifactId>cocoon-servlet-service-impl</artifactId>
-            <version>1.2.0-SNAPSHOT</version>
+            <version>1.3.0-SNAPSHOT</version>
           </dependency>
           <dependency>
             <groupId>org.apache.cocoon</groupId>
             <artifactId>cocoon-spring-configurator</artifactId>
-            <version>2.1.0-SNAPSHOT</version>
+            <version>2.2.0-SNAPSHOT</version>
           </dependency>
           <dependency>
             <groupId>org.apache.cocoon</groupId>
             <artifactId>cocoon-block-deployment</artifactId>
-            <version>1.1.0-SNAPSHOT</version>
+            <version>1.2.0-SNAPSHOT</version>
           </dependency>
           <dependency>
             <groupId>org.apache.cocoon</groupId>
             <artifactId>cocoon-jnet</artifactId>
-            <version>1.1.0-SNAPSHOT</version>
+            <version>1.2.0-SNAPSHOT</version>
           </dependency>
         </dependencies>
       </dependencyManagement>