Author: rob.stryker(a)jboss.com
Date: 2011-07-15 05:58:30 -0400 (Fri, 15 Jul 2011)
New Revision: 32936
Added:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerAlreadyStartedHandler.java
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/dialogs/ServerAlreadyStartedDialog.java
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/ExtensionManager.java
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerStatePoller.java
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/AbstractJBossStartLaunchConfiguration.java
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/JBossServerUIPlugin.java
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties
Log:
JBIDE-9243 - adding dialog for starting a server when another is already running
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/ExtensionManager.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/ExtensionManager.java 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/ExtensionManager.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -33,6 +33,7 @@
import org.jboss.ide.eclipse.as.core.server.IJBossServerPublishMethodType;
import org.jboss.ide.eclipse.as.core.server.IJBossServerPublisher;
import org.jboss.ide.eclipse.as.core.server.IPollerFailureHandler;
+import org.jboss.ide.eclipse.as.core.server.IServerAlreadyStartedHandler;
import org.jboss.ide.eclipse.as.core.server.IServerStatePoller;
import org.jboss.ide.eclipse.as.core.server.internal.ServerPublishMethodType;
import org.jboss.ide.eclipse.as.core.server.internal.ServerStatePollerType;
@@ -317,4 +318,17 @@
JMX_RUNNER_NOT_FOUND = new Object();
return null;
}
+
+
+ // TODO Replace with extension point or cleaner API
+ // Should have an array of possible handlers
+ // Should ask each handler if they 'accept' this handler, etc
+ private IServerAlreadyStartedHandler defaultAlreadyStartedHandler;
+ public IServerAlreadyStartedHandler getAlreadyStartedHandler(IServer server) {
+ return defaultAlreadyStartedHandler;
+ }
+ public void setAlreadyStartedHandler(IServerAlreadyStartedHandler handler) {
+ defaultAlreadyStartedHandler = handler;
+ }
+
}
Added:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerAlreadyStartedHandler.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerAlreadyStartedHandler.java
(rev 0)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerAlreadyStartedHandler.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.ide.eclipse.as.core.server;
+
+import org.eclipse.wst.server.core.IServer;
+
+public interface IServerAlreadyStartedHandler {
+ public static int CONTINUE_STARTUP = 1;
+ public static int ONLY_CONNECT = 2;
+ public static int CANCEL = 3;
+
+ /**
+ * Is this handler capable of handling this server?
+ * @param server
+ * @return
+ */
+ public boolean accepts(IServer server);
+
+ /**
+ * Handle the prompt for this server
+ *
+ * @param server
+ * @return One of the constants of this interface
+ */
+ public int promptForBehaviour(IServer server);
+}
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerStatePoller.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerStatePoller.java 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/IServerStatePoller.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Red Hat, Inc.
+ * Copyright (c) 2011 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,
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/AbstractJBossStartLaunchConfiguration.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/AbstractJBossStartLaunchConfiguration.java 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/AbstractJBossStartLaunchConfiguration.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -27,13 +27,18 @@
import org.eclipse.jdt.launching.VMRunnerConfiguration;
import org.eclipse.jst.server.core.ServerProfilerDelegate;
import org.eclipse.wst.server.core.IServer;
+import org.jboss.ide.eclipse.as.core.ExtensionManager;
import org.jboss.ide.eclipse.as.core.JBossServerCorePlugin;
import org.jboss.ide.eclipse.as.core.Messages;
import org.jboss.ide.eclipse.as.core.extensions.polling.WebPortPoller;
+import org.jboss.ide.eclipse.as.core.server.IServerAlreadyStartedHandler;
+import org.jboss.ide.eclipse.as.core.server.IServerStatePoller;
+import org.jboss.ide.eclipse.as.core.server.IServerStatePoller2;
import org.jboss.ide.eclipse.as.core.server.internal.DelegatingServerBehavior;
import org.jboss.ide.eclipse.as.core.util.JBossServerBehaviorUtils;
import org.jboss.ide.eclipse.as.core.util.LaunchCommandPreferences;
import org.jboss.ide.eclipse.as.core.util.LaunchConfigUtils;
+import org.jboss.ide.eclipse.as.core.util.PollThreadUtils;
/**
* @author Rob Stryker
@@ -51,16 +56,46 @@
jbsBehavior.setServerStarted();
return false;
}
- boolean started = WebPortPoller.onePing(jbsBehavior.getServer());
+ boolean started = isServerStarted(jbsBehavior);
if (started) {
- jbsBehavior.setServerStarting();
- jbsBehavior.setServerStarted();
- return false;
+ return handleAlreadyStartedScenario(jbsBehavior);
}
return true;
}
+ /*
+ * A solution needs to be found here.
+ * Should ideally use the poller that the server says is its poller,
+ * but some pollers such as timeout poller
+ */
+ protected boolean isServerStarted(DelegatingServerBehavior jbsBehavior) {
+ IServerStatePoller poller = PollThreadUtils.getPoller(IServerStatePoller.SERVER_UP,
jbsBehavior.getServer());
+
+ // Need to be able to FORCE the poller to poll immediately
+ if( poller == null || !(poller instanceof IServerStatePoller2))
+ poller = new WebPortPoller();
+ boolean started =
((IServerStatePoller2)poller).getCurrentStateSynchronous(jbsBehavior.getServer());
+ return started;
+ }
+
+ protected boolean handleAlreadyStartedScenario( DelegatingServerBehavior jbsBehavior) {
+ IServerAlreadyStartedHandler handler =
ExtensionManager.getDefault().getAlreadyStartedHandler(jbsBehavior.getServer());
+ if( handler != null ) {
+ int handlerResult = handler.promptForBehaviour(jbsBehavior.getServer());
+ if( handlerResult == IServerAlreadyStartedHandler.CONTINUE_STARTUP) {
+ return true;
+ }
+ if( handlerResult == IServerAlreadyStartedHandler.CANCEL) {
+ return false;
+ }
+ }
+ // force server to started mode
+ jbsBehavior.setServerStarting();
+ jbsBehavior.setServerStarted();
+ return false;
+ }
+
public void preLaunch(ILaunchConfiguration configuration,
String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
// override me
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/JBossServerUIPlugin.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/JBossServerUIPlugin.java 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/JBossServerUIPlugin.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -33,9 +33,11 @@
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.ui.internal.ServerUIPreferences;
+import org.jboss.ide.eclipse.as.core.ExtensionManager;
import org.jboss.ide.eclipse.as.core.JBossServerCorePlugin;
import org.jboss.ide.eclipse.as.core.server.UnitedServerListenerManager;
import org.jboss.ide.eclipse.as.ui.console.ShowConsoleServerStateListener;
+import
org.jboss.ide.eclipse.as.ui.dialogs.ServerAlreadyStartedDialog.ServerAlreadyStartedHandler;
import org.jboss.ide.eclipse.as.ui.views.server.extensions.XPathRuntimeListener;
import org.jboss.ide.eclipse.as.ui.wizards.JBInitialSelectionProvider;
import org.osgi.framework.BundleContext;
@@ -87,12 +89,14 @@
UnitedServerListenerManager.getDefault().addListener(ShowConsoleServerStateListener.getDefault());
ServerCore.addServerLifecycleListener(selectionProvider);
ServerCore.addRuntimeLifecycleListener(XPathRuntimeListener.getDefault());
+ ExtensionManager.getDefault().setAlreadyStartedHandler(new
ServerAlreadyStartedHandler());
}
/**
* This method is called when the plug-in is stopped
*/
public void stop(BundleContext context) throws Exception {
+ ExtensionManager.getDefault().setAlreadyStartedHandler(null);
ServerCore.removeRuntimeLifecycleListener(XPathRuntimeListener.getDefault());
ServerCore.removeServerLifecycleListener(selectionProvider);
UnitedServerListenerManager.getDefault().removeListener(ShowConsoleServerStateListener.getDefault());
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -251,6 +251,13 @@
public static String ChangeTimestampServerListDialog_Title;
public static String ChangeTimestampServerListDialog_Message;
+ public static String ServerAlreadyStartedDialog_Message;
+ public static String ServerAlreadyStartedDialog_Title;
+ public static String ServerAlreadyStartedDialog_Desc;
+ public static String ServerAlreadyStartedDialog_Connect;
+ public static String ServerAlreadyStartedDialog_Launch;
+
+
static {
NLS.initializeMessages(BUNDLE_NAME,
Messages.class);
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties 2011-07-15
09:48:07 UTC (rev 32935)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties 2011-07-15
09:58:30 UTC (rev 32936)
@@ -222,3 +222,9 @@
#Change Timestamp
ChangeTimestampServerListDialog_Title=Touch project
ChangeTimestampServerListDialog_Message=Project {0} has no files to touch.\nSelect
servers in which to republish the project.
+
+ServerAlreadyStartedDialog_Message=An application server may already be running on host
{0}.
+ServerAlreadyStartedDialog_Title=Server already running on {0}
+ServerAlreadyStartedDialog_Desc=Launching an additional server when one is already
running may \nmake some parts of the tools not function properly. \n\n Would you like
to:
+ServerAlreadyStartedDialog_Connect=Set the server adapter to 'started', but do
not launch
+ServerAlreadyStartedDialog_Launch=Launch a new instance anyway
Added:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/dialogs/ServerAlreadyStartedDialog.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/dialogs/ServerAlreadyStartedDialog.java
(rev 0)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/dialogs/ServerAlreadyStartedDialog.java 2011-07-15
09:58:30 UTC (rev 32936)
@@ -0,0 +1,112 @@
+/*******************************************************************************
+* Copyright (c) 2011 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.ide.eclipse.as.ui.dialogs;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.server.core.IServer;
+import org.jboss.ide.eclipse.as.core.server.IServerAlreadyStartedHandler;
+import org.jboss.ide.eclipse.as.ui.Messages;
+import org.jboss.ide.eclipse.as.ui.UIUtil;
+
+public class ServerAlreadyStartedDialog extends TitleAreaDialog {
+ public static class ServerAlreadyStartedHandler implements IServerAlreadyStartedHandler
{
+ public boolean accepts(IServer server) {
+ return true;
+ }
+ public int promptForBehaviour(final IServer server) {
+ final int[] result = new int[1];
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ ServerAlreadyStartedDialog d = new
ServerAlreadyStartedDialog(server,Display.getDefault().getActiveShell());
+ int dResult = d.open();
+ if( dResult == Window.CANCEL ) {
+ result[0] = IServerAlreadyStartedHandler.CANCEL;
+ } else {
+ result[0] = d.launch ? IServerAlreadyStartedHandler.CONTINUE_STARTUP :
IServerAlreadyStartedHandler.ONLY_CONNECT;
+ }
+ }
+ });
+ return result[0];
+ }
+ }
+
+ private IServer server;
+ private boolean launch;
+ public ServerAlreadyStartedDialog(IServer server, Shell parentShell) {
+ super(parentShell);
+ this.server = server;
+ }
+ @Override
+ protected Control createContents(Composite parent) {
+ Control c = super.createContents(parent);
+ setMessage(NLS.bind(Messages.ServerAlreadyStartedDialog_Message, server.getHost()),
IMessageProvider.WARNING );
+ setTitle(NLS.bind(Messages.ServerAlreadyStartedDialog_Title, server.getHost()));
+ getShell().setText(NLS.bind(Messages.ServerAlreadyStartedDialog_Title,
server.getHost()));
+ return c;
+ }
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ // create OK and Cancel buttons by default
+ super.createButtonsForButtonBar(parent);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite main = new Composite((Composite)super.createDialogArea(parent), SWT.NONE);
+ main.setLayoutData(new GridData(GridData.FILL_BOTH));
+ main.setLayout(new FormLayout());
+
+ Label desc = new Label(main, SWT.NONE);
+ desc.setText(Messages.ServerAlreadyStartedDialog_Desc);
+ Button connectButton = new Button(main, SWT.RADIO);
+ connectButton.setText(Messages.ServerAlreadyStartedDialog_Connect);
+ Button launchButton = new Button(main, SWT.RADIO);
+ launchButton.setText(Messages.ServerAlreadyStartedDialog_Launch);
+
+ connectButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ launch = false;
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ launchButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ launch = true;
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+
+ desc.setLayoutData(UIUtil.createFormData2(0, 5, null, 0, 0, 5, 100, -5));
+ connectButton.setLayoutData(UIUtil.createFormData2(desc, 5, null, 0, 0, 5, 100,
-5));
+ launchButton.setLayoutData(UIUtil.createFormData2(connectButton, 5, null, 0, 0, 5, 100,
-5));
+
+ connectButton.setSelection(true);
+ return main;
+ }
+
+}