Author: mrdon Date: Sat Oct 27 00:41:58 2007 New Revision: 589059 URL: http://svn.apache.org/viewvc?rev=589059&view=rev Log: Adding ability to override handlers by specifying another alias for an extension
Added: struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java Modified: struts/sandbox/trunk/struts2-rest-plugin/pom.xml struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml Modified: struts/sandbox/trunk/struts2-rest-plugin/pom.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/pom.xml?rev=589059&r1=589058&r2=589059&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/pom.xml (original) +++ struts/sandbox/trunk/struts2-rest-plugin/pom.xml Sat Oct 27 00:41:58 2007 @@ -46,6 +46,13 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>mockobjects</groupId> + <artifactId>mockobjects-core</artifactId> + <version>0.09</version> + <scope>test</scope> + </dependency> + </dependencies> </project> Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java?rev=589059&r1=589058&r2=589059&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java Sat Oct 27 00:41:58 2007 @@ -20,43 +20,53 @@ */ package org.apache.struts2.rest; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.config.entities.ActionConfig; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.inject.Inject; +import org.apache.struts2.ServletActionContext; +import org.apache.struts2.rest.handler.ContentTypeHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import static javax.servlet.http.HttpServletResponse.SC_OK; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import static javax.servlet.http.HttpServletResponse.SC_OK; - -import org.apache.struts2.ServletActionContext; -import org.apache.struts2.rest.handler.ContentTypeHandler; - -import com.opensymphony.xwork2.ModelDriven; -import com.opensymphony.xwork2.config.entities.ActionConfig; -import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.inject.Inject; - /** * Manages [EMAIL PROTECTED] ContentTypeHandler} instances and uses them to * process results */ public class ContentTypeHandlerManager { - private Map<String,ContentTypeHandler> handlers = new HashMap<String,ContentTypeHandler>(); - private String defaultHandlerName; + Map<String,ContentTypeHandler> handlers = new HashMap<String,ContentTypeHandler>(); + String defaultHandlerName; + public static final String STRUTS_REST_HANDLER_OVERRIDE_PREFIX = "struts.rest.handlerOverride."; @Inject("struts.rest.defaultHandlerName") public void setDefaultHandlerName(String name) { this.defaultHandlerName = name; } - + @Inject public void setContainer(Container container) { Set<String> names = container.getInstanceNames(ContentTypeHandler.class); for (String name : names) { ContentTypeHandler handler = container.getInstance(ContentTypeHandler.class, name); + + // Check for overriding handlers for the current extension + String overrideName = container.getInstance(String.class, STRUTS_REST_HANDLER_OVERRIDE_PREFIX +handler.getExtension()); + if (overrideName != null) { + if (!handlers.containsKey(handler.getExtension())) { + handler = container.getInstance(ContentTypeHandler.class, overrideName); + } else { + // overriding handler has already been registered + continue; + } + } this.handlers.put(handler.getExtension(), handler); } } Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml?rev=589059&r1=589058&r2=589059&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/resources/struts-plugin.xml Sat Oct 27 00:41:58 2007 @@ -21,7 +21,7 @@ <constant name="struts.rest.defaultHandlerName" value="xml" /> <constant name="struts.mapper.class" value="rest" /> <constant name="struts.mapper.idParameterName" value="id" /> - <constant name="struts.action.extension" value="" /> + <constant name="struts.action.extension" value="xhtml,,xml,json" /> <constant name="struts.configuration.classpath.defaultParentPackage" value="rest-default" /> <package name="rest-default" extends="struts-default"> Added: struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java?rev=589059&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java (added) +++ struts/sandbox/trunk/struts2-rest-plugin/src/test/java/org/apache/struts2/rest/ContentTypeHandlerManagerTest.java Sat Oct 27 00:41:58 2007 @@ -0,0 +1,66 @@ +/* + * $Id: Restful2ActionMapper.java 540819 2007-05-23 02:48:36Z mrdon $ + * + * 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.struts2.rest; + +import com.mockobjects.dynamic.C; +import com.mockobjects.dynamic.Mock; +import com.opensymphony.xwork2.inject.Container; +import junit.framework.TestCase; +import org.apache.struts2.rest.handler.ContentTypeHandler; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; + +public class ContentTypeHandlerManagerTest extends TestCase { + + public void testHandlerOverride() { + Mock mockHandlerXml = new Mock(ContentTypeHandler.class); + mockHandlerXml.matchAndReturn("getExtension", "xml"); + mockHandlerXml.matchAndReturn("toString", "xml"); + Mock mockHandlerJson = new Mock(ContentTypeHandler.class); + mockHandlerJson.matchAndReturn("getExtension", "json"); + mockHandlerJson.matchAndReturn("toString", "json"); + Mock mockHandlerXmlOverride = new Mock(ContentTypeHandler.class); + mockHandlerXmlOverride.matchAndReturn("getExtension", "xml"); + mockHandlerXmlOverride.matchAndReturn("toString", "xmlOverride"); + + Mock mockContainer = new Mock(Container.class); + mockContainer.matchAndReturn("getInstance", C.args(C.eq(ContentTypeHandler.class), C.eq("xmlOverride")), mockHandlerXmlOverride.proxy()); + mockContainer.matchAndReturn("getInstance", C.args(C.eq(ContentTypeHandler.class), C.eq("xml")), mockHandlerXml.proxy()); + mockContainer.matchAndReturn("getInstance", C.args(C.eq(ContentTypeHandler.class), C.eq("json")), mockHandlerJson.proxy()); + mockContainer.expectAndReturn("getInstanceNames", C.args(C.eq(ContentTypeHandler.class)), new HashSet(Arrays.asList("xml", "xmlOverride", "json"))); + + mockContainer.matchAndReturn("getInstance", C.args(C.eq(String.class), + C.eq(ContentTypeHandlerManager.STRUTS_REST_HANDLER_OVERRIDE_PREFIX+"xml")), "xmlOverride"); + mockContainer.expectAndReturn("getInstance", C.args(C.eq(String.class), + C.eq(ContentTypeHandlerManager.STRUTS_REST_HANDLER_OVERRIDE_PREFIX+"json")), null); + + ContentTypeHandlerManager mgr = new ContentTypeHandlerManager(); + mgr.setContainer((Container) mockContainer.proxy()); + + Map<String,ContentTypeHandler> handlers = mgr.handlers; + assertNotNull(handlers); + assertEquals(2, handlers.size()); + assertEquals(mockHandlerXmlOverride.proxy(), handlers.get("xml")); + assertEquals(mockHandlerJson.proxy(), handlers.get("json")); + } +}