From ae58ad2a2d8b297ea0e87ca116052d90a0deafb1 Mon Sep 17 00:00:00 2001 From: Ted Nathan Husted Date: Fri, 2 Feb 2007 02:49:11 +0000 Subject: [PATCH] WW-1680 Undo move pending a refactoring of the StrutsObjectFactory. git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@502453 13f79535-47bb-0310-9956-ffa450edef68 --- api/pom.xml | 54 +++++ .../main/java/org/apache/struts2/Action.java | 65 ++++++ .../java/org/apache/struts2/MessageAware.java | 61 +++++ .../java/org/apache/struts2/Messages.java | 216 ++++++++++++++++++ .../java/org/apache/struts2/ResultNames.java | 56 +++++ .../java/org/apache/struts2/Validatable.java | 37 +++ .../struts2/servlet/ParameterAware.java | 38 +++ .../struts2/servlet/ServletRequestAware.java | 38 +++ .../struts2/servlet/ServletResponseAware.java | 38 +++ .../org/apache/struts2/spi/ActionContext.java | 79 +++++++ .../org/apache/struts2/spi/Interceptor.java | 36 +++ .../apache/struts2/spi/RequestContext.java | 121 ++++++++++ .../struts2/spi/RequestContextAware.java | 39 ++++ .../java/org/apache/struts2/spi/Result.java | 38 +++ .../org/apache/struts2/spi/ValueStack.java | 113 +++++++++ api/src/main/resources/LICENSE.txt | 174 ++++++++++++++ api/src/main/resources/NOTICE.txt | 5 + 17 files changed, 1208 insertions(+) create mode 100644 api/pom.xml create mode 100644 api/src/main/java/org/apache/struts2/Action.java create mode 100644 api/src/main/java/org/apache/struts2/MessageAware.java create mode 100644 api/src/main/java/org/apache/struts2/Messages.java create mode 100644 api/src/main/java/org/apache/struts2/ResultNames.java create mode 100644 api/src/main/java/org/apache/struts2/Validatable.java create mode 100644 api/src/main/java/org/apache/struts2/servlet/ParameterAware.java create mode 100644 api/src/main/java/org/apache/struts2/servlet/ServletRequestAware.java create mode 100644 api/src/main/java/org/apache/struts2/servlet/ServletResponseAware.java create mode 100644 api/src/main/java/org/apache/struts2/spi/ActionContext.java create mode 100644 api/src/main/java/org/apache/struts2/spi/Interceptor.java create mode 100644 api/src/main/java/org/apache/struts2/spi/RequestContext.java create mode 100644 api/src/main/java/org/apache/struts2/spi/RequestContextAware.java create mode 100644 api/src/main/java/org/apache/struts2/spi/Result.java create mode 100644 api/src/main/java/org/apache/struts2/spi/ValueStack.java create mode 100644 api/src/main/resources/LICENSE.txt create mode 100644 api/src/main/resources/NOTICE.txt diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 000000000..34202df98 --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.apache.struts + struts2-parent + 2.0.5-SNAPSHOT + + org.apache.struts + struts2-api + jar + Struts 2 API + + + scm:svn:http://svn.apache.org/repos/asf/struts/struts2/trunk/api/ + scm:svn:https://svn.apache.org/repos/asf/struts/struts2/trunk/api/ + http://svn.apache.org/viewcvs.cgi/struts/struts2/trunk/api/ + + + + + javax.servlet + servlet-api + 2.4 + provided + + + junit + junit + 3.8.1 + test + + true + + + org.easymock + easymock + test + 2.0 + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + false + + + + + diff --git a/api/src/main/java/org/apache/struts2/Action.java b/api/src/main/java/org/apache/struts2/Action.java new file mode 100644 index 000000000..ae46570f2 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/Action.java @@ -0,0 +1,65 @@ +/* + * $Id$ + * + * 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; + +/** + * Default action interface. Provided purely for user convenience. Struts does not require actions to implement any + * interfaces. Actions need only implement a public, no argument method which returns {@code String}. If a user does + * not specify a method name, Struts defaults to {@code execute()}. + * + *

For example: + * + *

+ *   static import ResultNames.*;
+ *
+ *   public class MyAction implements Action {
+ *
+ *     public String execute() {
+ *       return SUCCESS;
+ *     }
+ *   }
+ * 
+ * + *

is equivalent to: + * + *

