package com.schneeloch.bostonbusmap_library.data; import java.util.Map; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableBiMap.Builder; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableTable; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.schneeloch.bostonbusmap_library.database.Schema; /** * Convenience class to handle mapping routes to route titles * @author schneg * */ public class RouteTitles extends TransitSourceTitles { private final ImmutableMap<String, Integer> tagToIndex; private final ImmutableMap<Schema.Routes.SourceId, TransitSourceTitles> transitSourceMaps; private final ImmutableMap<String, Schema.Routes.SourceId> transitSourceIds; public RouteTitles(ImmutableBiMap<String, String> map, ImmutableMap<String, Schema.Routes.SourceId> transitSourceIds) { super(map); ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder(); int count = 0; for (String key : map.keySet()) { builder.put(key, count); count++; } tagToIndex = builder.build(); Map<Schema.Routes.SourceId, ImmutableBiMap.Builder<String, String>> transitSourceBuilder = Maps.newHashMap(); for (String name : map.keySet()) { String title = map.get(name); Schema.Routes.SourceId transitSourceId = transitSourceIds.get(name); ImmutableBiMap.Builder<String, String> miniBuilder; if (transitSourceBuilder.containsKey(transitSourceId) == false) { miniBuilder = ImmutableBiMap.builder(); transitSourceBuilder.put(transitSourceId, miniBuilder); } else { miniBuilder = transitSourceBuilder.get(transitSourceId); } miniBuilder.put(name, title); } Map<Schema.Routes.SourceId, TransitSourceTitles> transitionMap = Maps.newHashMap(); for (Schema.Routes.SourceId transitSourceId : transitSourceBuilder.keySet()) { ImmutableBiMap.Builder<String, String> value = transitSourceBuilder.get(transitSourceId); TransitSourceTitles transitSourceTitles = new TransitSourceTitles(value.build()); transitionMap.put(transitSourceId, transitSourceTitles); } this.transitSourceMaps = ImmutableMap.copyOf(transitionMap); this.transitSourceIds = transitSourceIds; } public int getIndexForTag(String route) { if (tagToIndex.containsKey(route)) { return tagToIndex.get(route); } else { return -1; } } public String getTagUsingIndex(int index) { if (index < 0 || index >= map.size()) { index = map.size() - 1; } return map.keySet().asList().get(index); } public TransitSourceTitles getMappingForSources( Schema.Routes.SourceId[] transitSourceIds) { ImmutableBiMap.Builder<String, String> builder = ImmutableBiMap.builder(); for (Schema.Routes.SourceId id : transitSourceIds) { TransitSourceTitles titles = transitSourceMaps.get(id); builder.putAll(titles.map); } return new TransitSourceTitles(builder.build()); } public TransitSourceTitles getMappingForSource(Schema.Routes.SourceId transitSourceId) { return transitSourceMaps.get(transitSourceId); } public Schema.Routes.SourceId getTransitSourceId(String routeName) { return transitSourceIds.get(routeName); } }