blob: 4844955dcdafe8729a57314eefaa23b239ba18c7 [file] [log] [blame]
package org.apache.turbine.util;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Turbine" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Turbine", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
/**
* Used for adding and accessing messages that relate to a specific
* form and field. Allows to query for messages by form name and
* field name. Used together with FormMessage class.
*
* @author <a href="mailto:neeme@one.lv">Neeme Praks</a>
* @version $Id$
*/
public class FormMessages
{
private Hashtable forms_messages;
private Hashtable fields_messages;
private Hashtable messages_fields;
private Hashtable forms_fields;
/**
* Constructor.
*/
public FormMessages()
{
forms_messages = new Hashtable();
fields_messages = new Hashtable();
messages_fields = new Hashtable();
forms_fields = new Hashtable();
}
/**
* Sets a message for a field of a form. The message is given as
* a long representing a return code.
*
* @param formName A String with the form name.
* @param fieldName A String with the field name.
* @param returnCode A long with the return code.
*/
public void setMessage(String formName,
String fieldName,
long returnCode)
{
setMessage(formName, fieldName, String.valueOf(returnCode));
}
/**
* Sets a message for a field of a form. The message is given as
* a String.
*
* @param formName A String with the form name.
* @param fieldName A String with the field name.
* @param messageName A String with the message.
*/
public void setMessage(String formName,
String fieldName,
String messageName)
{
fieldName = formName + "-" + fieldName;
addValue(forms_messages, formName, messageName);
addValue(fields_messages, fieldName, messageName);
addValue(messages_fields, messageName, fieldName);
addValue(forms_fields, formName, fieldName);
}
/**
* Adds a pair key/value to a table, making sure not to add
* duplicate keys.
*
* @param table A Hastable.
* @param key A String with the key.
* @param value A String with value.
*/
private void addValue(Hashtable table,
String key,
String value)
{
Vector values;
if (!table.containsKey(key))
{
values = new Vector();
values.addElement(value);
table.put(key, values);
}
else
{
values = ((Vector) table.get(key));
if (!values.contains(value))
values.addElement(value);
}
}
/**
* Gets a pair key/value from a table.
*
* @param table A Hastable.
* @param key A String with the key.
* @return A Vector with the pair key/value, or null.
*/
private final Vector getValues(Hashtable table, String key)
{
return (Vector) table.get(key);
}
/**
* Gets all form messages for a given form.
*
* @param formName A String with the form name.
* @return A FormMessage[].
*/
public FormMessage[] getFormMessages(String formName)
{
Vector messages, fields;
String messageName, fieldName;
messages = getValues(forms_messages, formName);
if (messages != null)
{
FormMessage[] result = new FormMessage[messages.size()];
for (int i = 0; i < messages.size(); i++)
{
result[i] = new FormMessage(formName);
messageName = (String) messages.elementAt(i);
result[i].setMessage(messageName);
fields = getValues(messages_fields, messageName);
for (int j = 0; j < fields.size(); j++)
{
fieldName = (String) fields.elementAt(j);
if (formHasField(formName, fieldName))
{
result[i].setFieldName(fieldName);
}
}
}
return result;
}
return null;
}
/**
* Get form messages for a given form and field.
*
* @param formName A String with the form name.
* @param fieldName A String with the field name.
* @return A FormMessage[].
*/
public FormMessage[] getFormMessages(String formName, String fieldName)
{
String key = formName + "-" + fieldName;
Vector messages = getValues(fields_messages, key);
String messageName;
if (messages != null)
{
FormMessage[] result = new FormMessage[messages.size()];
for (int i = 0; i < messages.size(); i++)
{
result[i] = new FormMessage(formName, fieldName);
messageName = (String) messages.elementAt(i);
result[i].setMessage(messageName);
}
return result;
}
return null;
}
/**
* Check whether a form as a field.
*
* @param formName A String with the form name.
* @param fieldName A String with the field name.
* @return True if form has the field.
*/
private boolean formHasField(String formName,
String fieldName)
{
List fields = getValues(forms_fields, formName);
for (Iterator iter = fields.iterator(); iter.hasNext();)
{
if (fieldName.equals(iter.next().toString()))
{
return true;
}
}
return false;
}
}