+ *   static import ResultNames.*;
+ *
+ *   public class MyAction {
+ *
+ *     public String execute() {
+ *       return SUCCESS;
+ *     }
+ *   }
+ * 
+ * + * @author crazybob@google.com (Bob Lee) + */ +public interface Action { + + /** + * Executes this action. + * + * @return result name which matches a result name from the action mapping in the configuration file. See {@link + * ResultNames} for common suggestions. + */ + String execute(); +} diff --git a/api/src/main/java/org/apache/struts2/MessageAware.java b/api/src/main/java/org/apache/struts2/MessageAware.java new file mode 100644 index 000000000..6dd380b53 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/MessageAware.java @@ -0,0 +1,61 @@ +/* + * $Id$ + * + * 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; + +/** + * Implemented by actions which may need to record errors or messages. + * + *
+ *   static import ResultNames.*;
+ *
+ *   public class SetName implements MessageAware {
+ *
+ *     Messages messages;
+ *     String name;
+ *
+ *     public String execute() {
+ *       return SUCCESS;
+ *     }
+ *
+ *     public void setName(String name) {
+ *       if ("".equals(name))
+ *         messages.forField("name").addError("name.required");
+ *
+ *       this.name = name;
+ *     }
+ *
+ *     public void setMessages(Messages messages) {
+ *       this.messages = messages;
+ *     }
+ *   }
+ * 
+ * + * @author crazybob@google.com (Bob Lee) + */ +public interface MessageAware { + + /** + * Sets messages. + * + * @param messages messages + */ + void setMessages(Messages messages); +} diff --git a/api/src/main/java/org/apache/struts2/Messages.java b/api/src/main/java/org/apache/struts2/Messages.java new file mode 100644 index 000000000..bce30de5a --- /dev/null +++ b/api/src/main/java/org/apache/struts2/Messages.java @@ -0,0 +1,216 @@ +/* + * $Id$ + * + * 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; + +import java.util.List; +import java.util.Set; +import java.util.Map; + +/** + * Collection of messages. Supports nesting messages by field name. + * + *

Uses keys when adding instead of actual messages to decouple code from messages. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface Messages { + + // TODO: Use Object[] for args instead of String[]. + + /** + * Message severity. + */ + public enum Severity { + + /** + * Informational messages. + */ + INFO, + + /** + * Warning messages. + */ + WARN, + + /** + * Error messages. + */ + ERROR, + } + + /** + * Gets nested messages for the given field. + * + *

Supports dot notation to represent nesting. For example: + * + *

+     * messages.forField("foo").forField("bar") == messages.forField("foo.bar")
+     * 
+ * + * @param fieldName name of the field + * @return nested {@code Messages} for given field name + */ + Messages forField(String fieldName); + + /** + * Gets map of field name to messages for that field. + * + * @return map of field name to {@code Messages} + */ + Map forFields(); + + /** + * Adds informational message. + * + * @param key message key + * @see Severity.INFO + */ + void addInformation(String key); + + /** + * Adds informational message. + * + * @param key message key + * @param arguments message arguments + * @see Severity.INFO + */ + void addInformation(String key, String... arguments); + + /** + * Adds warning message. + * + * @param key message key + * @see Severity.WARN + */ + void addWarning(String key); + + /** + * Adds warning message. + * + * @param key message key + * @param arguments message arguments + * @see Severity.WARN + */ + void addWarning(String key, String... arguments); + + /** + * Adds error message. + * + * @param key message key + * @see Severity.ERROR + */ + void addError(String key); + + /** + * Adds error message. + * + * @param key message key + * @param arguments message arguments + * @see Severity.ERROR + */ + void addError(String key, String... arguments); + + /** + * Adds message. + * + * @param severity message severity + * @param key message key + */ + void add(Severity severity, String key); + + /** + * Adds request-scoped message. + * + * @param severity message severity + * @param key message key + * @param arguments message arguments + */ + void add(Severity severity, String key, String... arguments); + + /** + * Gets set of severities for which this {@code Messages} instance has messages. Not recursive. + * + * @return unmodifiable set of {@link Severity} sorted from least to most severe + */ + Set getSeverities(); + + /** + * Gets message strings for the given severity. Not recursive. + * + * @param severity message severity + * @return unmodifiable list of messages + */ + List forSeverity(Severity severity); + + /** + * Gets error message strings for this {@code Messages} instance. Not recursive. + * + * @return unmodifiable list of messages + */ + List getErrors(); + + /** + * Gets error message strings for this {@code Messages} instance. Not recursive. + * + * @return unmodifiable list of messages + */ + List getWarnings(); + + /** + * Gets informational message strings for this {@code Messages} instance. Not recursive. + * + * @return unmodifiable list of messages + */ + List getInformation(); + + /** + * Returns true if this or a nested {@code Messages} instance has error messages. + * + * @see Severity.ERROR + */ + boolean hasErrors(); + + /** + * Returns true if this or a nested {@code Messages} instance has warning messages. + * + * @see Severity.WARN + */ + boolean hasWarnings(); + + /** + * Returns true if this or a nested {@code Messages} instance has informational messages. + * + * @see Severity.INFO + */ + boolean hasInformation(); + + /** + * Returns true if this and all nested {@code Messages} instances have no messages. + */ + boolean isEmpty(); + + /** + * Returns true if this and all nested {@code Messages} instances have no messages for the given severity. + * + * @param severity message severity + */ + boolean isEmpty(Severity severity); +} \ No newline at end of file diff --git a/api/src/main/java/org/apache/struts2/ResultNames.java b/api/src/main/java/org/apache/struts2/ResultNames.java new file mode 100644 index 000000000..fd5955ce0 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/ResultNames.java @@ -0,0 +1,56 @@ +/* + * $Id$ + * + * 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; + +/** + * Commonly used result names returned by action methods. + * + * @author crazybob@google.com (Bob Lee) + */ +public final class ResultNames { + + private ResultNames() {} + + /** + * The action executed successfully. + */ + public static final String SUCCESS = "success"; + + /** + * The action requires more input, i.e. a validation error occurred. + */ + public static final String INPUT = "input"; + + /** + * The action requires the user to log in before executing. + */ + public static final String LOGIN = "login"; + + /** + * The action execution failed irrecoverably. + */ + public static final String ERROR = "error"; + + /** + * The action executed successfully, but do not execute a result. + */ + public static final String NONE = "none"; +} diff --git a/api/src/main/java/org/apache/struts2/Validatable.java b/api/src/main/java/org/apache/struts2/Validatable.java new file mode 100644 index 000000000..1d59dddee --- /dev/null +++ b/api/src/main/java/org/apache/struts2/Validatable.java @@ -0,0 +1,37 @@ +/* + * $Id$ + * + * 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; + +import org.apache.struts2.MessageAware; + +/** + * Implemented by actions which wish to execute some validation logic before their action method. Useful for + * cross-field validations. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface Validatable extends MessageAware { + + /** + * Validates input. Executes before action method. + */ + public void validate(); +} diff --git a/api/src/main/java/org/apache/struts2/servlet/ParameterAware.java b/api/src/main/java/org/apache/struts2/servlet/ParameterAware.java new file mode 100644 index 000000000..df705fbe6 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/servlet/ParameterAware.java @@ -0,0 +1,38 @@ +/* + * $Id$ + * + * 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.servlet; + +import java.util.Map; + +/** + * Implemented by actions which need direct access to the request parameters. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface ParameterAware { + + /** + * Sets parameters. + * + * @param parameters map of parameter name to parameter values + */ + void setParameters(Map parameters); +} diff --git a/api/src/main/java/org/apache/struts2/servlet/ServletRequestAware.java b/api/src/main/java/org/apache/struts2/servlet/ServletRequestAware.java new file mode 100644 index 000000000..cf1a44c6b --- /dev/null +++ b/api/src/main/java/org/apache/struts2/servlet/ServletRequestAware.java @@ -0,0 +1,38 @@ +/* + * $Id$ + * + * 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.servlet; + +import javax.servlet.http.HttpServletRequest; + +/** + * Implemented by actions which need direct access to the servlet request. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface ServletRequestAware { + + /** + * Sets the servlet request. + * + * @param request servlet request. + */ + void setServletRequest(HttpServletRequest request); +} diff --git a/api/src/main/java/org/apache/struts2/servlet/ServletResponseAware.java b/api/src/main/java/org/apache/struts2/servlet/ServletResponseAware.java new file mode 100644 index 000000000..c36726fa2 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/servlet/ServletResponseAware.java @@ -0,0 +1,38 @@ +/* + * $Id$ + * + * 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.servlet; + +import javax.servlet.http.HttpServletResponse; + +/** + * Implemented by actions which need direct access to the servlet response. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface ServletResponseAware { + + /** + * Sets the servlet response. + * + * @param response servlet response + */ + void setServletResponse(HttpServletResponse response); +} diff --git a/api/src/main/java/org/apache/struts2/spi/ActionContext.java b/api/src/main/java/org/apache/struts2/spi/ActionContext.java new file mode 100644 index 000000000..5546fa444 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/ActionContext.java @@ -0,0 +1,79 @@ +/* + * $Id$ + * + * 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.spi; + +import java.lang.reflect.Method; + +/** + * Context of an action execution. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface ActionContext { + + /** + * Gets action instance. + */ + Object getAction(); + + /** + * Gets action method. + */ + Method getMethod(); + + /** + * Gets action name. + */ + String getActionName(); + + /** + * Gets the path for the action's namespace. + */ + String getNamespacePath(); + + /** + * Gets the {@link Result} instance for the action. + * + * @return {@link Result} instance or {@code null} if we don't have a result yet. + */ + Result getResult(); + + /** + * Adds a result interceptor for the action. Enables executing code before and after a result, executing an + * alternate result, etc. + */ + void addResultInterceptor(Result interceptor); + + /** + * Gets context of action which chained to us. + * + * @return context of previous action or {@code null} if this is the first action in the chain + */ + ActionContext getPrevious(); + + /** + * Gets context of action which this action chained to. + * + * @return context of next action or {@code null} if we haven't chained to another action yet or this is the last + * action in the chain. + */ + ActionContext getNext(); +} diff --git a/api/src/main/java/org/apache/struts2/spi/Interceptor.java b/api/src/main/java/org/apache/struts2/spi/Interceptor.java new file mode 100644 index 000000000..33cd84751 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/Interceptor.java @@ -0,0 +1,36 @@ +/* + * $Id$ + * + * 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.spi; + +/** + * Intercepts an action request. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface Interceptor { + + /** + * Intercepts an action request. + * + * @param requestContext current request context + */ + String intercept(RequestContext requestContext) throws Exception; +} diff --git a/api/src/main/java/org/apache/struts2/spi/RequestContext.java b/api/src/main/java/org/apache/struts2/spi/RequestContext.java new file mode 100644 index 000000000..c08b08a6f --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/RequestContext.java @@ -0,0 +1,121 @@ +/* + * $Id$ + * + * 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.spi; + +import org.apache.struts2.Messages; + +import javax.servlet.ServletContext; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Request context. A single request may span multiple actions with action chaining. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface RequestContext { + + /** + * Gets context of the currently executing action. + * + * @return current action context + */ + ActionContext getActionContext(); + + /** + * Convenience method. Equivalent to {@code getActionContext().getAction()}. + * + * @return currently executing action + */ + Object getAction(); + + /** + * Gets map of request parameters. + */ + Map getParameterMap(); + + /** + * Gets map of request attributes. + */ + Map getAttributeMap(); + + /** + * Gets map of session attributes. + */ + Map getSessionMap(); + + /** + * Gets map of application (servlet context) attributes. + */ + Map getApplicationMap(); + + /** + * Finds cookies with the given name, + */ + List findCookiesForName(String name); + + /** + * Gets locale. + */ + Locale getLocale(); + + /** + * Sets locale. Stores the locale in the session for future requests. + */ + void setLocale(Locale locale); + + /** + * Gets messages. + */ + Messages getMessages(); + + /** + * Gets the servlet request. + */ + HttpServletRequest getServletRequest(); + + /** + * Gets the servlet response. + */ + HttpServletResponse getServletResponse(); + + /** + * Gets the servlet context. + */ + ServletContext getServletContext(); + + /** + * Gets the value stack. + */ + ValueStack getValueStack(); + + /** + * Invokes the next interceptor or the action method if no more interceptors remain. + * + * @return result name + * @throws IllegalStateException if already invoked or called from the action + */ + String proceed() throws Exception; +} diff --git a/api/src/main/java/org/apache/struts2/spi/RequestContextAware.java b/api/src/main/java/org/apache/struts2/spi/RequestContextAware.java new file mode 100644 index 000000000..342599b9e --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/RequestContextAware.java @@ -0,0 +1,39 @@ +/* + * $Id$ + * + * 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.spi; + +import org.apache.struts2.spi.RequestContext; + +/** + * Implemented by actions that need access to the current {@link org.apache.struts2.spi.RequestContext}. Use + * judiciously. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface RequestContextAware { + + /** + * Sets {@link org.apache.struts2.spi.RequestContext}. + * + * @param requestContext + */ + void setRequestContext(RequestContext requestContext); +} diff --git a/api/src/main/java/org/apache/struts2/spi/Result.java b/api/src/main/java/org/apache/struts2/spi/Result.java new file mode 100644 index 000000000..07913ccd3 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/Result.java @@ -0,0 +1,38 @@ +/* + * $Id$ + * + * 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.spi; + +import org.apache.struts2.spi.RequestContext; + +/** + * The result of an action request. Struts creates a new {@code Result} instance for each request. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface Result { + + /** + * Executes result. + * + * @param requestContext + */ + void execute(RequestContext requestContext) throws Exception; +} diff --git a/api/src/main/java/org/apache/struts2/spi/ValueStack.java b/api/src/main/java/org/apache/struts2/spi/ValueStack.java new file mode 100644 index 000000000..bd6192206 --- /dev/null +++ b/api/src/main/java/org/apache/struts2/spi/ValueStack.java @@ -0,0 +1,113 @@ +/* + * $Id$ + * + * 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.spi; + +/** + * A central fixture of the Struts framework, the {@code ValueStack} is a stack which contains the actions + * which have executed in addition to other objects. Users can get and set values on the stack using expressions. The + * {@code ValueStack} will search down the stack starting with the most recent objects until it finds an object to + * which the expression can apply. + * + * @author crazybob@google.com (Bob Lee) + */ +public interface ValueStack extends Iterable { + + /** + * Gets the top, most recent object from the stack without changing the stack. + * + * @return the top object + */ + Object peek(); + + /** + * Removes the top, most recent object from the stack. + * + * @return the top object + */ + Object pop(); + + /** + * Pushes an object onto the stack. + * + * @param o + */ + void push(Object o); + + /** + * Creates a shallow copy of this stack. + * + * @return a new stack which contains the same objects as this one + */ + ValueStack clone(); + + /** + * Queries the stack. Starts with the top, most recent object. If the expression can apply to the object, this + * method returns the result of evaluating the expression. If the expression does not apply, this method moves + * down the stack to the next object and repeats. Returns {@code null} if the expression doesn't apply to any + * objects. + * + * @param expression + * @return the evaluation of the expression against the first applicable object in the stack + */ + Object get(String expression); + + /** + * Queries the stack and converts the result to the specified type. Starts with the top, most recent object. If + * the expression can apply to the object, this method returns the result of evaluating the expression converted + * to the specified type. If the expression does not apply, this method moves down the stack to the next object + * and repeats. Returns {@code null} if the expression doesn't apply to any objects. + * + * @param expression + * @param asType the type to convert the result to + * @return the evaluation of the expression against the first applicable object in the stack converted to the + * specified type + */ + T get(String expression, Class asType); + + /** + * Queries the stack and converts the result to a {@code String}. Starts with the top, most recent object. If the + * expression can apply to the object, this method returns the result of evaluating the expression converted to a + * {@code String}. If the expression does not apply, this method moves down the stack to the next object and + * repeats. Returns {@code null} if the expression doesn't apply to any objects. + * + * @param expression + * @return the evaluation of the expression against the first applicable object in the stack converted to a {@code + * String} + */ + String getString(String expression); + + /** + * Sets a value on an object from the stack. This method starts at the top, most recent object. If the expression + * applies to that object, this methods sets the given value on that object using the expression and converting + * the type as necessary. If the expression does not apply, this method moves to the next object and repeats. + * + * @param expression + * @param value + */ + void set(String expression, Object value); + + /** + * Returns the number of object on the stack. + * + * @return size of stack + */ + int size(); +} diff --git a/api/src/main/resources/LICENSE.txt b/api/src/main/resources/LICENSE.txt new file mode 100644 index 000000000..dd5b3a58a --- /dev/null +++ b/api/src/main/resources/LICENSE.txt @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/api/src/main/resources/NOTICE.txt b/api/src/main/resources/NOTICE.txt new file mode 100644 index 000000000..cd13ec449 --- /dev/null +++ b/api/src/main/resources/NOTICE.txt @@ -0,0 +1,5 @@ +Apache Struts +Copyright 2000-2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file