/* * Copyright 2013 Serdar. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.fub.maps.project.aggregator.pipeline.processes; import de.fub.agg2graph.agg.AggContainer; import de.fub.agg2graph.management.Statistics; import de.fub.agg2graph.roadgen.IAggFilter; import de.fub.agg2graph.roadgen.IRoadNetworkFilter; import de.fub.agg2graph.roadgen.IRoadObjectMerger; import de.fub.agg2graph.roadgen.IRoadTypeClassifier; import de.fub.agg2graph.roadgen.Intersection; import de.fub.agg2graph.roadgen.RoadNetwork; import de.fub.agg2graphui.layers.IntersectionLayer; import de.fub.agg2graphui.layers.PrimaryRoadNetworkLayer; import de.fub.agg2graphui.layers.RoadNetworkLayer; import de.fub.agg2graphui.layers.SecondaryRoadNetworkLayer; import de.fub.agg2graphui.layers.TertiaryRoadNetworkLayer; import de.fub.maps.project.aggregator.factories.nodes.properties.ClassProperty; import de.fub.maps.project.aggregator.factories.nodes.properties.ClassWrapper; import de.fub.maps.project.aggregator.pipeline.AbstractAggregationProcess; import de.fub.maps.project.aggregator.pipeline.AggregationProcessNode; import de.fub.maps.project.aggregator.pipeline.wrapper.interfaces.RoadAggregationFilter; import de.fub.maps.project.aggregator.pipeline.wrapper.interfaces.RoadNetworkDescriptor; import de.fub.maps.project.aggregator.pipeline.wrapper.interfaces.RoadNetworkFilter; import de.fub.maps.project.aggregator.pipeline.wrapper.interfaces.RoadObjectMerger; import de.fub.maps.project.aggregator.pipeline.wrapper.interfaces.RoadTypeClassifier; import de.fub.maps.project.aggregator.xml.ProcessDescriptor; import de.fub.maps.project.aggregator.xml.Property; import de.fub.maps.project.aggregator.xml.PropertySection; import de.fub.maps.project.aggregator.xml.PropertySet; import de.fub.maps.project.api.process.ProcessPipeline; import de.fub.maps.project.api.statistics.StatisticProvider; import java.awt.Component; import java.awt.Image; import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; import javax.swing.JComponent; import org.netbeans.api.annotations.common.StaticResource; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; /** * Process unit implementation, which handles the creation of the RoadNetwork of * an Aggregator instance. * * @author Serdar */ @NbBundle.Messages({ "CLT_RoadNetworkProcess_Name=Road Generator", "CLT_RoadNetworkProcess_Description=Road Generation process", "CLT_RoadNetworkProcess_PropertySection_Name=Road Generator Settings", "CLT_RoadNetworkProcess_PropertySection_Description=No description available", "CLT_RoadNetworkProcess_Property_AggregationFilter_Name=Aggragation Filter Settings", "CLT_RoadNetworkProcess_Property_AggregationFilter_Description=No description available", "CLT_RoadNetworkProcess_Property_RoadObjectMerger_Name=Road Object Merger Settings", "CLT_RoadNetworkProcess_Property_RoadObjectMerger_Description=No description available", "CLT_RoadNetworkProcess_Property_Road Type_Classifier_Name=Road Type Classifier Settings", "CLT_RoadNetworkProcess_Property_Road_Type_Classifier_Description=No description available", "CLT_RoadNetworkProcess_Property_RoadNetworkFilter_Name=Road Network Filter Settings", "CLT_RoadNetworkProcess_Property_RoadNetworkFilter_Description=No description available",}) @ServiceProvider(service = AbstractAggregationProcess.class) public class RoadNetworkProcess extends AbstractAggregationProcess<AggContainer, RoadNetwork> implements StatisticProvider { private static final Logger LOG = Logger.getLogger(RoadNetworkProcess.class.getName()); @StaticResource private static final String ICON_PATH = "de/fub/maps/project/aggregator/pipeline/processes/datasourceProcessIcon.png"; private static final Image IMAGE = ImageUtilities.loadImage(ICON_PATH); private static final String PROP_NAME_AGGREGATION_FILTER_INSTANCE = "road.network.process.aggregationFilter.instance"; private static final String PROP_NAME_NETWORK_FILTER_INSTANCE = "road.network.process.network.filter.instance"; private static final String PROP_NAME_OBJECT_MERGER_INSTANCE = "road.network.process.object.merger.instance"; private static final String PROP_NAME_TYPE_CLASSIFIER_INSTANCE = "road.network.process.type.classifier.instance"; private RoadNetwork roadNetwork = null; private final IntersectionLayer intersectionLayer = new IntersectionLayer(); private final RoadNetworkLayer primaryRoadNetworkLayer = new PrimaryRoadNetworkLayer(); private final RoadNetworkLayer secondaryRoadNetworkLayer = new SecondaryRoadNetworkLayer(); private final RoadNetworkLayer teritaryRoadNetworkLayer = new TertiaryRoadNetworkLayer(); private RoadObjectMerger roadObjectMerger = null; private RoadAggregationFilter roadAggregationFilter = null; private RoadNetworkFilter roadNetworkFilter = null; private RoadTypeClassifier roadTypeClassifier = null; private RoadNetwortProcessNode node; public RoadNetworkProcess() { init(); } private void init() { getLayers().add(intersectionLayer); getLayers().add(primaryRoadNetworkLayer); getLayers().add(secondaryRoadNetworkLayer); getLayers().add(teritaryRoadNetworkLayer); } private void reInit() { node = null; if (getProcessDescriptor() != null) { List<PropertySection> sections = getProcessDescriptor().getProperties().getSections(); for (PropertySection section : sections) { for (PropertySet propertySet : section.getPropertySet()) { if (RoadNetworkProcess.class.getName().equals(propertySet.getId())) { for (Property property : propertySet.getProperties()) { if (PROP_NAME_AGGREGATION_FILTER_INSTANCE.equals(property.getId())) { handleRoadAggregationFilterCreation(property); } else if (PROP_NAME_NETWORK_FILTER_INSTANCE.equals(property.getId())) { handleRoadNetworkFilterCreation(property); } else if (PROP_NAME_OBJECT_MERGER_INSTANCE.equals(property.getId())) { handleRoadObjectMergerCreation(property); } else if (PROP_NAME_TYPE_CLASSIFIER_INSTANCE.equals(property.getId())) { handleRoadTypeClassifierCreation(property); } } return; } } } } } private void handleRoadObjectMergerCreation(Property property) { RoadObjectMerger merger = null; try { merger = RoadObjectMerger.Factory.find(property.getValue()); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { try { merger = RoadObjectMerger.Factory.getDefault(); } catch (RoadNetworkDescriptor.InstanceNotFound ex1) { Exceptions.printStackTrace(ex1); } } if (merger != null) { merger.setRoadNetworkProcess(this); setRoadObjectMerger(merger); } } private void handleRoadAggregationFilterCreation(Property property) { RoadAggregationFilter filter = null; try { filter = RoadAggregationFilter.Factory.find(property.getValue()); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { try { filter = RoadAggregationFilter.Factory.getDefault(); } catch (RoadNetworkDescriptor.InstanceNotFound ex1) { Exceptions.printStackTrace(ex1); } } if (filter != null) { filter.setRoadNetworkProcess(this); setRoadAggregationFilter(filter); } } private void handleRoadTypeClassifierCreation(Property property) { RoadTypeClassifier classifier = null; try { classifier = RoadTypeClassifier.Factory.find(property.getValue()); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { try { classifier = RoadTypeClassifier.Factory.getDefault(); } catch (RoadNetworkDescriptor.InstanceNotFound ex1) { Exceptions.printStackTrace(ex1); } } if (classifier != null) { classifier.setRoadNetworkProcess(this); setRoadTypeClassifier(classifier); } } private void handleRoadNetworkFilterCreation(Property property) { RoadNetworkFilter filter = null; try { filter = RoadNetworkFilter.Factory.find(property.getValue()); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { try { filter = RoadNetworkFilter.Factory.getDefault(); } catch (RoadNetworkDescriptor.InstanceNotFound ex1) { Exceptions.printStackTrace(ex1); } } if (filter != null) { filter.setRoadNetworkProcess(this); setRoadNetworkFilter(filter); } } public RoadNetwork getRoadNetwork() { return roadNetwork; } public void setRoadNetwork(RoadNetwork roadNetwork) { this.roadNetwork = roadNetwork; } public RoadObjectMerger getRoadObjectMerger() { return roadObjectMerger; } public void setRoadObjectMerger(RoadObjectMerger roadObjectMerger) { this.roadObjectMerger = roadObjectMerger; } public RoadAggregationFilter getRoadAggregationFilter() { return roadAggregationFilter; } public void setRoadAggregationFilter(RoadAggregationFilter roadAggregationFilter) { this.roadAggregationFilter = roadAggregationFilter; } public RoadNetworkFilter getRoadNetworkFilter() { return roadNetworkFilter; } public void setRoadNetworkFilter(RoadNetworkFilter roadNetworkFilter) { this.roadNetworkFilter = roadNetworkFilter; } public RoadTypeClassifier getRoadTypeClassifier() { return roadTypeClassifier; } public void setRoadTypeClassifier(RoadTypeClassifier roadTypeClassifier) { this.roadTypeClassifier = roadTypeClassifier; } @Override public void setProcessDescriptor(ProcessDescriptor processDescriptor) { super.setProcessDescriptor(processDescriptor); reInit(); } @Override public void setInput(AggContainer input) { // we can access the aggContainer via the parent Aggregator instance. } @Override protected void start() { if (getAggregator() != null) { ProgressHandle handle = ProgressHandleFactory.createHandle(getName()); try { handle.start(); primaryRoadNetworkLayer.clearRenderObjects(); intersectionLayer.clearRenderObjects(); roadNetwork = new RoadNetwork(); roadNetwork.setAggFilter(getRoadAggregationFilter()); roadNetwork.setRoadNetworkFilter(getRoadNetworkFilter()); roadNetwork.setRoadObjectMerger(getRoadObjectMerger()); roadNetwork.setRoadTypeClassifier(getRoadTypeClassifier()); roadNetwork.parse(getAggregator().getAggContainer(), null); handle.switchToDeterminate(roadNetwork.getIntersections().size()); int counter = 0; for (Intersection intersection : roadNetwork.getIntersections()) { if (canceled.get()) { fireProcessCanceledEvent(); return; } intersectionLayer.add(intersection); handle.progress(++counter); } primaryRoadNetworkLayer.add(roadNetwork); secondaryRoadNetworkLayer.add(roadNetwork); teritaryRoadNetworkLayer.add(roadNetwork); fireProcessProgressEvent(new ProcessPipeline.ProcessEvent<RoadNetworkProcess>(this, "Creating Roadnetwork...", 100)); } finally { handle.finish(); } } } @Override public RoadNetwork getResult() { synchronized (RUN_MUTEX) { return roadNetwork; } } @Override public String getName() { if (getProcessDescriptor() != null) { return getProcessDescriptor().getDisplayName(); } return Bundle.CLT_RoadNetworkProcess_Name(); } @Override public String getDescription() { if (getProcessDescriptor() != null) { return getProcessDescriptor().getDescription(); } return Bundle.CLT_RoadNetworkProcess_Description(); } @Override public Image getIcon() { return IMAGE; } @Override public JComponent getSettingsView() { return null; } @NbBundle.Messages({"CLT_No_Statistics_Available=No road network was computed to provide its statistics. Please run the read generator process!", "CLT_Description_Not_Available=Description not available."}) @Override public List<StatisticSection> getStatisticData() throws StatisticNotAvailableException { List<StatisticSection> statisticData = new ArrayList<StatisticSection>(); // create process performance statistics StatisticSection section = getPerformanceData(); statisticData.add(section); if (getResult() != null) { // create road network statistics section = new StatisticSection("Road Network Statistics", "Displays statistical data of the generated road network"); // NO18N statisticData.add(section); Map<String, Double> data = Statistics.getData(getResult()); for (Entry<String, Double> entry : data.entrySet()) { section.getStatisticsItemList().add(new StatisticItem(entry.getKey(), String.valueOf(entry.getValue()), Bundle.CLT_Description_Not_Available())); } } return statisticData; } @Override public boolean cancel() { canceled.set(true); return canceled.get(); } @Override public Component getVisualRepresentation() { return null; } @Override public Node getNodeDelegate() { if (node == null) { node = new RoadNetwortProcessNode(RoadNetworkProcess.this); } return node; } @Override protected ProcessDescriptor createProcessDescriptor() { ProcessDescriptor descriptor = new ProcessDescriptor(); descriptor.setJavaType(RoadNetworkProcess.class.getName()); descriptor.setDisplayName(Bundle.CLT_RoadNetworkProcess_Name()); descriptor.setDescription(Bundle.CLT_RoadNetworkProcess_Description()); PropertySection propertySection = new PropertySection(); propertySection.setId(RoadNetworkProcess.class.getName()); propertySection.setName(Bundle.CLT_RoadNetworkProcess_PropertySection_Name()); propertySection.setDescription(Bundle.CLT_RoadNetworkProcess_PropertySection_Description()); descriptor.getProperties().getSections().add(propertySection); PropertySet set = new PropertySet(); set.setId(RoadNetworkProcess.class.getName()); set.setName(Bundle.CLT_RoadNetworkProcess_PropertySection_Name()); set.setDescription(Bundle.CLT_RoadNetworkProcess_PropertySection_Description()); propertySection.getPropertySet().add(set); try { RoadAggregationFilter instance = RoadAggregationFilter.Factory.getDefault(); PropertySet propertySet = instance.getProcessDescriptor(); if (propertySet != null) { propertySection.getPropertySet().add(propertySet); } Property property = new Property(); property.setId(PROP_NAME_AGGREGATION_FILTER_INSTANCE); property.setJavaType(String.class.getName()); property.setValue(instance.getClass().getName()); property.setName(Bundle.CLT_RoadNetworkProcess_Property_AggregationFilter_Name()); property.setDescription(Bundle.CLT_RoadNetworkProcess_Property_AggregationFilter_Description()); set.getProperties().add(property); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } try { RoadNetworkFilter instance = RoadNetworkFilter.Factory.getDefault(); PropertySet propertySet = instance.getProcessDescriptor(); if (propertySet != null) { propertySection.getPropertySet().add(propertySet); } Property property = new Property(); property.setId(PROP_NAME_NETWORK_FILTER_INSTANCE); property.setJavaType(String.class.getName()); property.setValue(instance.getClass().getName()); property.setName(Bundle.CLT_RoadNetworkProcess_Property_RoadNetworkFilter_Name()); property.setDescription(Bundle.CLT_RoadNetworkProcess_Property_RoadNetworkFilter_Description()); set.getProperties().add(property); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } try { RoadObjectMerger instance = RoadObjectMerger.Factory.getDefault(); PropertySet propertySet = instance.getProcessDescriptor(); if (propertySet != null) { propertySection.getPropertySet().add(propertySet); } Property property = new Property(); property.setId(PROP_NAME_OBJECT_MERGER_INSTANCE); property.setJavaType(String.class.getName()); property.setValue(instance.getClass().getName()); property.setName(Bundle.CLT_RoadNetworkProcess_Property_RoadObjectMerger_Name()); property.setDescription(Bundle.CLT_RoadNetworkProcess_Property_RoadObjectMerger_Description()); set.getProperties().add(property); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } try { RoadTypeClassifier instance = RoadTypeClassifier.Factory.getDefault(); PropertySet propertySet = instance.getProcessDescriptor(); if (propertySet != null) { propertySection.getPropertySet().add(propertySet); } Property property = new Property(); property.setId(PROP_NAME_TYPE_CLASSIFIER_INSTANCE); property.setJavaType(String.class.getName()); property.setValue(instance.getClass().getName()); property.setName(Bundle.CLT_RoadNetworkProcess_Property_Road_Type_Classifier_Name()); property.setDescription(Bundle.CLT_RoadNetworkProcess_Property_Road_Type_Classifier_Description()); set.getProperties().add(property); } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } return descriptor; } private static class RoadNetwortProcessNode extends AggregationProcessNode { private final RoadNetworkProcess roadNetworkProcess; public RoadNetwortProcessNode(RoadNetworkProcess process) { super(process); this.roadNetworkProcess = process; } @Override protected Sheet createSheet() { Sheet sheet = null; if (roadNetworkProcess != null) { sheet = Sheet.createDefault(); ProcessDescriptor processDescriptor = roadNetworkProcess.getProcessDescriptor(); if (processDescriptor != null) { List<PropertySection> sections = processDescriptor.getProperties().getSections(); for (final PropertySection section : sections) { if (RoadNetworkProcess.class.getName().equals(section.getId())) { for (de.fub.maps.project.aggregator.xml.PropertySet propertySet : section.getPropertySet()) { if (RoadNetworkProcess.class.getName().equals(propertySet.getId())) { Sheet.Set set = Sheet.createPropertiesSet(); set.setName(propertySet.getId()); set.setDisplayName(propertySet.getName()); set.setShortDescription(propertySet.getDescription()); sheet.put(set); for (final de.fub.maps.project.aggregator.xml.Property prop : propertySet.getProperties()) { if (PROP_NAME_AGGREGATION_FILTER_INSTANCE.equals(prop.getId())) { ClassProperty classProperty = new RoadAggregationFilterProperty(section, prop); set.put(classProperty); } else if (PROP_NAME_NETWORK_FILTER_INSTANCE.equals(prop.getId())) { ClassProperty classProperty = new RoadNetworkFilterProperty(section, prop); set.put(classProperty); } else if (PROP_NAME_OBJECT_MERGER_INSTANCE.equals(prop.getId())) { ClassProperty property = new RoadObjectMergerProperty(section, prop); set.put(property); } else if (PROP_NAME_TYPE_CLASSIFIER_INSTANCE.equals(prop.getId())) { ClassProperty property = new RoadTypeClassifierProperty(section, prop); set.put(property); } } } } } } } IAggFilter aggFilter = roadNetworkProcess.getRoadAggregationFilter(); if (aggFilter instanceof RoadNetworkDescriptor) { RoadNetworkDescriptor descriptor = (RoadNetworkDescriptor) aggFilter; PropertySet[] propertySets = descriptor.getNodeDelegate().getPropertySets(); for (PropertySet propertySet : propertySets) { Sheet.Set set = convertToSet(propertySet); sheet.put(set); } } IRoadNetworkFilter roadNetworkFilter = roadNetworkProcess.getRoadNetworkFilter(); if (roadNetworkFilter instanceof RoadNetworkDescriptor) { RoadNetworkDescriptor descriptor = (RoadNetworkDescriptor) roadNetworkFilter; PropertySet[] propertySets = descriptor.getNodeDelegate().getPropertySets(); for (PropertySet propertySet : propertySets) { Sheet.Set set = convertToSet(propertySet); sheet.put(set); } } IRoadObjectMerger roadObjectMerger = roadNetworkProcess.getRoadObjectMerger(); if (roadObjectMerger instanceof RoadNetworkDescriptor) { RoadNetworkDescriptor descriptor = (RoadNetworkDescriptor) roadObjectMerger; PropertySet[] propertySets = descriptor.getNodeDelegate().getPropertySets(); for (PropertySet propertySet : propertySets) { Sheet.Set set = convertToSet(propertySet); sheet.put(set); } } IRoadTypeClassifier roadTypeClassifier = roadNetworkProcess.getRoadTypeClassifier(); if (roadTypeClassifier instanceof RoadNetworkDescriptor) { RoadNetworkDescriptor descriptor = (RoadNetworkDescriptor) roadTypeClassifier; PropertySet[] propertySets = descriptor.getNodeDelegate().getPropertySets(); for (PropertySet propertySet : propertySets) { Sheet.Set set = convertToSet(propertySet); sheet.put(set); } } } if (sheet == null) { sheet = super.createSheet(); } return sheet; } private Sheet.Set convertToSet(PropertySet propertySet) { Sheet.Set set = Sheet.createPropertiesSet(); set.setName(propertySet.getName()); set.setDisplayName(propertySet.getDisplayName()); set.setShortDescription(propertySet.getShortDescription()); for (Property<?> property : propertySet.getProperties()) { set.put(property); } return set; } private class RoadAggregationFilterProperty extends ClassProperty { private final PropertySection section; private final de.fub.maps.project.aggregator.xml.Property prop; private ClassWrapper wrapper = roadNetworkProcess.getRoadAggregationFilter() != null ? new ClassWrapper(roadNetworkProcess.getRoadAggregationFilter().getClass()) : null; public RoadAggregationFilterProperty(PropertySection section, de.fub.maps.project.aggregator.xml.Property prop) { super(prop.getId(), prop.getName(), prop.getDescription(), RoadAggregationFilter.class); this.section = section; this.prop = prop; } @Override public ClassWrapper getValue() throws IllegalAccessException, InvocationTargetException { return wrapper; } @Override public void setValue(ClassWrapper val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (val == null) { throw new IllegalArgumentException("Null is not a valid value"); } else if (wrapper == null || !val.getQualifiedName().equals(wrapper.getQualifiedName())) { ClassWrapper OldValue = this.wrapper; wrapper = val; int index = -1; if (OldValue != null) { for (de.fub.maps.project.aggregator.xml.PropertySet set : section.getPropertySet()) { index++; if (OldValue.getQualifiedName().equals(set.getId())) { LOG.info(MessageFormat.format("PropertySet {0} removed: {1}", set.getId(), section.getPropertySet().remove(set))); } } } try { RoadAggregationFilter filter = RoadAggregationFilter.Factory.find(val.getQualifiedName()); if (filter != null) { prop.setValue(val.getQualifiedName()); filter.setRoadNetworkProcess(roadNetworkProcess); roadNetworkProcess.setRoadAggregationFilter(filter); de.fub.maps.project.aggregator.xml.PropertySet set = filter.getProcessDescriptor(); if (index < 0 || index >= section.getPropertySet().size()) { section.getPropertySet().add(set); } else { section.getPropertySet().add(index, set); } } } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } } } } private class RoadNetworkFilterProperty extends ClassProperty { private final PropertySection section; private final de.fub.maps.project.aggregator.xml.Property property; private ClassWrapper wrapper = roadNetworkProcess.getRoadNetworkFilter() != null ? new ClassWrapper(roadNetworkProcess.getRoadNetworkFilter().getClass()) : null; public RoadNetworkFilterProperty(PropertySection section, de.fub.maps.project.aggregator.xml.Property property) { super(property.getId(), property.getName(), property.getDescription(), RoadNetworkFilter.class); this.section = section; this.property = property; } @Override public ClassWrapper getValue() throws IllegalAccessException, InvocationTargetException { return wrapper; } @Override public void setValue(ClassWrapper val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (val == null) { throw new IllegalArgumentException("null is not a valid value"); } else if (wrapper == null || !val.getQualifiedName().equals(wrapper.getQualifiedName())) { ClassWrapper oldValue = this.wrapper; this.wrapper = val; int index = -1; if (oldValue != null) { for (de.fub.maps.project.aggregator.xml.PropertySet propertySet : section.getPropertySet()) { index++; if (oldValue.getQualifiedName().equals(propertySet.getId())) { LOG.info(MessageFormat.format("PropertySet {0} removed: {1}", propertySet.getId(), section.getPropertySet().remove(propertySet))); } } } try { RoadNetworkFilter filter = RoadNetworkFilter.Factory.find(val.getQualifiedName()); if (filter != null) { property.setValue(val.getQualifiedName()); filter.setRoadNetworkProcess(roadNetworkProcess); roadNetworkProcess.setRoadNetworkFilter(filter); de.fub.maps.project.aggregator.xml.PropertySet propertySet = filter.getProcessDescriptor(); if (index < 0 || index >= section.getPropertySet().size()) { section.getPropertySet().add(propertySet); } else { section.getPropertySet().add(propertySet); } } } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } } } } private class RoadObjectMergerProperty extends ClassProperty { private final PropertySection section; private final de.fub.maps.project.aggregator.xml.Property property; private ClassWrapper wrapper = roadNetworkProcess.getRoadObjectMerger() != null ? new ClassWrapper(roadNetworkProcess.getRoadObjectMerger().getClass()) : null; public RoadObjectMergerProperty(PropertySection section, de.fub.maps.project.aggregator.xml.Property property) { super(property.getId(), property.getName(), property.getDescription(), RoadObjectMerger.class); this.section = section; this.property = property; } @Override public ClassWrapper getValue() throws IllegalAccessException, InvocationTargetException { return this.wrapper; } @Override public void setValue(ClassWrapper val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (val == null) { throw new IllegalArgumentException("Null is not a valid value"); } else if (wrapper == null || !val.getQualifiedName().equals(wrapper.getQualifiedName())) { ClassWrapper oldValue = this.wrapper; this.wrapper = val; int index = -1; if (oldValue != null) { for (de.fub.maps.project.aggregator.xml.PropertySet propertySet : section.getPropertySet()) { index++; if (oldValue.getQualifiedName().equals(propertySet.getId())) { LOG.info(MessageFormat.format("PropertySet {0} removed: {1}", propertySet.getId(), section.getPropertySet().remove(propertySet))); } } } try { RoadObjectMerger roadObjectMerger = RoadObjectMerger.Factory.find(val.getQualifiedName()); if (roadObjectMerger != null) { property.setValue(val.getQualifiedName()); roadObjectMerger.setRoadNetworkProcess(roadNetworkProcess); roadNetworkProcess.setRoadObjectMerger(roadObjectMerger); de.fub.maps.project.aggregator.xml.PropertySet propertySet = roadObjectMerger.getProcessDescriptor(); if (index < 0 || index >= section.getPropertySet().size()) { section.getPropertySet().add(index, propertySet); } else { section.getPropertySet().add(propertySet); } } } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } } } } private class RoadTypeClassifierProperty extends ClassProperty { private final PropertySection section; private final de.fub.maps.project.aggregator.xml.Property property; private ClassWrapper wrapper = roadNetworkProcess.getRoadTypeClassifier() != null ? new ClassWrapper(roadNetworkProcess.getRoadTypeClassifier().getClass()) : null; public RoadTypeClassifierProperty(PropertySection section, de.fub.maps.project.aggregator.xml.Property property) { super(property.getId(), property.getName(), property.getDescription(), RoadTypeClassifier.class); this.section = section; this.property = property; } @Override public ClassWrapper getValue() throws IllegalAccessException, InvocationTargetException { return this.wrapper; } @Override public void setValue(ClassWrapper val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (val == null) { throw new IllegalArgumentException("null is not a valid value"); } else if (wrapper == null || !val.getQualifiedName().equals(wrapper.getQualifiedName())) { ClassWrapper oldValue = this.wrapper; this.wrapper = val; int index = -1; if (oldValue != null) { for (de.fub.maps.project.aggregator.xml.PropertySet propertySet : section.getPropertySet()) { index++; if (oldValue.getQualifiedName().equals(propertySet.getId())) { LOG.info(MessageFormat.format(" PropertySet {0} removed: {1}", propertySet.getId(), section.getPropertySet().remove(propertySet))); } } } try { RoadTypeClassifier roadTypeClassifier = RoadTypeClassifier.Factory.find(val.getQualifiedName()); if (roadTypeClassifier != null) { property.setValue(val.getQualifiedName()); roadTypeClassifier.setRoadNetworkProcess(roadNetworkProcess); roadNetworkProcess.setRoadTypeClassifier(roadTypeClassifier); de.fub.maps.project.aggregator.xml.PropertySet propertySet = roadTypeClassifier.getProcessDescriptor(); if (index < 0 || index >= section.getPropertySet().size()) { section.getPropertySet().add(index, propertySet); } else { section.getPropertySet().add(propertySet); } } } catch (RoadNetworkDescriptor.InstanceNotFound ex) { Exceptions.printStackTrace(ex); } } } } } }