[409475] GlobalDeleteAction not equipped to handle multiple deletes
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java
index 8317184..3b9c9f5 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java
@@ -28,13 +28,10 @@
 import org.eclipse.wst.server.core.ServerCore;
 import org.eclipse.wst.server.ui.internal.DeleteServerDialog;
 import org.eclipse.wst.server.ui.internal.Messages;
-import org.eclipse.wst.server.ui.internal.Trace;
 /**
  * This global delete action handles both the server and module deletion.
  */
 public class GlobalDeleteAction extends SelectionProviderAction {
-	protected IServer[] servers;
-	protected IFolder[] configs;
 	private Shell shell;
 
 	public GlobalDeleteAction(Shell shell, ISelectionProvider selectionProvider) {
@@ -52,26 +49,28 @@
 			setEnabled(false);
 			return;
 		}
-		boolean enabled = false;
+
+		IServer[] servers = getAcceptedServers(sel);
+		if (servers != null && servers.length > 0) {
+			setEnabled(true);
+			return;
+		}
+		// selection isn't servers. If selection is only module-servers, then
+		// its acceptable
+		setEnabled(allSelectionAreModuleServer(sel));
+	}
+
+	private boolean allSelectionAreModuleServer(IStructuredSelection sel) {
 		Iterator iterator = sel.iterator();
 		while (iterator.hasNext()) {
 			Object obj = iterator.next();
-			if (obj instanceof IServer) {
-				IServer server = (IServer) obj;
-				if (accept(server))
-					enabled = true;
-			} 
-			else if (obj instanceof ModuleServer){
-				ModuleServer ms = (ModuleServer) obj;
-				if (accept(ms))
-					enabled = true;
-			}
-			else {
-				setEnabled(false);
-				return;
-			}
+			if (!(obj instanceof ModuleServer))
+				return false;
+			ModuleServer ms = (ModuleServer) obj;
+			if (!accept(ms))
+				return false;
 		}
-		setEnabled(enabled);
+		return true;
 	}
 
 	public boolean accept(ModuleServer ms){
@@ -86,16 +85,34 @@
 	}
 
 	public boolean accept(IServer server) {
-		servers = new IServer[] { server };
+		return !server.isReadOnly();
+	}
+
+	@Override
+	public void run() {	
+		IStructuredSelection sel = getStructuredSelection();
+		// filter the selection
+		if (!sel.isEmpty()) {
+			IServer[] selAsServers = getAcceptedServers(sel);
+			if( selAsServers != null) {
+				deleteServers(selAsServers);
+			} else {
+				ArrayList<IModule> moduleList = getRemovableModuleList(sel);
+				if( moduleList != null ) {
+					IServer s = ((ModuleServer)sel.getFirstElement()).getServer();
+					IModule[] asArray = moduleList.toArray(new IModule[moduleList.size()]);
+					new RemoveModuleAction(shell, s, asArray).run();
+				}
+			}
+		}
+	}
+	
+	private IFolder[] getConfigurationsFor(IServer[] serverArr) {
 		List<IFolder> list = new ArrayList<IFolder>();
-		
-		int size = servers.length;
-		for (int i = 0; i < size; i++) {
-			if (servers[i].isReadOnly())
-				return false;
-			
-			if (servers[i].getServerConfiguration() != null)
-				list.add(servers[i].getServerConfiguration());
+		for( int i = 0; i < serverArr.length; i++ ) {
+			if (serverArr[i].getServerConfiguration() != null) {
+				list.add(serverArr[i].getServerConfiguration());
+			}
 		}
 		
 		// remove configurations that are still referenced by other servers
@@ -104,8 +121,8 @@
 			int size2 = servers2.length;
 			for (int j = 0; j < size2; j++) {
 				boolean found = false;
-				for (int i = 0; i < size; i++) {
-					if (servers[i].equals(servers2[j]))
+				for (int i = 0; i < serverArr.length; i++) {
+					if (serverArr[i].equals(servers2[j]))
 						found = true;
 				}
 				if (!found) {
@@ -115,29 +132,26 @@
 				}
 			}
 		}
-		
-		configs = new IFolder[list.size()];
-		list.toArray(configs);
-		return true;
+		return list.toArray(new IFolder[list.size()]);
 	}
 
-	@Override
-	public void run() {		
-		IStructuredSelection sel = getStructuredSelection();
-		// filter the selection
-		if (!sel.isEmpty()) {
-			Object firstElement = sel.getFirstElement();
-			if( sel.size() == 1 && firstElement instanceof IServer) {
-				deleteServer((IServer)firstElement);
-			} else {
-				ArrayList<IModule> moduleList = getRemovableModuleList(sel);
-				if( moduleList != null ) {
-					IServer s = ((ModuleServer)firstElement).getServer();
-					IModule[] asArray = moduleList.toArray(new IModule[moduleList.size()]);
-					new RemoveModuleAction(shell, s, asArray).run();
-				}
-			}
+	/*
+	 * get an array of IServer if all elements in the selection are IServer.
+	 * Otherwise, return null.
+	 */
+	private IServer[] getAcceptedServers(IStructuredSelection sel) {
+		ArrayList<IServer> l = new ArrayList<IServer>();
+		Iterator i = sel.iterator();
+		Object o = null;
+		while (i.hasNext()) {
+			o = i.next();
+			if (!(o instanceof IServer))
+				return null;
+			// Do not add it if its read only
+			if (!((IServer) o).isReadOnly())
+				l.add((IServer) o);
 		}
+		return l.toArray(new IServer[l.size()]);
 	}
 	
 	/*
@@ -175,33 +189,14 @@
 	}
 	
 	protected void deleteServer(IServer server){
-		// It is possible that the server is created and added to the server view on workbench
-		// startup. As a result, when the user switches to the server view, the server is 
-		// selected, but the selectionChanged event is not called, which results in servers
-		// being null. When servers is null the server will not be deleted and the error log
-		// will have an IllegalArgumentException.
-		//
-		// To handle the case where servers is null, the selectionChanged method is called
-		// to ensure servers will be populated.
-		if (servers == null){
-			if (Trace.FINEST) {
-				Trace.trace(Trace.STRING_FINEST, "Delete server called when servers is null");
-			}				
-			
-			IStructuredSelection sel = getStructuredSelection();
-			if (sel != null){
-				selectionChanged(sel);
-			}
-		}
-				
-		if (Trace.FINEST) {
-			Trace.trace(Trace.STRING_FINEST, "Opening delete server dialog with parameters shell="
-					+ shell + " servers=" + servers + " configs=" + configs);
-		}		
+		deleteServers(new IServer[]{server});
+	}
+	
+	protected void deleteServers(IServer[] servers){
 		
 		// No check is made for valid parameters at this point, since if there is a failure, it
 		// should be output to the error log instead of failing silently.
-		DeleteServerDialog dsd = new DeleteServerDialog(shell, servers, configs);
+		DeleteServerDialog dsd = new DeleteServerDialog(shell, servers, getConfigurationsFor(servers));
 		dsd.open();
 	}
 }