/*
 * $Id: MessageTag.java,v 1.3 2006/03/09 01:33:31 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: MessageTag.java,v $
 * Revision 1.3  2006/03/09 01:33:31  marbobo
 * + Unicode-Unterstützung für Javascript und Html implementiert
 *
 * Revision 1.2  2005/01/28 10:29:37  jonyp
 * added copyright/revision info etc
 *
 */

package vkc.view.tag;

import java.util.Locale;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.struts.Globals;
import org.apache.struts.util.MessageResources;
import org.apache.struts.util.RequestUtils;
import org.apache.struts.util.ResponseUtils;

import vkc.util.StringUtils;
import vkc.util.VKCStringUtils;

public class MessageTag extends TagSupport {
    /**
     * Filter the rendered output for characters that are sensitive in HTML?
     */
    protected boolean filter = true;

    public boolean getFilter() {
        return filter;
    }

    public void setFilter(boolean filter) {
        this.filter = filter;
    }

	/**
	 * The first optional argument.
	 */
	protected String arg0 = null;
	protected boolean javascript = false;
	
	public String getArg0() {
		return (this.arg0);
	}
	
	public void setArg0(String arg0) {
		this.arg0 = arg0;
	}
	
	
	/**
	 * The second optional argument.
	 */
	protected String arg1 = null;
	
	public String getArg1() {
		return (this.arg1);
	}
	
	public void setArg1(String arg1) {
		this.arg1 = arg1;
	}
	
	
	/**
	 * The third optional argument.
	 */
	protected String arg2 = null;
	
	public String getArg2() {
		return (this.arg2);
	}
	
	public void setArg2(String arg2) {
		this.arg2 = arg2;
	}
	
	
	/**
	 * The fourth optional argument.
	 */
	protected String arg3 = null;
	
	public String getArg3() {
		return (this.arg3);
	}
	
	public void setArg3(String arg3) {
		this.arg3 = arg3;
	}
	
	
	/**
	 * The fifth optional argument.
	 */
	protected String arg4 = null;
	
	public String getArg4() {
		return (this.arg4);
	}
	
	public void setArg4(String arg4) {
		this.arg4 = arg4;
	}
	
	
	/**
	 * The servlet context attribute key for our resources.
	 */
	protected String bundle = null;
	
	public String getBundle() {
		return (this.bundle);
	}
	
	public void setBundle(String bundle) {
		this.bundle = bundle;
	}
	
	
	/**
	 * The default Locale for our server.
	 */
	protected static final Locale defaultLocale = Locale.getDefault();
	
	
	/**
	 * The message key of the message to be retrieved.
	 */
	protected String key = null;
	
	public String getKey() {
		return (this.key);
	}
	
	public void setKey(String key) {
		this.key = key;
	}
	
	
	/**
	 * Name of the bean that contains the message key.
	 */
	protected String name = null;
	
	public String getName() {
		return (this.name);
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	
	/**
	 * Name of the property to be accessed on the specified bean.
	 */
	protected String property = null;
	
	public String getProperty() {
		return (this.property);
	}
	
	public void setProperty(String property) {
		this.property = property;
	}
	
	
	/**
	 * The scope to be searched to retrieve the specified bean.
	 */
	protected String scope = null;
	
	public String getScope() {
		return (this.scope);
	}
	
	public void setScope(String scope) {
		this.scope = scope;
	}
	
	
	/**
	 * The session scope key under which our Locale is stored.
	 */
	protected String localeKey = Globals.LOCALE_KEY;
	
	public String getLocale() {
		return (this.localeKey);
	}
	
	public void setLocale(String localeKey) {
		this.localeKey = localeKey;
	}
	
	
	/**
	 * The message resources for this package.
	 */
	protected static MessageResources messages =
		MessageResources.getMessageResources
		("org.apache.struts.taglib.bean.LocalStrings");
	
	
	// --------------------------------------------------------- Public Methods
	
	
	/**
	 * Process the start tag.
	 *
	 * @exception JspException if a JSP exception has occurred
	 */
	public int doStartTag() throws JspException {
		String key = this.key;

		if (key == null) {
			// Look up the requested property value
			Object value = RequestUtils.lookup(pageContext, name, property, scope);
			
			if (value != null && !(value instanceof String)) {
				JspException e = new JspException(messages.getMessage("message.property", key));
				RequestUtils.saveException(pageContext, e);
				throw e;
			}
			
			key = (String)value;
		}
		
		// Construct the optional arguments array we will be using
		Object args[] = new Object[5];
		args[0] = arg0;
		args[1] = arg1;
		args[2] = arg2;
		args[3] = arg3;
		args[4] = arg4;
		
		// Retrieve the message string we are looking for
		String message = RequestUtils.message(pageContext, this.bundle, this.localeKey, key, args);
		
		if (message == null) {
			JspException e = new JspException(messages.getMessage("message.message", "\"" + key + "\""));
			RequestUtils.saveException(pageContext, e);
			throw e;
		}
		
		if (javascript) {
			message = StringUtils.replaceToken(message, "\n", "\\n");
			message = StringUtils.replaceToken(message, "\r", "\\r");
			
			if (!filter) {
				message = VKCStringUtils.decodeXmlEntities(message);
			}
			
			message = VKCStringUtils.filterJavascriptChars(message);
		}

		// Print the retrieved message to our output writer
		if (filter) {
			message = VKCStringUtils.filterUnicodeChars(message);
		}
		
		ResponseUtils.write(pageContext, message);
		
		// Continue processing this page
		return SKIP_BODY;
	}
	
	
	/**
	 * Release any acquired resources.
	 */
	public void release() {
		super.release();

		arg0 = null;
		arg1 = null;
		arg2 = null;
		arg3 = null;
		arg4 = null;
		bundle = Globals.MESSAGES_KEY;
		key = null;
		name = null;
		property = null;
		scope = null;
		localeKey = Globals.LOCALE_KEY;
		javascript = false;
		filter = true;
	}
	
	/**
	 * @param javascript The javascript to set.
	 */
	public void setJavascript(boolean javascript) {
		this.javascript = javascript;
	}
}