/*
* 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.Collection;
import java.util.Locale;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import org.frameworkset.spi.support.MessageSource;
import org.frameworkset.spi.support.MessageSourceResolvable;
import org.frameworkset.spi.support.NoSuchMessageException;
import org.frameworkset.spi.support.validate.FieldError;
import org.frameworkset.spi.support.validate.ObjectError;
import org.frameworkset.util.ObjectUtils;
import org.frameworkset.web.util.ExpressionEvaluationUtils;
import org.frameworkset.web.util.JavaScriptUtils;
import com.frameworkset.util.HtmlUtils;
import com.frameworkset.util.StringUtil;
/**
* <p>Title: TagHelper.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2008</p>
* @Date 2011-1-11
* @author biaoping.yin
* @version 1.0
*/
public abstract class TagHelper {
/**
* Default separator for splitting an arguments String: a comma (",")
*/
public static final String DEFAULT_ARGUMENT_SEPARATOR = ",";
/**
* Resolve the specified message into a concrete message String.
* The returned message String should be unescaped.
*/
public static String resolveMessage(PageContext pageContext,
MessageSource messageSource,Locale locale,
String code,String text,Object arguments,String argumentSeparator) throws JspException, NoSuchMessageException {
return resolveMessage( null,pageContext,
messageSource,locale,
code,text,arguments,argumentSeparator);
}
public static String resolveMessage(PageContext pageContext,
MessageSource messageSource,Locale locale,
String code,Object arguments,String argumentSeparator) throws JspException, NoSuchMessageException {
return resolveMessage( null,pageContext,
messageSource,locale,
code,null,arguments,argumentSeparator);
}
/**
* Resolve the specified message into a concrete message String.
* The returned message String should be unescaped.
*/
public static String resolveMessage(Object message,PageContext pageContext,
MessageSource messageSource,Locale locale,
String code,String text,Object arguments,String argumentSeparator) throws JspException, NoSuchMessageException {
// MessageSource messageSource = getMessageSource();
if (messageSource == null) {
throw new JspTagException("No corresponding MessageSource found");
}
// Evaluate the specified MessageSourceResolvable, if any.
MessageSourceResolvable resolvedMessage = null;
if (message instanceof MessageSourceResolvable) {
resolvedMessage = (MessageSourceResolvable) message;
}
else if (message != null) {
String expr = message.toString();
resolvedMessage = (MessageSourceResolvable)
ExpressionEvaluationUtils.evaluate("message", expr, MessageSourceResolvable.class, pageContext);
}
if (resolvedMessage != null) {
// We have a given MessageSourceResolvable.
// return messageSource.getMessage(resolvedMessage, getRequestContext().getLocale());
return messageSource.getMessage(resolvedMessage, locale);
}
String resolvedCode = ExpressionEvaluationUtils.evaluateString("code", code, pageContext);
String resolvedText = ExpressionEvaluationUtils.evaluateString("text", text, pageContext);
if (resolvedCode != null || resolvedText != null) {
// We have a code or default text that we need to resolve.
//resolveArguments(Object arguments,String argumentSeparator,PageContext pageContext)
// Object[] argumentsArray = resolveArguments(arguments);
Object[] argumentsArray = resolveArguments(arguments,argumentSeparator,pageContext);
if (resolvedText != null) {
// We have a fallback text to consider.
return messageSource.getMessage(
resolvedCode, argumentsArray, resolvedText, locale);
}
else {
// We have no fallback text to consider.
return messageSource.getMessage(
resolvedCode, argumentsArray,locale);
}
}
// All we have is a specified literal text.
return resolvedText;
}
/**
* Resolve the given arguments Object into an arguments array.
* @param arguments the specified arguments Object
* @return the resolved arguments as array
* @throws JspException if argument conversion failed
* @see #setArguments
*/
public static Object[] resolveArguments(Object arguments,String argumentSeparator,PageContext pageContext) throws JspException {
if (arguments instanceof String) {
String[] stringArray =
StringUtil.delimitedListToStringArray((String) arguments, argumentSeparator);
if (stringArray.length == 1) {
Object argument = ExpressionEvaluationUtils.evaluate("argument", stringArray[0], pageContext);
if (argument != null && argument.getClass().isArray()) {
return ObjectUtils.toObjectArray(argument);
}
else {
return new Object[] {argument};
}
}
else {
Object[] argumentsArray = new Object[stringArray.length];
for (int i = 0; i < stringArray.length; i++) {
argumentsArray[i] =
ExpressionEvaluationUtils.evaluate("argument[" + i + "]", stringArray[i], pageContext);
}
return argumentsArray;
}
}
else if (arguments instanceof Object[]) {
return (Object[]) arguments;
}
else if (arguments instanceof Collection) {
return ((Collection) arguments).toArray();
}
else if (arguments != null) {
// Assume a single argument object.
return new Object[] {arguments};
}
else {
return null;
}
}
public static String handlerError(ObjectError error,String defaultArguments,PageContext pageContext,
MessageSource messageSource,Locale locale,String argumentSeparator,
boolean isHtmlEscape,boolean isJavaScriptEscape) throws IOException, NoSuchMessageException, JspException
{
String code = null;
Object arguments = null;
if(error instanceof FieldError)
{
FieldError error_ = (FieldError)error;
if(defaultArguments == null)
{
if(error_.getArguments() == null || error_.getArguments().length == 0)
{
arguments = new Object[]{error_.getField(),error_.getRejectedValue(),error_.getType()};
}
else
{
arguments = error_.getArguments();
}
}
else
{
arguments = defaultArguments;
}
}
code = error.getCode();
String msg = null;
msg = resolveMessage(pageContext,messageSource,
locale,code,arguments,argumentSeparator);
if(msg != null )
{
if( msg.equals(code))
{
if(error.getDefaultMessage() != null)
msg = error.getDefaultMessage();
}
}
if(msg != null && !msg.equals(""))
{
msg = isHtmlEscape ? HtmlUtils.htmlEscape(msg) : msg;
msg = isJavaScriptEscape ? JavaScriptUtils.javaScriptEscape(msg) : msg;
// writeMessage(msg);
}
return msg;
}
}