// 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 net.sourceforge.eclipsejetty.launch.configuration; import static net.sourceforge.eclipsejetty.launch.util.JettyLaunchUI.*; import java.io.File; import java.util.Arrays; import java.util.HashSet; import java.util.List; import net.sourceforge.eclipsejetty.JettyPlugin; import net.sourceforge.eclipsejetty.JettyPluginUtils; import net.sourceforge.eclipsejetty.Messages; import net.sourceforge.eclipsejetty.jetty.JettyConfig; import net.sourceforge.eclipsejetty.jetty.JettyConfigType; import net.sourceforge.eclipsejetty.jetty.JettyVersion; import net.sourceforge.eclipsejetty.launch.util.JettyLaunchConfigurationAdapter; import net.sourceforge.eclipsejetty.launch.util.JettyLaunchConfigurationDelegate; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchDelegate; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; /** * UI * * @author Christian Köberl * @author Manfred Hantschel */ public class JettyLaunchAdvancedConfigurationTab extends AbstractJettyLaunchConfigurationTab { private final ModifyDialogListener modifyDialogListener; private final JettyLaunchConfigEntryList configEntryList; private Button embeddedButton; private Button externButton; private Text pathText; private Button pathVariablesButton; private Button pathBrowseButton; private Label versionHint; private Button jspSupportButton; private Button jmxSupportButton; private Button jndiSupportButton; private Button annotationsSupportButton; private Button websocketSupportButton; private Button ajpSupportButton; private Spinner ajpPortSpinner; private Button gracefulShutdownOverrideEnabledButton; private Spinner gracefulShutdownOverrideTimeoutSpinner; private Button threadPoolLimitEnabledButton; private Spinner threadPoolLimitCountSpinner; private Button acceptorLimitEnabledButton; private Spinner acceptorLimitCountSpinner; private Button customWebDefaultsEnabledButton; private Text customWebDefaultsResourceText; private Button customWebDefaultsWorkspaceButton; private Button customWebDefaultsFileSystemButton; private Button customWebDefaultsVariablesButton; private Button serverCacheDisabledButton; private Button clientCacheDisabledButton; private Table configTable; private boolean configTableFormatted = false; private Button openConfigButton; private Button editConfigButton; private Button removeConfigButton; private Button moveUpConfigButton; private Button moveDownConfigButton; private Button showLauncherInfoButton; private Button consoleEnabledButton; public JettyLaunchAdvancedConfigurationTab() { modifyDialogListener = new ModifyDialogListener(); configEntryList = new JettyLaunchConfigEntryList(modifyDialogListener); } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) * @wbp.parser.entryPoint */ public void createControl(final Composite parent) { Composite tabComposite = createTabComposite(parent, 2, true); createJettyGroup(tabComposite); createJettyFeatureGroup(tabComposite); createPluginFeatureGroup(tabComposite); createConfigGroup(tabComposite); createContextGroup(tabComposite); createHelpGroup(tabComposite); setControl(tabComposite); } private void createJettyGroup(Composite tabComposite) { Composite composite = createComposite(tabComposite, SWT.NONE, 2, -1, false, 2, 1); final Composite jettyGroup = createGroup(composite, Messages.advConfigTab_jettyGroupTitle, 2, -1, false, 1, 1); embeddedButton = createButton(jettyGroup, SWT.RADIO, Messages.advConfigTab_embeddedButton, Messages.advConfigTab_embeddedButtonTip, -1, 2, 1, modifyDialogListener); externButton = createButton(jettyGroup, SWT.RADIO, Messages.advConfigTab_externButton, Messages.advConfigTab_externButtonTip, 128, 1, 1, modifyDialogListener); pathText = createText(jettyGroup, SWT.BORDER, Messages.advConfigTab_pathTextTip, -1, -1, 1, 1, modifyDialogListener); Composite buttonComposite = createComposite(jettyGroup, SWT.NONE, 3, -1, false, 2, 1); createLabel(buttonComposite, JettyPluginUtils.EMPTY, -1, SWT.LEFT, 1, 1); pathVariablesButton = createButton(buttonComposite, SWT.NONE, Messages.advConfigTab_pathVariablesButton, Messages.advConfigTab_pathVariablesButtonTip, 96, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { chooseVariable(getShell(), pathText); } }); pathBrowseButton = createButton(buttonComposite, SWT.NONE, Messages.advConfigTab_externalButton, Messages.advConfigTab_externalButtonTip, 96, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { String path = chooseExternalDirectory(getShell(), Messages.advConfigTab_externalTitle, Messages.advConfigTab_externalMessage, pathText.getText()); if (path != null) { pathText.setText(path); } } }); versionHint = createHint(jettyGroup, String.format("Detected Jetty Version: %s", "none"), -1, 2, 1); versionHint.setAlignment(SWT.LEFT); createImage(composite, JettyPlugin.getIcon(JettyPlugin.JETTY_PLUGIN_ADVANCED_LOGO), 96, SWT.CENTER, SWT.TOP, 1, 3); } private void createJettyFeatureGroup(Composite tabComposite) { final Group jettyFeatureGroup = new Group(tabComposite, SWT.NONE); jettyFeatureGroup.setLayout(new GridLayout(1, false)); jettyFeatureGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); jettyFeatureGroup.setText(Messages.advConfigTab_jettyFeaturesGroupTitle); jspSupportButton = createButton(jettyFeatureGroup, SWT.CHECK, Messages.advConfigTab_jspSupportButton, Messages.advConfigTab_jspSupportButtonTip, -1, 1, 1, modifyDialogListener); jndiSupportButton = createButton(jettyFeatureGroup, SWT.CHECK, Messages.advConfigTab_jndiSupportButton, Messages.advConfigTab_jndiSupportButtonTip, -1, 1, 1, modifyDialogListener); annotationsSupportButton = createButton(jettyFeatureGroup, SWT.CHECK, "Enable Annotations Support", "Enables support for annotations as specified in the Servlet 2.5 Specification", -1, 1, 1, modifyDialogListener); jmxSupportButton = createButton(jettyFeatureGroup, SWT.CHECK, Messages.advConfigTab_jmxSupportButton, Messages.advConfigTab_jmxSupportButtonTip, -1, 1, 1, modifyDialogListener); websocketSupportButton = createButton(jettyFeatureGroup, SWT.CHECK, Messages.advConfigTab_websocketSupportButton, Messages.advConfigTab_websocketSupportButtonTip, -1, 1, 1, modifyDialogListener); } private void createPluginFeatureGroup(Composite tabComposite) { final Group pluginFeatureGroup = new Group(tabComposite, SWT.NONE); pluginFeatureGroup.setLayout(new GridLayout(1, false)); pluginFeatureGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); pluginFeatureGroup.setText(Messages.advConfigTab_pluginFeaturesGroupTitle); showLauncherInfoButton = createButton(pluginFeatureGroup, SWT.CHECK, Messages.advConfigTab_showLauncherInfoButton, Messages.advConfigTab_showLauncherInfoButtonTip, 224, 1, 1, modifyDialogListener); consoleEnabledButton = createButton(pluginFeatureGroup, SWT.CHECK, Messages.advConfigTab_consoleEnabledButton, Messages.advConfigTab_consoleEnabledButtonTip, 224, 1, 1, modifyDialogListener); } private void createConfigGroup(Composite tabComposite) { final Composite configGroup = createGroup(tabComposite, Messages.advConfigTab_jettyConfigurationGroupTitle, 3, -1, false, 2, 1); gracefulShutdownOverrideEnabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_gracefulShutdownTimeoutEnabledButton, Messages.advConfigTab_gracefulShutdownTimeoutEnabledTip, 224, 1, 1, modifyDialogListener); gracefulShutdownOverrideTimeoutSpinner = createSpinner(configGroup, SWT.BORDER, Messages.advConfigTab_gracefulShutdownTimeoutTip, 32, -1, 1, 1, modifyDialogListener); gracefulShutdownOverrideTimeoutSpinner.setDigits(1); gracefulShutdownOverrideTimeoutSpinner.setMinimum(1); gracefulShutdownOverrideTimeoutSpinner.setMaximum(3000); gracefulShutdownOverrideTimeoutSpinner.setIncrement(1); gracefulShutdownOverrideTimeoutSpinner.setPageIncrement(10); createLabel(configGroup, Messages.advConfigTab_gracefulShutdownTimeoutUnit, -1, SWT.LEFT, 1, 1); threadPoolLimitEnabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_threadPoolLimitEnabledButton, Messages.advConfigTab_threadPoolLimitEnabledButtonTip, 224, 1, 1, modifyDialogListener); threadPoolLimitCountSpinner = createSpinner(configGroup, SWT.BORDER, Messages.advConfigTab_threadPoolLimitCountSpinnerTip, 32, -1, 1, 1, modifyDialogListener); threadPoolLimitCountSpinner.setMinimum(8); threadPoolLimitCountSpinner.setMaximum(128); threadPoolLimitCountSpinner.setIncrement(1); threadPoolLimitCountSpinner.setPageIncrement(8); createLabel(configGroup, Messages.advConfigTab_threadPoolLimitCountUnit, -1, SWT.LEFT, 1, 1); acceptorLimitEnabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_acceptorLimitEnabledButton, Messages.advConfigTab_acceptorLimitEnabledButtonTip, 224, 1, 1, modifyDialogListener); acceptorLimitCountSpinner = createSpinner(configGroup, SWT.BORDER, Messages.advConfigTab_acceptorLimitCountSpinnerTip, 32, -1, 1, 1, modifyDialogListener); acceptorLimitCountSpinner.setMinimum(2); acceptorLimitCountSpinner.setMaximum(64); acceptorLimitCountSpinner.setIncrement(1); acceptorLimitCountSpinner.setPageIncrement(8); createLabel(configGroup, Messages.advConfigTab_acceptorLimitCountUnit, -1, SWT.LEFT, 1, 1); ajpSupportButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_ajpSupportButton, Messages.advConfigTab_ajpSupportButtonTip, 224, 1, 1, modifyDialogListener); // TODO enable when implemented ajpSupportButton.setEnabled(false); ajpPortSpinner = createSpinner(configGroup, SWT.BORDER, Messages.advConfigTab_ajpPortSpinnerTip, 32, -1, 2, 1, modifyDialogListener); ajpPortSpinner.setMinimum(0); ajpPortSpinner.setMaximum(65535); ajpPortSpinner.setIncrement(1); ajpPortSpinner.setPageIncrement(1000); // TODO enable when implemented ajpPortSpinner.setEnabled(false); customWebDefaultsEnabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_customWebDefaultsEnabledButton, Messages.advConfigTab_customWebDefaultsEnabledButtonTip, 224, 1, 1, modifyDialogListener); customWebDefaultsResourceText = createText(configGroup, SWT.BORDER, Messages.advConfigTab_customWebDefaultsResourceTextTip, -1, -1, 2, 1, modifyDialogListener); Composite customWebDefaultsButtons = createComposite(configGroup, SWT.NONE, 4, -1, false, 3, 1); createLabel(customWebDefaultsButtons, JettyPluginUtils.EMPTY, -1, SWT.LEFT, 1, 1); customWebDefaultsWorkspaceButton = createButton(customWebDefaultsButtons, SWT.NONE, Messages.advConfigTab_customWebDefaultsWorkspaceButton, Messages.advConfigTab_customWebDefaultsWorkspaceButtonTip, 96, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(getCurrentLaunchConfiguration()); String path = chooseWorkspaceFile(getShell(), adapter.getProject(), Messages.advConfigTab_customWebDefaultsWorkspaceTitle, Messages.advConfigTab_customWebDefaultsWorkspaceMessage, customWebDefaultsResourceText.getText()); if (path != null) { customWebDefaultsResourceText.setText(path); } } }); customWebDefaultsFileSystemButton = createButton(customWebDefaultsButtons, SWT.NONE, Messages.advConfigTab_customWebDefaultsFileSystemButton, Messages.advConfigTab_customWebDefaultsFileSystemButtonTip, 96, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { String path = chooseExternalFile(getShell(), customWebDefaultsResourceText.getText(), Messages.advConfigTab_customWebDefaultsFileSystemTitle, "*.xml", "*.*"); //$NON-NLS-1$//$NON-NLS-2$ if (path != null) { customWebDefaultsResourceText.setText(path); } } }); customWebDefaultsVariablesButton = createButton(customWebDefaultsButtons, SWT.NONE, Messages.advConfigTab_customWebDefaultsVariablesButton, Messages.advConfigTab_customWebDefaultsVariablesButtonTip, 96, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { chooseVariable(getShell(), customWebDefaultsResourceText); } }); serverCacheDisabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_serverCacheDisabledButton, Messages.advConfigTab_serverCacheDisabledButtonTip, 224, 3, 1, modifyDialogListener); clientCacheDisabledButton = createButton(configGroup, SWT.CHECK, Messages.advConfigTab_clientCacheDisabledButton, Messages.advConfigTab_clientCacheDisabledButtonTip, 224, 3, 1, modifyDialogListener); } private void createContextGroup(Composite tabComposite) { Group contextGroup = createGroup(tabComposite, Messages.advConfigTab_contextGroupTitle, 6, -1, true, 2, 1); configTable = createTable(contextGroup, SWT.BORDER | SWT.FULL_SELECTION, 320, 96, 5, 3, Messages.advConfigTab_contextTableInclude, Messages.advConfigTab_contextTableFile); configTable.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateConfigButtonState(); } }); moveUpConfigButton = createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextUpButton, Messages.advConfigTab_contextUpButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveUpConfig(); } }); moveDownConfigButton = createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextDownButton, Messages.advConfigTab_contextDownButtonTip, 128, 1, 2, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveDownConfig(); } }); openConfigButton = createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextOpenButton, Messages.advConfigTab_contextOpenButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { openConfig(); } }); createLabel(contextGroup, JettyPluginUtils.EMPTY, -1, SWT.LEFT, 1, 1); createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextAddButton, Messages.advConfigTab_contextAddButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addConig(); } }); createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextAddExternalButton, Messages.advConfigTab_contextAddExternalButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addExternalConfig(); } }); editConfigButton = createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextEditButton, Messages.advConfigTab_contextEditButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { editConfig(); } }); removeConfigButton = createButton(contextGroup, SWT.NONE, Messages.advConfigTab_contextRemoveButton, Messages.advConfigTab_contextRemoveButtonTip, 128, 1, 1, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeConfig(); } }); } private void createHelpGroup(Composite tabComposite) { Composite helpGroup = createTopComposite(tabComposite, SWT.NONE, 3, -1, false, 2, 1); createLabel(helpGroup, JettyPluginUtils.EMPTY, -1, SWT.LEFT, 1, 1); createImage(helpGroup, JettyPlugin.getJettyIcon(), 16, SWT.CENTER, SWT.BOTTOM, 1, 1); createLink(helpGroup, SWT.NONE, Messages.advConfigTab_homepageLink, SWT.RIGHT, 1, 1, new Listener() { public void handleEvent(Event event) { Program.launch("http://eclipse-jetty.github.io/"); //$NON-NLS-1$ } }); } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return Messages.advConfigTab_title; } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage() */ @Override public Image getImage() { return JettyPlugin.getJettyAdvancedIcon(); } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getMessage() */ @Override public String getMessage() { return Messages.advConfigTab_message; } /** * {@inheritDoc} * * @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public void initializeFrom(final ILaunchConfiguration configuration) { super.initializeFrom(configuration); try { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(configuration); embeddedButton.setSelection(adapter.isEmbedded()); externButton.setSelection(!adapter.isEmbedded()); pathText.setText(adapter.getPathString()); jspSupportButton.setSelection(adapter.isJspSupport()); jmxSupportButton.setSelection(adapter.isJmxSupport()); jndiSupportButton.setSelection(adapter.isJndiSupport()); annotationsSupportButton.setSelection(adapter.isAnnotationsSupport()); websocketSupportButton.setSelection(adapter.isWebsocketSupport()); ajpSupportButton.setSelection(adapter.isAjpSupport()); gracefulShutdownOverrideEnabledButton.setSelection(adapter.isGracefulShutdownOverrideEnabled()); gracefulShutdownOverrideTimeoutSpinner.setSelection(adapter.getGracefulShutdownOverrideTimeout() / 100); threadPoolLimitEnabledButton.setSelection(adapter.isThreadPoolLimitEnabled()); threadPoolLimitCountSpinner.setSelection(adapter.getThreadPoolLimitCount()); acceptorLimitEnabledButton.setSelection(adapter.isAcceptorLimitEnabled()); acceptorLimitCountSpinner.setSelection(adapter.getAcceptorLimitCount()); customWebDefaultsEnabledButton.setSelection(adapter.isCustomWebDefaultsEnabled()); customWebDefaultsResourceText.setText(adapter.getCustomWebDefaultsResource()); serverCacheDisabledButton.setSelection(!adapter.isServerCacheEnabled()); clientCacheDisabledButton.setSelection(!adapter.isClientCacheEnabled()); updateTable(adapter, true); updateConfigButtonState(); showLauncherInfoButton.setSelection(adapter.isShowLauncherInfo()); consoleEnabledButton.setSelection(adapter.isConsoleEnabled()); } catch (final CoreException e) { JettyPlugin.error(Messages.advConfigTab_initializeFailed, e); } } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) { // intentionally left blank } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(final ILaunchConfigurationWorkingCopy configuration) { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(configuration); try { adapter.updateConfigVersion(); boolean embedded = embeddedButton.getSelection(); adapter.setEmbedded(embedded); String jettyPath = pathText.getText().trim(); adapter.setPathString(jettyPath); try { JettyVersion jettyVersion = JettyVersion.detect(JettyPluginUtils.resolveVariables(jettyPath), embedded); adapter.setMainTypeName(jettyVersion); adapter.setVersion(jettyVersion); adapter.setMinorVersion(jettyVersion); adapter.setMicroVersion(jettyVersion); } catch (IllegalArgumentException e) { // failed to detect } adapter.setJspSupport(jspSupportButton.getSelection()); adapter.setJmxSupport(jmxSupportButton.getSelection()); adapter.setJndiSupport(jndiSupportButton.getSelection()); adapter.setAnnotationsSupport(annotationsSupportButton.getSelection()); adapter.setWebsocketSupport(websocketSupportButton.getSelection()); adapter.setAjpSupport(ajpSupportButton.getSelection()); adapter.setGracefulShutdownOverrideEnabled(gracefulShutdownOverrideEnabledButton.getSelection()); adapter.setGracefulShutdownOverrideTimeout(gracefulShutdownOverrideTimeoutSpinner.getSelection() * 100); adapter.setThreadPoolLimitEnabled(threadPoolLimitEnabledButton.getSelection()); adapter.setThreadPoolLimitCount(threadPoolLimitCountSpinner.getSelection()); adapter.setAcceptorLimitEnabled(acceptorLimitEnabledButton.getSelection()); adapter.setAcceptorLimitCount(acceptorLimitCountSpinner.getSelection()); adapter.setShowLauncherInfo(showLauncherInfoButton.getSelection()); adapter.setConsoleEnabled(consoleEnabledButton.getSelection()); adapter.setCustomWebDefaultsEnabled(customWebDefaultsEnabledButton.getSelection()); adapter.setCustomWebDefaultsResource(customWebDefaultsResourceText.getText()); adapter.setServerCacheEnabled(!serverCacheDisabledButton.getSelection()); adapter.setClientCacheEnabled(!clientCacheDisabledButton.getSelection()); adapter.setConfigs(configEntryList.getConfigs()); adapter.setClasspathProvider(JettyLaunchConfigurationAdapter.CLASSPATH_PROVIDER_JETTY); updateTable(adapter, false); updateConfigButtonState(); } catch (CoreException e) { JettyPlugin.error(Messages.advConfigTab_performApplyFailed, e); } } /** * {@inheritDoc} * * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public boolean isValid(final ILaunchConfiguration configuration) { setErrorMessage(null); setMessage(null); boolean jndi = jndiSupportButton.getSelection(); if (jndi) { annotationsSupportButton.setEnabled(false); annotationsSupportButton.setSelection(true); } else { annotationsSupportButton.setEnabled(true); } boolean embedded = embeddedButton.getSelection(); pathText.setEnabled(!embedded); pathVariablesButton.setEnabled(!embedded); pathBrowseButton.setEnabled(!embedded); boolean threadPoolLimitEnabled = threadPoolLimitEnabledButton.getSelection(); threadPoolLimitCountSpinner.setEnabled(threadPoolLimitEnabled); boolean acceptorLimitEnabled = acceptorLimitEnabledButton.getSelection(); acceptorLimitCountSpinner.setEnabled(acceptorLimitEnabled); if (acceptorLimitEnabled) { int minimum = Math.max(8, acceptorLimitCountSpinner.getSelection() * 2); threadPoolLimitCountSpinner.setMinimum(minimum); if (threadPoolLimitCountSpinner.getSelection() < minimum) { threadPoolLimitCountSpinner.setSelection(minimum); } } gracefulShutdownOverrideTimeoutSpinner.setEnabled(gracefulShutdownOverrideEnabledButton.getSelection()); boolean customWebDefaultsEnabled = customWebDefaultsEnabledButton.getSelection(); customWebDefaultsResourceText.setEnabled(customWebDefaultsEnabled); customWebDefaultsVariablesButton.setEnabled(customWebDefaultsEnabled); customWebDefaultsFileSystemButton.setEnabled(customWebDefaultsEnabled); customWebDefaultsWorkspaceButton.setEnabled(customWebDefaultsEnabled); serverCacheDisabledButton.setEnabled(!customWebDefaultsEnabled); clientCacheDisabledButton.setEnabled(!customWebDefaultsEnabled); String jettyPath = null; if (!embedded) { jettyPath = JettyPluginUtils.resolveVariables(pathText.getText()).trim(); if (jettyPath.length() > 0) { File f = new File(jettyPath); if (!f.exists() || !f.isDirectory()) { setErrorMessage(String.format(Messages.advConfigTab_pathInvalid, jettyPath)); return false; } } else { setErrorMessage(Messages.advConfigTab_pathMissing); return false; } } try { JettyVersion version = JettyVersion.detect(JettyPluginUtils.resolveVariables(jettyPath), embedded); versionHint.setText(String.format("Detected Jetty Version: %s", version.getVersion())); } catch (final IllegalArgumentException e) { versionHint.setText(String.format("Detected Jetty Version: %s", "unknown")); setErrorMessage(String.format(Messages.advConfigTab_versionDetectionFailed, jettyPath)); return false; } if (customWebDefaultsEnabled) { String customWebDefaultsPath = JettyPluginUtils.resolveVariables(customWebDefaultsResourceText.getText()).trim(); if (customWebDefaultsPath.length() > 0) { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(configuration); File file = JettyPluginUtils.resolveFile(adapter.getProject(), customWebDefaultsPath); if ((file == null) || (!file.exists())) { setErrorMessage(String .format(Messages.advConfigTab_customWebDefaultsInvalid, customWebDefaultsPath)); return false; } } else { setErrorMessage(String.format(Messages.advConfigTab_customWebDefaultsMissing)); } } List<JettyConfig> contexts = configEntryList.getConfigs(); for (JettyConfig context : contexts) { if ((context.isActive()) && (!context.isValid(ResourcesPlugin.getWorkspace()))) { setErrorMessage(String.format(Messages.advConfigTab_contextInvalid, context.getPath())); } } setDirty(true); return true; } /** * Update the table with the Jetty configuration XML files * * @param adapter the adapter * @param updateType true to update all types */ private void updateTable(JettyLaunchConfigurationAdapter adapter, boolean updateType) { try { List<JettyConfig> contexts = adapter.getConfigs(); if (configEntryList.update(adapter.getConfiguration(), configTable, contexts)) { if (!configTableFormatted) { for (int i = 0; i < configTable.getColumnCount(); i += 1) { configTable.getColumn(i).pack(); } } if (configTable.getItemCount() > 0) { configTableFormatted = true; } } } catch (CoreException e) { JettyPlugin.error(Messages.advConfigTab_updateTableFailed, e); } } /** * Choose one Jetty configuration XML file from the workspace * * @param path the inital path * @return the selected file, null if none was selected */ protected String chooseConfig(String path) { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(getCurrentLaunchConfiguration()); return chooseWorkspaceFile(getShell(), adapter.getProject(), Messages.advConfigTab_contextAddTitle, Messages.advConfigTab_contextAddMessage, path); } /** * Choose one Jetty configuration XML file from the file system * * @param path the initial path * @return the selected file, null if none was selected */ protected String chooseConfigFromFileSystem(String path) { return chooseExternalFile(getShell(), path, Messages.advConfigTab_contextAddExternalTitle, "*.xml", "*.*"); //$NON-NLS-1$//$NON-NLS-2$ } /** * Update the state of the buttons for the Jetty configuration XML files */ public void updateConfigButtonState() { int index = configTable.getSelectionIndex(); JettyLaunchConfigEntry entry = (index >= 0) ? configEntryList.get(index) : null; JettyConfigType type = (entry != null) ? entry.getType() : null; openConfigButton.setEnabled(configTable.getSelectionIndex() >= 0); editConfigButton.setEnabled((type == JettyConfigType.PATH) || (type == JettyConfigType.WORKSPACE)); moveUpConfigButton.setEnabled(index > 0); moveDownConfigButton.setEnabled((index >= 0) && (index < (configTable.getItemCount() - 1))); removeConfigButton.setEnabled((type == JettyConfigType.PATH) || (type == JettyConfigType.WORKSPACE)); } /** * Move the Jetty configuration XML file one step up */ private void moveUpConfig() { int index = configTable.getSelectionIndex(); if (index > 0) { configEntryList.exchange(configTable, index - 1); configTable.setSelection(index - 1); updateLaunchConfigurationDialog(); } } /** * Move the selected Jetty configuration XML file one step down */ private void moveDownConfig() { int index = configTable.getSelectionIndex(); if ((index >= 0) && (index < (configTable.getItemCount() - 1))) { configEntryList.exchange(configTable, index); configTable.setSelection(index + 1); updateLaunchConfigurationDialog(); } } /** * Adds an Jetty configuration XML file from the workspace. */ private void addConig() { String path = chooseConfig(null); if (path != null) { configEntryList.add(configTable, new JettyLaunchConfigEntry(new JettyConfig(path, JettyConfigType.WORKSPACE, true))); updateLaunchConfigurationDialog(); } } /** * Adds an Jetty configuration XML file from the file system. */ private void addExternalConfig() { String path = chooseConfigFromFileSystem(null); if (path != null) { configEntryList.add(configTable, new JettyLaunchConfigEntry(new JettyConfig(path, JettyConfigType.PATH, true))); updateLaunchConfigurationDialog(); } } /** * Opens the Jetty configuration XML file. */ private void openConfig() { int index = configTable.getSelectionIndex(); if (index >= 0) { JettyLaunchConfigEntry entry = configEntryList.get(index); IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); IWorkbenchPage page = window.getActivePage(); IEditorInput input = null; IEditorDescriptor descriptor = null; switch (entry.getType()) { case DEFAULT: try { JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(getCurrentLaunchConfiguration()); ILaunchDelegate[] delegates = adapter.getConfiguration().getType() .getDelegates(new HashSet<String>(Arrays.asList("run"))); //$NON-NLS-1$ if (delegates.length == 1) { JettyLaunchConfigurationDelegate delegate = (JettyLaunchConfigurationDelegate) delegates[0].getDelegate(); File file = delegate.createJettyConfigurationFile(adapter, true); descriptor = workbench.getEditorRegistry().getDefaultEditor(file.getName()); input = new FileStoreEditorInput(EFS.getLocalFileSystem().fromLocalFile(file)); } } catch (CoreException ex) { JettyPlugin.error(Messages.advConfigTab_contextCreateFailed, ex); } break; case PATH: { File file = new File(entry.getPath()); descriptor = workbench.getEditorRegistry().getDefaultEditor(file.getName()); input = new FileStoreEditorInput(EFS.getLocalFileSystem().fromLocalFile(file)); } break; case WORKSPACE: { IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(entry.getPath())); descriptor = workbench.getEditorRegistry().getDefaultEditor(file.getName()); input = new FileEditorInput(file); } break; } if (descriptor != null) { try { IDE.openEditor(page, input, descriptor.getId()); } catch (PartInitException ex) { JettyPlugin.error(Messages.advConfigTab_contextOpenFailed, ex); } } } } /** * Edits the table entry of the Jetty configuration XML file */ private void editConfig() { int index = configTable.getSelectionIndex(); if (index > 0) { String path = null; JettyLaunchConfigEntry entry = configEntryList.get(index); switch (entry.getType()) { case PATH: path = chooseConfigFromFileSystem(entry.getPath()); break; case WORKSPACE: path = chooseConfig(entry.getPath()); break; default: break; } if (path != null) { entry.setPath(path); updateLaunchConfigurationDialog(); } } } /** * Removes the Jetty configuration XML file from the table */ private void removeConfig() { int index = configTable.getSelectionIndex(); if (index >= 0) { JettyLaunchConfigEntry entry = configEntryList.get(index); if ((entry.getType() == JettyConfigType.PATH) || (entry.getType() == JettyConfigType.WORKSPACE)) { configEntryList.remove(configTable, index); updateLaunchConfigurationDialog(); } } } public final class ModifyDialogListener implements ModifyListener, SelectionListener { /** * {@inheritDoc} * * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ @SuppressWarnings("synthetic-access") public void modifyText(final ModifyEvent e) { updateLaunchConfigurationDialog(); } /** * {@inheritDoc} * * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetDefaultSelected(final SelectionEvent arg0) { // intentionally left blank } /** * {@inheritDoc} * * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @SuppressWarnings("synthetic-access") public void widgetSelected(final SelectionEvent arg0) { updateLaunchConfigurationDialog(); } } }