/************************************************************************************* * Copyright (c) 2008-2013 Red Hat, Inc. and others. * All rights reserved. This program and the accompanying materials * are 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: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.arquillian.ui.internal.launcher; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.debug.ui.ILaunchConfigurationTab; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TableViewerEditor; import org.eclipse.jface.viewers.TableViewerFocusCellManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.PlatformUI; import org.eclipse.wst.server.core.IRuntime; import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.IServerListener; import org.eclipse.wst.server.core.ServerCore; import org.eclipse.wst.server.core.ServerEvent; import org.jboss.tools.arquillian.core.internal.ArquillianConstants; import org.jboss.tools.arquillian.core.internal.util.ArquillianUtility; import org.jboss.tools.arquillian.ui.ArquillianUIActivator; import org.jboss.tools.arquillian.ui.internal.utils.ArquillianUIUtil; import org.osgi.framework.Bundle; /** * * @author snjeza * */ public class ArquillianTab extends AbstractLaunchConfigurationTab { private static final String MANAGEMENT_ADDRESS = "managementAddress"; //$NON-NLS-1$ private static final String MANAGEMENT_PORT = "managementPort"; //$NON-NLS-1$ private static final String RUN_MODE = "run"; //$NON-NLS-1$ private static final String DEBUG_MODE = "debug"; //$NON-NLS-1$ public static final String ID = "org.jboss.tools.arquillian.ui.arquillianTab"; //$NON-NLS-1$ private Image checkboxOn; private Image checkboxOff; private Set<ArquillianProperty> properties; private TableViewer propertiesViewer; private TableViewer serversViewer; private Button saveButton; private ILaunchConfiguration configuration; private Button selectProfilesButton; private Button addProfilesButton; private IResourceChangeListener resourceChangeListener = new IResourceChangeListener() { @Override public void resourceChanged(IResourceChangeEvent event) { if (configuration == null) { return; } String name = null; try { name = ArquillianUtility.getJavaProject(configuration).getElementName(); } catch (CoreException e) { // ignore } if (name == null) { return; } if (event.getType() == IResourceChangeEvent.POST_BUILD) { IResourceDelta delta = event.getDelta(); IResourceDelta projectDelta = delta.findMember(new Path(name)); if (projectDelta == null) { return; } IResource project = projectDelta.getResource(); if (project != null && project instanceof IProject) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { properties = null; initializeFrom(configuration); ILaunchConfigurationTab[] tabs = getLaunchConfigurationDialog().getTabs(); for (ILaunchConfigurationTab tab:tabs) { if (tab instanceof ArquillianLaunchConfigurationTab) { ((ArquillianLaunchConfigurationTab)tab).validatePage(); break; } } getLaunchConfigurationDialog().updateButtons(); getLaunchConfigurationDialog().updateMessage(); } }); } } } }; private IServer[] servers; private IServerListener serverListener = new IServerListener() { @Override public void serverChanged(ServerEvent event) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (serversViewer != null && !serversViewer.getControl().isDisposed()) { serversViewer.refresh(); updateServerButtons(); } } }); } }; private Button startButton; private Button debugButton; private Button stopButton; private Button testButton; public ArquillianTab() { ResourcesPlugin.getWorkspace().addResourceChangeListener( resourceChangeListener, IResourceChangeEvent.POST_BUILD); } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); setControl(composite); PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId()); composite.setLayout(new GridLayout(1, true)); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); composite.setLayoutData(gd); composite.setFont(parent.getFont()); Group propertiesGroup = new Group(composite, SWT.NONE); propertiesGroup.setLayout(new GridLayout(1, false)); propertiesGroup.setText("Configuration properties"); gd = new GridData(SWT.FILL, SWT.FILL, true, false); propertiesGroup.setLayoutData(gd); propertiesViewer = createPropertiesSection(propertiesGroup); Composite propertiesButtonComposite = new Composite(composite, SWT.NONE); gd = new GridData(SWT.RIGHT, SWT.FILL, true, false); propertiesButtonComposite.setLayoutData(gd); propertiesButtonComposite.setLayout(new GridLayout(4, false)); testButton = createButton(propertiesButtonComposite, "Test Management"); testButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (properties == null) { return; } final String[] managementAddress = new String[1]; final String[] managementPort = new String[1]; for (ArquillianProperty property : properties) { String name = getPropertyName(property); if (MANAGEMENT_PORT.equals(name)) { managementPort[0] = property.getValue(); } if (MANAGEMENT_ADDRESS.equals(name)) { managementAddress[0] = property.getValue(); } } if (managementAddress[0] != null && managementPort[0] != null && !managementAddress[0].isEmpty() && !managementPort[0].isEmpty()) { BusyIndicator.showWhile(Display.getDefault(), new Runnable() { @Override public void run() { Socket socket = null; try { InetAddress addr = InetAddress .getByName(managementAddress[0]); int port = 0; try { port = Integer .valueOf(managementPort[0]); } catch (NumberFormatException e1) { ArquillianUIActivator.log(e1); return; } SocketAddress sockaddr = new InetSocketAddress( addr, port); socket = new Socket(); socket.connect(sockaddr, 15000); MessageDialog.openInformation( getShell(), "Test Management", "Test succeeded"); } catch (Exception e1) { MessageDialog .openInformation( getShell(), "Test Management", "Test failed.\n" + e1.getLocalizedMessage()); } finally { if (socket != null) { try { socket.close(); } catch (IOException e1) { // ignore } } } } }); } } }); addProfilesButton = createButton(propertiesButtonComposite, ArquillianConstants.ADD_ARQUILLIAN_PROFILES); addProfilesButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ArquillianUtility.runAction(configuration, ArquillianConstants.ADD_ARQUILLIAN_PROFILES_COMMAND, true); } }); if (mavenProfileExists()) { selectProfilesButton = createButton(propertiesButtonComposite, ArquillianConstants.SELECT_MAVEN_PROFILES); selectProfilesButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ArquillianUtility.runAction(configuration, ArquillianConstants.SELECT_MAVEN_PROFILES_COMMAND, true); } }); } else { new Label(propertiesButtonComposite, SWT.NONE); } saveButton = createButton(propertiesButtonComposite, "Save"); saveButton.setEnabled(false); saveButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { try { ArquillianUIUtil.save(properties, configuration ); saveButton.setEnabled(false); } catch (CoreException e1) { MessageDialog.openConfirm(getShell(), "Error", e1.getMessage()); } } }); Group serversGroup = new Group(composite, SWT.NONE); serversGroup.setLayout(new GridLayout(1, false)); serversGroup.setText("Servers"); gd = new GridData(SWT.FILL, SWT.FILL, true, false); serversGroup.setLayoutData(gd); serversViewer = createServersSection(serversGroup); Composite serversButtonComposite = new Composite(composite, SWT.NONE); gd = new GridData(SWT.RIGHT, SWT.FILL, true, false); serversButtonComposite.setLayoutData(gd); serversButtonComposite.setLayout(new GridLayout(3, false)); startButton = createButton(serversButtonComposite, "Start"); startButton.setEnabled(false); startButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final IServer server = getSelectedServer(); if (server == null) { return; } Job job = new Job("Starting ...") { @Override protected IStatus run(IProgressMonitor monitor) { try { server.start(RUN_MODE, monitor); } catch (CoreException e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } }; job.setSystem(true); job.schedule(); } }); debugButton = createButton(serversButtonComposite, "Debug"); debugButton.setEnabled(false); debugButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final IServer server = getSelectedServer(); if (server == null) { return; } Job job = new Job("Starting ...") { @Override protected IStatus run(IProgressMonitor monitor) { try { server.start(DEBUG_MODE, monitor); } catch (CoreException e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } }; job.setSystem(true); job.schedule(); } }); stopButton = createButton(serversButtonComposite, "Stop"); stopButton.setEnabled(false); stopButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final IServer server = getSelectedServer(); if (server == null) { return; } Job job = new Job("Starting ...") { @Override protected IStatus run(IProgressMonitor monitor) { server.stop(true); return Status.OK_STATUS; } }; job.setSystem(true); job.schedule(); } }); serversViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateServerButtons(); } }); Dialog.applyDialogFont(composite); } private boolean mavenProfileExists() { Bundle bundle = Platform.getBundle(ArquillianConstants.MAVEN_PROFILES_UI_PLUGIN_ID); return bundle != null; } private Button createButton(Composite parent, String label) { Button button = new Button(parent, SWT.PUSH); button.setText(label); GridData gd = new GridData(SWT.RIGHT, SWT.FILL, false, false); int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); gd.widthHint = Math.max(widthHint, minSize.x); button.setLayoutData(gd); return button; } private int convertHorizontalDLUsToPixels(int dlus) { GC gc = new GC(getControl()); gc.setFont(getControl().getFont()); FontMetrics fontMetrics = gc.getFontMetrics(); gc.dispose(); return (fontMetrics.getAverageCharWidth() * dlus + 2) / 4; } private TableViewer createServersSection(Composite parent) { TableViewer viewer = new TableViewer(parent, SWT.SINGLE | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 80; viewer.getTable().setLayoutData(gd); Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); table.setFont(parent.getFont()); viewer.setContentProvider(new ServersContentProvider()); String[] columnHeaders = {"Name", "Runtime", "Home", "Mode"}; for (int i = 0; i < columnHeaders.length; i++) { TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new ServersLabelProvider(i)); column.getColumn().setText(columnHeaders[i]); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); //column.setEditingSupport(new ArquillianPropertiesEditingSupport(viewer, i)); } ColumnLayoutData[] layouts= { new ColumnWeightData(80,80), new ColumnWeightData(60,60), new ColumnWeightData(140,140), new ColumnWeightData(40,40), }; TableLayout layout = new AutoResizeTableLayout(table); for (int i = 0; i < layouts.length; i++) { layout.addColumnData(layouts[i]); } viewer.getTable().setLayout(layout); //configureViewer(viewer); viewer.setInput(getServers()); return viewer; } private IServer[] getServers() { removeServerListeners(); servers = ServerCore.getServers(); addServerListeners(); return servers; } private void addServerListeners() { if (servers != null) { for (IServer server:servers) { server.addServerListener(serverListener); } } } private void removeServerListeners() { if (servers != null) { for (IServer server:servers) { server.removeServerListener(serverListener); } } } private TableViewer createPropertiesSection(Composite parent) { TableViewer viewer = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 90; viewer.getTable().setLayoutData(gd); Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); table.setFont(parent.getFont()); viewer.setContentProvider(new PropertiesContentProvider()); String[] columnHeaders = {"Name", "Value", "Source", "Default?"}; for (int i = 0; i < columnHeaders.length; i++) { TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new PropertiesLabelProvider(i)); column.getColumn().setText(columnHeaders[i]); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); column.setEditingSupport(new ArquillianPropertiesEditingSupport(viewer, i)); } ColumnLayoutData[] layouts= { new ColumnWeightData(150,150), new ColumnWeightData(120,120), new ColumnWeightData(60,60), new ColumnWeightData(30,30), }; TableLayout layout = new AutoResizeTableLayout(table); for (int i = 0; i < layouts.length; i++) { layout.addColumnData(layouts[i]); } viewer.getTable().setLayout(layout); configureViewer(viewer); viewer.setInput(properties); return viewer; } private void configureViewer(final TableViewer viewer) { TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(viewer, new FocusCellOwnerDrawHighlighter(viewer)); ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(viewer) { protected boolean isEditorActivationEvent( ColumnViewerEditorActivationEvent event) { ViewerCell cell = viewer.getColumnViewerEditor().getFocusCell(); if (cell != null && cell.getColumnIndex() == 1) { return super.isEditorActivationEvent(event); } return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } }; TableViewerEditor.create(viewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION); } @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { properties = null; initializeFrom(configuration); } @Override public void initializeFrom(ILaunchConfiguration configuration) { if (propertiesViewer != null) { properties = ArquillianUIUtil .getArquillianProperties(configuration); propertiesViewer.setInput(properties); propertiesViewer.refresh(); updatePropertiesButton(); } this.configuration = configuration; } private void updatePropertiesButton() { if (properties == null) { testButton.setEnabled(false); } boolean hasManagementPort = false; boolean hasManagementAddress = false; for (ArquillianProperty property:properties) { String name = getPropertyName(property); if (MANAGEMENT_PORT.equals(name)) { hasManagementPort = true; } if (MANAGEMENT_ADDRESS.equals(name)) { hasManagementAddress = true; } } testButton.setEnabled(hasManagementAddress && hasManagementPort); } private String getPropertyName(ArquillianProperty property) { if (property == null) { return null; } String name = property.getName(); if (name == null) { return null; } int index = name.lastIndexOf("."); //$NON-NLS-1$ if (index > 0) { name = name.substring(index + 1); } return name; } @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { } @Override public String getName() { return "Arquillian"; } /** * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId() * * @since 3.3 */ public String getId() { return ID; } public Image getCheckOnImage() { if (checkboxOn == null) { checkboxOn = ArquillianUIActivator.imageDescriptorFromPlugin(ArquillianUIActivator.PLUGIN_ID, "/icons/xpl/complete_tsk.gif").createImage(); } return checkboxOn; } public Image getCheckOffImage() { if (checkboxOff == null) { checkboxOff = ArquillianUIActivator.imageDescriptorFromPlugin(ArquillianUIActivator.PLUGIN_ID, "/icons/xpl/incomplete_tsk.gif").createImage(); } return checkboxOff; } @Override public void dispose() { super.dispose(); if (checkboxOn != null) { checkboxOn.dispose(); checkboxOn = null; } if (checkboxOff != null) { checkboxOff.dispose(); checkboxOff = null; } if (resourceChangeListener != null) { ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener); } removeServerListeners(); } private IServer getSelectedServer() { ISelection sel = serversViewer.getSelection(); IServer server = null; if (sel instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) sel; server = (IServer) selection.getFirstElement(); } return server; } private void updateServerButtons() { startButton.setEnabled(false); debugButton.setEnabled(false); stopButton.setEnabled(false); IServer server = getSelectedServer(); if (server == null) { return; } int state = server.getServerState(); switch (state) { case IServer.STATE_STOPPED: startButton.setEnabled(true); debugButton.setEnabled(true); break; case IServer.STATE_STARTED: stopButton.setEnabled(true); break; default: break; } } private class PropertiesLabelProvider extends ColumnLabelProvider { private int columnIndex; public PropertiesLabelProvider(int columnIndex) { this.columnIndex = columnIndex; } @Override public Image getImage(Object element) { if (element == null) { return null; } ArquillianProperty properties = (ArquillianProperty) element; if (columnIndex == 3) { if (properties.isDefaultValue()) return getCheckOnImage(); else return getCheckOffImage(); } return null; } @Override public String getText(Object element) { if (element instanceof ArquillianProperty) { ArquillianProperty properties = (ArquillianProperty) element; if (columnIndex == 0) { String name = properties.getName(); int index = name.lastIndexOf("."); if (index > 0) { name = name.substring(index+1); } return name; } if (columnIndex == 1) { return properties.getValue(); } if (columnIndex == 2) { return properties.getSource(); } } return null; } } private class PropertiesContentProvider implements IStructuredContentProvider { @Override public Object[] getElements(Object inputElement) { return properties.toArray(new ArquillianProperty[0]); } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { properties = (Set<ArquillianProperty>) newInput; } } private class ServersContentProvider implements IStructuredContentProvider { @Override public Object[] getElements(Object inputElement) { return servers; } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { servers = (IServer[]) newInput; } } private class ServersLabelProvider extends ColumnLabelProvider { private int columnIndex; public ServersLabelProvider(int columnIndex) { super(); this.columnIndex = columnIndex; } @Override public Image getImage(Object element) { return null; } @Override public String getText(Object element) { if (!(element instanceof IServer)) { return null; } IServer server = (IServer) element; switch (columnIndex) { case 0: return server.getName(); case 1: IRuntime runtime = server.getRuntime(); if (runtime != null) { return runtime.getName(); } break; case 2: IRuntime rt = server.getRuntime(); if( rt != null ) { return rt.getLocation().toOSString(); } return ""; case 3: String mode = server.getMode(); int state = server.getServerState(); if (state == IServer.STATE_STARTING) { return "Starting"; } if (state == IServer.STATE_STOPPING) { return "Stopping"; } if (state == IServer.STATE_STOPPED) { return "Stopped"; } if (state == IServer.STATE_STARTED) { if (DEBUG_MODE.equals(mode)) { return "Debugging"; } return "Started"; } return "Unknown"; default: break; } return null; } } private class ArquillianPropertiesEditingSupport extends EditingSupport { private CellEditor editor; private int column; public ArquillianPropertiesEditingSupport(ColumnViewer viewer, int column) { super(viewer); switch (column) { case 3: editor = new CheckboxCellEditor(((TableViewer) viewer).getTable()); break; default: editor = new TextCellEditor(((TableViewer) viewer).getTable()); } this.column = column; } @Override protected boolean canEdit(Object element) { if (this.column == 1) { return true; } return false; } @Override protected CellEditor getCellEditor(Object element) { return editor; } @Override protected Object getValue(Object element) { ArquillianProperty properties = (ArquillianProperty) element; String value = null; switch (this.column) { case 0: value = properties.getName(); if (value == null) { value = ""; //$NON-NLS-1$ } return value; case 1: value = properties.getValue(); if (value == null) { value = ""; //$NON-NLS-1$ } return value; case 2: value = properties.getSource(); if (value == null) { value = ""; //$NON-NLS-1$ } return value; case 3: boolean isDefault = properties.isDefaultValue(); return isDefault; default: break; } return null; } @Override protected void setValue(Object element, Object value) { ArquillianProperty property = (ArquillianProperty) element; switch (this.column) { case 1: if (value != null) { property.setValue(value.toString()); } else { property.setValue(null); } property.setChanged(true); property.setDefaultValue(false); property.setSource("arquillian.properties"); ISelection selection = getViewer().getSelection(); getViewer().setSelection(null); getViewer().setSelection(selection); saveButton.setEnabled(true); break; default: break; } getViewer().update(element, null); } } }