/******************************************************************************* * Copyright (c) 2016 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.windup.ui.internal.launch; import static org.jboss.tools.windup.ui.internal.Messages.Rules; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.ui.PlatformUI; import org.jboss.tools.windup.core.services.WindupOptionsService; import org.jboss.tools.windup.model.domain.ModelService; import org.jboss.tools.windup.ui.FilteredListDialog; import org.jboss.tools.windup.ui.WindupUIPlugin; import org.jboss.tools.windup.ui.internal.Messages; import org.jboss.tools.windup.ui.internal.rules.xml.XMLRulesetModelUtil; import org.jboss.tools.windup.windup.ConfigurationElement; import org.jboss.tools.windup.windup.CustomRuleProvider; import com.google.common.collect.Lists; @SuppressWarnings("restriction") public class RulesTab extends AbstractLaunchConfigurationTab { private static final String ID = "org.jboss.tools.windup.ui.launch.RulesTab"; //$NON-NLS-1$ private ModelService modelService; private ConfigurationElement configuration; private TableViewer rulesRepositoryViewer; private Button removeButton; // TODO: We probably want to use this once we start using an external Windup launcher. @SuppressWarnings("unused") private WindupOptionsService optionsService; public RulesTab(ModelService modelService, WindupOptionsService optionsService) { this.modelService = modelService; this.optionsService = optionsService; } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().margins(5, 5).applyTo(container); GridDataFactory.fillDefaults().grab(true, true).applyTo(container); createCustomRulesGroup(container); super.setControl(container); PlatformUI.getWorkbench().getHelpSystem().setHelp(container, ID); } private void createCustomRulesGroup(Composite parent) { Group group = SWTFactory.createGroup(parent, Messages.windupCustomRules+":", 2, 1, GridData.FILL_BOTH); GridDataFactory.fillDefaults().grab(true, true).hint(70, 100).applyTo(group); rulesRepositoryViewer = new TableViewer(group, SWT.MULTI|SWT.BORDER|SWT.FULL_SELECTION|SWT.H_SCROLL|SWT.V_SCROLL); GridDataFactory.fillDefaults().grab(true, true).applyTo(rulesRepositoryViewer.getTable()); rulesRepositoryViewer.setContentProvider(ArrayContentProvider.getInstance()); rulesRepositoryViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { CustomRuleProvider provider = (CustomRuleProvider)element; StringBuilder builder = new StringBuilder(); String parsedRulesetId = XMLRulesetModelUtil.getRulesetId(provider.getLocationURI()); if (parsedRulesetId != null && !parsedRulesetId.isEmpty()) { builder.append(parsedRulesetId); builder.append(" - "); //$NON-NLS-1$ } builder.append(provider.getLocationURI()); return builder.toString(); } @Override public Image getImage(Object element) { return WindupUIPlugin.getDefault().getImageRegistry().get(WindupUIPlugin.IMG_RULE_SET); } }); createCustomRulesButtonBar(group); } private void createCustomRulesButtonBar(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().margins(0, 0).spacing(0, 0).applyTo(container); GridDataFactory.fillDefaults().grab(false, true).applyTo(container); Button addButton = new Button(container, SWT.PUSH); addButton.setText("Add..."); //$NON-NLS-1$ GridDataFactory.fillDefaults().grab(true, false).applyTo(addButton); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FilteredListDialog dialog = new FilteredListDialog(parent.getShell(), new LabelProvider() { @Override public String getText(Object element) { CustomRuleProvider provider = (CustomRuleProvider)element; StringBuilder builder = new StringBuilder(); String parsedRulesetId = XMLRulesetModelUtil.getRulesetId(provider.getLocationURI()); if (parsedRulesetId != null && !parsedRulesetId.isEmpty()) { builder.append(parsedRulesetId); builder.append(" - "); //$NON-NLS-1$ } builder.append(provider.getLocationURI()); return builder.toString(); } @Override public Image getImage(Object element) { return WindupUIPlugin.getDefault().getImageRegistry().get(WindupUIPlugin.IMG_RULE_SET); } }); dialog.setMultipleSelection(true); dialog.setMessage(Messages.selectExistingRepositories); modelService.cleanCustomRuleRepositories(configuration); List<CustomRuleProvider> providers = Lists.newArrayList(modelService.getModel().getCustomRuleRepositories()); providers = providers.stream().filter(p -> !configuration.getUserRulesDirectories().contains(p.getLocationURI())).collect(Collectors.toList()); dialog.setElements(providers.stream().toArray(CustomRuleProvider[]::new)); dialog.setTitle(Messages.selectRepositories); dialog.setHelpAvailable(false); dialog.create(); if (dialog.open() == Window.OK) { Object[] selected = (Object[])dialog.getResult(); if (selected.length > 0) { List<String> rulesets = Lists.newArrayList(); // TODO: Temporary - see https://tree.taiga.io/project/rdruss-jboss-migration-windup-v3/task/884 selected = new Object[] {selected[0]}; modelService.write(() -> configuration.getUserRulesDirectories().clear()); // Arrays.stream(selected).forEach(p -> rulesets.add(((CustomRuleProvider)p).getLocationURI())); modelService.write(() -> { configuration.getUserRulesDirectories().addAll(rulesets); }); reload(); } } } }); removeButton= new Button(container, SWT.PUSH); removeButton.setText(Messages.windupRemove); GridDataFactory.fillDefaults().grab(true, false).applyTo(removeButton); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection ss = (StructuredSelection)rulesRepositoryViewer.getSelection(); if (!ss.isEmpty()) { @SuppressWarnings("unchecked") List<CustomRuleProvider> providers = (List<CustomRuleProvider>)ss.toList(); List<String> paths = providers.stream().map(p -> p.getLocationURI()).collect(Collectors.toList()); modelService.write(() -> { configuration.getUserRulesDirectories().removeAll(paths); }); reloadCustomRules(); } } }); rulesRepositoryViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { removeButton.setEnabled(!event.getSelection().isEmpty()); } }); removeButton.setEnabled(false); } private void reload() { reloadCustomRules(); } private void reloadCustomRules() { if (rulesRepositoryViewer != null) { modelService.cleanCustomRuleRepositories(configuration); List<CustomRuleProvider> providers = Lists.newArrayList(); configuration.getUserRulesDirectories().forEach(directory -> { modelService.getModel().getCustomRuleRepositories().forEach(provider -> { if (directory.contains(provider.getLocationURI())) { providers.add(provider); } }); }); rulesRepositoryViewer.setInput(providers); } } @Override public void setDefaults(ILaunchConfigurationWorkingCopy launchConfig) { initializeConfiguration(launchConfig); } @Override public void performApply(ILaunchConfigurationWorkingCopy launchConfig) { modelService.write(() -> { configuration.setName(launchConfig.getName()); }); } @Override public String getName() { return Rules; } @Override public Image getImage() { return WindupUIPlugin.getDefault().getImageRegistry().get(WindupUIPlugin.IMG_RULES); } @Override public boolean isValid(ILaunchConfiguration launchConfig) { return true; } @Override public void initializeFrom(ILaunchConfiguration launchConfig) { initializeConfiguration(launchConfig); } private void initializeConfiguration(ILaunchConfiguration launchConfig) { this.configuration = modelService.findConfiguration(launchConfig.getName()); if (configuration == null) { this.configuration = modelService.createConfiguration(launchConfig.getName()); } reload(); } }