blob: 8c62ef0c51feac997da14e3b0e931f1e2fd8c8bb [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* 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 com.google.gwt.i18n.server;
import com.google.gwt.i18n.client.Constants.DefaultBooleanValue;
import com.google.gwt.i18n.client.Constants.DefaultDoubleValue;
import com.google.gwt.i18n.client.Constants.DefaultFloatValue;
import com.google.gwt.i18n.client.Constants.DefaultIntValue;
import com.google.gwt.i18n.client.Constants.DefaultStringArrayValue;
import com.google.gwt.i18n.client.Constants.DefaultStringMapValue;
import com.google.gwt.i18n.client.Constants.DefaultStringValue;
import com.google.gwt.i18n.client.LocalizableResource.GenerateKeys;
import com.google.gwt.i18n.client.Messages.PluralCount;
import com.google.gwt.i18n.client.Messages.Select;
import com.google.gwt.i18n.server.keygen.MethodNameKeyGenerator;
/**
* Utilities for processing GWT i18n messages.
*/
public class MessageUtils {
/**
* An exception signaling {@link #getKeyGenerator(GenerateKeys)} was unable
* to process the annotation.
*/
public static class KeyGeneratorException extends Exception {
/**
* @param message
*/
public KeyGeneratorException(String message) {
super(message);
}
/**
* @param message
* @param cause
*/
public KeyGeneratorException(String message, Throwable cause) {
super(message, cause);
}
}
public static Class<?>[] SELECTOR_ANOTATIONS = new Class<?>[] {
PluralCount.class, Select.class
};
public static String getConstantsDefaultValue(Message msg) {
DefaultStringValue dsv = msg.getAnnotation(DefaultStringValue.class);
if (dsv != null) {
return dsv.value();
}
DefaultIntValue div = msg.getAnnotation(DefaultIntValue.class);
if (div != null) {
return String.valueOf(div.value());
}
DefaultBooleanValue dbv = msg.getAnnotation(DefaultBooleanValue.class);
if (dbv != null) {
return String.valueOf(dbv.value());
}
DefaultDoubleValue ddv = msg.getAnnotation(DefaultDoubleValue.class);
if (ddv != null) {
return String.valueOf(ddv.value());
}
DefaultFloatValue dfv = msg.getAnnotation(DefaultFloatValue.class);
if (dfv != null) {
return String.valueOf(dfv.value());
}
DefaultStringArrayValue dsav = msg.getAnnotation(
DefaultStringArrayValue.class);
if (dsav != null) {
StringBuilder buf = new StringBuilder();
boolean needComma = false;
for (String value : dsav.value()) {
if (needComma) {
buf.append(',');
} else {
needComma = true;
}
buf.append(MessageUtils.quoteComma(value));
}
return buf.toString();
}
DefaultStringMapValue dsmv = msg.getAnnotation(DefaultStringMapValue.class);
if (dsmv != null) {
String[] values = dsmv.value();
StringBuilder buf = new StringBuilder();
boolean needComma = false;
for (int i = 0; i < values.length; i += 2) {
if (needComma) {
buf.append(',');
} else {
needComma = true;
}
buf.append(MessageUtils.quoteComma(values[i]));
}
return buf.toString();
}
return null;
}
@SuppressWarnings("deprecation")
public static KeyGenerator getKeyGenerator(GenerateKeys keyGenAnnot)
throws KeyGeneratorException {
if (keyGenAnnot == null) {
return new MethodNameKeyGenerator();
}
String keyGenClassName = keyGenAnnot.value();
Throwable caught = null;
try {
Class<?> clazz = Class.forName(keyGenClassName);
if (KeyGenerator.class.isAssignableFrom(clazz)) {
Class<? extends KeyGenerator> kgClass = clazz.asSubclass(
KeyGenerator.class);
return kgClass.newInstance();
}
if (com.google.gwt.i18n.rebind.keygen.KeyGenerator.class.isAssignableFrom(
clazz)) {
Class<? extends com.google.gwt.i18n.rebind.keygen.KeyGenerator> kgClass
= clazz.asSubclass(com.google.gwt.i18n.rebind.keygen.KeyGenerator.class);
return new KeyGeneratorAdapter(kgClass.newInstance());
}
throw new KeyGeneratorException(keyGenClassName
+ " in @GenerateKeys must implement KeyGenerator");
} catch (ClassNotFoundException e) {
caught = e;
} catch (InstantiationException e) {
caught = e;
} catch (IllegalAccessException e) {
caught = e;
}
throw new KeyGeneratorException("Unable to process @GenerateKeys('"
+ keyGenClassName + "'): " + caught.getMessage(), caught);
}
public static String quoteComma(String value) {
return value.replace(",", "\\,");
}
}