blob: e796d01447b51e6f6052ec511e34c73f8c5a1466 [file] [log] [blame]
package org.apache.turbine.util;
import java.util.ArrayList;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.util.Hashtable;
import java.util.List;
/**
* 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 final Hashtable<String, List<String>> forms_messages;
private final Hashtable<String, List<String>> fields_messages;
private final Hashtable<String, List<String>> messages_fields;
private final Hashtable<String, List<String>> 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 )
{
String formFieldName = formName + "-" + fieldName;
addValue( forms_messages, formName, messageName );
addValue( fields_messages, formFieldName, messageName );
addValue( messages_fields, messageName, formFieldName );
addValue( forms_fields, formName, formFieldName );
}
/**
* Adds a pair key/value to a table, making sure not to add duplicate keys.
*
* @param table A Hashtable.
* @param key A String with the key.
* @param value A String with value.
*/
private void addValue( Hashtable<String, List<String>> table, String key, String value )
{
List<String> values;
if ( !table.containsKey( key ) )
{
values = new ArrayList<>();
values.add( value );
table.put( key, values );
}
else
{
values = table.get( key );
if ( !values.contains( value ) )
{
values.add( value );
}
}
}
/**
* Gets a pair key/value from a table.
*
* @param table A Hashtable.
* @param key A String with the key.
* @return A List with the pair key/value, or null.
*/
private final List<String> getValues( Hashtable<String, List<String>> table, String key )
{
return 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 )
{
List<String> 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 = messages.get( i );
result[i].setMessage( messageName );
fields = getValues( messages_fields, messageName );
for (String field : fields)
{
fieldName = field;
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;
List<String> 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 = messages.get( 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<String> fields = getValues( forms_fields, formName );
for (String field : fields)
{
if ( fieldName.equals( field.toString() ) )
{
return true;
}
}
return false;
}
}