You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by bl...@apache.org on 2010/02/28 21:53:45 UTC

svn commit: r917291 - in /incubator/wink/trunk: wink-common/src/main/java/org/apache/wink/common/internal/registry/ wink-server/src/main/java/org/apache/wink/server/internal/ wink-server/src/main/java/org/apache/wink/server/internal/handlers/ wink-serv...

Author: bluk
Date: Sun Feb 28 20:53:45 2010
New Revision: 917291

URL: http://svn.apache.org/viewvc?rev=917291&view=rev
Log:
Add ability to inject @Context Application class

Removed restriction on only allowing interfaces
on the message context.

Added:
    incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/jaxrs/ApplicationInjectionTest.java
Modified:
    incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ContextAccessor.java
    incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
    incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
    incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java

Modified: incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ContextAccessor.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ContextAccessor.java?rev=917291&r1=917290&r2=917291&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ContextAccessor.java (original)
+++ incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ContextAccessor.java Sun Feb 28 20:53:45 2010
@@ -62,13 +62,6 @@
     @SuppressWarnings("unchecked")
     public <T> T getContextFromAccessor(final Class<T> contextClass, RuntimeContext runtimeContext) {
 
-        // the context class must be an interface.
-        // we do this check just so we can throw a nice exception.
-        if (contextClass.isInterface() == false) {
-            throw new IllegalArgumentException(String.format("%s must be an interface",
-                                                             contextClass));
-        }
-
         // return context directly
         if (runtimeContext != null) {
             try {

Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java?rev=917291&r1=917290&r2=917291&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java Sun Feb 28 20:53:45 2010
@@ -118,6 +118,9 @@
     private ServletContext            servletContext;
     private FilterConfig              filterConfig;
 
+    // jax-rs application subclass
+    private List<Application>         applications;
+
     private String[]                  httpMethodOverrideHeaders;
 
     /**
@@ -259,8 +262,16 @@
     }
 
     public void addApplication(Application application, boolean isSystemApplication) {
+        if (applications == null) {
+            applications = new ArrayList<Application>(1);
+        }
         new ApplicationProcessor(application, resourceRegistry, providersRegistry,
                                  isSystemApplication).process();
+        applications.add(application);
+    }
+
+    public List<Application> getApplications() {
+        return applications;
     }
 
     // init methods
@@ -337,8 +348,8 @@
                     MediaTypeMapperFactory handlersFactory = handlerFactoryClass.newInstance();
                     mediaTypeMapper.addMappings(handlersFactory.getMediaTypeMappings());
                 } catch (ClassNotFoundException e) {
-                    logger.error(Messages
-                        .getMessage("isNotAClassWithMsgFormat", mediaTypeMapperFactoryClassName), e);
+                    logger.error(Messages.getMessage("isNotAClassWithMsgFormat",
+                                                     mediaTypeMapperFactoryClassName), e);
                 } catch (InstantiationException e) {
                     logger.error(Messages.getMessage("classInstantiationExceptionWithMsgFormat",
                                                      mediaTypeMapperFactoryClassName), e);
@@ -361,7 +372,9 @@
         if (handlersFactoryClassName != null) {
             try {
                 logger.debug("Handlers Factory Class is: {}", handlersFactoryClassName);
-                // use ClassUtils.getClass instead of Class.forName so we have classloader visibility into the Web module in J2EE environments
+                // use ClassUtils.getClass instead of Class.forName so we have
+                // classloader visibility into the Web module in J2EE
+                // environments
                 Class<HandlersFactory> handlerFactoryClass =
                     (Class<HandlersFactory>)ClassUtils.getClass(handlersFactoryClassName);
                 HandlersFactory handlersFactory = handlerFactoryClass.newInstance();
@@ -377,13 +390,14 @@
                     errorUserHandlers = (List<ResponseHandler>)handlersFactory.getErrorHandlers();
                 }
             } catch (ClassNotFoundException e) {
-                logger.error(Messages.getMessage("isNotAClassWithMsgFormat", handlersFactoryClassName), e);
+                logger.error(Messages.getMessage("isNotAClassWithMsgFormat",
+                                                 handlersFactoryClassName), e);
             } catch (InstantiationException e) {
                 logger.error(Messages.getMessage("classInstantiationExceptionWithMsgFormat",
                                                  handlersFactoryClassName), e);
             } catch (IllegalAccessException e) {
-                logger
-                    .error(Messages.getMessage("classIllegalAccessWithMsgFormat", handlersFactoryClassName), e);
+                logger.error(Messages.getMessage("classIllegalAccessWithMsgFormat",
+                                                 handlersFactoryClassName), e);
             }
         }
 

Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java?rev=917291&r1=917290&r2=917291&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java Sun Feb 28 20:53:45 2010
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.List;
 import java.util.Properties;
 
 import javax.servlet.FilterConfig;
@@ -31,6 +32,7 @@
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
+import javax.ws.rs.core.Application;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Request;
@@ -85,6 +87,10 @@
         setAttribute(ProvidersRegistry.class, configuration.getProvidersRegistry());
 
         initContexts();
+        List<Application> apps = configuration.getApplications();
+        if (apps != null && !apps.isEmpty()) {
+            setAttribute(Application.class, apps.get(0));
+        }
     }
 
     private void initContexts() {

Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java?rev=917291&r1=917290&r2=917291&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/servlet/RestServlet.java Sun Feb 28 20:53:45 2010
@@ -112,9 +112,9 @@
     protected RequestProcessor createRequestProcessor() throws ClassNotFoundException,
         InstantiationException, IllegalAccessException, IOException {
         DeploymentConfiguration deploymentConfiguration = getDeploymentConfiguration();
+        deploymentConfiguration.addApplication(getApplication(), false);
         RequestProcessor requestProcessor = new RequestProcessor(deploymentConfiguration);
         logger.debug("Creating request processor {} for servlet {}", requestProcessor, this);
-        deploymentConfiguration.addApplication(getApplication(), false);
         return requestProcessor;
     }
 

Added: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/jaxrs/ApplicationInjectionTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/jaxrs/ApplicationInjectionTest.java?rev=917291&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/jaxrs/ApplicationInjectionTest.java (added)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/jaxrs/ApplicationInjectionTest.java Sun Feb 28 20:53:45 2010
@@ -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.server.internal.jaxrs;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
+
+import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
+import org.apache.wink.test.mock.MockRequestConstructor;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class ApplicationInjectionTest extends MockServletInvocationTest {
+
+    @Override
+    protected String getApplicationClassName() {
+        return MyApplication.class.getName();
+    }
+
+    public static class MyApplication extends Application {
+
+        @Override
+        public Set<Class<?>> getClasses() {
+            Set<Class<?>> classes = new HashSet<Class<?>>();
+            classes.add(TestResource.class);
+            return classes;
+        }
+
+    }
+
+    @Path("/test")
+    public static class TestResource {
+        @Context
+        Application app;
+
+        @GET
+        public String get() {
+            assertNotNull(app);
+            assertTrue(app instanceof MyApplication);
+            return "hello";
+        }
+    }
+
+    @Test
+    public void testHttpHeaderContext() throws Exception {
+        MockHttpServletRequest servletRequest =
+            MockRequestConstructor.constructMockRequest("GET", "/test", "*/*");
+        MockHttpServletResponse response = invoke(servletRequest);
+        assertEquals(200, response.getStatus());
+        assertEquals("hello", response.getContentAsString());
+    }
+
+}