[117905] Re-add publish listener to API
diff --git a/plugins/org.eclipse.wst.server.core/component.xml b/plugins/org.eclipse.wst.server.core/component.xml
index 45fab15..4f43974 100644
--- a/plugins/org.eclipse.wst.server.core/component.xml
+++ b/plugins/org.eclipse.wst.server.core/component.xml
@@ -7,6 +7,7 @@
     <type name="IModuleArtifact" implement="false" subclass="false" instantiate="false"/>
     <type name="IModuleType" implement="false" subclass="false" instantiate="false"/>
 <!--    <type name="IProjectProperties" implement="false" subclass="false" instantiate="false"/>-->
+    <type name="IPublishListener" subclass="false" instantiate="false"/>
     <type name="IRuntime" implement="false" subclass="false" instantiate="false"/>
     <type name="IRuntimeLifecycleListener" subclass="false" instantiate="false"/>
 <!--    <type name="IRuntimeTargetHandler" implement="false" subclass="false" instantiate="false"/>-->
@@ -48,6 +49,7 @@
     <type name="HttpLaunchable"/>
     <type name="IStaticWeb"/>
     <type name="NullModuleArtifact"/>
+    <type name="PublishAdapter"/>
     <type name="ProjectModule"/>
     <type name="ProjectModuleFactoryDelegate"/>
     <type name="RuntimeLifecycleAdapter"/>
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishListener.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IPublishListener.java
similarity index 94%
rename from plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishListener.java
rename to plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IPublishListener.java
index d67e395..0a52be8 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/IPublishListener.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IPublishListener.java
@@ -8,10 +8,9 @@
  * Contributors:
  *     IBM Corporation - Initial API and implementation
  **********************************************************************/
