/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.app.xmlui.aspect.general;

import java.sql.SQLException;

import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.authorize.AuthorizeException;

/**
 * This class will add a simple notification div the DRI document. Typicaly 
 * this transformer is used after an action has been preformed to let the
 * user know if an operation succeded or failed.
 * 
 * The possible paramaters are:
 * 
 * outcome: The outcome determines whether the notice is positive or negative. 
 * Possible values are: "success", "failure", or "netural". If no values are 
 * supplied then netural is assumed.
 * 
 * header: An i18n dictionary key referencing the text that should be used
 * as a header for this notice.
 * 
 * message: An i18n dictionary key refrencing the text that should be used as
 * the content for this notice. 
 * 
 * characters: Plain text string that should be used as the content for this
 * notice. Normaly all messages should be i18n dictionary keys however this
 * parameter is usefull for error messages that are not nessasarly translated.
 * 
 * All parameters are optional but you must supply at least the message or the 
 * characters
 *
 *
 * 
 * Examlpe:
 * <map:transformer type="notice">
 *   <map:parameter name="outcome" value="success"/>
 *   <map:parameter name="message" value="xmlui.<aspect>.<class>.<type>"/>
 * </map:transformer>
 * 
 * @author Scott Phillips
 * @author Alexey Maslov
 */
public class NoticeTransformer extends AbstractDSpaceTransformer   
{
	
	/** Language Strings */
	private static final Message T_head =
		message("xmlui.general.notice.default_head");
	
	/**
	 * Add the notice div to the body.
	 */
	public void addBody(Body body) throws WingException, SQLException, AuthorizeException 
	{
		String outcome = parameters.getParameter("outcome",null);
		String header = parameters.getParameter("header",null);
		String message = parameters.getParameter("message",null);
		String characters = parameters.getParameter("characters",null);
			    
		if ((message    == null || message.length() <= 0) && 
			(characters == null || characters.length() <= 0))
        {
            throw new WingException("No message found.");
        }
		
		String rend = "notice";
		if ("netural".equals(outcome))
        {
            rend += " netural";
        }
		else if ("success".equals(outcome))
        {
            rend += " success";
        }
		else if ("failure".equals(outcome))
        {
            rend += " failure";
        }
		
		Division div = body.addDivision("general-message",rend);
		if ((header != null) && (!"".equals(header)))
        {
            div.setHead(message(header));
        }
		else
        {
            div.setHead(T_head);
        }

		if (message != null && message.length() > 0)
        {
            div.addPara(message(message));
        }
		
		if (characters != null && characters.length() > 0)
        {
            div.addPara(characters);
        }
	}
}
