// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.tagfilter.v0_6; import org.openstreetmap.osmosis.core.pipeline.common.TaskConfiguration; import org.openstreetmap.osmosis.core.pipeline.common.TaskManager; import org.openstreetmap.osmosis.core.pipeline.common.TaskManagerFactory; import org.openstreetmap.osmosis.core.pipeline.v0_6.SinkSourceManager; import java.util.Map; import java.util.Set; import java.util.HashMap; import java.util.HashSet; /** * Extends the basic task manager factory functionality with TagFilter task * specific common methods. * * @author Andrew Byrd */ public class TagFilterFactory extends TaskManagerFactory { /** * Decodes escaped wildcard, separator, equals, and space characters. * * @param s * the String to decode. */ private String unEscape(String s) { StringBuilder sb = new StringBuilder(); boolean escaped = false; for (char c : s.toCharArray()) { if (escaped) { switch (c) { case '%': sb.append('%'); break; case 'a': sb.append('*'); break; case 'c': sb.append(','); break; case 'e': sb.append('='); break; case 's': sb.append(' '); break; default : break; } escaped = false; } else { if (c == '%') { escaped = true; } else { sb.append(c); } } } return sb.toString(); } /** * {@inheritDoc} */ @Override protected TaskManager createTaskManagerImpl(TaskConfiguration taskConfig) { // Iterate over keyword arguments and fetch them through the appropriate TaskManagerFactory utility method // to avoid 'Argument was not recognized' exceptions from Osmosis Set<String> keys = new HashSet<String>(); Map<String, Set<String>> keyValues = new HashMap<String, Set<String>>(); for (String key : taskConfig.getConfigArgs().keySet()) { String value = getStringArgument(taskConfig, key); if (value.equals("*")) { keys.add(unEscape(key)); } else { Set<String> values = new HashSet<String>(); for (String v : value.split(",")) { values.add(unEscape(v)); } keyValues.put(unEscape(key), values); } } return new SinkSourceManager( taskConfig.getId(), new TagFilter(getDefaultStringArgument(taskConfig, ""), keys, keyValues), taskConfig.getPipeArgs() ); } }