Author: mrdon Date: Thu Oct 25 03:54:30 2007 New Revision: 588196 URL: http://svn.apache.org/viewvc?rev=588196&view=rev Log: * Changing zero conf to look for classes ending in 'Controller' rather than 'Resource' * Making the method name for different rest operations configurable * Renaming RestInfo to HttpHeaders as it makes more sense
Added: struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersController.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java - copied, changed from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ResourceClasspathPackageProvider.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultHttpHeaders.java - copied, changed from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultRestInfo.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/HttpHeaders.java - copied, changed from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestInfo.java Removed: struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersResource.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultRestInfo.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ResourceClasspathPackageProvider.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestInfo.java Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ContentTypeHandlerManager.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionInvocation.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java Added: struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersController.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersController.java?rev=588196&view=auto ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersController.java (added) +++ struts/sandbox/trunk/struts2-rest-plugin/showcase/src/main/java/org/apache/struts2/rest/example/OrdersController.java Thu Oct 25 03:54:30 2007 @@ -0,0 +1,84 @@ +package org.apache.struts2.rest.example; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.struts2.interceptor.ParameterAware; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; + +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Validateable; +import com.opensymphony.xwork2.ValidationAwareSupport; + +public class OrdersController extends ValidationAwareSupport implements ModelDriven<Object>, ParameterAware, Validateable{ + + private Order model = new Order(); + private static Map<String,Order> orders = new HashMap<String,Order>(); + + static { + orders.put("3", new Order("3", "Bob", 33)); + orders.put("4", new Order("4", "Sarah", 44)); + orders.put("5", new Order("5", "Jim", 66)); + } + private Collection<Order> list; + + public void validate() { + if (model.getId() == null || model.getId().length() ==0) { + addFieldError("id", "ID is wrong"); + } + } + + public String show() { + return "show"; + } + + public String edit() { + return "edit"; + } + + public String editNew() { + return "editNew"; + } + + public String destroy() { + orders.remove(model.getId()); + return "success"; + } + + public HttpHeaders create() { + orders.put(model.getId(), model); + return new DefaultHttpHeaders() + .setLocationId(model.getId()) + .renderResult("success"); + } + + public String update() { + orders.put(model.getId(), model); + return "success"; + } + + public HttpHeaders index() { + list = new ArrayList(orders.values()); + + return new DefaultHttpHeaders() + .renderResult("index") + .withETag("2323"); + } + + public Object getModel() { + return (list != null ? list : model); + } + + // Silly workaround since modeldriven doesn't work right in xwork 2.1.0 + public void setParameters(Map<String,String[]> parameters) { + if (parameters.get("id") != null && orders.get(parameters.get("id")[0]) != null) { + orders.get(parameters.get("id")[0]).copyTo(model); + } + } + + +} 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=588196&r1=588195&r2=588196&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 Thu Oct 25 03:54:30 2007 @@ -93,8 +93,8 @@ } boolean statusNotOk = false; - if (methodResult instanceof RestInfo) { - RestInfo info = (RestInfo) methodResult; + if (methodResult instanceof HttpHeaders) { + HttpHeaders info = (HttpHeaders) methodResult; resultCode = info.apply(req, res, target); if (info.getStatus() != SC_OK) { statusNotOk = true; Copied: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java (from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ResourceClasspathPackageProvider.java) URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java?p2=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java&p1=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ResourceClasspathPackageProvider.java&r1=588193&r2=588196&rev=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ResourceClasspathPackageProvider.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/ControllerClasspathPackageProvider.java Thu Oct 25 03:54:30 2007 @@ -25,23 +25,23 @@ import com.opensymphony.xwork2.util.ResolverUtil.ClassTest; /** - * Checks for actions ending in Resource indicating a Rest resource + * Checks for actions ending in Controller indicating a Rest controller */ -public class ResourceClasspathPackageProvider extends ClasspathPackageProvider { +public class ControllerClasspathPackageProvider extends ClasspathPackageProvider { @Override protected ClassTest createActionClassTest() { return new ClassTest() { - // Match Action implementations and classes ending with "Resource" + // Match Action implementations and classes ending with "Controller" public boolean matches(Class type) { - return (type.getSimpleName().endsWith("Resource")); + return (type.getSimpleName().endsWith("Controller")); } }; } @Override protected String getClassSuffix() { - return "Resource"; + return "Controller"; } } Copied: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultHttpHeaders.java (from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultRestInfo.java) URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultHttpHeaders.java?p2=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultHttpHeaders.java&p1=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultRestInfo.java&r1=588193&r2=588196&rev=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultRestInfo.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/DefaultHttpHeaders.java Thu Oct 25 03:54:30 2007 @@ -30,7 +30,7 @@ /** * Default implementation of rest info that uses fluent-style construction */ -public class DefaultRestInfo implements RestInfo { +public class DefaultHttpHeaders implements HttpHeaders { String resultCode; int status = SC_OK; Object etag; @@ -39,43 +39,43 @@ boolean disableCaching; Date lastModified; - public DefaultRestInfo renderResult(String code) { + public DefaultHttpHeaders renderResult(String code) { this.resultCode = code; return this; } - public DefaultRestInfo withStatus(int code) { + public DefaultHttpHeaders withStatus(int code) { this.status = code; return this; } - public DefaultRestInfo withETag(Object etag) { + public DefaultHttpHeaders withETag(Object etag) { this.etag = etag; return this; } - public DefaultRestInfo setLocationId(Object id) { + public DefaultHttpHeaders setLocationId(Object id) { this.locationId = id; return this; } - public DefaultRestInfo setLocation(String loc) { + public DefaultHttpHeaders setLocation(String loc) { this.location = loc; return this; } - public DefaultRestInfo lastModified(Date date) { + public DefaultHttpHeaders lastModified(Date date) { this.lastModified = date; return this; } - public DefaultRestInfo disableCaching() { + public DefaultHttpHeaders disableCaching() { this.disableCaching = true; return this; } /* (non-Javadoc) - * @see org.apache.struts2.rest.RestInfo#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) + * @see org.apache.struts2.rest.HttpHeaders#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) */ public String apply(HttpServletRequest request, HttpServletResponse response, Object target) { response.setStatus(status); Copied: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/HttpHeaders.java (from r588193, struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestInfo.java) URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/HttpHeaders.java?p2=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/HttpHeaders.java&p1=struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestInfo.java&r1=588193&r2=588196&rev=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestInfo.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/HttpHeaders.java Thu Oct 25 03:54:30 2007 @@ -24,9 +24,9 @@ import javax.servlet.http.HttpServletResponse; /** - * Type-safe rest-related information to apply to a response + * Type-safe rest-related informtion to apply to a response */ -public interface RestInfo { +public interface HttpHeaders { /** * Applies the configured information to the response Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionInvocation.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionInvocation.java?rev=588196&r1=588195&r2=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionInvocation.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionInvocation.java Thu Oct 25 03:54:30 2007 @@ -67,7 +67,7 @@ /** * Extends the usual [EMAIL PROTECTED] ActionInvocation} to add support for processing the object returned - * from the action execution. This allows us to support methods that return [EMAIL PROTECTED] RestInfo} + * from the action execution. This allows us to support methods that return [EMAIL PROTECTED] HttpHeaders} * as well as apply content type-specific operations to the result. */ public class RestActionInvocation extends DefaultActionInvocation { Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java?rev=588196&r1=588195&r2=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestActionMapper.java Thu Oct 25 03:54:30 2007 @@ -54,6 +54,27 @@ * from the action name. Whether or not the method is specified, the mapper will * try to truncate the identifier from the url and store it as a parameter. * </li> + * <li><code>struts.mapper.indexMethodName</code> - The method name to call for a GET + * request with no id parameter. Defaults to 'index'. + * </li> + * <li><code>struts.mapper.getMethodName</code> - The method name to call for a GET + * request with an id parameter. Defaults to 'show'. + * </li> + * <li><code>struts.mapper.postMethodName</code> - The method name to call for a POST + * request with no id parameter. Defaults to 'create'. + * </li> + * <li><code>struts.mapper.putMethodName</code> - The method name to call for a PUT + * request with an id parameter. Defaults to 'update'. + * </li> + * <li><code>struts.mapper.deleteMethodName</code> - The method name to call for a DELETE + * request with an id parameter. Defaults to 'destroy'. + * </li> + * <li><code>struts.mapper.editMethodName</code> - The method name to call for a GET + * request with an id parameter and the 'edit' view specified. Defaults to 'edit'. + * </li> + * <li><code>struts.mapper.newMethodName</code> - The method name to call for a GET + * request with no id parameter and the 'new' view specified. Defaults to 'editNew'. + * </li> * </ul> * <p> * The following URL's will invoke its methods: @@ -78,6 +99,13 @@ protected static final Logger LOG = LoggerFactory.getLogger(RestActionMapper.class); public static final String HTTP_METHOD_PARAM = "_method"; private String idParameterName = "id"; + private String indexMethodName = "index"; + private String getMethodName = "show"; + private String postMethodName = "create"; + private String editMethodName = "edit"; + private String newMethodName = "editNew"; + private String deleteMethodName = "destroy"; + private String putMethodName = "update"; public RestActionMapper() { } @@ -90,7 +118,42 @@ public void setIdParameterName(String idParameterName) { this.idParameterName = idParameterName; } - + + @Inject(required=false,value="struts.mapper.indexMethodName") + public void setIndexMethodName(String indexMethodName) { + this.indexMethodName = indexMethodName; + } + + @Inject(required=false,value="struts.mapper.getMethodName") + public void setGetMethodName(String getMethodName) { + this.getMethodName = getMethodName; + } + + @Inject(required=false,value="struts.mapper.postMethodName") + public void setPostMethodName(String postMethodName) { + this.postMethodName = postMethodName; + } + + @Inject(required=false,value="struts.mapper.editMethodName") + public void setEditMethodName(String editMethodName) { + this.editMethodName = editMethodName; + } + + @Inject(required=false,value="struts.mapper.newMethodName") + public void setNewMethodName(String newMethodName) { + this.newMethodName = newMethodName; + } + + @Inject(required=false,value="struts.mapper.deleteMethodName") + public void setDeleteMethodName(String deleteMethodName) { + this.deleteMethodName = deleteMethodName; + } + + @Inject(required=false,value="struts.mapper.putMethodName") + public void setPutMethodName(String putMethodName) { + this.putMethodName = putMethodName; + } + public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) { ActionMapping mapping = new ActionMapping(); @@ -134,11 +197,11 @@ // Index e.g. foo if (isGet(request)) { - mapping.setMethod("index"); + mapping.setMethod(indexMethodName); // Creating a new entry on POST e.g. foo } else if (isPost(request)) { - mapping.setMethod("create"); + mapping.setMethod(postMethodName); } // Handle uris with an id at the end @@ -147,23 +210,23 @@ // Viewing the form to edit an item e.g. foo/1;edit if (isGet(request) && id.endsWith(";edit")) { id = id.substring(0, id.length() - ";edit".length()); - mapping.setMethod("edit"); + mapping.setMethod(editMethodName); // Viewing the form to create a new item e.g. foo/new } else if (isGet(request) && "new".equals(id)) { - mapping.setMethod("editNew"); + mapping.setMethod(newMethodName); // Removing an item e.g. foo/1 } else if (isDelete(request)) { - mapping.setMethod("destroy"); + mapping.setMethod(deleteMethodName); // Viewing an item e.g. foo/1 } else if (isGet(request)) { - mapping.setMethod("show"); + mapping.setMethod(getMethodName); // Updating an item e.g. foo/1 } else if (isPut(request)) { - mapping.setMethod("update"); + mapping.setMethod(putMethodName); } } } Modified: struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java?rev=588196&r1=588195&r2=588196&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java (original) +++ struts/sandbox/trunk/struts2-rest-plugin/src/main/java/org/apache/struts2/rest/RestWorkflowInterceptor.java Thu Oct 25 03:54:30 2007 @@ -181,7 +181,7 @@ } - RestInfo info = new DefaultRestInfo() + HttpHeaders info = new DefaultHttpHeaders() .disableCaching() .renderResult(method) .withStatus(SC_BAD_REQUEST);