[94617] Publish tasks
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishOperation2.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishOperation2.java
index 8b332da..db319b0 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishOperation2.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishOperation2.java
@@ -27,11 +27,15 @@
 public class PublishOperation2 extends PublishOperation {
 	protected TomcatServerBehaviour server;
 	protected IModule module;
+	protected int kind;
+	protected int deltaKind;
 
-	public PublishOperation2(TomcatServerBehaviour server, IModule module) {
-		super("Publish to server", "Publish Web modules to Tomcat server");
+	public PublishOperation2(TomcatServerBehaviour server, int kind, IModule module, int deltaKind) {
+		super("Publish to server", "Publish Web module to Tomcat server");
 		this.server = server;
 		this.module = module;
+		this.kind = kind;
+		this.deltaKind = deltaKind;
 	}
 
 	public int getOrder() {
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishTask.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishTask.java
index e204b44..799d2ab 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishTask.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/PublishTask.java
@@ -18,10 +18,10 @@
 import org.eclipse.wst.server.core.model.PublishTaskDelegate;
 
 public class PublishTask extends PublishTaskDelegate {
-	public PublishOperation[] getTasks(IServer server, List modules) {
+	public PublishOperation[] getTasks(IServer server, int kind, List modules, List kindList) {
 		if (modules == null)
 			return null;
-	
+		
 		TomcatServerBehaviour tomcatServer = (TomcatServerBehaviour) server.loadAdapter(TomcatServerBehaviour.class, null);
 		
 		List tasks = new ArrayList();
@@ -29,7 +29,8 @@
 		for (int i = 0; i < size; i++) {
 			IModule[] module = (IModule[]) modules.get(i);
 			IModule m = module[module.length - 1];
-			tasks.add(new PublishOperation2(tomcatServer, m));
+			Integer in = (Integer) kindList.get(i);
+			tasks.add(new PublishOperation2(tomcatServer, kind, m, in.intValue()));
 		}
 		
 		return (PublishOperation[]) tasks.toArray(new PublishOperation[tasks.size()]);
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishTask.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishTask.java
index 3f7a282..50915e3 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishTask.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishTask.java
@@ -45,4 +45,15 @@
 	 * @return a possibly empty array of optional tasks 
 	 */
 	public PublishOperation[] getTasks(IServer server, List modules);
+
+	/**
+	 * Returns the tasks that should be performed during publishing.
+	 * 
+	 * @param server the server
+	 * @param modules a list containing IModule arrays
+	 * @param kind one of the IServer.PUBLISH_XX constants
+	 * @param kindList one of the IServer publish change constants
+	 * @return the tasks that should be performed on the server
+	 */
+	public PublishOperation[] getTasks(IServer server, int kind, List modules, List kindList);
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishTask.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishTask.java
index 4efa7c3..ec9fbd5 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishTask.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishTask.java
@@ -78,7 +78,24 @@
 	public PublishOperation[] getTasks(IServer server, List modules) {
 		try {
 			Trace.trace(Trace.FINEST, "Task.init " + this);
-			return getDelegate().getTasks(server, modules);
+			PublishOperation[] po = getDelegate().getTasks(server, modules);
+			if (po != null)
+				return po;
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error calling delegate " + toString() + ": " + e.getMessage());
+		}
+		return new PublishOperation[0];
+	}
+
+	/*
+	 * @see
+	 */
+	public PublishOperation[] getTasks(IServer server, int kind, List modules, List kindList) {
+		try {
+			Trace.trace(Trace.FINEST, "Task.init " + this);
+			PublishOperation[] po = getDelegate().getTasks(server, kind, modules, kindList);
+			if (po != null)
+				return po;
 		} catch (Exception e) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate " + toString() + ": " + e.getMessage());
 		}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
index 0b9c581..040e54a 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
@@ -103,7 +103,7 @@
 	
 	// Server listeners
 	protected transient ServerNotificationManager notificationManager;
-	
+
 	public class AutoPublishThread extends Thread {
 		public boolean stop;
 		public int time = 0; 
@@ -123,7 +123,7 @@
 				return;
 			
 			Trace.trace(Trace.FINEST, "Auto-publish thread publishing " + Server.this);
-
+			
 			PublishServerJob publishJob = new PublishServerJob(Server.this, IServer.PUBLISH_AUTO, false);
 			publishJob.schedule();
 		}
@@ -435,18 +435,22 @@
 		
 		//Trace.trace(Trace.FINEST, "< handleDeployableProjectChange()");
 	}
+	
+	protected void stopAutoPublish() {
+		if (autoPublishThread == null)
+			return;
+		
+		autoPublishThread.stop = true;
+		autoPublishThread.interrupt();
+		autoPublishThread = null;
+	}
 
 	/**
 	 * Reset automatic publish thread if it is running and start a new
 	 * thread if automatic publishing is currently enabled.
 	 */
-	public void autoPublish() {
-		// check for auto-publish
-		if (autoPublishThread != null) {
-			autoPublishThread.stop = true;
-			autoPublishThread.interrupt();
-			autoPublishThread = null;
-		}
+	protected void autoPublish() {
+		stopAutoPublish();
 		
 		int time = 0;
 		if (getAutoPublishSetting() == AUTO_PUBLISH_DEFAULT) {
@@ -686,47 +690,35 @@
 			}
 		}
 		
-		IStatus status = null;
-		try {
-			firePublishStarted();
-			status = doPublish(kind, monitor);
-		} catch (Exception e) {
-			status = null; // TODO
-		} finally {
-			firePublishFinished(status);
-		}
+		firePublishStarted();
+		IStatus status = doPublish(kind, monitor);
+		firePublishFinished(status);
 		return status;
 	}
 
 	protected IStatus doPublish(int kind, IProgressMonitor monitor) {
 		Trace.trace(Trace.FINEST, "-->-- Publishing to server: " + toString() + " -->--");
+		
+		stopAutoPublish();
 
 		try {
 			return getBehaviourDelegate(monitor).publish(kind, monitor);
 		} catch (Exception e) {
 			Trace.trace(Trace.SEVERE, "Error calling delegate publish() " + toString(), e);
-			return null;
+			return new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, 0, Messages.errorPublishing, e);
 		}
 	}
-	
+
 	/**
 	 * Returns the publish tasks that have been targetted to this server.
 	 * These tasks should be run during publishing.
 	 * 
+	 * @param kind one of the IServer.PUBLISH_XX constants
+	 * @param moduleList a list of modules
+	 * @param kindList one of the IServer publish change constants
 	 * @return a possibly empty array of IOptionalTasks
 	 */
-	public PublishOperation[] getTasks() {
-		final List moduleList = new ArrayList();
-		
-		IModuleVisitor visitor = new IModuleVisitor() {
-			public boolean visit(IModule[] module) {
-				moduleList.add(module);
-				return true;
-			}
-		};
-
-		visit(visitor, null);
-	
+	public PublishOperation[] getTasks(int kind, List moduleList, List kindList) {
 		List tasks = new ArrayList();
 		
 		String serverTypeId = getServerType().getId();
@@ -737,7 +729,7 @@
 			for (int i = 0; i < size; i++) {
 				IPublishTask task = publishTasks[i];
 				if (task.supportsType(serverTypeId)) {
-					PublishOperation[] tasks2 = task.getTasks(this, moduleList);
+					PublishOperation[] tasks2 = task.getTasks(this, kind, moduleList, kindList);
 					if (tasks2 != null) {
 						int size2 = tasks2.length;
 						for (int j = 0; j < size2; j++) {
@@ -1138,7 +1130,7 @@
 			Trace.trace(Trace.SEVERE, "Error calling delegate stop() " + toString(), t);
 		}
 	}
-	
+
 	/**
 	 * @see IServer#start(String, IOperationListener)
 	 */
@@ -1175,7 +1167,7 @@
 			boolean alreadyDone;
 		}
 		final Timer timer = new Timer();
-		
+			
 		Thread thread = new Thread() {
 			public void run() {
 				try {
@@ -1195,7 +1187,7 @@
 		};
 		thread.setDaemon(true);
 		thread.start();
-	
+		
 		Trace.trace(Trace.FINEST, "synchronousStart 2");
 	
 		// start the server
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishOperation.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishOperation.java
index 08c4a92..8ec1331 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishOperation.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishOperation.java
@@ -15,7 +15,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.wst.server.core.TaskModel;
 /**
- * An publish operation that will be executed during publishing. 
+ * An operation that will be executed during publishing. 
  * 
  * [issue: EY It is not clear to me that when this task will be run. Will the place where the
  * task is being run depend on the server, e.g. the TDC tasks for the v6 server should be run
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishTaskDelegate.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishTaskDelegate.java
index 5101cbc..2442c3b 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishTaskDelegate.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/PublishTaskDelegate.java
@@ -32,5 +32,20 @@
 	 * @param modules a list containing IModule arrays
 	 * @return the tasks that should be performed on the server.
 	 */
-	public abstract PublishOperation[] getTasks(IServer server, List modules);
+	public PublishOperation[] getTasks(IServer server, List modules) {
+		return null;
+	}
+
+	/**
+	 * Returns the tasks that should be performed during publishing.
+	 * 
+	 * @param server the server
+	 * @param modules a list containing IModule arrays
+	 * @param kind one of the IServer.PUBLISH_XX constants.
+	 * @param kindList one of the IServer publish change constants.
+	 * @return the tasks that should be performed on the server.
+	 */
+	public PublishOperation[] getTasks(IServer server, int kind, List modules, List kindList) {
+		return getTasks(server, modules);
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
index 3f62e60..4f8b961 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/model/ServerBehaviourDelegate.java
@@ -535,14 +535,13 @@
 				kindList.add(new Integer(ServerBehaviourDelegate.ADDED));
 		}
 		
-		PublishOperation[] tasks = getTasks();
-		
 		addRemovedModules(moduleList, kindList);
 		
 		while (moduleList.size() > kindList.size()) {
 			kindList.add(new Integer(ServerBehaviourDelegate.REMOVED));
 		}
-
+		
+		PublishOperation[] tasks = getTasks(kind, moduleList, kindList);
 		int size = 2000 + 3500 * moduleList.size() + 500 * tasks.length;
 		
 		monitor = ProgressUtil.getMonitorFor(monitor);
@@ -670,20 +669,20 @@
 	 * 
 	 * Uses 500 ticks plus 3500 ticks per module
 	 */
-	protected void publishModules(int kind, List modules2, List deltaKind, MultiStatus multi, IProgressMonitor monitor) {
-		if (modules2 == null)
+	protected void publishModules(int kind, List modules, List deltaKind, MultiStatus multi, IProgressMonitor monitor) {
+		if (modules == null)
 			return;
-
-		int size = modules2.size();
+		
+		int size = modules.size();
 		if (size == 0)
 			return;
 		
 		if (monitor.isCanceled())
 			return;
-
+		
 		// publish modules
 		for (int i = 0; i < size; i++) {
-			IStatus status = publishModule(kind, (IModule[]) modules2.get(i), ((Integer)deltaKind.get(i)).intValue(), ProgressUtil.getSubMonitorFor(monitor, 3000));
+			IStatus status = publishModule(kind, (IModule[]) modules.get(i), ((Integer)deltaKind.get(i)).intValue(), ProgressUtil.getSubMonitorFor(monitor, 3000));
 			multi.add(status);
 		}
 	}
@@ -692,10 +691,13 @@
 	 * Returns the publish tasks that have been targetted to this server.
 	 * These tasks should be run during publishing.
 	 * 
+	 * @param kind one of the IServer.PUBLISH_XX constants
+	 * @param moduleList a list of modules
+	 * @param kindList list of one of the IServer publish change constants
 	 * @return a possibly empty array of IOptionalTasks
 	 */
-	protected final PublishOperation[] getTasks() {
-		return server.getTasks();
+	protected final PublishOperation[] getTasks(int kind, List moduleList, List kindList) {
+		return server.getTasks(kind, moduleList, kindList);
 	}
 
 	/**