blob: e081309678577e43b2644c3882df0a0c78f98234 [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// 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.apache.tapestry.engine;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.Properties;
import org.apache.tapestry.IMessages;
import org.apache.tapestry.Tapestry;
/**
* Implementation of {@link org.apache.tapestry.IMessages}. This is basically
* a wrapper around an instance of {@link Properties}. This ensures
* that the properties are, in fact, read-only (which ensures that
* they don't have to be synchronized).
*
* @author Howard Lewis Ship
* @since 2.0.4
*
**/
public class ComponentMessages implements IMessages
{
private Properties _properties;
private Locale _locale;
public ComponentMessages(Locale locale, Properties properties)
{
_locale = locale;
_properties = properties;
}
public String getMessage(String key, String defaultValue)
{
return _properties.getProperty(key, defaultValue);
}
public String getMessage(String key)
{
String result = _properties.getProperty(key);
if (result == null)
result = "[" + key.toUpperCase() + "]";
return result;
}
public String format(String key, Object argument1, Object argument2, Object argument3)
{
return format(key, new Object[] { argument1, argument2, argument3 });
}
public String format(String key, Object argument1, Object argument2)
{
return format(key, new Object[] { argument1, argument2 });
}
public String format(String key, Object argument)
{
return format(key, new Object[] { argument });
}
public String format(String key, Object[] arguments)
{
String pattern = getMessage(key);
// This ugliness is mandated for JDK 1.3 compatibility, which has a bug
// in MessageFormat ... the
// pattern is applied in the constructor, using the system default Locale,
// regardless of what locale is later specified!
// It appears that the problem does not exist in JDK 1.4.
MessageFormat messageFormat = new MessageFormat("");
messageFormat.setLocale(_locale);
messageFormat.applyPattern(pattern);
int count = Tapestry.size(arguments);
for (int i = 0; i < count; i++)
{
if (arguments[i] instanceof Throwable)
{
Throwable t = (Throwable) arguments[i];
String message = t.getMessage();
if (Tapestry.isNonBlank(message))
arguments[i] = message;
else
arguments[i] = t.getClass().getName();
}
}
return messageFormat.format(arguments);
}
}