blob: 2d15fd3846db8a5fba8c94cdd52fe4ef212892a0 [file] [log] [blame]
/*
* Copyright 2008 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.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.i18n.rebind.AbstractResource.ResourceList;
import com.google.gwt.i18n.shared.GwtLocale;
import com.google.gwt.user.rebind.AbstractGeneratorClassCreator;
/**
* Creator for methods of the form String[] getX().
*/
class ConstantsStringArrayMethodCreator extends
AbstractLocalizableMethodCreator {
static String[] split(String target) {
// We add an artificial end character to avoid the odd split() behavior
// that drops the last item if it is only whitespace.
target = target + "~";
// Do not split on escaped commas.
String[] args = target.split("(?<![\\\\]),");
// Now remove the artificial ending we added above.
// We have to do it before we escape and trim because otherwise
// the artificial trailing '~' would prevent the last item from being
// properly trimmed.
if (args.length > 0) {
int last = args.length - 1;
args[last] = args[last].substring(0, args[last].length() - 1);
}
for (int i = 0; i < args.length; i++) {
args[i] = args[i].replaceAll("\\\\,", ",").trim();
}
return args;
}
/**
* Constructor for localizable string array method creator.
*
* @param classCreator
*/
public ConstantsStringArrayMethodCreator(
AbstractGeneratorClassCreator classCreator) {
super(classCreator);
}
@Override
public void createMethodFor(TreeLogger logger, JMethod method, String key,
ResourceList resource, GwtLocale locale) {
String methodName = method.getName();
// Make sure cache exists.
enableCache();
// Check cache for array.
println("String args[] = (String[]) cache.get(" + wrap(methodName) + ");");
// If not found, create String[].
println("if (args == null) {");
indent();
println("String [] writer= {");
indent();
String template = resource.getRequiredStringExt(key, null);
String[] args = split(template);
for (int i = 0; i < args.length; i++) {
String toPrint = args[i].replaceAll("\\,", ",");
println(wrap(toPrint) + ",");
}
outdent();
println("};");
// add to cache, and return
println("cache.put(" + wrap(methodName) + ", writer);");
println("return writer;");
outdent();
println("} else {");
indent();
println("return args;");
outdent();
println("}");
}
}