| /* |
| * Copyright 2010 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.tools.cldr; |
| |
| import com.google.gwt.i18n.shared.GwtLocale; |
| |
| import org.unicode.cldr.util.CLDRFile.Factory; |
| |
| import java.io.BufferedWriter; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.OutputStreamWriter; |
| import java.io.PrintWriter; |
| |
| /** |
| * Base class for CLDR processors that generate GWT i18n resources. |
| */ |
| public abstract class Processor { |
| |
| protected static final String I18N_PACKAGE_PATH = "user/src/com/google/gwt/i18n/"; |
| |
| protected static <T> String join(String joiner, Iterable<T> objects) { |
| StringBuilder buf = new StringBuilder(); |
| for (Object obj : objects) { |
| if (buf.length() > 0) { |
| buf.append(joiner); |
| } |
| buf.append(obj.toString()); |
| } |
| return buf.toString(); |
| } |
| |
| protected static String localeSuffix(GwtLocale locale) { |
| return (locale.isDefault() ? "" : "_") + locale.getAsString(); |
| } |
| |
| /** |
| * @param value |
| * @return value with all quotes escaped |
| */ |
| protected static String quote(String value) { |
| return value.replace("\"", "\\\""); |
| } |
| |
| protected final Factory cldrFactory; |
| |
| protected final LocaleData localeData; |
| |
| protected final File outputDir; |
| |
| private boolean useOverride; |
| |
| /** |
| * Initialize the shared portion of a Processor. |
| * |
| * @param outputDir output directory for created files |
| * @param cldrFactory CLDR factory used to create new CLDRFile instances |
| * @param localeData LocaleData instance to collect data from CLDR files |
| */ |
| protected Processor(File outputDir, Factory cldrFactory, LocaleData localeData) { |
| this.outputDir = outputDir; |
| this.cldrFactory = cldrFactory; |
| this.localeData = localeData; |
| useOverride = true; |
| } |
| |
| /** |
| * Execute this processor. |
| * |
| * It will call loadData, cleanupData, writeOutputFiles, and then reset on its |
| * localeData instance. |
| * |
| * @throws IOException |
| */ |
| public final void run() throws IOException { |
| try { |
| loadData(); |
| cleanupData(); |
| writeOutputFiles(); |
| } finally { |
| localeData.reset(); |
| } |
| } |
| |
| /** |
| * Override hook for subclasses to implement any cleanup needed, such as |
| * removing values which duplicate those from ancestors. |
| */ |
| protected void cleanupData() { |
| // do nothing by default |
| } |
| |
| /** |
| * Create an output file including any parent directories. |
| * |
| * @param name name of file, which will be prefixed by |
| * user/src/com/google/gwt/i18n/client/impl/cldr |
| * @param ext extension for file |
| * @param locale locale name or null if not localized |
| * @return a PrintWriter instance |
| * @throws IOException |
| */ |
| protected PrintWriter createFile(String name, String ext, String locale) throws IOException { |
| if (locale == null || locale.length() == 0) { |
| locale = ""; |
| } else { |
| locale = "_" + locale; |
| } |
| return createOutputFile("client/impl/cldr/" + name + locale + "." + ext); |
| } |
| |
| protected PrintWriter createOutputFile(String suffix) throws IOException, FileNotFoundException { |
| return createOutputFile(I18N_PACKAGE_PATH, suffix); |
| } |
| |
| protected PrintWriter createOutputFile(String prefix, String suffix) throws IOException, |
| FileNotFoundException { |
| PrintWriter pw; |
| File f = new File(outputDir, prefix + suffix); |
| File parent = f.getParentFile(); |
| if (parent != null) { |
| parent.mkdirs(); |
| } |
| f.createNewFile(); |
| pw = |
| new PrintWriter( |
| new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-8")), false); |
| return pw; |
| } |
| |
| protected void generateIntMethod(PrintWriter pw, String category, GwtLocale locale, String key, |
| String method) { |
| String value = localeData.getEntry(category, locale, key); |
| if (value != null) { |
| pw.println(); |
| if (useOverride) { |
| pw.println(" @Override"); |
| } |
| pw.println(" public int " + method + "() {"); |
| pw.println(" return " + value + ";"); |
| pw.println(" }"); |
| } |
| } |
| |
| protected void generateStringMethod(PrintWriter pw, String category, GwtLocale locale, |
| String key, String method) { |
| String value = localeData.getEntry(category, locale, key); |
| generateStringValue(pw, method, value); |
| } |
| |
| protected void generateStringValue(PrintWriter pw, String method, String value) { |
| if (value != null) { |
| pw.println(); |
| if (useOverride) { |
| pw.println(" @Override"); |
| } |
| pw.println(" public String " + method + "() {"); |
| pw.println(" return \"" + quote(value) + "\";"); |
| pw.println(" }"); |
| } |
| } |
| |
| /** |
| * @return true if generated methods should use @Override. |
| */ |
| protected boolean getOverrides() { |
| return useOverride; |
| } |
| |
| /** |
| * Load data needed by this processor. |
| * |
| * @throws IOException |
| */ |
| protected abstract void loadData() throws IOException; |
| |
| protected void printHeader(PrintWriter pw) { |
| pw.println("/*"); |
| pw.println(" * Copyright 2010 Google Inc."); |
| pw.println(" * "); |
| pw.println(" * Licensed under the Apache License, Version 2.0 (the " |
| + "\"License\"); you may not"); |
| pw.println(" * use this file except in compliance with the License. You " |
| + "may obtain a copy of"); |
| pw.println(" * the License at"); |
| pw.println(" * "); |
| pw.println(" * http://www.apache.org/licenses/LICENSE-2.0"); |
| pw.println(" * "); |
| pw.println(" * Unless required by applicable law or agreed to in writing, " + "software"); |
| pw.println(" * distributed under the License is distributed on an \"AS " |
| + "IS\" BASIS, WITHOUT"); |
| pw.println(" * WARRANTIES OR CONDITIONS OF ANY KIND, either express or " + "implied. See the"); |
| pw.println(" * License for the specific language governing permissions and " |
| + "limitations under"); |
| pw.println(" * the License."); |
| pw.println(" */"); |
| } |
| |
| /** |
| * Set whether method definitions should use @Override. |
| * |
| * @param useOverride |
| */ |
| protected void setOverrides(boolean useOverride) { |
| this.useOverride = useOverride; |
| } |
| |
| /** |
| * Write output files produced by this processor. |
| * |
| * @throws IOException |
| */ |
| protected abstract void writeOutputFiles() throws IOException; |
| } |