/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.actions; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import org.datacleaner.api.Component; import org.datacleaner.components.categories.WriteDataCategory; import org.datacleaner.desktop.api.PrecedingComponentConsumer; import org.datacleaner.job.ComponentRequirement; import org.datacleaner.job.FilterOutcome; import org.datacleaner.job.SimpleComponentRequirement; import org.datacleaner.job.builder.AnalysisJobBuilder; import org.datacleaner.job.builder.ComponentBuilder; import org.datacleaner.job.builder.FilterComponentBuilder; import org.datacleaner.lifecycle.LifeCycleHelper; import org.datacleaner.util.IconUtils; import org.datacleaner.util.ImageManager; import org.datacleaner.widgets.DescriptorMenu; import org.datacleaner.widgets.PopupButton; /** * Action that displays output writers for a filter's outcome. */ public class DisplayOptionsForFilterOutcomeActionListener extends DisplayOutputWritersAction implements ActionListener { private static final ImageManager imageManager = ImageManager.get(); private final FilterComponentBuilder<?, ?> _filterJobBuilder; private final String _categoryName; private final PopupButton _popupButton; public DisplayOptionsForFilterOutcomeActionListener(final PopupButton popupButton, final FilterComponentBuilder<?, ?> filterJobBuilder, final String categoryName) { super(filterJobBuilder.getAnalysisJobBuilder()); _filterJobBuilder = filterJobBuilder; _categoryName = categoryName; _popupButton = popupButton; } @Override public void actionPerformed(final ActionEvent e) { final FilterOutcome filterOutcome = _filterJobBuilder .getFilterOutcome(_filterJobBuilder.getDescriptor().getOutcomeCategoryByName(_categoryName)); final ComponentRequirement requirement = new SimpleComponentRequirement(filterOutcome); final DescriptorMenu writeDataMenu = new DescriptorMenu(new WriteDataCategory()); { final List<JMenuItem> writerDataMenuItems = createMenuItems(); for (final JMenuItem menuItem : writerDataMenuItems) { writeDataMenu.add(menuItem); } } final AnalysisJobBuilder analysisJobBuilder = _filterJobBuilder.getAnalysisJobBuilder(); // TODO: Add more items: "Dependent components" (click through), // "Add analyzer", "Add transformer" final JMenuItem setAsDefaultOutcomeMenuItem = new JMenuItem("Set as default requirement"); setAsDefaultOutcomeMenuItem .setToolTipText("Makes this filter outcome the default choice for other components in the job."); final ComponentRequirement existingDefaultRequirement = analysisJobBuilder.getDefaultRequirement(); if (requirement.equals(existingDefaultRequirement)) { setAsDefaultOutcomeMenuItem .setIcon(imageManager.getImageIcon(IconUtils.STATUS_VALID, IconUtils.ICON_SIZE_SMALL)); } setAsDefaultOutcomeMenuItem.addActionListener(e1 -> { final Enum<?> category = _filterJobBuilder.getDescriptor().getOutcomeCategoryByName(_categoryName); final FilterOutcome outcome = _filterJobBuilder.getFilterOutcome(category); analysisJobBuilder.setDefaultRequirement(outcome); }); final JPopupMenu popup = _popupButton.getMenu(); popup.removeAll(); popup.add(writeDataMenu); popup.add(setAsDefaultOutcomeMenuItem); } @Override protected void configure(final AnalysisJobBuilder analysisJobBuilder, final ComponentBuilder componentBuilder) { final Component component = componentBuilder.getComponentInstance(); if (component instanceof PrecedingComponentConsumer) { final LifeCycleHelper helper = new LifeCycleHelper(analysisJobBuilder.getConfiguration(), null, true); helper.assignProvidedProperties(componentBuilder.getDescriptor(), component); ((PrecedingComponentConsumer) component) .configureForFilterOutcome(analysisJobBuilder, _filterJobBuilder.getDescriptor(), _categoryName); } final FilterOutcome outcome = _filterJobBuilder.getFilterOutcome(_categoryName); final ComponentRequirement requirement = new SimpleComponentRequirement(outcome); componentBuilder.setComponentRequirement(requirement); } }