Author: dolander
Date: Sun Aug 1 14:23:43 2004
New Revision: 35548
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Attribute.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatDate.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatNumber.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatString.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatTag.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Formattable.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Label.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/LabelBase.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Select.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextArea.java
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextBox.java
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B18068.xml
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B33322.xml
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DateFormatString.xml
Log:
Update the error reporting in the Format tags.
Errors are now reported both in-line and in the error summary.
There are two types of error reported, errors in setting attributes which are
reported by
the format tags directly and formatting errors which occur during formatting
and are reported
by the Formattable tag.
Update the Formattable interface to allow formatters to report errors
Report additional errors
Update a few error messages to indicate which tags are creating the errors.
Update tests for changes in the error messages
Review: Eddie
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractColumn.java
Sun Aug 1 14:23:43 2004
@@ -90,6 +90,13 @@
{
getColumnModel().addFormatter(formatter);
}
+ /**
+ * Indicate that a formatter has reported an error so the formatter should
output it's
+ * body text.
+ */
+ public void formatterHasError() {
+ // @todo: need to implement this.
+ }
public int doStartTag()
{
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Attribute.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Attribute.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Attribute.java
Sun Aug 1 14:23:43 2004
@@ -78,8 +78,9 @@
* @netui.tldx:attribute
*/
public void setName(String name)
+ throws JspException
{
- _name = name;
+ _name = setRequiredValueAttribute(name,"name");
}
/**
@@ -97,7 +98,7 @@
*/
public void setValue(String value)
{
- _value = value;
+ _value = setNonEmptyValueAttribute(value);
}
/**
@@ -107,8 +108,9 @@
* @netui.tldx:attribute
*/
public void setFacet(String facet)
+ throws JspException
{
- _facet = facet;
+ _facet = setRequiredValueAttribute(facet,"facet");
}
/**
@@ -117,6 +119,11 @@
*/
public int doStartTag() throws JspException
{
+ if (hasErrors()) {
+ reportErrors();
+ return SKIP_BODY;
+ }
+
Tag tag = getParent();
if (!(tag instanceof IAttributeConsumer)) {
String s = Bundle.getString("Tags_AttributeInvalidParent");
@@ -128,6 +135,16 @@
IAttributeConsumer ac = (IAttributeConsumer) tag;
ac.setAttribute(_name, _value, _facet);
return SKIP_BODY;
+ }
+
+ /**
+ * Does nothing but call the localRelease() method.
+ * @throws JspException if a JSP exception has occurred
+ */
+ public int doEndTag() throws JspException
+ {
+ localRelease();
+ return EVAL_PAGE;
}
protected void localRelease()
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatDate.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatDate.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatDate.java
Sun Aug 1 14:23:43 2004
@@ -226,7 +226,7 @@
/**
* Set the pattern to use to convert a String value into a date. This
* will be used before the common formats.
- * @param pattern the pattern representing the string input
+ * @param inputPattern the pattern representing the string input
* @jsptagref.attributedescription
* The pattern used to convert a String value into a date.
*
@@ -237,9 +237,10 @@
* @netui:attribute required="false" rtexprvalue="true"
* @netui.tldx:attribute
*/
- public void setStringInputPattern(String pattern)
+ public void setStringInputPattern(String inputPattern)
+ throws JspException
{
- _stringInput = pattern;
+ _stringInput =
setRequiredValueAttribute(inputPattern,"stringInputPattern");
}
/**
@@ -248,21 +249,33 @@
*/
public int doStartTag() throws JspException
{
+ Tag parentTag = getParent();
+
+ // if there are errors we need to either add these to the parent
AbstractBastTag or report an error.
if (hasErrors()) {
+ if (parentTag instanceof Formattable) {
+ Formattable parent = (Formattable) parentTag;
+ parent.formatterHasError();
+ }
reportErrors();
localRelease();
- return EVAL_PAGE;
+ return SKIP_BODY;
}
- Tag parentTag = getParent();
if (parentTag instanceof Formattable) {
- DateFormatter formatter = new DateFormatter();
- formatter.setPattern(_pattern);
- formatter.setLocale(getLocale());
- formatter.setInputPattern(_stringInput);
Formattable parent = (Formattable) parentTag;
- parent.addFormatter(formatter);
+ DateFormatter dateFmt = new DateFormatter();
+ dateFmt.setPattern(_pattern);
+ dateFmt.setLocale(getLocale());
+ dateFmt.setInputPattern(_stringInput);
+ parent.addFormatter(dateFmt);
}
+ else {
+ String s = Bundle.getString("Tags_FormattableParentRequired");
+ registerTagError(s,null);
+ reportErrors();
+ }
+
localRelease();
return SKIP_BODY;
}
@@ -294,11 +307,18 @@
SimpleDateFormat dateFormat = null;
if (getPattern() != null) {
- if (locale != null) {
- dateFormat = new SimpleDateFormat(getPattern(), locale);
+ try {
+ if (locale != null) {
+ dateFormat = new SimpleDateFormat(getPattern(),
locale);
+ }
+ else {
+ dateFormat = new SimpleDateFormat(getPattern());
+ }
}
- else {
- dateFormat = new SimpleDateFormat(getPattern());
+ catch (IllegalArgumentException e) {
+ String s =
Bundle.getString("Tags_DateFormatPatternException",new
Object[]{e.getMessage()});
+ logger.warn(s);
+ throw new JspException(s);
}
}
else {
@@ -333,7 +353,7 @@
catch (IllegalArgumentException e) {
String s =
Bundle.getString("Tags_formatDate_StringPatternError",
new Object[]{inputPattern, e.getMessage()});
- logger.error(s);
+ logger.warn(s);
throw new JspException(s);
}
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatNumber.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatNumber.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatNumber.java
Sun Aug 1 14:23:43 2004
@@ -131,7 +131,7 @@
/**
* The type of number format to be used.
*/
- protected String type;
+ protected String _type;
/**
* Return the name of the Tag.
@@ -141,16 +141,7 @@
return "FormatNumber";
}
- /**
- * Gets the type of number format to be used.
- * @return the type.
- */
- public String getType()
- {
- return type;
- }
-
- /**
+ /**
* Sets the type of number format to be used (number, currency, or
percent).
* @param type - the number format type.
* @jsptagref.attributedescription
@@ -163,8 +154,15 @@
* @netui:attribute required="false" rtexprvalue="true"
*/
public void setType(String type)
+ throws JspException
{
- this.type = type;
+ _type = setRequiredValueAttribute(type,"type");
+ if (_type != null) {
+ if (!type.equals("number") && !type.equals("currency") &&
!type.equals("percent")) {
+ String s = Bundle.getString("Tags_NumberFormatWrongType");
+ registerTagError(s,null);
+ }
+ }
}
/**
@@ -173,21 +171,33 @@
*/
public int doStartTag() throws JspException
{
+ Tag parentTag = getParent();
+
+ // if there are errors we need to either add these to the parent
AbstractBastTag or report an error.
if (hasErrors()) {
+ if (parentTag instanceof Formattable) {
+ Formattable parent = (Formattable) parentTag;
+ parent.formatterHasError();
+ }
reportErrors();
localRelease();
- return EVAL_PAGE;
+ return SKIP_BODY;
}
- Tag parentTag = getParent();
+ // if there are no errors then add this to the parent as a formatter.
if (parentTag instanceof Formattable) {
NumberFormatter formatter = new NumberFormatter();
formatter.setPattern(_pattern);
- formatter.setType(type);
+ formatter.setType(_type);
formatter.setLocale(getLocale());
Formattable parent = (Formattable) parentTag;
parent.addFormatter(formatter);
}
+ else {
+ String s = Bundle.getString("Tags_FormattableParentRequired");
+ registerTagError(s,null);
+ reportErrors();
+ }
localRelease();
return SKIP_BODY;
}
@@ -198,7 +208,7 @@
protected void localRelease()
{
super.localRelease();
- type = null;
+ _type = null;
}
/**
@@ -227,6 +237,7 @@
StringBuilder formattedString = new StringBuilder(32);
DecimalFormat numberFormat = null;
+ // get the number format. The type has been validated when it was
set on the tag.
if (locale == null) {
if ((type == null) || (type.equals("number"))) {
numberFormat = (DecimalFormat)
java.text.NumberFormat.getNumberInstance();
@@ -238,7 +249,7 @@
numberFormat = (DecimalFormat)
java.text.NumberFormat.getPercentInstance();
}
else {
- throw new
JspException(Bundle.getString("Tags_NumberFormatWrongType"));
+ assert(false) : "Invalid type was found:" + type;
}
}
else {
@@ -252,17 +263,20 @@
numberFormat = (DecimalFormat)
java.text.NumberFormat.getPercentInstance(locale);
}
else {
- throw new
JspException(Bundle.getString("Tags_NumberFormatWrongType"));
+ assert(false) : "Invalid type was found:" + type;
}
}
+ // format the number, apply the pattern specified
try {
if (getPattern() != null)
numberFormat.applyPattern(getPattern());
}
catch (Exception e) {
- throw new
JspException(Bundle.getString("Tags_FormatException", e.getMessage()), e);
+ throw new
JspException(Bundle.getString("Tags_NumberFormatPatternException",
e.getMessage()), e);
}
+
+ // parse the number
if (dataToFormat.toString().length() == 0) {
return "";
}
@@ -271,7 +285,7 @@
formattedString.append(numberFormat.format(number));
}
catch (Exception e) {
- throw new
JspException(Bundle.getString("Tags_FormatException", e.getMessage()), e);
+ throw new
JspException(Bundle.getString("Tags_NumberFormatParseException",
e.getMessage()), e);
}
return formattedString.toString();
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatString.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatString.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatString.java
Sun Aug 1 14:23:43 2004
@@ -18,6 +18,8 @@
*/
package org.apache.beehive.netui.tags.html;
+import org.apache.beehive.netui.util.Bundle;
+
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
@@ -149,13 +151,19 @@
*/
public int doStartTag() throws JspException
{
+ Tag parentTag = getParent();
+
+ // if there are errors we need to either add these to the parent
AbstractBastTag or report an error.
if (hasErrors()) {
+ if (parentTag instanceof Formattable) {
+ Formattable parent = (Formattable) parentTag;
+ parent.formatterHasError();
+ }
reportErrors();
localRelease();
- return EVAL_PAGE;
+ return SKIP_BODY;
}
- Tag parentTag = getParent();
if (parentTag instanceof Formattable) {
StringFormatter formatter = new StringFormatter();
formatter.setPattern(_pattern);
@@ -163,6 +171,12 @@
Formattable parent = (Formattable) parentTag;
parent.addFormatter(formatter);
}
+ else {
+ String s = Bundle.getString("Tags_FormattableParentRequired");
+ registerTagError(s,null);
+ reportErrors();
+ }
+
localRelease();
return SKIP_BODY;
}
@@ -267,9 +281,7 @@
patternIndex++;
}
}
-
return formattedString.toString();
-
}
}
}
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatTag.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatTag.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/FormatTag.java
Sun Aug 1 14:23:43 2004
@@ -23,7 +23,6 @@
import org.apache.beehive.netui.util.logging.Logger;
import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.Tag;
import java.util.Locale;
/**
@@ -45,7 +44,7 @@
*/
public void setLanguage(String language)
{
- _language = language;
+ _language = setNonEmptyValueAttribute(language);
}
/**
@@ -55,7 +54,7 @@
*/
public void setCountry(String country)
{
- _country = country;
+ _country = setNonEmptyValueAttribute(country);
}
/**
@@ -63,14 +62,15 @@
* @return the locale
*/
public Locale getLocale()
+ throws JspException
{
Locale loc = null;
if (_language != null || _country != null) {
// language is required
if (_language == null) {
- String s = Bundle.getString("Tags_LocaleRequiresLanguage",
- new Object[]{_country});
- logger.error(s);
+ String s = Bundle.getString("Tags_LocaleRequiresLanguage",new
Object[]{_country});
+ registerTagError(s,null);
+ logger.warn(s);
return super.getUserLocale();
}
@@ -94,16 +94,14 @@
public void setPattern(String pattern)
throws JspException
{
- if ((pattern == null) || (pattern.length() == 0)) {
- registerTagError(Bundle.getString("Tags_NoFormatPattern"), null);
- }
- _pattern = pattern;
+ _pattern = setRequiredValueAttribute(pattern,"patttern");
}
/**
* Create the internal Formatter instance and perform the formatting.
* @throws JspException if a JSP exception has occurred
*/
+ /*
public int doStartTag() throws JspException
{
Tag parentTag = getParent();
@@ -116,6 +114,7 @@
localRelease();
return SKIP_BODY;
}
+ */
/**
* Release any acquired resources.
@@ -131,7 +130,7 @@
/**
* Internal FormatTag.Formatter which performs the actual formatting.
*/
- public static class Formatter
+ public abstract static class Formatter
{
private String pattern;
@@ -153,6 +152,15 @@
else
return dataToFormat.toString();
}
- }
+ public boolean hasError()
+ {
+ return false;
+ }
+
+ public String getErrorMessage()
+ {
+ return null;
+ }
+ }
}
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Formattable.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Formattable.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Formattable.java
Sun Aug 1 14:23:43 2004
@@ -18,8 +18,6 @@
*/
package org.apache.beehive.netui.tags.html;
-// @todo: rename to IFormattable
-
/**
* Interface that indicates whether or not a tag's output can be formatted
with by a <code>FormatTag</code>.
*/
@@ -30,4 +28,10 @@
* @param formatter - the formatter instance to add to the Formattable
tag's set of formatters.
*/
public void addFormatter(FormatTag.Formatter formatter);
+
+ /**
+ * Indicate that a formatter has reported an error so the formattable
needs to make sure that
+ * the body content is output so the placement of the error is visible in
the page.
+ */
+ public void formatterHasError();
}
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Label.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Label.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Label.java
Sun Aug 1 14:23:43 2004
@@ -211,6 +211,15 @@
br.doEndTag(results);
+ // if there were errors in the formatters, report them.
+ if (_formatterErrors) {
+ if (bodyContent != null) {
+ String value = bodyContent.getString().trim();
+ bodyContent.clearBody();
+ write(value);
+ }
+ }
+
if (hasErrors()) {
reportErrors();
localRelease();
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/LabelBase.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/LabelBase.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/LabelBase.java
Sun Aug 1 14:23:43 2004
@@ -34,7 +34,8 @@
protected Object _defaultValue; // The attribute value of
the defaultValue attribute
protected Object _value; // The text of the Label.
protected boolean _escapeWhiteSpace = true; // escape white space flag
- private ArrayList _formatters; // The formatters
+ protected boolean _formatterErrors = false; // The formatter has errors.
+ private ArrayList _formatters; // The formatters
/**
* Set the default value of this Label.
@@ -89,6 +90,14 @@
}
/**
+ * Indicate that a formatter has reported an error so the formatter should
output it's
+ * body text.
+ */
+ public void formatterHasError() {
+ _formatterErrors = true;
+ }
+
+ /**
* Filter the specified string for characters that are senstive to
* HTML interpreters, returning the string with these characters replaced
* by the corresponding character entities.
@@ -114,6 +123,7 @@
_defaultValue = null;
_escapeWhiteSpace = true;
_formatters = null;
+ _formatterErrors = false;
_value = null;
}
@@ -123,19 +133,39 @@
protected String formatText(Object text)
throws JspException
{
+ StringBuilder errors = null;
if (text == null)
return null;
+
if (_formatters == null)
return text.toString();
for (int i = 0; i < _formatters.size(); i++) {
FormatTag.Formatter currentFormatter = (FormatTag.Formatter)
_formatters.get(i);
+
+ // if there are errors in the formatter, we need to report them
+ // and continue to the next one.
+ if (currentFormatter.hasError()) {
+ if (errors == null) {
+ errors = new StringBuilder(32);
+ }
+ assert(errors != null);
+ errors.append(currentFormatter.getErrorMessage());
+ continue;
+ }
+
+ // apply the formatter.
try {
text = currentFormatter.format(text);
}
catch (JspException e) {
registerTagError(e.getMessage(), e);
}
+ }
+ // if there were errors we will return the errors followed by the text,
+ // otherwise just return the text.
+ if (errors != null) {
+ return errors.toString() + text.toString();
}
return text.toString();
}
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Select.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Select.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Select.java
Sun Aug 1 14:23:43 2004
@@ -20,7 +20,6 @@
import org.apache.beehive.netui.pageflow.ProcessPopulate;
import org.apache.beehive.netui.pageflow.RequestParameterHandler;
-import org.apache.beehive.netui.script.common.DataAccessProviderBean;
import org.apache.beehive.netui.script.common.IDataAccessProvider;
import org.apache.beehive.netui.script.common.DataAccessProviderStack;
import org.apache.beehive.netui.tags.naming.FormDataNameInterceptor;
@@ -213,6 +212,7 @@
private SelectTag.State _state = new SelectTag.State();
private OptionTag.State _optionState = new OptionTag.State();
private InputHiddenTag.State _hiddenState = new InputHiddenTag.State();
+ private boolean _formatterError = false;
/**
* Default value of the options <code>value</code> attribute.
@@ -757,6 +757,11 @@
String scriptId = null;
ServletRequest req = pageContext.getRequest();
+ String fmtErrors = null;
+ if (_formatterError) {
+ fmtErrors = getErrorsFromBody();
+ }
+
if (hasErrors()) {
reportErrors();
localRelease();
@@ -787,6 +792,10 @@
results.append("\n");
}
+ // Render any formatting errors that may have occurred.
+ if (fmtErrors != null)
+ results.append(fmtErrors);
+
// Create an appropriate "form" element based on our parameters
_state.name = realName;
scriptId = renderTagId(_state, realName, false, true);
@@ -794,9 +803,10 @@
TagRenderingBase br =
TagRenderingBase.Factory.getRendering(TagRenderingBase.SELECT_TAG, req);
br.doStartTag(results, _state);
- // Render a tag representing the end of our current form
- if (_saveBody != null)
+ // Render the content of the body, these would be the options
+ if (_saveBody != null) {
results.append(_saveBody);
+ }
// if we are repeating then the body contained the options so we can
exit here
if (_repeater) {
@@ -896,6 +906,49 @@
_repCurItem = null;
_repCurStage = 0;
_dynamicOptions = null;
+ _formatterError = false;
+ }
+
+ private String getErrorsFromBody()
+ {
+ final String END_TOKEN = "</span>";
+ assert(_saveBody != null);
+ StringBuilder body = new StringBuilder(_saveBody.length());
+ StringBuilder error = new StringBuilder(_saveBody.length());
+
+ // pull out all of the spans These should be legally constructed,
otherwise we will ignore them.
+ int len = _saveBody.length();
+ int pos = 0;
+ while (pos < len) {
+
+ // find the start of a span, if we dont' find one then it's
over....
+ int start = _saveBody.indexOf("<span",pos);
+ if (start == -1)
+ break;
+
+ // if we don't find the end of the <span> then we don't have a
legal span so ignore it
+ int end = _saveBody.indexOf(END_TOKEN);
+ if (end == -1)
+ break;
+
+ // copy the pos to start into the body
+ int realEnd = end + END_TOKEN.length() + 1;
+ body.append(_saveBody.substring(pos,start));
+ error.append(_saveBody.substring(start,realEnd));
+ System.err.println("Body:" + body);
+ System.err.println("Error:" + error);
+ pos = realEnd;
+ }
+
+ // recreate the remainder of the body, everything not left
+ body.append(_saveBody.substring(pos,len));
+ _saveBody = body.toString();
+
+ System.err.println("Body:" + body);
+ System.err.println("Error:" + error);
+
+ // return the error
+ return error.toString();
}
private boolean doRepeaterAfterBody()
@@ -1120,6 +1173,14 @@
public void addFormatter(FormatTag.Formatter formatter)
{
_formatters.add(formatter);
+ }
+
+ /**
+ * Indicate that a formatter has reported an error so the formatter should
output it's
+ * body text.
+ */
+ public void formatterHasError() {
+ _formatterError = true;
}
/**
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextArea.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextArea.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextArea.java
Sun Aug 1 14:23:43 2004
@@ -80,6 +80,7 @@
private TextAreaTag.State _state = new TextAreaTag.State();
private ArrayList _formatters = null;
+ private boolean _formatErrors = false;
/**
* Return the name of the Tag.
@@ -224,6 +225,15 @@
// Buffer to write the results
StringBuilder results = new StringBuilder(64);
+ // if there were format errors then report them
+ if (_formatErrors) {
+ if (bodyContent != null) {
+ String value = bodyContent.getString().trim();
+ bodyContent.clearBody();
+ write(value);
+ }
+ }
+
// create the input tag.
TagRenderingBase br =
TagRenderingBase.Factory.getRendering(TagRenderingBase.TEXT_AREA_TAG, req);
br.doStartTag(results, _state);
@@ -268,6 +278,7 @@
_state.clear();
_formatters = null;
+ _formatErrors = false;
}
/**
@@ -280,6 +291,14 @@
_formatters = new ArrayList();
_formatters.add(formatter);
+ }
+
+ /**
+ * Indicate that a formatter has reported an error so the formatter should
output it's
+ * body text.
+ */
+ public void formatterHasError() {
+ _formatErrors = true;
}
/**
Modified:
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextBox.java
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextBox.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/TextBox.java
Sun Aug 1 14:23:43 2004
@@ -84,6 +84,7 @@
private ArrayList _formatters;
private boolean _password = false;
+ private boolean _formatErrors = false;
/**
* Return the name of the Tag.
@@ -300,6 +301,7 @@
_state.type = INPUT_TEXT;
}
+
// Create the state for the input tag
_state.name = doNaming();
scriptId = renderTagId(_state, _state.name, false, true);
@@ -321,6 +323,15 @@
StringBuilder results = new StringBuilder(256);
+ // if there were format errors then report them
+ if (_formatErrors) {
+ if (bodyContent != null) {
+ String value = bodyContent.getString().trim();
+ bodyContent.clearBody();
+ write(value);
+ }
+ }
+
// create the input tag.
TagRenderingBase br =
TagRenderingBase.Factory.getRendering(TagRenderingBase.INPUT_TEXT_TAG, req);
assert(br != null);
@@ -353,6 +364,7 @@
_formatters = null;
_password = false;
+ _formatErrors = false;
}
/**
@@ -365,6 +377,14 @@
_formatters = new ArrayList();
_formatters.add(formatter);
+ }
+
+ /**
+ * Indicate that a formatter has reported an error so the formatter should
output it's
+ * body text.
+ */
+ public void formatterHasError() {
+ _formatErrors = true;
}
/**
Modified:
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
==============================================================================
---
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
(original)
+++
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
Sun Aug 1 14:23:43 2004
@@ -48,6 +48,12 @@
Tags_NumberFormatWrongType=The NumberFormat type must be "number", "currency",
or "percent".
Tags_NoFormatPattern=The pattern of the Format must not be null or an empty
string.
Tags_FormatException=FormatError while formatting: {0}.
+Tags_NumberFormatPatternException=FormatNumber error applying pattern: {0}
+Tags_NumberFormatParseException=FormatNumber error parsing input: {0}
+Tags_DateFormatPatternException=FormatDate error creating SimpleDateFormat: {0}
+Tags_formatDate_String_Error=The String "{0}" is not in an understood date
format.
+Tags_formatDate_StringPatternError=FormatDate error, the stringInputPattern
"{0}" is invalid. IllegalArgumentException: {1}
+Tags_FormattableParentRequired=Format tags require a parent that is
Formattable.
Tags_EmptyStringFormatException=The value to be formatted by the FormatNumber
cannot be an empty string or null.
Tags_BadParameterType=Parameter {0} cannot be a Map.
Tags_MalformedURLException=MalformedURLException occured.
@@ -86,8 +92,6 @@
Tags_Form_URLException=The action ''{0}'' for the Form is malformed: {1}
Tags_Anchor_InvalidAnchorURI=The Anchor URI is invalid; it must be exactly one
of {0}
Tags_HRefEvalNull=The href expression "{0}" resolved to null.
-Tags_formatDate_String_Error=The String "{0}" is not in an understood date
format.
-Tags_formatDate_StringPatternError=The stringInputPattern "{0}" is invalid.
IllegalArgumentException: {1}
Tags_formatDate_Type_Error=The type "{0}" may not be formatted by a formatDate
tag.
Tags_LocaleRequiresLanguage=If you set a country, you must also set a language
when specifying a local, defaulting to Locale of Request. The country set was
"{0}"
Tags_ErrorsException=An error occurred accessing the message bundle. This may
be because the message-resource is not defined within the page flow. The
error: {0}
Modified:
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B18068.xml
==============================================================================
---
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B18068.xml
(original)
+++
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B18068.xml
Sun Aug 1 14:23:43 2004
@@ -1,92 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
-
-<recorderSession
xmlns="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
-
- <sessionName>B18068</sessionName>
- <tester>Daryl</tester>
- <startDate>20 Mar 2004, 10:04:06.235 AM MST</startDate>
- <description>Verify that the FormatNumber tag validates the
type.</description>
-
- <tests>
- <test>
- <testNumber>1</testNumber>
-
- <request>
-
- <protocol>HTTP</protocol>
- <protocolVersion>1.1</protocolVersion>
- <host>localhost</host>
- <port>7001</port>
- <uri>/coreWeb/bugs/b18068/Controller.jpf</uri>
- <method>GET</method>
-
- <parameters>
- </parameters>
-
- <cookies>
- <cookie>
- <name>JSESSIONID</name>
-
<value>Ac57ASvcUXbpM1mkSuSWUV2tcRVXqdQeXntxBB3pdPjGAh0kqwyr!-1017168403</value>
- </cookie>
- </cookies>
-
- <headers>
- <header>
- <name>Accept</name>
- <value>image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword,
*/*</value>
- </header>
- <header>
- <name>Accept-Encoding</name>
- <value>gzip, deflate, x-gzip, compress, x-compress</value>
- </header>
- <header>
- <name>Accept-Language</name>
- <value>en-us</value>
- </header>
- <header>
- <name>Connection</name>
- <value>Keep-Alive, TE</value>
- </header>
- <header>
- <name>Cookie</name>
-
<value>JSESSIONID=Ac57ASvcUXbpM1mkSuSWUV2tcRVXqdQeXntxBB3pdPjGAh0kqwyr!-1017168403</value>
- </header>
- <header>
- <name>Cookie2</name>
- <value>$Version="1"</value>
- </header>
- <header>
- <name>Host</name>
- <value>localhost:7001</value>
- </header>
- <header>
- <name>TE</name>
- <value>trailers, deflate, gzip, compress</value>
- </header>
- <header>
- <name>User-Agent</name>
- <value>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
RPT-HTTPClient/0.3-3E</value>
- </header>
- <header>
- <name>testRecorder.playback.failMode</name>
- <value>stop</value>
- </header>
- <header>
- <name>testRecorder.playback.testID</name>
- <value>-189e36e1:fb692b5d8a:-791b</value>
- </header>
- <header>
- <name>testRecorder.playback.testNumber</name>
- <value>1</value>
- </header>
- </headers>
-
- </request>
-
- <response>
- <statusCode>200</statusCode>
- <reason></reason>
- <responseBody><![CDATA[<html>
+<ses:recorderSession
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
+ <ses:sessionName>B18068</ses:sessionName>
+ <ses:tester>Daryl</ses:tester>
+ <ses:startDate>01 Aug 2004, 01:47:52.672 PM MDT</ses:startDate>
+ <ses:description>Daryl</ses:description>
+ <ses:tests>
+ <ses:test>
+ <ses:testNumber>1</ses:testNumber>
+ <ses:request>
+ <ses:protocol>HTTP</ses:protocol>
+ <ses:protocolVersion>1.1</ses:protocolVersion>
+ <ses:host>localhost</ses:host>
+ <ses:port>8080</ses:port>
+ <ses:uri>/coreWeb/bugs/b18068/Controller.jpf</ses:uri>
+ <ses:method>GET</ses:method>
+ <ses:parameters/>
+ <ses:cookies/>
+ <ses:headers>
+ <ses:header>
+ <ses:name>accept</ses:name>
+ <ses:value>image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>accept-encoding</ses:name>
+ <ses:value>gzip, deflate, x-gzip, compress,
x-compress</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>accept-language</ses:name>
+ <ses:value>en-us</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>connection</ses:name>
+ <ses:value>Keep-Alive, TE</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>cookie2</ses:name>
+ <ses:value>$Version="1"</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>host</ses:name>
+ <ses:value>localhost:8080</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>te</ses:name>
+ <ses:value>trailers, deflate, gzip, compress</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>testrecorder.playback.testid</ses:name>
+ <ses:value>-70d743c2:fe1b2e3bb5:-78a2</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>user-agent</ses:name>
+ <ses:value>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.0) RPT-HTTPClient/0.3-3E</ses:value>
+ </ses:header>
+ </ses:headers>
+ </ses:request>
+ <ses:response>
+ <ses:statusCode>200</ses:statusCode>
+ <ses:reason/>
+ <ses:responseBody><![CDATA[<html>
<head>
<title>Format Error</title>
</head>
@@ -94,27 +66,21 @@
<h4>Format Error -- Should report an error for an invalid type</h4>
<span> <table border="1" cellspacing="0"
style="color:red;background-color:white">
<tr><th colspan="5">Tag Error</th></tr>
- <tr><th>Tag</th><td>Label</td>
+ <tr><th>Tag</th><td>FormatNumber</td>
<th>Errors</th><td colspan="2">1</td></tr>
<tr><th>Tag Error</th><th>Message</th><td colspan="3">The NumberFormat type
must be "number", "currency", or "percent".</td></tr>
-</table></span>
-
+</table></span><span>12345.67</span>
</body>
-</html>]]></responseBody>
-
- </response>
-
- <testResults>
- <testStatus>fail</testStatus>
-
- </testResults>
- </test>
-
- </tests>
-
- <endDate>20 Mar 2004, 10:04:07.497 AM MST</endDate>
- <sessionStatus>fail</sessionStatus>
- <testCount>1</testCount>
- <passedCount>0</passedCount>
- <failedCount>1</failedCount>
-</recorderSession>
\ No newline at end of file
+</html>]]></ses:responseBody>
+ </ses:response>
+ <ses:testResults>
+ <ses:testStatus>fail</ses:testStatus>
+ </ses:testResults>
+ </ses:test>
+ </ses:tests>
+ <ses:endDate>01 Aug 2004, 01:47:54.174 PM MDT</ses:endDate>
+ <ses:sessionStatus>fail</ses:sessionStatus>
+ <ses:testCount>1</ses:testCount>
+ <ses:passedCount>0</ses:passedCount>
+ <ses:failedCount>1</ses:failedCount>
+</ses:recorderSession>
Modified:
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B33322.xml
==============================================================================
---
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B33322.xml
(original)
+++
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/B33322.xml
Sun Aug 1 14:23:43 2004
@@ -1,92 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
-
-<recorderSession
xmlns="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
-
- <sessionName>B33322</sessionName>
- <tester>Daryl</tester>
- <startDate>26 Mar 2004, 02:40:00.958 PM MST</startDate>
- <description>Error Reporting in the NumberFormatter</description>
-
- <tests>
- <test>
- <testNumber>1</testNumber>
-
- <request>
-
- <protocol>HTTP</protocol>
- <protocolVersion>1.1</protocolVersion>
- <host>localhost</host>
- <port>7001</port>
- <uri>/coreWeb/bugs/b33322/Controller.jpf</uri>
- <method>GET</method>
-
- <parameters>
- </parameters>
-
- <cookies>
- <cookie>
- <name>JSESSIONID</name>
-
<value>AkiXWtFW8FZqscp1vxbYvVXblDcKjhcMJsDLQQNhnAns9wKYsquu!601497888</value>
- </cookie>
- </cookies>
-
- <headers>
- <header>
- <name>Accept</name>
- <value>image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword,
*/*</value>
- </header>
- <header>
- <name>Accept-Encoding</name>
- <value>gzip, deflate, x-gzip, compress, x-compress</value>
- </header>
- <header>
- <name>Accept-Language</name>
- <value>en-us</value>
- </header>
- <header>
- <name>Connection</name>
- <value>Keep-Alive, TE</value>
- </header>
- <header>
- <name>Cookie</name>
-
<value>JSESSIONID=AkiXWtFW8FZqscp1vxbYvVXblDcKjhcMJsDLQQNhnAns9wKYsquu!601497888</value>
- </header>
- <header>
- <name>Cookie2</name>
- <value>$Version="1"</value>
- </header>
- <header>
- <name>Host</name>
- <value>localhost:7001</value>
- </header>
- <header>
- <name>TE</name>
- <value>trailers, deflate, gzip, compress</value>
- </header>
- <header>
- <name>User-Agent</name>
- <value>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E
RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E</value>
- </header>
- <header>
- <name>testRecorder.playback.failMode</name>
- <value>stop</value>
- </header>
- <header>
- <name>testRecorder.playback.testID</name>
- <value>-67265aa3:fb89054f29:-78ed</value>
- </header>
- <header>
- <name>testRecorder.playback.testNumber</name>
- <value>1</value>
- </header>
- </headers>
-
- </request>
-
- <response>
- <statusCode>200</statusCode>
- <reason></reason>
- <responseBody><![CDATA[<!--Generated by WebLogic Workshop-->
+<ses:recorderSession
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
+ <ses:sessionName>B33322</ses:sessionName>
+ <ses:tester>Daryl</ses:tester>
+ <ses:startDate>01 Aug 2004, 01:48:20.542 PM MDT</ses:startDate>
+ <ses:description>Daryl</ses:description>
+ <ses:tests>
+ <ses:test>
+ <ses:testNumber>1</ses:testNumber>
+ <ses:request>
+ <ses:protocol>HTTP</ses:protocol>
+ <ses:protocolVersion>1.1</ses:protocolVersion>
+ <ses:host>localhost</ses:host>
+ <ses:port>8080</ses:port>
+ <ses:uri>/coreWeb/bugs/b33322/Controller.jpf</ses:uri>
+ <ses:method>GET</ses:method>
+ <ses:parameters/>
+ <ses:cookies/>
+ <ses:headers>
+ <ses:header>
+ <ses:name>accept</ses:name>
+ <ses:value>image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>accept-encoding</ses:name>
+ <ses:value>gzip, deflate, x-gzip, compress,
x-compress</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>accept-language</ses:name>
+ <ses:value>en-us</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>connection</ses:name>
+ <ses:value>Keep-Alive, TE</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>cookie2</ses:name>
+ <ses:value>$Version="1"</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>host</ses:name>
+ <ses:value>localhost:8080</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>te</ses:name>
+ <ses:value>trailers, deflate, gzip, compress</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>testrecorder.playback.testid</ses:name>
+ <ses:value>-70d743c2:fe1b2e3bb5:-7892</ses:value>
+ </ses:header>
+ <ses:header>
+ <ses:name>user-agent</ses:name>
+ <ses:value>Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.0) RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E
RPT-HTTPClient/0.3-3E RPT-HTTPClient/0.3-3E</ses:value>
+ </ses:header>
+ </ses:headers>
+ </ses:request>
+ <ses:response>
+ <ses:statusCode>200</ses:statusCode>
+ <ses:reason/>
+ <ses:responseBody><![CDATA[<!--Generated by WebLogic Workshop-->
@@ -105,24 +77,19 @@
<div> <hr /><table border="1" cellspacing="0"
style="color:red;background-color:white">
<tr><th colspan="6">Page Errors</th></tr>
<tr><th>Error Number</th><th>Tag Type</th><th colspan="4">Error</th></tr>
-<tr><th>1</th><th>Label</th><th>Message</th><td>FormatError while formatting:
Multiple decimal separators in pattern "999.00.999".</td></tr>
+<tr><th>1</th><th>Label</th><th>Message</th><td>FormatNumber error applying
pattern: Multiple decimal separators in pattern "999.00.999"</td></tr>
</table></div>
</body>
-</html>]]></responseBody>
-
- </response>
-
- <testResults>
- <testStatus>fail</testStatus>
-
- </testResults>
- </test>
-
- </tests>
-
- <endDate>26 Mar 2004, 02:40:03.041 PM MST</endDate>
- <sessionStatus>fail</sessionStatus>
- <testCount>1</testCount>
- <passedCount>0</passedCount>
- <failedCount>1</failedCount>
-</recorderSession>
\ No newline at end of file
+</html>]]></ses:responseBody>
+ </ses:response>
+ <ses:testResults>
+ <ses:testStatus>fail</ses:testStatus>
+ </ses:testResults>
+ </ses:test>
+ </ses:tests>
+ <ses:endDate>01 Aug 2004, 01:48:22.134 PM MDT</ses:endDate>
+ <ses:sessionStatus>fail</ses:sessionStatus>
+ <ses:testCount>1</ses:testCount>
+ <ses:passedCount>0</ses:passedCount>
+ <ses:failedCount>1</ses:failedCount>
+</ses:recorderSession>
Modified:
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DateFormatString.xml
==============================================================================
---
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DateFormatString.xml
(original)
+++
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DateFormatString.xml
Sun Aug 1 14:23:43 2004
@@ -2,7 +2,7 @@
<ses:recorderSession
xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session">
<ses:sessionName>DateFormatString</ses:sessionName>
<ses:tester>Daryl</ses:tester>
- <ses:startDate>05 Jul 2004, 08:07:10.411 PM MDT</ses:startDate>
+ <ses:startDate>01 Aug 2004, 01:52:06.547 PM MDT</ses:startDate>
<ses:description>Daryl</ses:description>
<ses:tests>
<ses:test>
@@ -15,12 +15,7 @@
<ses:uri>/coreWeb/tags/dateFormatString/Controller.jpf</ses:uri>
<ses:method>GET</ses:method>
<ses:parameters/>
- <ses:cookies>
- <ses:cookie>
- <ses:name>JSESSIONID</ses:name>
- <ses:value>FD8DC702CA2580B8DF8DF160785F2C23</ses:value>
- </ses:cookie>
- </ses:cookies>
+ <ses:cookies/>
<ses:headers>
<ses:header>
<ses:name>accept</ses:name>
@@ -39,10 +34,6 @@
<ses:value>Keep-Alive, TE</ses:value>
</ses:header>
<ses:header>
- <ses:name>cookie</ses:name>
-
<ses:value>JSESSIONID=FD8DC702CA2580B8DF8DF160785F2C23</ses:value>
- </ses:header>
- <ses:header>
<ses:name>cookie2</ses:name>
<ses:value>$Version="1"</ses:value>
</ses:header>
@@ -56,7 +47,7 @@
</ses:header>
<ses:header>
<ses:name>testrecorder.playback.testid</ses:name>
- <ses:value>729233a0:fd9231710a:-7d40</ses:value>
+ <ses:value>-70d743c2:fe1b2e3bb5:-776f</ses:value>
</ses:header>
<ses:header>
<ses:name>testrecorder.playback.testnumber</ses:name>
@@ -103,7 +94,7 @@
<div> <hr /><table border="1" cellspacing="0"
style="color:red;background-color:white">
<tr><th colspan="6">Page Errors</th></tr>
<tr><th>Error Number</th><th>Tag Type</th><th colspan="4">Error</th></tr>
-<tr><th>1</th><th>Label</th><th>Message</th><td>The stringInputPattern
"yy.MN.dd" is invalid. IllegalArgumentException: Illegal pattern character
'N'</td></tr>
+<tr><th>1</th><th>Label</th><th>Message</th><td>FormatDate error, the
stringInputPattern "yy.MN.dd" is invalid. IllegalArgumentException: Illegal
pattern character 'N'</td></tr>
<tr><th>2</th><th>Label</th><th>Message</th><td>The String "2003.10.25" is not
in an understood date format.</td></tr>
</table></div>
</body>
@@ -114,7 +105,7 @@
</ses:testResults>
</ses:test>
</ses:tests>
- <ses:endDate>05 Jul 2004, 08:07:11.853 PM MDT</ses:endDate>
+ <ses:endDate>01 Aug 2004, 01:52:08.129 PM MDT</ses:endDate>
<ses:sessionStatus>fail</ses:sessionStatus>
<ses:testCount>1</ses:testCount>
<ses:passedCount>0</ses:passedCount>