/*
* Copyright (c) 2012, grossmann
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of the jo-widgets.org nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS 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 jo-widgets.org 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.
*/
package org.jowidgets.i18n.api;
import java.util.Collection;
public final class MessageReplacer {
private static final IMessageReplacer MESSAGE_REPLACER = new MessageReplacerImpl();
private MessageReplacer() {}
public static IMessageReplacer getInstance() {
return MESSAGE_REPLACER;
}
/**
* Replaces all variables (%1, ..., %n) with the given string parameters
*
* @param message The message that contains variables
* @param parameter The parameters to insert
*
* @return A new string where the variables was replaced with the parameters
*/
public static String replace(final IMessage message, final String... parameter) {
return MESSAGE_REPLACER.replace(message.get(), parameter);
}
/**
* Replaces all variables (%1, ..., %n) with the given string parameters
*
* @param message The message that contains variables
* @param parameter The parameters to insert
*
* @return A new string where the variables was replaced with the parameters
*/
public static String replace(final String message, final String... parameter) {
return MESSAGE_REPLACER.replace(message, parameter);
}
/**
* Replaces all variables (%1, ..., %n) with the given string parameters
*
* @param message The message that contains variables
* @param parameter The parameters to insert
*
* @return A new string where the variables was replaced with the parameters
*/
public static String replace(final String message, final Collection<String> parameter) {
return MESSAGE_REPLACER.replace(message, parameter);
}
private static final class MessageReplacerImpl implements IMessageReplacer {
@Override
public String replace(final String message, final String... parameters) {
final StringBuilder result = new StringBuilder();
final StringBuilder digits = new StringBuilder();
boolean digitMode = false;
boolean toLowercase = false;
for (final char c : message.toCharArray()) {
if (digitMode) {
if (c >= '0' && c <= '9') {
digits.append(c);
}
else if (c == 'L') {
toLowercase = true;
}
else {
if (digits.length() > 0) {
final int paramIndex = Integer.valueOf(digits.toString()) - 1;
if (paramIndex > parameters.length) {
throw new IllegalStateException("Message '" + message + "' contains to many placeholders.");
}
result.append(getParameter(paramIndex, toLowercase, parameters));
}
else {
result.append('%');
}
result.append(c);
digitMode = false;
toLowercase = false;
}
}
else if (c == '%') {
digits.setLength(0);
digitMode = true;
}
else {
result.append(c);
}
}
if (digitMode && digits.length() > 0) {
final int paramIndex = Integer.valueOf(digits.toString()) - 1;
if (paramIndex > parameters.length) {
throw new IllegalStateException("Message '" + message + "' contains to many placeholders.");
}
result.append(getParameter(paramIndex, toLowercase, parameters));
}
return result.toString();
}
@Override
public String replace(final String message, final Collection<String> parameters) {
return replace(message, parameters.toArray(new String[parameters.size()]));
}
private String getParameter(final int paramIndex, final boolean toLowercase, final String... parameters) {
if (toLowercase) {
return parameters[paramIndex].toLowerCase(LocaleHolder.getUserLocale());
}
else {
return parameters[paramIndex];
}
}
}
}