/*
* Copyright 2008 biaoping.yin
*
* 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.frameworkset.web.tag;
import java.io.IOException;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import org.frameworkset.spi.support.NoSuchMessageException;
import org.frameworkset.spi.support.validate.Errors;
import org.frameworkset.spi.support.validate.FieldError;
import org.frameworkset.spi.support.validate.ObjectError;
/**
* <p>Title: ErrorTag.java</p>
* <p>Description: 输出全局错误和参数绑定错误信息标签
*
* <div>error:
<pg:errors >
<pg:error/>
</pg:errors >
</div>
<div>errors:<pg:errors /></div>
<div>globalerrors:<pg:globalerrors /></div>
<div>message:<pg:error colName="message"/></div>
<div>${error_message}</div>
*
* </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2008</p>
* @Date 2011-1-4
* @author biaoping.yin
* @version 1.0
*/
public class ErrorsTag extends HtmlEscapingAwareTag {
private ObjectError current_error;
private List errors_;
private int curindex;
private boolean containErrorTag = false;
private boolean needevalbodyAtEndTag = false;
private String arguments;
private String argumentSeparator = TagHelper.DEFAULT_ARGUMENT_SEPARATOR;
protected FieldError getFileError(){
return (FieldError)current_error;
}
protected boolean suppport(ObjectError current_error)
{
return true;
}
@Override
protected int doStartTagInternal() throws Exception {
Errors errors = null;
{
errors = this.getRequestContext().getErrors("default");
}
if(errors != null)
{
errors_ = errors.getAllErrors();
curindex = 0;
// if(errors_ != null && index <errors_.size())
// {
// ObjectError temp = (ObjectError)errors_.get(index);
// index ++;
// if(this.suppport(temp))
// {
// current_error = temp;
// }
// else
// {
// while(index < errors_.size())
// {
// temp = (ObjectError)errors_.get(index);
// index ++;
// if(this.suppport(temp))
// {
// current_error = temp;
// break;
// }
// }
// }
//
//
// if(current_error != null)
// return EVAL_BODY_INCLUDE;
// }
evaluateNextError();
if(current_error != null)
{
needevalbodyAtEndTag = true;
return EVAL_BODY_INCLUDE;
}
}
return SKIP_BODY;
}
private void evaluateNextError()
{
current_error = null;
if(errors_ != null && curindex <errors_.size())
{
ObjectError temp = (ObjectError)errors_.get(curindex);
curindex ++;
if(this.suppport(temp))
{
current_error = temp;
}
else
{
while(curindex < errors_.size())
{
temp = (ObjectError)errors_.get(curindex);
curindex ++;
if(this.suppport(temp))
{
current_error = temp;
break;
}
}
}
}
}
private void evalbody() throws JspException
{
do
{
try {
String msg = TagHelper.handlerError(current_error, this.arguments,
pageContext, getMessageSource(),
this.getRequestContext().getLocale(),
argumentSeparator,
this.isHtmlEscape(), isJavaScriptEscape());
this.writeMessage(msg + "<br>");
// return SKIP_BODY;
} catch (NoSuchMessageException e) {
logger.error(e.getMessage(), e);
throw new JspTagException(e.getMessage());
} catch (IOException e) {
logger.error(e.getMessage(), e);
throw new JspTagException(e.getMessage());
}
catch (JspException ex) {
logger.error(ex.getMessage(), ex);
throw ex;
}
catch (RuntimeException ex) {
logger.error(ex.getMessage(), ex);
throw ex;
}
catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new JspTagException(ex.getMessage());
}
evaluateNextError();
}while(current_error != null);
}
public int doAfterBody() throws JspException {
needevalbodyAtEndTag = false;
if(errors_ == null || errors_.size() == 0)
return SKIP_BODY;
if(curindex >= errors_.size())
{
if(this.isContainErrorTag())
return SKIP_BODY;
else
{
try {
String msg = TagHelper.handlerError(current_error, this.arguments,
pageContext, getMessageSource(),
this.getRequestContext().getLocale(),
argumentSeparator,
this.isHtmlEscape(), isJavaScriptEscape());
this.writeMessage(msg);
return SKIP_BODY;
} catch (NoSuchMessageException e) {
logger.error(e.getMessage(), e);
throw new JspTagException(e.getMessage());
} catch (IOException e) {
logger.error(e.getMessage(), e);
throw new JspTagException(e.getMessage());
}
catch (JspException ex) {
logger.error(ex.getMessage(), ex);
throw ex;
}
catch (RuntimeException ex) {
logger.error(ex.getMessage(), ex);
throw ex;
}
catch (Exception ex) {
logger.error(ex.getMessage(), ex);
throw new JspTagException(ex.getMessage());
}
}
}
else
{
if(!this.isContainErrorTag())
{
evalbody();
return SKIP_BODY;
}
else
{
evaluateNextError();
if(current_error != null)
{
return EVAL_BODY_AGAIN;
}
else
return SKIP_BODY;
}
}
}
@Override
public int doEndTag() throws JspException {
if(needevalbodyAtEndTag)//没有指定标签体,则在标签结束时输出错误信息
{
needevalbodyAtEndTag = false;
evalbody();
}
return super.doEndTag();
}
public void doFinally()
{
curindex = 0;
current_error = null;
errors_ = null;
needevalbodyAtEndTag = false;
containErrorTag = false;
arguments = null;
argumentSeparator = TagHelper.DEFAULT_ARGUMENT_SEPARATOR;
super.doFinally();
}
protected ObjectError getCurrent_error() {
return current_error;
}
private boolean isContainErrorTag() {
return containErrorTag;
}
public void setContainErrorTag(boolean containErrorTag) {
this.containErrorTag = containErrorTag;
}
public String getArguments() {
return arguments;
}
public void setArguments(String arguments) {
this.arguments = arguments;
}
public String getArgumentSeparator() {
return argumentSeparator;
}
public void setArgumentSeparator(String argumentSeparator) {
this.argumentSeparator = argumentSeparator;
}
}