blob: 4ac57d159a5a10594225584140f7904c8b916456 [file] [log] [blame]
package org.unicode.cldr.draft.keyboard;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.unicode.cldr.draft.keyboard.KeyboardId.Platform;
import com.google.common.base.Charsets;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.common.io.Resources;
import com.ibm.icu.util.ULocale;
public final class KeyboardIdMap {
private final ImmutableMultimap<String, KeyboardId> nameToKeyboardId;
// Internal only.
private final Set<String> coveredNames;
private KeyboardIdMap(ImmutableMultimap<String, KeyboardId> nameToKeyboardId) {
this.nameToKeyboardId = checkNotNull(nameToKeyboardId);
coveredNames = Sets.newHashSet();
}
private static final Splitter LINE_SPLITTER = Splitter.on("\n").omitEmptyStrings();
private static final Splitter COMMA_SPLITTER = Splitter.on(",");
private static final Splitter DASH_SPLITTER = Splitter.on("-").omitEmptyStrings();
/**
* Creates the mapping from csv contents. The first line must contain the column headers
* "name,locale,attributes".
*/
public static KeyboardIdMap fromCsv(String csv, Platform platform) {
checkArgument(!csv.isEmpty());
List<String> lines = LINE_SPLITTER.splitToList(csv);
checkArgument(lines.get(0).equals("name,locale,attributes"), "Missing csv headers");
ImmutableMultimap.Builder<String, KeyboardId> builder = ImmutableMultimap.builder();
for (String line : Iterables.skip(lines, 1)) {
// The first element may be between quotes (if it includes a comma), if so parse it manually.
String name;
int closingQuote = line.startsWith("\"") ? line.indexOf("\"", 1) : 0;
List<String> components = COMMA_SPLITTER.splitToList(line.substring(closingQuote));
if (closingQuote != 0) {
name = line.substring(1, closingQuote);
} else {
name = components.get(0);
}
ULocale locale = ULocale.forLanguageTag(components.get(1));
ImmutableList<String> attributes =
ImmutableList.copyOf(DASH_SPLITTER.splitToList(components.get(2)));
builder.put(name, KeyboardId.of(locale, platform, attributes));
}
return new KeyboardIdMap(builder.build());
}
/** Retrieves the csv file relative to the class given. */
public static KeyboardIdMap fromResource(Class<?> clazz, String fileName, Platform platform) {
try {
String csv = Resources.toString(Resources.getResource(clazz, fileName),
Charsets.UTF_8);
return fromCsv(csv, platform);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
public ImmutableCollection<KeyboardId> getKeyboardId(String name) {
coveredNames.add(name);
ImmutableCollection<KeyboardId> ids = nameToKeyboardId.get(name);
checkArgument(ids.size() > 0, "No keyboard id for %s [%s]", name, nameToKeyboardId);
return ids;
}
public Set<String> unmatchedIds() {
return Sets.difference(nameToKeyboardId.keySet(), coveredNames);
}
}