/*
* Copyright (c) 2012, 2013, Credit Suisse (Anatole Tresch), Werner Keil.
*
* 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 org.javamoney.regions.internal.data;
import java.util.Map;
import javax.inject.Singleton;
import org.javamoney.regions.Region;
import org.javamoney.regions.RegionTreeNode;
import org.javamoney.regions.RegionType;
import org.javamoney.regions.spi.BuildableRegionNode;
import org.javamoney.regions.spi.RegionProviderSpi;
import org.javamoney.regions.spi.RegionTreeProviderSpi;
import org.javamoney.regions.spi.BuildableRegionNode.Builder;
/**
* Region tree provider implementation registering under {@code CLDR} which maps
* the region tree provided by ICU4J.
*
* @author Anatole Tresch
*/
@Singleton
public class ICURegionTreeProvider implements RegionTreeProviderSpi {
private BuildableRegionNode regionTree;
// CLDR/world/...
@Override
public String getTreeId() {
return "CLDR";
}
@Override
public void init(Map<Class, RegionProviderSpi> providers) {
ICURegionProvider regionProvider = (ICURegionProvider) providers
.get(ICURegionProvider.class);
com.ibm.icu.util.Region icuWorld = com.ibm.icu.util.Region
.getAvailable(com.ibm.icu.util.Region.RegionType.WORLD)
.iterator().next();
Region root = regionProvider.getRegion(RegionType.WORLD,
icuWorld.toString());
Builder treeBuilder = new BuildableRegionNode.Builder(root);
populateRegionNode(regionProvider, treeBuilder);
regionTree = treeBuilder.build();
}
private void populateRegionNode(ICURegionProvider regionProvider,
BuildableRegionNode.Builder regionNode) {
for (com.ibm.icu.util.Region rt : ((IcuRegion) regionNode.getRegion())
.getIcuRegion().getContainedRegions()) {
RegionType type = RegionType.of(rt.getType().name());
Region region = regionProvider.getRegion(type,
rt.toString());
Builder nodeBuilder = new BuildableRegionNode.Builder(region);
populateRegionNode(regionProvider, nodeBuilder);
regionNode.addChildRegions(nodeBuilder.build());
}
}
@Override
public RegionTreeNode getRegionTree() {
return regionTree;
}
}