/* * 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.factories.nodes; import de.fub.maps.project.aggregator.factories.AggregatorSubFolderFactory; 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.xml.AggregatorDescriptor; import de.fub.maps.project.aggregator.xml.Properties; import de.fub.maps.project.aggregator.xml.PropertySection; import de.fub.maps.project.models.Aggregator; import de.fub.utilsmodule.icons.IconRegister; import de.fub.utilsmodule.node.property.ProcessProperty; import de.fub.utilsmodule.synchronizer.ModelSynchronizer; import java.awt.Image; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; import javax.swing.Action; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.netbeans.api.annotations.common.StaticResource; import org.openide.loaders.DataNode; import org.openide.nodes.Children; import org.openide.nodes.PropertySupport; import org.openide.nodes.PropertySupport.ReadOnly; import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.util.WeakListeners; import org.openide.util.lookup.Lookups; import org.openide.util.lookup.ProxyLookup; /** * * @author Serdar */ @NbBundle.Messages({ "CLT_Progress_name=Pipeline Process", "# {0} - current phase", "CLT_Progress_Phase=Phase {0}"}) public class AggregatorNode extends DataNode implements PropertyChangeListener, ChangeListener { @StaticResource private static final String ICON_PATH = "de/fub/maps/project/aggregator/filetype/aggregationBuilderIcon.png"; private static final Logger LOG = Logger.getLogger(AggregatorNode.class.getName()); protected static final String TAB_NAME = "tabName"; private Sheet sheet = null; private final Aggregator aggregator; private final ModelSynchronizer.ModelSynchronizerClient modelSynchronizerClient; public AggregatorNode(Aggregator aggregator) { super(aggregator.getDataObject(), Children.create(new AggregatorSubFolderFactory(aggregator), true), new ProxyLookup(Lookups.fixed(aggregator), aggregator.getDataObject().getLookup())); this.aggregator = aggregator; this.aggregator.addPropertyChangeListener(WeakListeners.propertyChange(AggregatorNode.this, aggregator)); modelSynchronizerClient = this.aggregator.create(AggregatorNode.this); } @Override public String getDisplayName() { if (aggregator != null && aggregator.getAggregatorDescriptor() != null) { return aggregator.getAggregatorDescriptor().getName(); } return super.getDisplayName(); } @Override public String getShortDescription() { if (aggregator != null && aggregator.getAggregatorDescriptor() != null) { return aggregator.getAggregatorDescriptor().getDescription(); } return super.getShortDescription(); } @Override @SuppressWarnings("unchecked") protected Sheet createSheet() { if (sheet == null) { sheet = Sheet.createDefault(); } for (PropertySet ps : sheet.toArray()) { sheet.remove(ps.getName()); } if (aggregator != null) { final AggregatorDescriptor descriptor = aggregator.getAggregatorDescriptor(); if (descriptor != null) { Sheet.Set createProperties = createProperties(); sheet.put(createProperties); Properties properties = descriptor.getProperties(); if (properties != null) { for (PropertySection section : properties.getSections()) { Sheet.Set createPropertySection = createPropertySection(section); sheet.put(createPropertySection); } } Collection<AbstractAggregationProcess<?, ?>> processes = aggregator.getPipeline().getProcesses(); for (AbstractAggregationProcess<?, ?> process : processes) { PropertySet[] propertySets = new ProcessFilterNode(process.getNodeDelegate()).getPropertySets(); for (PropertySet propertySet : propertySets) { Sheet.Set set = Sheet.createPropertiesSet(); set.setName(propertySet.getName()); set.setDisplayName(propertySet.getDisplayName()); set.setShortDescription(propertySet.getShortDescription()); set.setValue(TAB_NAME, process.getName()); sheet.put(set); for (Property property : propertySet.getProperties()) { if (property != null) { set.put(property); } } } } } Sheet.Set createPipelineProperty = createPipelineProperty(aggregator); sheet.put(createPipelineProperty); } return sheet; } private Sheet.Set createPropertySection(PropertySection section) { Sheet.Set set = Sheet.createPropertiesSet(); set.setName(section.getId()); set.setDisplayName(section.getName()); set.setShortDescription(section.getDescription()); for (de.fub.maps.project.aggregator.xml.PropertySet propertySet : section.getPropertySet()) { for (de.fub.maps.project.aggregator.xml.Property property : propertySet.getProperties()) { ProcessProperty processProperty = new ProcessProperty(modelSynchronizerClient, property) { @Override public boolean canWrite() { return aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING; } }; set.put(processProperty); } } return set; } @NbBundle.Messages({ "CLT_Common_info=General Information", "CLT_Property_Name_DisplayName=Name", "CLT_Property_Name_Description=Name of the aggregator.", "CLT_Property_Description_DisplayName=Description", "CLT_Property_Description_Description=Description test of the aggregator",}) private Sheet.Set createProperties() { Sheet.Set set = Sheet.createPropertiesSet(); set.setName("general information"); set.setDisplayName(Bundle.CLT_Common_info()); Property<?> property = null; property = new PropertySupport.ReadWrite<String>( "name", String.class, Bundle.CLT_Property_Name_DisplayName(), Bundle.CLT_Property_Name_Description()) { private String value = aggregator.getAggregatorDescriptor().getName(); @Override public boolean canWrite() { return aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING; } @Override public String getValue() throws IllegalAccessException, InvocationTargetException { return value; } @Override public void setValue(String val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING) { value = val; aggregator.getAggregatorDescriptor().setName(val); update(); } } }; set.put(property); property = new PropertySupport.ReadWrite<String>( "description", String.class, Bundle.CLT_Property_Description_DisplayName(), Bundle.CLT_Property_Description_Description()) { private String description = aggregator.getAggregatorDescriptor().getDescription(); @Override public boolean canWrite() { return aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING; } @Override public String getValue() throws IllegalAccessException, InvocationTargetException { return description; } @Override public void setValue(String val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING) { description = val; aggregator.getAggregatorDescriptor().setDescription(val); update(); } } }; set.put(property); return set; } @NbBundle.Messages("CLT_Pipeline_Content=Pipeline Content") private Sheet.Set createPipelineProperty(Aggregator aggregator) { Sheet.Set set = Sheet.createPropertiesSet(); set.setName("Pipline Content"); set.setDisplayName(Bundle.CLT_Progress_name()); Property<?> property = null; Iterator<AbstractAggregationProcess<?, ?>> it = aggregator.getPipeline().iterator(); int i = 1; while (it.hasNext()) { final AbstractAggregationProcess<?, ?> process = it.next(); if (process.getProcessDescriptor() != null) { String name = Bundle.CLT_Progress_Phase(i); property = new ReadOnly<String>(name, String.class, name, process.getDescription()) { @Override public String getValue() throws IllegalAccessException, InvocationTargetException { return process.getName(); } }; set.put(property); i++; } } return set; } @Override public Action getPreferredAction() { return getActions(true)[0]; } @Override public Action[] getActions(boolean context) { List<Action> actionsForPath = new ArrayList<Action>(Utilities.actionsForPath("Loaders/text/aggregationbuilder+xml/Actions")); return actionsForPath.toArray(new Action[actionsForPath.size()]); } @Override public Image getIcon(int type) { Image image = super.getIcon(type); if (aggregator != null) { image = ImageUtilities.loadImage(ICON_PATH); Image hint = null; switch (aggregator.getAggregatorState()) { case ERROR: case ERROR_NOT_EXECUTABLE: hint = IconRegister.findRegisteredIcon("errorHintIcon.png"); if (hint != null) { image = ImageUtilities.mergeImages(image, hint, 0, 0); } break; case INACTIVE: break; case WARNING: break; case RUNNING: hint = IconRegister.findRegisteredIcon("playHintIcon.png"); if (hint != null) { image = ImageUtilities.mergeImages(image, hint, 0, 0); } break; default: throw new AssertionError(); } } return image; } @Override public Image getOpenedIcon(int type) { return getIcon(type); } @Override public void propertyChange(PropertyChangeEvent evt) { if (Aggregator.PROP_NAME_AGGREGATOR_STATE.equals(evt.getPropertyName())) { fireIconChange(); } } private void update() { aggregator.updateSource(); } @Override public void stateChanged(ChangeEvent e) { createSheet(); fireIconChange(); } private class AggregationStrategyProperty extends ClassProperty { private ClassWrapper wrapper = aggregator.getAggregatorDescriptor().getAggregationStrategy() != null ? new ClassWrapper(aggregator.getAggregatorDescriptor().getAggregationStrategy()) : null; public AggregationStrategyProperty(String name, String displayName, String shortDescription, Class<?> interf) { super(name, displayName, shortDescription, interf); } @Override public boolean canWrite() { return aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING; } @Override public ClassWrapper getValue() throws IllegalAccessException, InvocationTargetException { return wrapper; } @Override public void setValue(ClassWrapper val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (aggregator.getAggregatorState() != Aggregator.AggregatorState.RUNNING) { if (val == null) { throw new IllegalArgumentException(" null is not a valid argument!"); } wrapper = val; aggregator.getAggregatorDescriptor().setAggregationStrategy(val.getQualifiedName()); update(); } } } }