blob: 8f2e1fc852dbe8117e889c69d0e43087c9aa04be [file] [log] [blame]
/*
* 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 org.unicode.cldr.util.XPathParts;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* Encapsulates region/language literacy data from CLDR.
*/
public class RegionLanguageData {
/**
* Stores the populate literate in a given language.
*/
public static class LanguagePopulation implements Comparable<LanguagePopulation> {
private final String language;
private final double literatePopulation;
private final boolean official;
public LanguagePopulation(String language, double literatePopulation, boolean official) {
this.language = language;
this.literatePopulation = literatePopulation;
this.official = official;
}
@Override
public int compareTo(LanguagePopulation other) {
int c = -Double.compare(literatePopulation, other.literatePopulation);
if (c == 0) {
c = language.compareTo(other.language);
}
return c;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
LanguagePopulation other = (LanguagePopulation) obj;
return language.equals(other.language)
&& (Double.compare(literatePopulation, other.literatePopulation) == 0);
}
public String getLanguage() {
return language;
}
public double getLiteratePopulation() {
return literatePopulation;
}
@Override
public int hashCode() {
long temp = Double.doubleToLongBits(literatePopulation);
return language.hashCode() + 31 * (int) (temp ^ (temp >>> 32));
}
public boolean isOfficial() {
return official;
}
@Override
public String toString() {
return "[lang=" + language + " pop=" + literatePopulation + "]";
}
}
/**
* Stores the region populations literate in a given language.
*/
public static class RegionPopulation implements Comparable<RegionPopulation> {
private final String region;
private final double literatePopulation;
private final boolean official;
public RegionPopulation(String region, double literatePopulation, boolean official) {
this.region = region;
this.literatePopulation = literatePopulation;
this.official = official;
}
@Override
public int compareTo(RegionPopulation other) {
int c = -Double.compare(literatePopulation, other.literatePopulation);
if (c == 0) {
c = region.compareTo(other.region);
}
return c;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
RegionPopulation other = (RegionPopulation) obj;
return region.equals(other.region)
&& (Double.compare(literatePopulation, other.literatePopulation) == 0);
}
public double getLiteratePopulation() {
return literatePopulation;
}
public String getRegion() {
return region;
}
@Override
public int hashCode() {
long temp = Double.doubleToLongBits(literatePopulation);
return region.hashCode() + 31 * (int) (temp ^ (temp >>> 32));
}
public boolean isOfficial() {
return official;
}
@Override
public String toString() {
return "[region=" + region + " pop=" + literatePopulation + "]";
}
}
private final InputFactory cldrFactory;
private Map<String, SortedSet<LanguagePopulation>> regionMap;
private Map<String, SortedSet<RegionPopulation>> languageMap;
public RegionLanguageData(InputFactory cldrFactory) {
this.cldrFactory = cldrFactory;
}
public Set<LanguagePopulation> getLanguages(String region) {
ensureMaps();
Set<LanguagePopulation> languageSet = regionMap.get(region);
if (languageSet == null) {
languageSet = Collections.emptySet();
}
return languageSet;
}
public Set<RegionPopulation> getRegions(String language) {
ensureMaps();
Set<RegionPopulation> regionSet = languageMap.get(language);
if (regionSet == null) {
regionSet = Collections.emptySet();
}
return regionSet;
}
private void ensureMaps() {
if (regionMap != null) {
return;
}
regionMap = new HashMap<String, SortedSet<LanguagePopulation>>();
languageMap = new HashMap<String, SortedSet<RegionPopulation>>();
InputFile supp = cldrFactory.getSupplementalData();
XPathParts parts = new XPathParts();
for (String path : supp.listPaths("//supplementalData/territoryInfo/territory")) {
parts.set(supp.getFullXPath(path));
String language = parts.findAttributeValue("languagePopulation", "type");
if (language == null) {
continue;
}
String territory = parts.findAttributeValue("territory", "type");
String literacyPercentStr = parts.findAttributeValue("territory", "literacyPercent");
String populationStr = parts.findAttributeValue("territory", "population");
String populationPercentStr =
parts.findAttributeValue("languagePopulation", "populationPercent");
String statusStr = parts.findAttributeValue("languagePopulation", "officialStatus");
double literacyPercent = Double.parseDouble(literacyPercentStr) * .01;
double population = Double.parseDouble(populationStr);
double populationPercent = Double.parseDouble(populationPercentStr) * .01;
double literatePopulation = population * populationPercent * literacyPercent;
boolean official = "official".equals(statusStr);
SortedSet<RegionPopulation> regPop = languageMap.get(language);
if (regPop == null) {
regPop = new TreeSet<RegionPopulation>();
languageMap.put(language, regPop);
}
regPop.add(new RegionPopulation(territory, literatePopulation, official));
SortedSet<LanguagePopulation> langPop = regionMap.get(territory);
if (langPop == null) {
langPop = new TreeSet<LanguagePopulation>();
regionMap.put(territory, langPop);
}
langPop.add(new LanguagePopulation(language, literatePopulation, official));
}
}
}