/* * This file is part of the OSMembrane project. * More informations under www.osmembrane.de * * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0. * for more details about the license see http://www.osmembrane.de/license/ * * Source: $HeadURL$ ($Revision$) * Last changed: $Date$ */ package de.osmembrane.model.preset; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import de.openstreetmap.josm.tagging_preset_1.Group; import de.openstreetmap.josm.tagging_preset_1.Item; import de.openstreetmap.josm.tagging_preset_1.Key; import de.openstreetmap.josm.tagging_preset_1.Root; import de.osmembrane.Application; import de.osmembrane.exceptions.ControlledException; import de.osmembrane.exceptions.ExceptionSeverity; import de.osmembrane.model.persistence.FileException; import de.osmembrane.model.persistence.PersistenceFactory; import de.osmembrane.model.persistence.TaggingPresetPresistence; /** * Implementation of {@link AbstractPresetPrototype}. * * @author jakob_jarosch */ public class PresetPrototype extends AbstractPresetPrototype { private Root preset; private List<PresetItem> nodeList = new ArrayList<PresetItem>(); private List<PresetItem> wayList = new ArrayList<PresetItem>(); @Override public void initiate(URL xmlFilename) { try { preset = (Root) PersistenceFactory.getInstance() .getPersistence(TaggingPresetPresistence.class) .load(xmlFilename); List<Object> obj = preset.getGroupOrItemOrSeparator(); createLists(obj); } catch (FileException e) { Application.handleException(new ControlledException(this, ExceptionSeverity.CRITICAL_UNEXPECTED_BEHAVIOR, e, "Could not load the OSMembrane xml file.")); } } @Override public PresetItem[] getNodes() { return getFilteredNodes(""); } @Override public PresetItem[] getNodeKeys() { return filterDoubleKeys(getNodes()); } @Override public PresetItem[] getFilteredNodes(String filter) { List<PresetItem> items = new ArrayList<PresetItem>(); for (PresetItem item : nodeList) { if (item.matches(filter)) { items.add(item); } } return items.toArray(new PresetItem[items.size()]); } @Override public PresetItem[] getFilteredNodeKeys(String filter) { return filterDoubleKeys(getFilteredNodes(filter)); } @Override public PresetItem[] getWays() { return getFilteredWays(""); } @Override public PresetItem[] getWayKeys() { return filterDoubleKeys(getWays()); } @Override public PresetItem[] getFilteredWays(String filter) { List<PresetItem> items = new ArrayList<PresetItem>(); for (PresetItem item : wayList) { if (item.matches(filter)) { items.add(item); } } return items.toArray(new PresetItem[items.size()]); } @Override public PresetItem[] getFilteredWayKeys(String filter) { return filterDoubleKeys(getFilteredWays(filter)); } private void createLists(List<Object> objects) { for (Object obj : objects) { if (obj instanceof Item) { processItem((Item) obj); } if (obj instanceof Group) { createLists(((Group) obj).getGroupOrItemOrSeparator()); } } Collections.sort(nodeList); Collections.sort(wayList); } private void processItem(Item item) { Key key = null; for (Object obj : item.getLabelOrSpaceOrLink()) { if (obj instanceof Key) { key = (Key) obj; } } if (key != null) { PresetItem presetItem = new PresetItem(item, key.getKey(), key.getValue()); /* Add the item to the lists which it refer to. */ if (presetItem.isNode()) { nodeList.add(presetItem); } if (presetItem.isWay()) { wayList.add(presetItem); } } } private PresetItem[] filterDoubleKeys(PresetItem[] items) { Map<String, PresetItem> keyMap = new HashMap<String, PresetItem>(); for (PresetItem item : items) { keyMap.put(item.getKey(), item); } return keyMap.values().toArray(new PresetItem[keyMap.values().size()]); } }