-package org.eclipse.wst.server.core.internal;
+package org.eclipse.wst.server.core;
 
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.server.core.IServer;
 /**
  * A publish listener is used to listen for publishing events from a server.
  * The events are typically received in the following order:
@@ -26,6 +25,7 @@
  * Publish listeners are added to a server via IServer.addPublishListener().
  * </p>
  * @see IServer
+ * @since 1.0
  */
 public interface IPublishListener {
 	/**
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
index 6a7cf67..071df81 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/IServer.java
@@ -70,13 +70,8 @@
 	/**
 	 * An operation listener is used to receive notification back about a
 	 * specific server operation, such as starting or stopping a server.
-	 *
-	 * <b>Provisional API:</b> This class/interface is part of an interim API
-	 * that is still under development and expected to change significantly
-	 * before reaching stability. It is being made available at this early
-	 * stage to solicit feedback from pioneering adopters on the understanding
-	 * that any code that uses this API will almost certainly be broken
-	 * (repeatedly) as the API evolves.
+	 * 
+	 * @since 1.0
 	 */
 	public interface IOperationListener {
 		/**
@@ -264,6 +259,24 @@
 	public void removeServerListener(IServerListener listener);
 
 	/**
+	 * Adds a publish listener to this server.
+	 * Has no effect if an identical listener is already registered.
+	 *
+	 * @param listener the publish listener
+	 * @see #removePublishListener(IPublishListener)
+	 */
+	public void addPublishListener(IPublishListener listener);
+
+	/**
+	 * Removes a publish listener from this server.
+	 * Has no effect if the listener is not registered.
+	 *
+	 * @param listener the publish listener
+	 * @see #addPublishListener(IPublishListener)
+	 */
+	public void removePublishListener(IPublishListener listener);
+
+	/**
 	 * Returns whether this server is in a state that it can
 	 * be published to.
 	 *
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
index 128846b..f6b9353 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerCore.java
@@ -78,10 +78,10 @@
 	 *
 	 * @return org.eclipse.wst.server.core.internal.ResourceManager
 	 */
-	private static ResourceManager getResourceManager() {
+	private final static ResourceManager getResourceManager() {
 		return ResourceManager.getInstance();
 	}
-	
+
 	/**
 	 * Returns the preference information for the project. The project may not
 	 * be null.
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 432928f..00506fa 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
@@ -267,6 +267,8 @@
 	/**
     * Returns a list of id (String) of preferred publish operations that will not be run
     * during publish.
+    * 
+    * @return a list of publish operation ids
     */
 	public List getDisabledPreferredPublishOperationIds() {
 		return getAttribute(PROP_DISABLED_PERFERRED_TASKS, EMPTY_LIST);		
@@ -275,6 +277,8 @@
 	/**
     * Returns a list of id (String) of optional publish operations that are enabled to 
     * be run during publish.
+    * 
+    * @return a list of publish operation ids
     */
 	public List getEnabledOptionalPublishOperationIds() {
 		return getAttribute(PROP_ENABLED_OPTIONAL_TASKS, EMPTY_LIST);
@@ -288,7 +292,7 @@
 	public int getServerState() {
 		return serverState;
 	}
-	
+
 	public String getMode() {
 		return mode;
 	}
@@ -300,7 +304,7 @@
 		this.serverState = state;
 		fireServerStateChangeEvent();
 	}
-	
+
 	/**
 	 * Add a listener to this server.
 	 *
@@ -312,7 +316,7 @@
 		Trace.trace(Trace.LISTENERS, "Adding server listener " + listener + " to " + this);
 		getServerNotificationManager().addListener(listener);
 	}
-	
+
 	/**
 	 * Add a listener to this server with the given event mask.
 	 *
@@ -395,13 +399,13 @@
 		moduleState.put(getKey(module), in);
 		fireServerModuleStateChangeEvent(module);
 	}
-	
+
 	public void setModulePublishState(IModule[] module, int state) {
 		if (module == null)
 			throw new IllegalArgumentException("Module cannot be null");
 		Integer in = new Integer(state);
 		modulePublishState.put(getKey(module), in);
-		//fireServerModuleStateChangeEvent(module);
+		fireServerModuleStateChangeEvent(module);
 	}
 
 	public void setModuleRestartState(IModule[] module, boolean r) {
@@ -409,7 +413,7 @@
 			throw new IllegalArgumentException("Module cannot be null");
 		Boolean b = new Boolean(r);
 		moduleState.put(getKey(module), b);
-		//fireServerModuleStateChangeEvent(module);
+		fireServerModuleStateChangeEvent(module);
 	}
 
 	protected void handleModuleProjectChange(final IModule module) {
@@ -513,7 +517,7 @@
 		if (state == serverSyncState)
 			return;
 		serverSyncState = state;
-		//fireConfigurationSyncStateChangeEvent();
+		firePublishStateChange();
 	}
 
 	/**
@@ -604,6 +608,20 @@
 	/**
 	 * Fire a publish state change event.
 	 */
+	protected void firePublishStateChange() {
+		Trace.trace(Trace.FINEST, "->- Firing publish state change event ->-");
+		
+		if (notificationManager == null || notificationManager.hasListenerEntries())
+			return;
+		
+		notificationManager.broadcastChange(
+			new ServerEvent(ServerEvent.SERVER_CHANGE | ServerEvent.PUBLISH_STATE_CHANGE, this, getServerState(), 
+					getServerPublishState(), getServerRestartState()));
+	}
+
+	/**
+	 * Fire a publish state change event.
+	 */
 	protected void firePublishStateChange(IModule[] module) {
 		Trace.trace(Trace.FINEST, "->- Firing publish state change event: " + module + " ->-");
 	
@@ -777,18 +795,23 @@
 	
 	/**
 	 * Returns all publish tasks that have been targetted to this server.
+	 * 
+	 * @param moduleList a list of modules
+	 * @return an array of publish operations
 	 */
 	public PublishOperation[] getAllTasks(List moduleList) {
 		String serverTypeId = getServerType().getId();
+		if (serverTypeId == null)
+			return new PublishOperation[0];
+		
 		List tasks = new ArrayList();
-
-		// server tasks
+		
 		IPublishTask[] publishTasks = ServerPlugin.getPublishTasks();
 		if (publishTasks != null) {
 			int size = publishTasks.length;
 			for (int i = 0; i < size; i++) {
 				IPublishTask task = publishTasks[i];
-				if (serverTypeId != null && task.supportsType(serverTypeId)) {
+				if (task.supportsType(serverTypeId)) {
 					PublishOperation[] tasks2 = task.getTasks(this, modules);
 					tasks.addAll(Arrays.asList(tasks2));
 				}
@@ -796,7 +819,7 @@
 		}
 		
 		Collections.sort(tasks, PUBLISH_OPERATION_COMPARTOR);
-
+		
 		return (PublishOperation[])tasks.toArray(new PublishOperation[tasks.size()]);
 	}
 	
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
index 3b40a98..2fbf188 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java
@@ -176,6 +176,7 @@
 	/**
 	 * Disable the preferred publish operation.
 	 * 
+	 * @param op a publish operation
 	 * @return true if change is made. 
 	 */
 	public boolean disablePreferredPublishOperations(PublishOperation op) {
@@ -187,13 +188,14 @@
 		if (list.contains(opId))
 			return false;
 		list.add(opId);
-		setAttribute(PROP_DISABLED_PERFERRED_TASKS, (List)list);
+		setAttribute(PROP_DISABLED_PERFERRED_TASKS, list);
 		return true;
 	}
 
 	/**
 	 * Enable the optional publish operation. Optional publish operation is not ran by default.
 	 * 
+	 * @param op a publish operation
 	 * @return true if change is made. 
 	 */
 	public boolean enableOptionalPublishOperations(PublishOperation op) {
@@ -205,7 +207,7 @@
 		if (list.contains(opId))
 			return false;
 		list.add(opId);
-		setAttribute(PROP_ENABLED_OPTIONAL_TASKS, (List)list);
+		setAttribute(PROP_ENABLED_OPTIONAL_TASKS, list);
 		return true;
 	}
 
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishAdapter.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishAdapter.java
similarity index 76%
rename from plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishAdapter.java
rename to plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishAdapter.java
index 25e72a0..276467b 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/PublishAdapter.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/util/PublishAdapter.java
@@ -8,21 +8,29 @@
  * Contributors:
  *     IBM Corporation - Initial API and implementation
  *******************************************************************************/
-package org.eclipse.wst.server.core.internal;
+package org.eclipse.wst.server.core.util;
 
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.wst.server.core.IPublishListener;
 import org.eclipse.wst.server.core.IServer;
 /**
  * Helper class which implements the IPublishListener interface
  * with empty methods.
  * 
- * @see org.eclipse.wst.server.core.internal.IPublishListener
+ * @see org.eclipse.wst.server.core.IPublishListener
+ * @since 1.0
  */
 public class PublishAdapter implements IPublishListener {
+	/**
+	 * @see IPublishListener#publishStarted(IServer)
+	 */
 	public void publishStarted(IServer server) {
 		// do nothing
 	}
 
+	/**
+	 * @see IPublishListener#publishFinished(IServer, IStatus)
+	 */
 	public void publishFinished(IServer server, IStatus status) {
 		// do nothing
 	}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
index ebce850..8abfb27 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
@@ -25,6 +25,7 @@
 
 import org.eclipse.wst.server.core.*;
 import org.eclipse.wst.server.core.internal.*;
+import org.eclipse.wst.server.core.util.PublishAdapter;
 import org.eclipse.wst.server.ui.ServerUIUtil;
 import org.eclipse.wst.server.ui.internal.actions.RunOnServerActionDelegate;
 import org.eclipse.wst.server.ui.internal.editor.IServerEditorInput;
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Startup.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Startup.java
index 0f2cd25..066ada6 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Startup.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Startup.java
@@ -13,10 +13,9 @@
 import org.eclipse.core.runtime.IStatus;
 
 import org.eclipse.wst.server.core.*;
-import org.eclipse.wst.server.core.internal.IPublishListener;
 import org.eclipse.wst.server.core.internal.IStartup;
-import org.eclipse.wst.server.core.internal.PublishAdapter;
 import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.util.PublishAdapter;
 import org.eclipse.wst.server.ui.internal.audio.Audio;
 /**
  *
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServerTableViewer.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServerTableViewer.java
index dbb5dc5..9eedbce 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServerTableViewer.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServerTableViewer.java
@@ -17,9 +17,8 @@
 import org.eclipse.jface.viewers.*;
 
 import org.eclipse.wst.server.core.*;
-import org.eclipse.wst.server.core.internal.IPublishListener;
-import org.eclipse.wst.server.core.internal.PublishAdapter;
 import org.eclipse.wst.server.core.internal.Server;
+import org.eclipse.wst.server.core.util.PublishAdapter;
 import org.eclipse.wst.server.ui.internal.Trace;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.widgets.Display;