craigmcc 2004/08/07 20:28:35
Modified: contrib/struts-faces build.xml
contrib/struts-faces/src/conf struts-faces.xml
contrib/struts-faces/src/java/org/apache/struts/faces/application
ViewHandlerImpl.java
contrib/struts-faces/src/java/org/apache/struts/faces/component
ErrorsComponent.java
contrib/struts-faces/src/java/org/apache/struts/faces/renderer
ErrorsRenderer.java
contrib/struts-faces/src/java/org/apache/struts/faces/taglib
ErrorsTag.java
contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient
AbstractTestCase.java SimpleTestCase.java
contrib/struts-faces/src/systest/org/apache/struts/faces/systest
ApplicationResources.properties
contrib/struts-faces/web/systest/WEB-INF struts-config.xml
Added: contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient
LogonTestCase.java
contrib/struts-faces/src/systest/org/apache/struts/faces/systest
LogonAction.java
contrib/struts-faces/web/systest logon.jsp logon1.jsp
contrib/struts-faces/web/systest/WEB-INF validation.xml
Log:
Add more system integration tests for the Struts-Faces Integration Library;
particularly one that exercises form submits and the validator framework.
FIXME: I'm missing something stupid in my validator setup, because the
error messages in LogonTestCase.testIncorrect() do not include the prompt
strings as they really should.
Revision Changes Path
1.17 +0 -8 jakarta-struts/contrib/struts-faces/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-struts/contrib/struts-faces/build.xml,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- build.xml 7 Aug 2004 04:53:34 -0000 1.16
+++ build.xml 8 Aug 2004 03:28:34 -0000 1.17
@@ -504,19 +504,11 @@
</copy>
<!-- Copy required configuration files -->
-<!--
- <copy todir="${build.home}/webapps/systest/WEB-INF">
- <fileset dir="${build.home}/conf">
- <include name="*.tld"/>
- </fileset>
- </copy>
<copy todir="${build.home}/webapps/systest/WEB-INF">
<fileset dir="${struts.home}/lib">
- <include name="*.tld"/>
<include name="valid*.xml"/>
</fileset>
</copy>
--->
<!-- Copy required library JAR files -->
<mkdir dir="${build.home}/webapps/systest/WEB-INF/lib"/>
1.10 +10 -0 jakarta-struts/contrib/struts-faces/src/conf/struts-faces.xml
Index: struts-faces.xml
===================================================================
RCS file: /home/cvs/jakarta-struts/contrib/struts-faces/src/conf/struts-faces.xml,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- struts-faces.xml 7 Aug 2004 04:53:35 -0000 1.9
+++ struts-faces.xml 8 Aug 2004 03:28:35 -0000 1.10
@@ -177,6 +177,16 @@
</attribute>
<attribute>
+ <name>property</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>
+ Component of the component for which to render errors. If not
+ specified, only global messages are rendered.
+ </description>
+ </attribute>
+
+ <attribute>
<name>rendered</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
1.4 +3 -0
jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/application/ViewHandlerImpl.java
Index: ViewHandlerImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/application/ViewHandlerImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ViewHandlerImpl.java 7 Jul 2004 22:08:56 -0000 1.3
+++ ViewHandlerImpl.java 8 Aug 2004 03:28:35 -0000 1.4
@@ -113,6 +113,9 @@
public void renderView(FacesContext context, UIViewRoot view)
throws IOException, FacesException {
+ if (log.isDebugEnabled()) {
+ log.debug("renderView(" + view.getViewId() + ")");
+ }
ExternalContext econtext = context.getExternalContext();
if (econtext.getSession(false) != null) {
Locale locale = (Locale)
1.2 +36 -1
jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/component/ErrorsComponent.java
Index: ErrorsComponent.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/component/ErrorsComponent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ErrorsComponent.java 8 Jul 2004 01:11:28 -0000 1.1
+++ ErrorsComponent.java 8 Aug 2004 03:28:35 -0000 1.2
@@ -56,6 +56,12 @@
private String bundle = null;
+ /**
+ * <p>Property name of the property to report errors for.</p>
+ */
+ private String property = null;
+
+
// ---------------------------------------------------- Component Properties
@@ -96,6 +102,33 @@
}
+ /**
+ * <p>Return the property name for which to report errors.</p>
+ */
+ public String getProperty() {
+
+ ValueBinding vb = getValueBinding("property");
+ if (vb != null) {
+ return (String) vb.getValue(getFacesContext());
+ } else {
+ return property;
+ }
+
+ }
+
+
+ /**
+ * <p>Set the property name for which to report errors.</p>
+ *
+ * @param property The new property name
+ */
+ public void setProperty(String property) {
+
+ this.property = property;
+
+ }
+
+
// ---------------------------------------------------- StateManager Methods
@@ -110,6 +143,7 @@
Object values[] = (Object[]) state;
super.restoreState(context, values[0]);
bundle = (String) values[1];
+ property = (String) values[2];
}
@@ -121,9 +155,10 @@
*/
public Object saveState(FacesContext context) {
- Object values[] = new Object[2];
+ Object values[] = new Object[3];
values[0] = super.saveState(context);
values[1] = bundle;
+ values[2] = property;
return values;
}
1.9 +16 -3
jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/renderer/ErrorsRenderer.java
Index: ErrorsRenderer.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/renderer/ErrorsRenderer.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ErrorsRenderer.java 26 Jul 2004 19:34:49 -0000 1.8
+++ ErrorsRenderer.java 8 Aug 2004 03:28:35 -0000 1.9
@@ -98,9 +98,18 @@
// Set up to render the error messages appropriately
boolean headerDone = false;
ResponseWriter writer = context.getResponseWriter();
+ String id = component.getId();
+ String property = (String) component.getAttributes().get("property");
+ if (id != null) {
+ writer.startElement("span", component);
+ if (id != null) {
+ writer.writeAttribute("id", component.getClientId(context),
+ "id");
+ }
+ }
// Render any JavaServer Faces messages
- Iterator messages = context.getMessages();
+ Iterator messages = context.getMessages(property);
while (messages.hasNext()) {
FacesMessage message = (FacesMessage) messages.next();
if (!headerDone) {
@@ -124,7 +133,8 @@
context.getExternalContext().getRequestMap().get
(Globals.ERROR_KEY);
if (errors != null) {
- Iterator reports = errors.get();
+ Iterator reports = errors.get
+ ((property == null) ? ActionErrors.GLOBAL_ERROR : property);
while (reports.hasNext()) {
ActionMessage report = (ActionMessage) reports.next();
if (!headerDone) {
@@ -151,6 +161,9 @@
// Append the list footer if needed
if (headerDone && footerPresent) {
writer.write(resources.getMessage(locale, "errors.footer"));
+ }
+ if (id != null) {
+ writer.endElement("span");
}
}
1.9 +39 -1
jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/taglib/ErrorsTag.java
Index: ErrorsTag.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/java/org/apache/struts/faces/taglib/ErrorsTag.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ErrorsTag.java 8 Jul 2004 01:11:28 -0000 1.8
+++ ErrorsTag.java 8 Aug 2004 03:28:35 -0000 1.9
@@ -17,6 +17,7 @@
package org.apache.struts.faces.taglib;
+import javax.faces.component.UIComponent;
/**
@@ -33,6 +34,16 @@
// ---------------------------------------------------------- Tag Attributes
+ /**
+ * <p>The property name for which to report errors.</p>
+ */
+ protected String property = null;
+
+ public void setProperty(String property) {
+ this.property = property;
+ }
+
+
// ---------------------------------------------------------- Public Methods
@@ -53,6 +64,33 @@
public String getRendererType() {
return ("org.apache.struts.faces.Errors");
+
+ }
+
+
+ /**
+ * <p>Release any variables allocated during use of this tag instance.</p>
+ */
+ public void release() {
+
+ super.release();
+ this.property = null;
+
+ }
+
+
+ // -------------------------------------------------- UIComponentTag Methods
+
+
+ /**
+ * <p>Override attributes set on this tag instance.</p>
+ *
+ * @param component Component whose attributes should be overridden
+ */
+ protected void setProperties(UIComponent component) {
+
+ super.setProperties(component);
+ setStringAttribute(component, "property", property);
}
1.2 +21 -1
jakarta-struts/contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient/AbstractTestCase.java
Index: AbstractTestCase.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient/AbstractTestCase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractTestCase.java 3 Aug 2004 07:01:08 -0000 1.1
+++ AbstractTestCase.java 8 Aug 2004 03:28:35 -0000 1.2
@@ -23,7 +23,9 @@
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlHead;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
@@ -234,6 +236,24 @@
*/
this.page = page;
return (page);
+
+ }
+
+
+ /**
+ * <p>Submit the current page, using the specified component, and retrieve
+ * the subsequent page, saving a reference so that other utility methods
+ * may be used to retrieve information from it.</p>
+ *
+ * @param submit Submit component to click
+ *
+ * @exception IOException if an input/output error occurs
+ */
+ protected HtmlPage submit(HtmlSubmitInput submit) throws IOException {
+
+ HtmlPage page = (HtmlPage) submit.click();
+ this.page = page;
+ return page;
}
1.3 +1 -4
jakarta-struts/contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient/SimpleTestCase.java
Index: SimpleTestCase.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient/SimpleTestCase.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SimpleTestCase.java 7 Aug 2004 04:53:35 -0000 1.2
+++ SimpleTestCase.java 8 Aug 2004 03:28:35 -0000 1.3
@@ -36,9 +36,6 @@
import junit.framework.TestCase;
import junit.framework.TestSuite;
-import org.apache.commons.httpclient.Cookie;
-import org.apache.commons.httpclient.HttpState;
-
/**
* <p>Test case for a simple Struts-Faces page that is statically examined
1.1
jakarta-struts/contrib/struts-faces/src/sysclient/org/apache/struts/faces/sysclient/LogonTestCase.java
Index: LogonTestCase.java
===================================================================
/*
* Copyright 2002,2004 The Apache Software Foundation.
*
* Licensed 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.struts.faces.sysclient;
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlBase;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlHead;
import com.gargoylesoftware.htmlunit.html.HtmlLink;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlResetInput;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* <p>Test case for a logon form that accepts a username and password.</p>
*
* @version $Revision: 1.1 $ $Date: 2004/08/08 03:28:35 $
*/
public class LogonTestCase extends AbstractTestCase {
// ------------------------------------------------------------ Constructors
/**
* <p>Construct a new instance of this test case.</p>
*
* @param name Name of the new test case
*/
public LogonTestCase(String name) {
super(name);
}
// ------------------------------------------------------ Instance Variables
// ------------------------------------------------------ Test Setup Methods
/**
* <p>Set up the instance variables required for this test case.</p>
*/
public void setUp() throws Exception {
super.setUp();
page("/logon.faces");
}
/**
* <p>Return the set of tests included in this test suite.</p>
*/
public static Test suite() {
return (new TestSuite(LogonTestCase.class));
}
/**
* <p>Tear down instance variables required by this test case.</p>
*/
public void tearDown() {
super.tearDown();
}
// ------------------------------------------------- Individual Test Methods
/**
* <p>Submit incorrect input fields and verify the correct response.</p>
*/
public void testIncorrect() throws Exception {
HtmlSpan span = null;
HtmlTextInput username = (HtmlTextInput) element("form:username");
HtmlPasswordInput password = (HtmlPasswordInput)
element("form:password");
HtmlSubmitInput submit = (HtmlSubmitInput) element("form:submit");
username.setValueAttribute("bb");
password.setValueAttribute("");
submit(submit);
assertEquals("logon", title());
span = (HtmlSpan) element("globalErrors");
assertNotNull(span);
assertEquals("", span.asText());
username = (HtmlTextInput) element("form:username");
assertNotNull(username);
assertEquals("bb", username.getValueAttribute());
span = (HtmlSpan) element("form:usernameErrors");
assertNotNull(span);
// FIXME: response string should really include "Username:"
assertEquals("[EH][EP] can not be less than 3 characters.[ES][EF]",
span.asText());
password = (HtmlPasswordInput) element("form:password");
assertNotNull(password);
assertEquals("", password.getValueAttribute());
span = (HtmlSpan) element("form:passwordErrors");
assertNotNull(span);
// FIXME: response string should really include "Password:"
assertEquals("[EH][EP] is required.[ES][EF]", span.asText());
}
/**
* <p>Verify the content of a pristine page returned when executing this
* view for the first time.</p>
*/
public void testPristine() throws Exception {
HtmlSpan span = null;
HtmlElement html = (HtmlElement) page;
assertEquals("html", html.getTagName());
assertEquals("http://www.w3.org/1999/xhtml",
html.getAttributeValue("xmlns"));
assertEquals("logon", title());
HtmlForm form = (HtmlForm) element("form");
assertNotNull(form);
assertEquals("", form.getAcceptAttribute());
assertEquals("", form.getAcceptCharsetAttribute());
String url = this.url.toString();
url = url.substring(0, url.length() - 1);
url = url.substring(url.lastIndexOf('/'));
String action = form.getActionAttribute();
int semicolon = action.indexOf(';');
if (semicolon >= 0) {
action = action.substring(0, semicolon);
}
assertEquals(url + "/logon.faces", action);
assertEquals("", form.getEnctypeAttribute());
assertEquals("post", form.getMethodAttribute());
assertEquals("", form.getNameAttribute());
assertEquals("", form.getOnResetAttribute());
assertEquals("", form.getOnSubmitAttribute());
assertEquals("", form.getTargetAttribute());
span = (HtmlSpan) element("form:usernamePrompt");
assertNotNull(span);
assertEquals("Username:", span.asText());
HtmlTextInput username = (HtmlTextInput) element("form:username");
assertNotNull(username);
assertEquals("", username.getLangAttribute());
assertEquals("form:username", username.getNameAttribute());
assertEquals("", username.getOnClickAttribute());
assertEquals("", username.getOnDblClickAttribute());
assertEquals("", username.getOnKeyDownAttribute());
assertEquals("", username.getOnKeyPressAttribute());
assertEquals("", username.getOnKeyUpAttribute());
assertEquals("", username.getOnMouseDownAttribute());
assertEquals("", username.getOnMouseMoveAttribute());
assertEquals("", username.getOnMouseOutAttribute());
assertEquals("", username.getOnMouseOverAttribute());
assertEquals("", username.getOnMouseUpAttribute());
assertEquals("text", username.getTypeAttribute());
assertEquals("", username.getValueAttribute());
span = (HtmlSpan) element("form:passwordPrompt");
assertNotNull(span);
assertEquals("Password:", span.asText());
HtmlPasswordInput password = (HtmlPasswordInput)
element("form:password");
assertNotNull(password);
assertEquals("", password.getLangAttribute());
assertEquals("form:password", password.getNameAttribute());
assertEquals("", password.getOnClickAttribute());
assertEquals("", password.getOnDblClickAttribute());
assertEquals("", password.getOnKeyDownAttribute());
assertEquals("", password.getOnKeyPressAttribute());
assertEquals("", password.getOnKeyUpAttribute());
assertEquals("", password.getOnMouseDownAttribute());
assertEquals("", password.getOnMouseMoveAttribute());
assertEquals("", password.getOnMouseOutAttribute());
assertEquals("", password.getOnMouseOverAttribute());
assertEquals("", password.getOnMouseUpAttribute());
assertEquals("password", password.getTypeAttribute());
assertEquals("", password.getValueAttribute());
HtmlSubmitInput submit = (HtmlSubmitInput) element("form:submit");
assertNotNull(submit);
assertEquals("", submit.getLangAttribute());
assertEquals("form:submit", submit.getNameAttribute());
assertEquals("", submit.getOnClickAttribute());
assertEquals("", submit.getOnDblClickAttribute());
assertEquals("", submit.getOnKeyDownAttribute());
assertEquals("", submit.getOnKeyPressAttribute());
assertEquals("", submit.getOnKeyUpAttribute());
assertEquals("", submit.getOnMouseDownAttribute());
assertEquals("", submit.getOnMouseMoveAttribute());
assertEquals("", submit.getOnMouseOutAttribute());
assertEquals("", submit.getOnMouseOverAttribute());
assertEquals("", submit.getOnMouseUpAttribute());
assertEquals("submit", submit.getTypeAttribute());
assertEquals("Logon", submit.getValueAttribute());
HtmlResetInput reset = (HtmlResetInput) element("form:reset");
assertNotNull(reset);
assertEquals("", reset.getLangAttribute());
assertEquals("form:reset", reset.getNameAttribute());
assertEquals("", reset.getOnClickAttribute());
assertEquals("", reset.getOnDblClickAttribute());
assertEquals("", reset.getOnKeyDownAttribute());
assertEquals("", reset.getOnKeyPressAttribute());
assertEquals("", reset.getOnKeyUpAttribute());
assertEquals("", reset.getOnMouseDownAttribute());
assertEquals("", reset.getOnMouseMoveAttribute());
assertEquals("", reset.getOnMouseOutAttribute());
assertEquals("", reset.getOnMouseOverAttribute());
assertEquals("", reset.getOnMouseUpAttribute());
assertEquals("reset", reset.getTypeAttribute());
assertEquals("Reset", reset.getValueAttribute());
HtmlSubmitInput cancel = (HtmlSubmitInput) element("form:cancel");
assertNotNull(cancel);
assertEquals("", cancel.getLangAttribute());
assertEquals("form:cancel", cancel.getNameAttribute());
assertEquals("", cancel.getOnClickAttribute());
assertEquals("", cancel.getOnDblClickAttribute());
assertEquals("", cancel.getOnKeyDownAttribute());
assertEquals("", cancel.getOnKeyPressAttribute());
assertEquals("", cancel.getOnKeyUpAttribute());
assertEquals("", cancel.getOnMouseDownAttribute());
assertEquals("", cancel.getOnMouseMoveAttribute());
assertEquals("", cancel.getOnMouseOutAttribute());
assertEquals("", cancel.getOnMouseOverAttribute());
assertEquals("", cancel.getOnMouseUpAttribute());
assertEquals("submit", cancel.getTypeAttribute());
assertEquals("Cancel", cancel.getValueAttribute());
}
/**
* <p>Submit known-bad mismatch and verify the correct response.</p>
*/
public void testMismatch() throws Exception {
HtmlSpan span = null;
HtmlTextInput username = (HtmlTextInput) element("form:username");
HtmlPasswordInput password = (HtmlPasswordInput)
element("form:password");
HtmlSubmitInput submit = (HtmlSubmitInput) element("form:submit");
username.setValueAttribute("baduser");
password.setValueAttribute("badpass");
submit(submit);
assertEquals("logon", title());
span = (HtmlSpan) element("globalErrors");
assertNotNull(span);
assertEquals("[EH][EP]Invalid username/password combination[ES][EF]",
span.asText());
username = (HtmlTextInput) element("form:username");
assertNotNull(username);
assertEquals("baduser", username.getValueAttribute());
span = (HtmlSpan) element("form:usernameErrors");
assertNotNull(span);
assertEquals("", span.asText());
password = (HtmlPasswordInput) element("form:password");
assertNotNull(password);
assertEquals("", password.getValueAttribute());
span = (HtmlSpan) element("form:passwordErrors");
assertNotNull(span);
assertEquals("", span.asText());
}
/**
* <p>Submit known-good username and password values, and
* verify the correct response.</p>
*/
public void testSuccessful() throws Exception {
HtmlTextInput username = (HtmlTextInput) element("form:username");
HtmlPasswordInput password = (HtmlPasswordInput)
element("form:password");
HtmlSubmitInput submit = (HtmlSubmitInput) element("form:submit");
username.setValueAttribute("gooduser");
password.setValueAttribute("goodpass");
submit(submit);
assertEquals("logon1", title());
}
}
1.2 +22 -0
jakarta-struts/contrib/struts-faces/src/systest/org/apache/struts/faces/systest/ApplicationResources.properties
Index: ApplicationResources.properties
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/src/systest/org/apache/struts/faces/systest/ApplicationResources.properties,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ApplicationResources.properties 7 Aug 2004 04:53:35 -0000 1.1
+++ ApplicationResources.properties 8 Aug 2004 03:28:35 -0000 1.2
@@ -1,7 +1,29 @@
+button.cancel=Cancel
+button.logon=Logon
+button.reset=Reset
errors.header=[EH]
errors.footer=[EF]
errors.prefix=[EP]
errors.suffix=[ES]
+errors.required={0} is required.
+errors.minlength={0} can not be less than {1} characters.
+errors.maxlength={0} can not be more than {1} characters.
+errors.invalid={0} is invalid.
+errors.byte={0} must be a byte.
+errors.short={0} must be a short.
+errors.integer={0} must be an integer.
+errors.long={0} must be a long.
+errors.float={0} must be a float.
+errors.double={0} must be a double.
+errors.date={0} is not a date.
+errors.range={0} is not in the range {1} through {2}.
+errors.creditcard={0} is an invalid credit card number.
+errors.email={0} is an invalid e-mail address.
+logon.username=Username is required
+logon.password=Password is required
+logon.mismatch=Invalid username/password combination
+prompt.username=Username:
+prompt.password=Password:
resource.simple=Resource Simple Text
resource.filtered=Resource <b>Filtered</b> Text
resource.unfiltered=Resource <b>Unfiltered</b> Text
1.1
jakarta-struts/contrib/struts-faces/src/systest/org/apache/struts/faces/systest/LogonAction.java
Index: LogonAction.java
===================================================================
/*
* Copyright 2002,2004 The Apache Software Foundation.
*
* Licensed 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.struts.faces.systest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
/**
* <p>Action to process logon attempts. It accepts only the combination
* "gooduser" and "goodpass", while rejecting all others. Successful
* login requests a logical forward "login1", while unsuccessful login
* returns to the input form.</p>
*/
public class LogonAction extends Action {
private static final Log log = LogFactory.getLog(LogonAction.class);
/**
* <p>Process an attempted logon.</p>
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
ActionErrors errors = new ActionErrors();
String username = (String)
PropertyUtils.getSimpleProperty(form, "username");
if ((username == null) || ("".equals(username))) {
errors.add("username",
new ActionError("logon.username"));
}
String password = (String)
PropertyUtils.getSimpleProperty(form, "password");
if ((password == null) || ("".equals(password))) {
errors.add("password",
new ActionError("logon.password"));
}
if (log.isTraceEnabled()) {
log.trace("username=" + username + ",password=" + password);
}
if (errors.isEmpty() &&
(!"gooduser".equals(username) || !"goodpass".equals(password))) {
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("logon.mismatch"));
}
if (errors.isEmpty()) {
if (log.isDebugEnabled()) {
log.debug("Successful logon, forwarding to logon1");
}
return (mapping.findForward("logon1"));
} else {
if (log.isDebugEnabled()) {
log.debug("Unsuccessful logon, returning to input");
}
saveErrors(request, errors);
return (mapping.getInputForward());
}
}
}
1.1 jakarta-struts/contrib/struts-faces/web/systest/logon.jsp
Index: logon.jsp
===================================================================
<!--
Copyright 2002,2004 The Apache Software Foundation.
Licensed 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.
-->
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="s" uri="http://jakarta.apache.org/struts/tags-faces" %>
<f:view>
<s:html locale="true" xhtml="true">
<head>
<title>logon</title>
</head>
<body>
<s:loadMessages
messages="messages"
var="messages"/>
<s:errors id="globalErrors"
bundle="messages"/>
<s:form id="form"
action="/logon">
<h:panelGrid columns="3">
<h:outputText id="usernamePrompt"
value="#{messages['prompt.username']}"/>
<h:inputText id="username"
value="#{logonForm.username}"/>
<s:errors id="usernameErrors"
bundle="messages"
property="username"/>
<h:outputText id="passwordPrompt"
value="#{messages['prompt.password']}"/>
<h:inputSecret id="password"
value="#{logonForm.password}"/>
<s:errors id="passwordErrors"
bundle="messages"
property="password"/>
<h:commandButton id="submit"
type="SUBMIT"
value="#{messages['button.logon']}"/>
<h:commandButton id="reset"
type="RESET"
value="#{messages['button.reset']}"/>
<h:commandButton id="cancel"
type="SUBMIT"
value="#{messages['button.cancel']}"/>
</h:panelGrid>
</s:form>
</body>
</s:html>
</f:view>
1.1 jakarta-struts/contrib/struts-faces/web/systest/logon1.jsp
Index: logon1.jsp
===================================================================
<!--
Copyright 2002,2004 The Apache Software Foundation.
Licensed 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.
-->
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="s" uri="http://jakarta.apache.org/struts/tags-faces" %>
<f:view>
<s:html locale="true" xhtml="true">
<head>
<title>logon1</title>
<s:base/>
<s:stylesheet path="/stylesheet.css"/>
</head>
<body>
</body>
</s:html>
</f:view>
1.3 +19 -106
jakarta-struts/contrib/struts-faces/web/systest/WEB-INF/struts-config.xml
Index: struts-config.xml
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/struts-faces/web/systest/WEB-INF/struts-config.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- struts-config.xml 7 Aug 2004 04:53:35 -0000 1.2
+++ struts-config.xml 8 Aug 2004 03:28:35 -0000 1.3
@@ -24,14 +24,8 @@
<!--
- This is the Struts configuration file for the example application,
- using the proposed new syntax.
-
- NOTE: You would only flesh out the details in the "form-bean"
- declarations if you had a generator tool that used them to create
- the corresponding Java classes for you. Otherwise, you would
- need only the "form-bean" element itself, with the corresponding
- "name" and "type" attributes.
+ This is the Struts configuration file for the Struts-Faces system
+ integration test webapp.
-->
@@ -42,117 +36,38 @@
<!-- ========== Form Bean Definitions =================================== -->
<form-beans>
- <!-- Logon form bean -->
-<!--
- <form-bean name="logonForm"
- type="org.apache.struts.validator.DynaValidatorForm">
+ <!-- Logon Form Bean -->
+ <form-bean name="logonForm"
+ type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
--->
-
- <!-- Registration form bean -->
-<!--
- <form-bean name="registrationForm"
- type="org.apache.struts.webapp.example.RegistrationForm"/>
--->
-
- <!-- Subscription form bean -->
-<!--
- <form-bean name="subscriptionForm"
- type="org.apache.struts.webapp.example.SubscriptionForm"/>
--->
</form-beans>
<!-- ========== Global Forward Definitions ============================== -->
<global-forwards>
-<!--
- <forward name="logoff" path="/logoff.do"/>
- <forward name="logon" path="/logon.faces"/>
- <forward name="registration" path="/registration.faces"/>
- <forward name="subscription" path="/subscription.faces"/>
- <forward name="success" path="/mainMenu.faces"/>
--->
- </global-forwards>
-
- <!-- ========== Action Mapping Definitions ============================== -->
- <action-mappings>
+ <forward name="logon"
+ path="/logon.jsp"/>
- <!-- Edit user registration -->
-<!--
- <action path="/editRegistration"
- type="org.apache.struts.webapp.example.EditRegistrationAction"
- attribute="registrationForm"
- scope="request"
- validate="false">
- <forward name="success" path="/registration.faces"/>
- </action>
--->
+ <forward name="logon1"
+ path="/logon1.jsp"/>
- <!-- Edit mail subscription -->
-<!--
- <action path="/editSubscription"
- type="org.apache.struts.webapp.example.EditSubscriptionAction"
- attribute="subscriptionForm"
- scope="request"
- validate="false">
- <forward name="failure" path="/mainMenu.faces"/>
- <forward name="success" path="/subscription.faces"/>
- </action>
--->
-
- <!-- Process a user logoff -->
-<!--
- <action path="/logoff"
- type="org.apache.struts.webapp.example.LogoffAction">
- <forward name="success" path="/index.faces"/>
- </action>
--->
-
- <!-- Process a user logon -->
-<!--
- <action path="/logon"
- type="org.apache.struts.webapp.example.LogonAction"
- name="logonForm"
- scope="request"
- input="logon">
- <exception
- key="expired.password"
- type="org.apache.struts.webapp.example.ExpiredPasswordException"
- path="/changePassword.faces"/>
- </action>
--->
-
- <!-- Save user registration -->
-<!--
- <action path="/saveRegistration"
- type="org.apache.struts.webapp.example.SaveRegistrationAction"
- name="registrationForm"
- scope="request"
- input="registration"/>
--->
+ </global-forwards>
- <!-- Save mail subscription -->
-<!--
- <action path="/saveSubscription"
- type="org.apache.struts.webapp.example.SaveSubscriptionAction"
- name="subscriptionForm"
- scope="request"
- input="subscription">
- <forward name="success" path="/editRegistration.do?action=Edit"/>
- </action>
--->
+ <!-- ========== Action Mapping Definitions ============================== -->
+ <action-mappings>
- <!-- Display the "walking tour" documentation -->
-<!--
- <action path="/tour"
- forward="/tour.htm">
- </action>
--->
+ <!-- Execute Logon Action -->
+ <action path="/logon"
+ type="org.apache.struts.faces.systest.LogonAction"
+ input="logon"
+ name="logonForm"
+ scope="request"
+ validate="true"/>
</action-mappings>
@@ -177,12 +92,10 @@
<!-- ========== Plug Ins Configuration ================================== -->
-<!--
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
--->
</struts-config>
1.1
jakarta-struts/contrib/struts-faces/web/systest/WEB-INF/validation.xml
Index: validation.xml
===================================================================
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration
1.1//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
<!--
Copyright 2002,2004 The Apache Software Foundation.
Licensed 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.
-->
<!--
Validation Rules for the Struts-Faces System Integration Test Webapp
$Id: validation.xml,v 1.1 2004/08/08 03:28:35 craigmcc Exp $
-->
<form-validation>
<formset>
<form name="logonForm">
<field property="username"
depends="required,minlength,maxlength">
<!--
<arg position="0"
bundle="messages"
key="prompt.username"/>
<arg position="1"
name="minlength"
resource="false"
key="${var:minlength}"/>
<arg position="2"
name="maxlength"
resource="false"
key="${var:maxlength}"/>
-->
<arg0 key="prompt.username"/>
<arg1 key="${var:minlength}" name="minlength"
resource="false"/>
<arg2 key="${var:maxlength}" name="maxlength"
resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
<field property="password"
depends="required,minlength,maxlength">
<arg0 key="prompt.password"/>
<arg1 key="${var:minlength}" name="minlength"
resource="false"/>
<arg2 key="${var:maxlength}" name="maxlength"
resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]