blob: 9c842092cdba036b066f14a72b65163e737d0446 [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.i18n.client.Messages;
import com.google.gwt.i18n.rebind.MessageFormatParser.ArgumentChunk;
import com.google.gwt.i18n.rebind.MessageFormatParser.TemplateChunk;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.HashSet;
import java.util.Set;
/**
* Creates a MessagesInterface from a Resource file.
*/
public class MessagesInterfaceCreator extends
AbstractLocalizableInterfaceCreator {
/**
* Searches for MessageFormat-style args in the template string and returns
* a set of argument indices seen.
*
* @param template template to parse
* @return set of argument indices seen
* @throws ParseException if the template is incorrect.
*/
private static Set<Integer> numberOfMessageArgs(String template)
throws ParseException {
Set<Integer> seenArgs = new HashSet<Integer>();
for (TemplateChunk chunk : MessageFormatParser.parse(template)) {
if (chunk instanceof ArgumentChunk) {
seenArgs.add(((ArgumentChunk) chunk).getArgumentNumber());
}
}
return seenArgs;
}
/**
* Constructor for <code>MessagesInterfaceCreator</code>.
*
* @param className class name
* @param packageName package name
* @param resourceBundle resource bundle
* @param targetLocation target location
* @throws IOException
*/
public MessagesInterfaceCreator(String className, String packageName,
File resourceBundle, File targetLocation) throws IOException {
super(className, packageName, resourceBundle, targetLocation,
Messages.class);
}
@Override
protected void genMethodArgs(String defaultValue) {
try {
Set<Integer> seenArgs = numberOfMessageArgs(defaultValue);
int maxArgSeen = -1;
for (int arg : seenArgs) {
if (arg > maxArgSeen) {
maxArgSeen = arg;
}
}
for (int i = 0; i <= maxArgSeen; i++) {
if (i > 0) {
composer.print(", ");
}
if (!seenArgs.contains(i)) {
composer.print("@Optional ");
}
composer.print("String arg" + i);
}
} catch (ParseException e) {
throw new RuntimeException(defaultValue
+ " could not be parsed as a MessageFormat string.", e);
}
}
@Override
protected void genValueAnnotation(String defaultValue) {
composer.println("@DefaultMessage(" + makeJavaString(defaultValue) + ")");
}
@Override
protected String javaDocComment(String path) {
return "Interface to represent the messages contained in resource bundle:\n\t"
+ path + "'.";
}
}