/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. */ package org.geotoolkit.style; import org.geotoolkit.util.collection.CollectionChangeEvent; import java.beans.PropertyChangeEvent; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.EventObject; import java.util.List; import org.geotoolkit.filter.DefaultFilterFactory2; import org.geotoolkit.filter.identity.DefaultFeatureId; import org.apache.sis.measure.NumberRange; import org.junit.Test; import static org.junit.Assert.*; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; import org.opengis.style.SemanticType; import org.opengis.style.Symbolizer; import org.opengis.util.GenericName; /** * Test different style object events. * * @author Johann Sorel (Geomatys) * @module */ public class ListenerTest extends org.geotoolkit.test.TestBase { private static final MutableStyleFactory SF = new DefaultStyleFactory(); private static final FilterFactory FF = new DefaultFilterFactory2(); private static double DELTA = 0d; public ListenerTest() { } @Test public void testRuleListener() throws URISyntaxException { final MutableRule rule = SF.rule(); final List<PropertyChangeEvent> propEvents = new ArrayList<PropertyChangeEvent>(); final List<CollectionChangeEvent<Symbolizer>> events = new ArrayList<CollectionChangeEvent<Symbolizer>>(); NumberRange range; rule.addListener(new RuleListener() { @Override public void propertyChange(PropertyChangeEvent event) { propEvents.add(event); } @Override public void symbolizerChange(CollectionChangeEvent<Symbolizer> event) { events.add(event); } }); final Symbolizer symbol = SF.lineSymbolizer(); //test add events.clear(); rule.symbolizers().add(symbol); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_ADDED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(symbol, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test remove events.clear(); rule.symbolizers().remove(symbol); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_REMOVED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(symbol, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test property events rule.setName("currentName"); rule.setDescription(SF.description("title", "abstract")); rule.setElseFilter(true); rule.setFilter(Filter.INCLUDE); rule.setOnlineResource(SF.onlineResource(new URI("http://test.com"))); rule.setLegendGraphic(SF.graphicLegend(SF.graphic())); rule.setMinScaleDenominator(0); rule.setMaxScaleDenominator(10); propEvents.clear(); //ensure that no events are fired when the new value is the same rule.setName("currentName"); assertEquals(0, propEvents.size()); rule.setDescription(SF.description("title", "abstract")); assertEquals(0, propEvents.size()); rule.setElseFilter(true); assertEquals(0, propEvents.size()); rule.setFilter(Filter.INCLUDE); assertEquals(0, propEvents.size()); rule.setOnlineResource(SF.onlineResource(new URI("http://test.com"))); assertEquals(0, propEvents.size()); rule.setLegendGraphic(SF.graphicLegend(SF.graphic())); assertEquals(0, propEvents.size()); rule.setMinScaleDenominator(0); assertEquals(0, propEvents.size()); rule.setMaxScaleDenominator(10); assertEquals(0, propEvents.size()); //ensure that event are correctly send propEvents.clear(); rule.setName("newName"); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), "currentName"); assertEquals(propEvents.get(0).getNewValue(), "newName"); propEvents.clear(); rule.setDescription(SF.description("newtitle", "newabstract")); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.description("title", "abstract")); assertEquals(propEvents.get(0).getNewValue(), SF.description("newtitle", "newabstract")); propEvents.clear(); rule.setElseFilter(false); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), true); assertEquals(propEvents.get(0).getNewValue(), false); propEvents.clear(); rule.setFilter(Filter.EXCLUDE); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), Filter.INCLUDE); assertEquals(propEvents.get(0).getNewValue(), Filter.EXCLUDE); propEvents.clear(); rule.setOnlineResource(SF.onlineResource(new URI("http://test2.com"))); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.onlineResource(new URI("http://test.com"))); assertEquals(propEvents.get(0).getNewValue(), SF.onlineResource(new URI("http://test2.com"))); propEvents.clear(); rule.setLegendGraphic(null); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.graphicLegend(SF.graphic())); assertEquals(propEvents.get(0).getNewValue(), null); propEvents.clear(); rule.setMinScaleDenominator(100d); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), 0d); assertEquals(propEvents.get(0).getNewValue(), 100d); propEvents.clear(); rule.setMaxScaleDenominator(1000d); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), 10d); assertEquals(propEvents.get(0).getNewValue(), 1000d); } @Test public void testFTSListener() throws URISyntaxException { final MutableFeatureTypeStyle fts = SF.featureTypeStyle(); final List<PropertyChangeEvent> propEvents = new ArrayList<PropertyChangeEvent>(); final List<CollectionChangeEvent<MutableRule>> events = new ArrayList(); NumberRange range; fts.addListener(new FeatureTypeStyleListener() { @Override public void propertyChange(PropertyChangeEvent event) { propEvents.add(event); } @Override public void ruleChange(CollectionChangeEvent<MutableRule> event) { events.add(event); } @Override public void featureTypeNameChange(CollectionChangeEvent<GenericName> event) { //todo add test on this event } @Override public void semanticTypeChange(CollectionChangeEvent<SemanticType> event) { //todo add test on this event } }); final MutableRule rule = SF.rule(); //test add events.clear(); fts.rules().add(rule); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_ADDED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(rule, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test remove events.clear(); fts.rules().remove(rule); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_REMOVED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(rule, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test rule event forwarded final Symbolizer symbol = SF.lineSymbolizer(); fts.rules().add(rule); events.clear(); rule.symbolizers().add(symbol); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_CHANGED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(rule, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); EventObject subEvent = events.get(0).getChangeEvent(); assertTrue(subEvent instanceof CollectionChangeEvent); CollectionChangeEvent sub = (CollectionChangeEvent) subEvent; assertEquals(CollectionChangeEvent.ITEM_ADDED, sub.getType()); assertEquals(1, sub.getItems().size()); assertEquals(symbol, sub.getItems().iterator().next()); range = sub.getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test property events fts.setName("currentName"); fts.setDescription(SF.description("title", "abstract")); fts.setOnlineResource(SF.onlineResource(new URI("http://test.com"))); fts.setFeatureInstanceIDs(FF.id(Collections.singleton(new DefaultFeatureId("id1")))); propEvents.clear(); //ensure that no events are fired when the new value is the same fts.setName("currentName"); assertEquals(0, propEvents.size()); fts.setDescription(SF.description("title", "abstract")); assertEquals(0, propEvents.size()); fts.setOnlineResource(SF.onlineResource(new URI("http://test.com"))); assertEquals(0, propEvents.size()); fts.setFeatureInstanceIDs(FF.id(Collections.singleton(new DefaultFeatureId("id1")))); assertEquals(0, propEvents.size()); //ensure that event are correctly send propEvents.clear(); fts.setName("newName"); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), "currentName"); assertEquals(propEvents.get(0).getNewValue(), "newName"); propEvents.clear(); fts.setDescription(SF.description("newtitle", "newabstract")); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.description("title", "abstract")); assertEquals(propEvents.get(0).getNewValue(), SF.description("newtitle", "newabstract")); propEvents.clear(); fts.setOnlineResource(SF.onlineResource(new URI("http://test2.com"))); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.onlineResource(new URI("http://test.com"))); assertEquals(propEvents.get(0).getNewValue(), SF.onlineResource(new URI("http://test2.com"))); propEvents.clear(); fts.setFeatureInstanceIDs(FF.id(Collections.singleton(new DefaultFeatureId("id2")))); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), FF.id(Collections.singleton(new DefaultFeatureId("id1")))); assertEquals(propEvents.get(0).getNewValue(), FF.id(Collections.singleton(new DefaultFeatureId("id2")))); } @Test public void testStyleListener() { final MutableStyle style = SF.style(); final List<PropertyChangeEvent> propEvents = new ArrayList<PropertyChangeEvent>(); final List<CollectionChangeEvent<MutableFeatureTypeStyle>> events = new ArrayList(); NumberRange range; style.addListener(new StyleListener() { @Override public void propertyChange(PropertyChangeEvent event) { propEvents.add(event); } @Override public void featureTypeStyleChange(CollectionChangeEvent<MutableFeatureTypeStyle> event) { events.add(event); } }); final MutableFeatureTypeStyle fts = SF.featureTypeStyle(); //test add events.clear(); style.featureTypeStyles().add(fts); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_ADDED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(fts, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test remove events.clear(); style.featureTypeStyles().remove(fts); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_REMOVED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(fts, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test rule event forwarded final MutableRule rule = SF.rule(); style.featureTypeStyles().add(fts); events.clear(); fts.rules().add(rule); assertEquals(1, events.size()); assertEquals(CollectionChangeEvent.ITEM_CHANGED, events.get(0).getType()); assertEquals(1, events.get(0).getItems().size()); assertEquals(fts, events.get(0).getItems().iterator().next()); range = events.get(0).getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); EventObject subEvent = events.get(0).getChangeEvent(); assertTrue(subEvent instanceof CollectionChangeEvent); CollectionChangeEvent sub = (CollectionChangeEvent) subEvent; assertEquals(CollectionChangeEvent.ITEM_ADDED, sub.getType()); assertEquals(1, sub.getItems().size()); assertEquals(rule, sub.getItems().iterator().next()); range = sub.getRange(); assertEquals(0d, range.getMinDouble(), DELTA); assertEquals(0d, range.getMaxDouble(), DELTA); //test property events style.setName("currentName"); style.setDescription(SF.description("title", "abstract")); style.setDefault(true); style.setDefaultSpecification(SF.lineSymbolizer()); propEvents.clear(); //ensure that no events are fired when the new value is the same style.setName("currentName"); assertEquals(0, propEvents.size()); style.setDescription(SF.description("title", "abstract")); assertEquals(0, propEvents.size()); style.setDefault(true); assertEquals(0, propEvents.size()); style.setDefaultSpecification(SF.lineSymbolizer()); assertEquals(0, propEvents.size()); //ensure that event are correctly send propEvents.clear(); style.setName("newName"); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), "currentName"); assertEquals(propEvents.get(0).getNewValue(), "newName"); propEvents.clear(); style.setDescription(SF.description("newtitle", "newabstract")); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.description("title", "abstract")); assertEquals(propEvents.get(0).getNewValue(), SF.description("newtitle", "newabstract")); propEvents.clear(); style.setDefault(false); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), true); assertEquals(propEvents.get(0).getNewValue(), false); propEvents.clear(); style.setDefaultSpecification(SF.pointSymbolizer()); assertEquals(1, propEvents.size()); assertEquals(propEvents.get(0).getOldValue(), SF.lineSymbolizer()); assertEquals(propEvents.get(0).getNewValue(), SF.pointSymbolizer()); } }