/* * Copyright (C) 2007 Steve Ratcliffe * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Author: Steve Ratcliffe * Create date: Dec 1, 2007 */ package uk.me.parabola.mkgmap.build; import uk.me.parabola.log.Logger; import uk.me.parabola.mkgmap.filters.FilterConfig; import uk.me.parabola.mkgmap.filters.MapFilter; import uk.me.parabola.mkgmap.filters.MapFilterChain; import uk.me.parabola.mkgmap.general.MapElement; import java.util.ArrayList; import java.util.List; /** * This calls all the filters that are applied to an element as it is added to * the map at a particular level. * * @author Steve Ratcliffe */ public class LayerFilterChain implements MapFilterChain { private static final Logger log = Logger.getLogger(LayerFilterChain.class); // The filters that will be applied to the element. private List<MapFilter> filters = new ArrayList<MapFilter>(); // The position in the filter list. private int position; private final FilterConfig config; public LayerFilterChain(FilterConfig config) { this.config = config; } public void doFilter(MapElement element) { int nfilters = filters.size(); log.debug("doing filter pos=", position, "out of=", nfilters); if (position >= nfilters) return; MapFilter f = filters.get(position++); f.doFilter(element, this); // maintain chain position for repeated calls in the split filters position--; } /** * Start the filtering process for an element. * @param element The element to add to the map. */ void startFilter(MapElement element) { position = 0; doFilter(element); } /** * Add a filter to this chain. * * @param filter Filter to added at the end of the chain. */ void addFilter(MapFilter filter) { assert config != null; filter.init(config); filters.add(filter); } }