/* * 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(",", "\\,"); } }