package org.holoeverywhere.resbuilder.type.strings; import java.io.File; import java.util.Comparator; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import javax.xml.stream.XMLStreamWriter; import org.holoeverywhere.resbuilder.BuildMojo; import org.holoeverywhere.resbuilder.FileProcesser.FileProcesserException; import org.holoeverywhere.resbuilder.FileProcesser.ProcessResult; import org.holoeverywhere.resbuilder.TypeProcesser; import org.holoeverywhere.resbuilder.TypeProcesser.Type; import org.json.JSONArray; import org.json.JSONObject; @Type("strings") public class TypeStrings extends TypeProcesser { public static class StringsProcessResult extends ProcessResult { private static final long serialVersionUID = 8075005070516680457L; public final Map<String, Map<String, String>> data = new TreeMap<String, Map<String, String>>( COMPARATOR); public String filepattern, namePrefix; public boolean ignoreDefaultLocale; @Override public void flush(BuildMojo mojo) throws FileProcesserException { try { for (String locale : data.keySet()) { if (ignoreDefaultLocale && DEFAULT_LOCALE.equals(locale)) { continue; } Map<String, String> subdata = data.get(locale); XMLStreamWriter writer = openWriter(mojo, null, makeFileNameForLocale(locale, filepattern)); for (Entry<String, String> entry : subdata.entrySet()) { writer.writeStartElement("string"); writer.writeAttribute("name", (namePrefix == null ? "" : namePrefix) + entry.getKey()); writer.writeCharacters(entry.getValue()); writer.writeEndElement(); } } } catch (Exception e) { throw new FileProcesserException(e); } } } public static final Comparator<String> COMPARATOR = new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; private static final String DEFAULT_LOCALE = "en"; private static String[] jsonArrayToStringArray(JSONArray array) { final int count = array.length(); String[] result = new String[count]; for (int i = 0; i < count; i++) { result[i] = array.optString(i); } return result; } public static String makeFileNameForLocale(String locale, String filepattern) { String name = "values"; if (!DEFAULT_LOCALE.equals(locale)) { name += "-" + locale.replace("_", "-r"); // en_US -> en-rUS } name += "/" + String.format(filepattern, "strings", locale); return name; } @Override @SuppressWarnings("unchecked") public StringsProcessResult process(BuildMojo mojo, JSONObject json) { StringsProcessResult result = new StringsProcessResult(); result.namePrefix = json.optString("prefix", ""); result.filepattern = json.optString("filename_pattern", "%1$s.xml"); result.ignoreDefaultLocale = json.optBoolean("ignore_default_locale"); if (json.has("grab")) { Grabber grabber = Grabber.grabber(new File(mojo.androidSdkPath, "platforms/android-" + mojo.androidSdkVersion + "/data/res")); grabber.grab(jsonArrayToStringArray(json.optJSONArray("grab"))); result.data.putAll(grabber.getData()); } if (json.has("data")) { JSONObject data = json.optJSONObject("data"); Iterator<String> names = data.sortedKeys(); while (names.hasNext()) { String name = names.next(); JSONObject dataForName = data.optJSONObject(name); Iterator<String> locales = dataForName.sortedKeys(); while (locales.hasNext()) { String locale = locales.next(); Map<String, String> resultDataForLocale = result.data.get(locale); if (resultDataForLocale == null) { resultDataForLocale = new TreeMap<String, String>(COMPARATOR); result.data.put(locale, resultDataForLocale); } resultDataForLocale.put(name, dataForName.optString(locale)); } } } return result; } }