[dna-commits] DNA SVN: r1068 - in branches/eclipse: org.jboss.dna.publish/.settings and 13 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Wed Jul 1 18:20:47 EDT 2009


Author: elvisisking
Date: 2009-07-01 18:20:46 -0400 (Wed, 01 Jul 2009)
New Revision: 1068

Added:
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/delete.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/edit_server.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/new_server.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Utils.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/DeleteServerAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/EditServerAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/NewServerAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerContentProvider.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerView.java
   branches/eclipse/org.jboss.dna.publish/jcip-annotations.jar
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IServerRegistryListener.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerRegistryEvent.java
Removed:
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/repository.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java
Modified:
   branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs
   branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF
   branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects/repository.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects/workspace.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java
   branches/eclipse/org.jboss.dna.publish/.settings/org.eclipse.jdt.core.prefs
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/IDnaObject.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
Log:
More updates to UI.

Modified: branches/eclipse/org.jboss.dna.publish/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- branches/eclipse/org.jboss.dna.publish/.settings/org.eclipse.jdt.core.prefs	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/.settings/org.eclipse.jdt.core.prefs	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,7 +1,20 @@
-#Wed May 20 08:35:05 CDT 2009
+#Wed Jul 01 08:15:03 CDT 2009
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
 org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
 org.eclipse.jdt.core.compiler.source=1.6

Added: branches/eclipse/org.jboss.dna.publish/jcip-annotations.jar
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish/jcip-annotations.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -39,8 +39,6 @@
     
     String ErrorSavingServerRegistry = "ErrorSavingServerRegistry"; //$NON-NLS-1$
     
-    String RemovingServerProblemMsg = "RemovingServerProblemMsg"; //$NON-NLS-1$
-    
     String RepositoryEmptyNameMsg = "RepositoryEmptyNameMsg"; //$NON-NLS-1$
     
     String RepositoryNullServerMsg = "RepositoryNullServerMsg"; //$NON-NLS-1$
@@ -55,6 +53,18 @@
     
     String ServerExistsMsg = "ServerExistsMsg"; //$NON-NLS-1$
     
+    String ServerManagerRegistryAddUnexpectedError = "ServerManagerRegistryAddUnexpectedError"; //$NON-NLS-1$
+    
+    String ServerManagerRegistryListenerError = "ServerManagerRegistryListenerError"; //$NON-NLS-1$
+    
+    String ServerManagerRegistryListenerErrorsOccurred = "ServerManagerRegistryListenerErrorsOccurred"; //$NON-NLS-1$
+    
+    String ServerManagerRegistryRemoveUnexpectedError = "ServerManagerRegistryRemoveUnexpectedError"; //$NON-NLS-1$
+    
+    String ServerManagerRegistryUpdateAddError = "ServerManagerRegistryUpdateAddError"; //$NON-NLS-1$
+    
+    String ServerManagerRegistryUpdateRemoveError = "ServerManagerRegistryUpdateRemoveError"; //$NON-NLS-1$
+    
     String ServerShortDescription = "ServerShortDescription"; //$NON-NLS-1$
     
     String WorkspaceEmptyNameMsg = "WorkspaceEmptyNameMsg"; //$NON-NLS-1$

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IServerRegistryListener.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IServerRegistryListener.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IServerRegistryListener.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,39 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public interface IServerRegistryListener {
+
+    /**
+     * @param event the event being processed
+     * @return any errors caught during the processing or <code>null</code>
+     * @since 0.6
+     */
+    Exception[] serverRegistryChanged( ServerRegistryEvent event );
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IServerRegistryListener.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -28,6 +28,7 @@
 
 /**
  * @author Dan Florian
+ * @since 0.6
  */
 public final class Logger {
 
@@ -36,36 +37,99 @@
     // ===========================================================================================================================
 
     /**
+     * @param status the status whose message is a {@link MessageFormat} pattern.
+     * @param arguments the arguments being inserted into the pattern
+     * @return the message
+     * @since 0.6
+     */
+    private static String getMessage( Status status,
+                                      Object... arguments ) {
+        return MessageFormat.format(status.getMessage(), arguments);
+    }
+
+    /**
      * @param clazz the class whose logger will be used
-     * @param error the error being logged
-     * @param message the message being logged
+     * @param status the status being logged
      * @since 0.6
      */
-    public static void error( Class<?> clazz,
-                              Throwable error,
-                              String message ) {
+    public static void log( Class<?> clazz,
+                            Status status ) {
         org.slf4j.Logger delegate = LoggerFactory.getLogger(clazz);
 
-        if (delegate.isErrorEnabled()) {
-            delegate.error(message, error);
+        if (status.isError() && delegate.isErrorEnabled()) {
+            if (status.getException() == null) {
+                delegate.error(status.getMessage());
+            } else {
+                delegate.error(status.getMessage(), status.getException());
+            }
+        } else if (status.isWarning() && delegate.isWarnEnabled()) {
+            if (status.getException() == null) {
+                delegate.warn(status.getMessage());
+            } else {
+                delegate.warn(status.getMessage(), status.getException());
+            }
+        } else if (status.isInfo() && delegate.isInfoEnabled()) {
+            if (status.getException() == null) {
+                delegate.info(status.getMessage());
+            } else {
+                delegate.info(status.getMessage(), status.getException());
+            }
+        } else {
+            if (delegate.isTraceEnabled()) {
+                if (status.getException() == null) {
+                    delegate.info(status.getMessage());
+                } else {
+                    delegate.info(status.getMessage(), status.getException());
+                }
+            }
         }
     }
 
     /**
      * @param clazz the class whose logger will be used
-     * @param error the error being logged
-     * @param pattern the message format pattern
+     * @param status the status being logged (status message is a {@link MessageFormat} pattern)
      * @param arguments the arguments to be inserted into the pattern
      * @since 0.6
      */
-    public static void error( Class<?> clazz,
-                              Throwable error,
-                              String pattern,
-                              Object... arguments ) {
+    public static void log( Class<?> clazz,
+                            Status status,
+                            Object... arguments ) {
         org.slf4j.Logger delegate = LoggerFactory.getLogger(clazz);
 
-        if (delegate.isErrorEnabled()) {
-            delegate.error(MessageFormat.format(pattern, arguments), error);
+        if (status.isError() && delegate.isErrorEnabled()) {
+            String msg = getMessage(status, arguments);
+
+            if (status.getException() == null) {
+                delegate.error(msg);
+            } else {
+                delegate.error(msg);
+            }
+        } else if (status.isWarning() && delegate.isWarnEnabled()) {
+            String msg = getMessage(status, arguments);
+
+            if (status.getException() == null) {
+                delegate.warn(msg);
+            } else {
+                delegate.warn(msg, status.getException());
+            }
+        } else if (status.isInfo() && delegate.isInfoEnabled()) {
+            String msg = getMessage(status, arguments);
+
+            if (status.getException() == null) {
+                delegate.info(msg);
+            } else {
+                delegate.info(msg, status.getException());
+            }
+        } else {
+            if (delegate.isTraceEnabled()) {
+                String msg = getMessage(status, arguments);
+
+                if (status.getException() == null) {
+                    delegate.info(msg);
+                } else {
+                    delegate.info(msg, status.getException());
+                }
+            }
         }
     }
 

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,3 +1,26 @@
+#
+# JBoss DNA (http://www.jboss.org/dna)
+# See the COPYRIGHT.txt file distributed with this work for information
+# regarding copyright ownership.  Some portions may be licensed
+# to Red Hat, Inc. under one or more contributor license agreements.
+# See the AUTHORS.txt file in the distribution for a full listing of 
+# individual contributors. 
+#
+# JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+# is licensed to you under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# JBoss DNA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
 ErrorDeletingServerRegistryFile = There was a problem deleting server registry file "{0}"
 ErrorRestoringServerRegistry = Error trying to restore the server registry from file "{0}"
 ErrorSavingServerRegistry = Error trying to save the server registry to "{0}"
@@ -2,4 +25,2 @@
 
-RemovingServerProblemMsg = {0} cannot be removed as it has not been registered
-
 RepositoryEmptyNameMsg = A repository name cannot be empty
@@ -14,6 +35,13 @@
 ServerInvalidUrlMsg = The  value "{0}" is not a valid server URL
 ServerShortDescription = DNA Server: URL={0} User={1}
 
+ServerManagerRegistryAddUnexpectedError = Unexpected error adding server to registry
+ServerManagerRegistryListenerError = This error was reported by an IServerRegistryListener
+ServerManagerRegistryListenerErrorsOccurred = Errors occurred processing a server registry event. Check error log for more details.
+ServerManagerRegistryRemoveUnexpectedError = {0} cannot be removed as it has not been registered
+ServerManagerRegistryUpdateAddError = There was an unexpected error updating the server in the registry. The old version of the server was successfully removed. However, the new version was not updated. Detail: {0}
+ServerManagerRegistryUpdateRemoveError = There was an unexpected error updating the server in the registry. The server has not been updated in the server registry. Detail: {0}
+
 WorkspaceEmptyNameMsg = A workspace name cannot be empty
 WorkspaceNullRepositoryMsg = A workspace repository cannot be null
 WorkspaceShortDescription = DNA Repository Workspace: Name: {0}, {1}

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -26,7 +26,6 @@
 import java.io.File;
 import java.net.Authenticator;
 import java.net.PasswordAuthentication;
-import java.util.Collection;
 import org.jboss.dna.publish.domain.Server;
 import org.jboss.dna.publish.domain.Workspace;
 
@@ -40,37 +39,68 @@
     // Constants
     // ===========================================================================================================================
 
-//    private static final String SERVER_CONTEXT = "/resources"; //$NON-NLS-1$
+    //    private static final String SERVER_CONTEXT = "/resources"; //$NON-NLS-1$
 
     // ===========================================================================================================================
     // Class Methods
     // ===========================================================================================================================
 
-    private static void setAuthenticator(final Server server) {
+    private static void setAuthenticator( final Server server ) {
         Authenticator.setDefault(new Authenticator() {
             @Override
             protected PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication(server.getUser(), server.getPassword().toCharArray());
             }
-        });        
+        });
     }
 
     // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The workspace where the publishing or unpublishing will take place.
+     * 
+     * @since 0.6
+     */
+    private final Workspace workspace;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param workspace the workspace to use when publishing or unpublishing
+     * @since 0.6
+     */
+    public Publisher( Workspace workspace ) {
+        this.workspace = workspace;
+    }
+
+    // ===========================================================================================================================
     // Methods
     // ===========================================================================================================================
 
-    public Status publish( Workspace workspace,
-                           Collection<File> files ) {
-        // TODO implement
+    /**
+     * @param file the file being published
+     * @return a status indicating if the publishing was successful
+     * @since 0.6
+     */
+    public Status publish( File file ) {
+        // TODO implement publish(File)
         Server server = workspace.getServer();
         setAuthenticator(server);
 
         return null;
     }
 
-    public Status unpublish( Workspace workspace,
-                             Collection<File> files ) {
-        // TODO implement
+    /**
+     * @param file the file being unpublished
+     * @return a status indicating if the unpublishing was successful
+     * @since 0.6
+     */
+    public Status unpublish( File file ) {
+        // TODO implement unpublish(File)
         return null;
     }
 

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -27,6 +27,7 @@
 import java.io.FileOutputStream;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -38,7 +39,9 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Repository;
 import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.Workspace;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -104,8 +107,15 @@
     // ===========================================================================================================================
 
     /**
+     * The listeners registered to receive {@link ServerRegistryEvent server registry events}.
+     * 
      * @since 0.6
      */
+    private final Collection<IServerRegistryListener> listeners;
+
+    /**
+     * @since 0.6
+     */
     private final String stateLocationPath;
 
     /**
@@ -125,6 +135,7 @@
     public ServerManager( String stateLocationPath ) {
         this.servers = Collections.synchronizedList(new ArrayList<Server>());
         this.stateLocationPath = stateLocationPath;
+        this.listeners = new ArrayList<IServerRegistryListener>();
     }
 
     // ===========================================================================================================================
@@ -132,6 +143,21 @@
     // ===========================================================================================================================
 
     /**
+     * Listeners already registered will not be added again.
+     * 
+     * @param listener the listener being register to receive events
+     * @return <code>true</code> if listener was added
+     * @since 0.6
+     */
+    public boolean addRegistryListener( IServerRegistryListener listener ) {
+        if (!this.listeners.contains(listener)) {
+            return this.listeners.add(listener);
+        }
+
+        return false;
+    }
+
+    /**
      * Registers the specified <code>Server</code>.
      * 
      * @param server the server being added
@@ -139,16 +165,7 @@
      * @since 0.6
      */
     public Status addServer( Server server ) {
-        if (!this.servers.contains(server)) {
-            this.servers.add(server);
-            return Status.OK_STATUS;
-        }
-
-        // server already exists
-        String pattern = MESSAGES.getString(ServerExistsMsg);
-        String msg = MessageFormat.format(pattern, server.getShortDescription());
-        Status status = new Status(Severity.ERROR, msg, null);
-        return status;
+        return internalAddServer(server, true);
     }
 
     /**
@@ -174,32 +191,163 @@
     }
 
     /**
-     * @param server the server being tested
-     * @return <code>true</code> if the server has been registered
+     * @param server the server whose repositories are being requested
+     * @return the server repositories (never <code>null</code>)
      * @since 0.6
      */
-    public boolean isRegistered( Server server ) {
-        return this.servers.contains(server);
+    public Collection<Repository> getRepositories( Server server ) {
+        // TODO implement getRepositories()
+        return Collections.emptyList();
     }
 
     /**
+     * @param repository the repository whose workspaces are being requested
+     * @return the DNA repository workspaces (never <code>null</code>)
+     * @since 0.6
+     */
+    public Collection<Workspace> getWorkspaces( Repository repository ) {
+        // TODO implement getWorkspaces()
+        return Collections.emptyList();
+    }
+
+    /**
+     * Registers the specified <code>Server</code>.
+     * 
+     * @param server the server being added
+     * @param notifyListeners indicates if registry listeners should be notified
+     * @return a status indicating if the server was added to the registry
+     * @since 0.6
+     */
+    private Status internalAddServer( Server server,
+                                      boolean notifyListeners ) {
+        if (!this.servers.contains(server)) {
+            if (this.servers.add(server)) {
+                if (notifyListeners) {
+                    Exception[] errors = notifyRegistryListeners(ServerRegistryEvent.createNewEvent(server));
+                    return processRegistryListenerErrors(errors);
+                }
+
+                return Status.OK_STATUS;
+            }
+
+            // server was not added to registry for unexpected reason
+            return new Status(Severity.ERROR, ServerManagerRegistryAddUnexpectedError, null);
+        }
+
+        // server already exists
+        String pattern = MESSAGES.getString(ServerExistsMsg);
+        String msg = MessageFormat.format(pattern, server.getShortDescription());
+        Status status = new Status(Severity.ERROR, msg, null);
+        return status;
+    }
+
+    /**
      * @param server the server being removed
+     * @param notifyListeners indicates if registry listeners should be notified
      * @return a status indicating if the specified server was removed from the registry
      * @since 0.6
      */
-    public Status removeServer( Server server ) {
+    private Status internalRemoveServer( Server server,
+                                         boolean notifyListeners ) {
         if (this.servers.remove(server)) {
+            if (notifyListeners) {
+                Exception[] errors = notifyRegistryListeners(ServerRegistryEvent.createRemoveEvent(server));
+                return processRegistryListenerErrors(errors);
+            }
+
             return Status.OK_STATUS;
         }
 
         // server could not be removed
-        String pattern = MESSAGES.getString(RemovingServerProblemMsg);
+        String pattern = MESSAGES.getString(ServerManagerRegistryRemoveUnexpectedError);
         String msg = MessageFormat.format(pattern, server.getShortDescription());
         Status status = new Status(Severity.ERROR, msg, null);
         return status;
     }
 
     /**
+     * @param server the server being tested
+     * @return <code>true</code> if the server has been registered
+     * @since 0.6
+     */
+    public boolean isRegistered( Server server ) {
+        return this.servers.contains(server);
+    }
+
+    /**
+     * @param event the event the registry listeners are to process
+     * @return any errors thrown by or found by the listeners or <code>null</code> (never empty)
+     * @since 0.6
+     */
+    private Exception[] notifyRegistryListeners( ServerRegistryEvent event ) {
+        if (!this.listeners.isEmpty()) {
+            Collection<Exception> errors = null;
+            Collection<IServerRegistryListener> registryListeners = new ArrayList<IServerRegistryListener>(this.listeners);
+
+            for (IServerRegistryListener l : registryListeners) {
+                try {
+                    Exception[] problems = l.serverRegistryChanged(event);
+
+                    if ((problems != null) && (problems.length != 0)) {
+                        if (errors == null) {
+                            errors = new ArrayList<Exception>();
+                        }
+
+                        errors.addAll(Arrays.asList(problems));
+                    }
+                } catch (Exception e) {
+                    if (errors == null) {
+                        errors = new ArrayList<Exception>();
+                    }
+
+                    errors.add(e);
+                }
+            }
+
+            if ((errors != null) && !errors.isEmpty()) {
+                return errors.toArray(new Exception[errors.size()]);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * @param errors the errors reported by the registry listeners
+     * @return a status indicating if registry listeners reported any errors
+     * @since 0.6
+     */
+    private Status processRegistryListenerErrors( Exception[] errors ) {
+        if (errors == null) {
+            return Status.OK_STATUS;
+        }
+
+        for (Exception error : errors) {
+            Logger.log(getClass(), new Status(Severity.ERROR, ServerManagerRegistryListenerError, error));
+        }
+
+        return new Status(Severity.WARNING, ServerManagerRegistryListenerErrorsOccurred, null);
+    }
+
+    /**
+     * @param listener the listener being unregistered and will no longer receive events
+     * @return <code>true</code> if listener was removed
+     * @since 0.6
+     */
+    public boolean removeRegistryListener( IServerRegistryListener listener ) {
+        return this.listeners.remove(listener);
+    }
+
+    /**
+     * @param server the server being removed
+     * @return a status indicating if the specified server was removed from the registry
+     * @since 0.6
+     */
+    public Status removeServer( Server server ) {
+        return internalRemoveServer(server, true);
+    }
+
+    /**
      * @return a status indicating if the previous session state was restored successfully
      * @since 0.6
      */
@@ -298,6 +446,42 @@
         return new File(getStateFileName()).exists();
     }
 
+    /**
+     * Updates the server registry with a new version of a server.
+     * 
+     * @param previousServerVersion the version of the server being replaced
+     * @param newServerVersion the new version of the server being put in the server registry
+     * @return a status indicating if the server was updated in the registry
+     * @since 0.6
+     */
+    public Status updateServer( Server previousServerVersion,
+                                Server newServerVersion ) {
+        Status status = internalRemoveServer(previousServerVersion, false);
+
+        if (status.isOk()) {
+            status = internalAddServer(newServerVersion, false);
+
+            if (status.isOk()) {
+                // all good so notify listeners
+                Exception[] errors = notifyRegistryListeners(ServerRegistryEvent.createUpdateEvent(previousServerVersion,
+                                                                                                   newServerVersion));
+                return processRegistryListenerErrors(errors);
+            }
+
+            // unexpected problem adding new version of server to registry
+            String pattern = MESSAGES.getString(ServerManagerRegistryUpdateAddError);
+            String msg = MessageFormat.format(pattern, status.getMessage());
+            status = new Status(Severity.ERROR, msg, status.getException());
+            return status;
+        }
+
+        // unexpected problem removing server from registry
+        String pattern = MESSAGES.getString(ServerManagerRegistryUpdateRemoveError);
+        String msg = MessageFormat.format(pattern, status.getMessage());
+        status = new Status(Severity.ERROR, msg, status.getException());
+        return status;
+    }
+
     // ===========================================================================================================================
     // Methods
     // ===========================================================================================================================

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerRegistryEvent.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerRegistryEvent.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerRegistryEvent.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,197 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish;
+
+import org.jboss.dna.publish.domain.Server;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerRegistryEvent {
+
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The status severity levels.
+     * 
+     * @since 0.6
+     */
+    public enum Type {
+        /**
+         * Indicates that a new server was added to the server registry.
+         * 
+         * @since 0.6
+         */
+        NEW,
+
+        /**
+         * Indicates that a server was removed from the server registry.
+         * 
+         * @since 0.6
+         */
+        REMOVE,
+
+        /**
+         * Indicates that properties of an existing server in the registry has been changed.
+         * 
+         * @since 0.6
+         */
+        UPDATE
+    }
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param newServer the server that was added to the server registry
+     * @return the event
+     * @see Type#NEW
+     * @since 0.6
+     */
+    public static ServerRegistryEvent createNewEvent( Server newServer ) {
+        return new ServerRegistryEvent(Type.NEW, newServer);
+    }
+
+    /**
+     * @param removedServer the server removed from the server registry
+     * @return the event
+     * @see Type#REMOVE
+     * @since 0.6
+     */
+    public static ServerRegistryEvent createRemoveEvent( Server removedServer ) {
+        return new ServerRegistryEvent(Type.REMOVE, removedServer);
+    }
+
+    /**
+     * @param previousServerVersion the server being updated (this instance is no longer found in the server registry)
+     * @param newServerVersion the updated version of the server (this is now contained in the server registry)
+     * @return the event
+     * @see Type#UPDATE
+     * @since 0.6
+     */
+    public static ServerRegistryEvent createUpdateEvent( Server previousServerVersion,
+                                                         Server newServerVersion ) {
+        ServerRegistryEvent event = new ServerRegistryEvent(Type.UPDATE, previousServerVersion);
+        event.updatedServer = newServerVersion;
+        return event;
+    }
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The server being added, removed, or updated.
+     * 
+     * @since 0.6
+     */
+    private final Server server;
+
+    /**
+     * The event type.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
+    /**
+     * The server that is replacing an existing server. Will be <code>null</code> for all types except {@link Type#UPDATE update}.
+     * 
+     * @since 0.6
+     */
+    private Server updatedServer;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param type the event type
+     * @param server the server being added, removed, or updated
+     * @since 0.6
+     */
+    private ServerRegistryEvent( Type type,
+                                 Server server ) {
+        this.type = type;
+        this.server = server;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @return the added, removed, or the old version of the server that has been updated
+     * @since 0.6
+     */
+    public Server getServer() {
+        return this.server;
+    }
+
+    /**
+     * @return the new version of an existing server that has been updated
+     * @throws UnsupportedOperationException if method is called when the type is not an update
+     * @see Type#UPDATE
+     * @since 0.6
+     */
+    public Server getUpdatedServer() {
+        if (this.type != Type.UPDATE) {
+            throw new UnsupportedOperationException();
+        }
+
+        return this.updatedServer;
+    }
+
+    /**
+     * @return <code>true</code> if the event is adding a new server to the registry
+     * @see Type#NEW
+     * @since 0.6
+     */
+    public boolean isNew() {
+        return (this.type == Type.NEW);
+    }
+
+    /**
+     * @return <code>true</code> if the event is removing a server from the registry
+     * @see Type#REMOVE
+     * @since 0.6
+     */
+    public boolean isRemove() {
+        return (this.type == Type.REMOVE);
+    }
+
+    /**
+     * @return <code>true</code> if the event is updating properties of an existing server in the registry
+     * @see Type#UPDATE
+     * @since 0.6
+     */
+    public boolean isUpdate() {
+        return (this.type == Type.UPDATE);
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerRegistryEvent.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/IDnaObject.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/IDnaObject.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/IDnaObject.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -23,8 +23,6 @@
  */
 package org.jboss.dna.publish.domain;
 
-import java.util.List;
-
 /**
  * The IDnaObject class defines a business object.
  * 
@@ -34,24 +32,12 @@
 public interface IDnaObject {
 
     /**
-     * @return an ordered list of children (never <code>null</code>)
-     * @since 0.6
-     */
-    List<? extends IDnaObject> getChildren();
-
-    /**
      * @return the object name (never <code>null</code>)
      * @since 0.6
      */
     String getName();
 
     /**
-     * @return the parent or <code>null</code>
-     * @since 0.6
-     */
-    IDnaObject getParent();
-
-    /**
      * @return a description suitable for use in a tooltip (never <code>null</code>)
      * @since 0.6
      */

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -24,10 +24,6 @@
 package org.jboss.dna.publish.domain;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
 import org.jboss.dna.publish.IConstants;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.domain.validation.RepositoryValidator;
@@ -77,7 +73,7 @@
                        Server server ) {
         // validate inputs
         Status status = RepositoryValidator.isValid(name, server);
-        
+
         if (status.isError()) {
             throw new RuntimeException(status.getMessage(), status.getException());
         }
@@ -110,19 +106,6 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getChildren()
-     * @since 0.6
-     */
-    @Override
-    public List<? extends IDnaObject> getChildren() {
-        // a repository's children are workspaces
-        Collection<Workspace> kids = getWorkspaces();
-        return Arrays.asList(kids.toArray(new IDnaObject[kids.size()]));
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
      * @see org.jboss.dna.publish.domain.IDnaObject#getName()
      * @since 0.6
      */
@@ -132,18 +115,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getParent()
-     * @since 0.6
-     */
-    @Override
-    public IDnaObject getParent() {
-        // a repository's parent is a server
-        return getServer();
-    }
-
-    /**
      * @return the server where this repository is located (never <code>null</code>)
      * @since 0.6
      */
@@ -164,15 +135,6 @@
     }
 
     /**
-     * @return the DNA repository workspaces (never <code>null</code>)
-     * @since 0.6
-     */
-    public Collection<Workspace> getWorkspaces() {
-        // TODO implement getWorkspaces()
-        return Collections.emptyList();
-    }
-
-    /**
      * {@inheritDoc}
      * 
      * @see java.lang.Object#hashCode()

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -24,12 +24,7 @@
 package org.jboss.dna.publish.domain;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
 import org.jboss.dna.publish.IConstants;
-import org.jboss.dna.publish.ServerManager;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.domain.validation.RepositoryValidator;
 import org.jboss.dna.publish.domain.validation.ServerValidator;
@@ -52,13 +47,6 @@
      * @since 0.6
      */
     private final String password;
-    
-    /**
-     * The server manager that manages the server registry.
-     * 
-     * @since 0.6
-     */
-    private ServerManager serverManager;
 
     /**
      * The server URL.
@@ -127,20 +115,6 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getChildren()
-     * @see #getRepositories()
-     * @since 0.6
-     */
-    @Override
-    public List<? extends IDnaObject> getChildren() {
-        // a server's children are repositories
-        Collection<Repository> kids = getRepositories();
-        return Arrays.asList(kids.toArray(new IDnaObject[kids.size()]));
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
      * @see org.jboss.dna.publish.domain.IDnaObject#getName()
      * @since 0.6
      */
@@ -150,18 +124,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getParent()
-     * @since 0.6
-     */
-    @Override
-    public IDnaObject getParent() {
-        // a server does not have a parent
-        return null;
-    }
-
-    /**
      * @return the server authentication password
      * @since 0.6
      */
@@ -170,18 +132,6 @@
     }
 
     /**
-     * @return the server DNA repositories (never <code>null</code>)
-     * @since 0.6
-     */
-    public Collection<Repository> getRepositories() {
-        if (this.serverManager != null) {
-            // TODO implement getRepositories()
-        }
-        
-        return Collections.emptyList();
-    }
-
-    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.publish.domain.IDnaObject#getShortDescription()
@@ -223,12 +173,4 @@
         return hash;
     }
 
-    /**
-     * @param serverManager the server manager (may be <code>null</code>)
-     * @since 0.6
-     */
-    public void setServerManager( ServerManager serverManager ) {
-        this.serverManager = serverManager;
-    }
-
 }

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -24,8 +24,6 @@
 package org.jboss.dna.publish.domain;
 
 import java.text.MessageFormat;
-import java.util.Collections;
-import java.util.List;
 import org.jboss.dna.publish.IConstants;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.domain.validation.WorkspaceValidator;
@@ -73,7 +71,7 @@
                       Repository repository ) {
         // validate inputs
         Status status = WorkspaceValidator.isValid(name, repository);
-        
+
         if (status.isError()) {
             throw new RuntimeException(status.getMessage(), status.getException());
         }
@@ -106,18 +104,6 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getChildren()
-     * @since 0.6
-     */
-    @Override
-    public List<? extends IDnaObject> getChildren() {
-        // workspaces don't have children for 0.6 (this will change for future versions)
-        return Collections.emptyList();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
      * @see org.jboss.dna.publish.domain.IDnaObject#getName()
      * @since 0.6
      */
@@ -127,24 +113,13 @@
     }
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.publish.domain.IDnaObject#getParent()
-     * @since 0.6
-     */
-    @Override
-    public IDnaObject getParent() {
-        return getRepository();
-    }
-    
-    /**
      * @return the repository where this workspace is located (never <code>null</code>)
      * @since 0.6
      */
     public Repository getRepository() {
         return this.repository;
     }
-    
+
     /**
      * @return the server where this workspace is located (never <code>null</code>)
      * @since 0.6
@@ -164,10 +139,10 @@
         String pattern = MESSAGES.getString(WorkspaceShortDescription);
         return MessageFormat.format(pattern, this.name, this.repository.getShortDescription());
     }
-    
+
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see java.lang.Object#hashCode()
      * @since 0.6
      */
@@ -177,6 +152,6 @@
         hash = 31 * hash + this.name.hashCode();
         hash = 31 * hash + this.repository.hashCode();
         return hash;
-     }
+    }
 
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,7 +1,20 @@
-#Wed Jun 17 07:47:51 CDT 2009
+#Wed Jul 01 08:14:43 CDT 2009
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
 org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
 org.eclipse.jdt.core.compiler.source=1.6

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF	2009-07-01 22:20:46 UTC (rev 1068)
@@ -5,9 +5,10 @@
 Bundle-Version: 1.0.0
 Bundle-Activator: org.jboss.dna.publish.ui.swt.Activator
 Bundle-Vendor: %bundleVendor
+Bundle-Localization: plugin
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime,
  org.jboss.dna.publish,
- org.eclipse.core.resources;bundle-version="3.4.2"
+ org.eclipse.core.resources
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties	2009-07-01 22:20:46 UTC (rev 1068)
@@ -5,3 +5,4 @@
                plugin.properties,\
                icons/,\
                plugin.xml
+src.includes = src/

Copied: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects (from rev 1062, branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16)

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects/repository.gif
===================================================================
(Binary files differ)

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/objects/workspace.gif
===================================================================
(Binary files differ)

Copied: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views (from rev 1062, branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/cview16)

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/delete.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/delete.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/edit_server.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/edit_server.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/new_server.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/new_server.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Deleted: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/views/repository.gif
===================================================================
(Binary files differ)

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties	2009-07-01 22:20:46 UTC (rev 1068)
@@ -26,5 +26,5 @@
 contextMenu.label = DNA
 dnaCategory = DNA
 publishAction.label = Publish
-repositoryView = DNA Repositories
+serverView = DNA Servers
 unpublishAction.label = Unpublish
\ No newline at end of file

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml	2009-07-01 22:20:46 UTC (rev 1068)
@@ -6,10 +6,10 @@
    <extension
          point="org.eclipse.ui.popupMenus">
       <objectContribution
-            id="org.jboss.dna.publish.iresourcepopupmenucontribution"
+            id="org.jboss.dna.publish.ui.swt.iresourcepopupmenucontribution"
             objectClass="org.eclipse.core.resources.IResource">
          <menu
-               id="org.jboss.dna.publish.contextMenu"
+               id="org.jboss.dna.publish.ui.swt.contextMenu"
                label="%contextMenu.label"
                path="additions">
             <separator
@@ -22,7 +22,7 @@
                id="org.jboss.dna.publish.ui.swt.unpublishAction"
                label="%unpublishAction.label"
                class="org.jboss.dna.publish.ui.swt.actions.UnpublishAction"
-               menubarPath="org.jboss.dna.publish.contextMenu/group1"
+               menubarPath="org.jboss.dna.publish.ui.swt.contextMenu/group1"
                enablesFor="*">
          </action>
          
@@ -31,7 +31,7 @@
                id="org.jboss.dna.publish.ui.swt.publishAction"
                label="%publishAction.label"
                class="org.jboss.dna.publish.ui.swt.actions.PublishAction"
-               menubarPath="org.jboss.dna.publish.contextMenu/group1"
+               menubarPath="org.jboss.dna.publish.ui.swt.contextMenu/group1"
                enablesFor="*">
          </action>
       </objectContribution>
@@ -47,12 +47,12 @@
       
       <!-- Repository view -->
       <view
-            id="respositoryView"
-            name="%repositoryView"
+            id="serverView"
+            name="%serverView"
             category="org.jboss.dna"
-            class="org.jboss.dna.publish.ui.swt.views.RepositoryView"
+            class="org.jboss.dna.publish.ui.swt.views.ServerView"
             fastViewWidthRatio="0.25"
-            icon="icons/full/cview16/repository.gif">
+            icon="icons/objects/server.gif">
       </view>
    </extension>
 

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -24,9 +24,9 @@
 package org.jboss.dna.publish.ui.swt;
 
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.jboss.dna.publish.Logger;
 import org.jboss.dna.publish.ServerManager;
@@ -80,26 +80,31 @@
     private ServerManager serverMgr;
 
     // ===========================================================================================================================
-    // Constructors
+    // Methods
     // ===========================================================================================================================
 
-    /**
-     * Constructs the plugin activator. If constructed outside of Eclipse the {@link #initialize(String)} method must be called to
-     * construct the {@link ServerManager server manager}.
-     * 
-     * @since 0.6
-     */
-    public Activator() {
-        super();
-        plugin = this;
+    public Image getSharedImage(String imageId) {
+        Image result = PlatformUI.getWorkbench().getSharedImages().getImage(imageId);
+        
+        if (result != null) {
+            return result;
+        }
+        
+        return ImageDescriptor.getMissingImageDescriptor().createImage();
     }
 
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
+    public ImageDescriptor getSharedImageDescriptor(String imageId) {
+        ImageDescriptor result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(imageId);
+        
+        if (result != null) {
+            return result;
+        }
+        
+        return ImageDescriptor.getMissingImageDescriptor();
+    }
+    
     /**
-     * @param object the object whose image is being requested
+     * @param object the object whose image is being requested (domain object or plugin-relative path)
      * @return the image or <code>null</code> if not found
      * @since 0.6
      */
@@ -156,7 +161,6 @@
 
     /**
      * @return the server manager or <code>null</code> if activator has not been initialized or started
-     * @see #initialize(String)
      * @see #start(BundleContext)
      * @since 0.6
      */
@@ -165,63 +169,33 @@
     }
 
     /**
-     * Performs plugin initialization. One thing it does is initialize the {@link ServerManager server manager}.
-     * <p>
-     * Note: This should <strong>ONLY</strong> be called when the OSGi framework is not running (i.e., {@link BundleContext bundle
-     * context} is <code>null</code>) and should be called instead of calling {@link #start(BundleContext)}.
-     * 
-     * @param stateLocationPath the file system directory where state files can be stored or <code>null</code> if saving state is
-     *        not desired
+     * @param status the status being logged
      * @since 0.6
      */
-    public void initialize( String stateLocationPath ) {
-        this.serverMgr = new ServerManager(stateLocationPath);
-        Status status = this.serverMgr.restoreState();
-
-        // problem restoring server registry
-        if (status.isError()) {
-            log(getClass(), status);
-        }
-    }
-
-    public void log( Class<?> sourceClass,
-                     Status status ) {
-        if (Platform.isRunning()) {
-            IStatus eclipseStatus;
-
-            if (status instanceof EclipseStatus) {
-                eclipseStatus = ((EclipseStatus)status).getDelegate();
-            } else {
-                eclipseStatus = new org.eclipse.core.runtime.Status(EclipseStatus.convertSeverity(status.getSeverity()),
+    public void log( Status status ) {
+        IStatus eclipseStatus = new org.eclipse.core.runtime.Status(Utils.convertSeverity(status.getSeverity()),
                                                                     IUiConstants.PLUGIN_ID, status.getMessage(),
                                                                     status.getException());
-            }
-
-            getLog().log(eclipseStatus);
-        } else {
-            Logger.error(getClass(), status.getException(), status.getMessage());
-        }
+        getLog().log(eclipseStatus);
     }
 
-    public void log( Class<?> sourceClass,
-                     IStatus status ) {
-        log(sourceClass, new EclipseStatus(status));
-    }
-
     /**
      * {@inheritDoc}
-     * <p>
-     * If OSGi is not running this does nothing.
      * 
      * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
      * @since 0.6
      */
     @Override
     public void start( BundleContext context ) throws Exception {
-        if (context != null) {
-            // OSGi is running
-            super.start(context);
-            initialize(plugin.getStateLocation().toFile().getAbsolutePath());
+        super.start(context);
+        plugin = this;
+
+        this.serverMgr = new ServerManager(getStateLocation().toFile().getAbsolutePath());
+        Status status = this.serverMgr.restoreState();
+
+        // problem restoring server registry
+        if (!status.isOk()) {
+            Logger.log(getClass(), status);
         }
     }
 
@@ -235,17 +209,15 @@
     public void stop( BundleContext context ) throws Exception {
         if (this.serverMgr != null) {
             Status status = this.serverMgr.saveState();
-            
-            if (status.isError()) {
-                log(getClass(), status);
+
+            if (!status.isOk()) {
+                log(status);
             }
 
             this.serverMgr = null;
         }
 
-        if (context != null) {
-            super.stop(context);
-        }
+        super.stop(context);
 
         plugin = null;
     }

Deleted: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,112 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors.
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- * 
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.publish.ui.swt;
-
-import org.eclipse.core.runtime.IStatus;
-import org.jboss.dna.publish.Status;
-
-/**
- * Converts an Eclipse status into an non-Eclipse status.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public class EclipseStatus extends Status {
-
-    // ===========================================================================================================================
-    // Class Methods
-    // ===========================================================================================================================
-
-    /**
-     * Converts the non-Eclipse status severity to an Eclipse severity level. An {@link Status.Severity#UNKNOWN unknown status} is
-     * converted to {@link IStatus#CANCEL cancel}. A {@link Status.Severity} is
-     * 
-     * @param severity the eclipse status severity level
-     * @return the converted severity level
-     * @see IStatus
-     * @since 0.6
-     */
-    public static int convertSeverity( Severity severity ) {
-        if (severity == Severity.OK) return IStatus.OK;
-        if (severity == Severity.ERROR) return IStatus.ERROR;
-        if (severity == Severity.WARNING) return IStatus.WARNING;
-        if (severity == Severity.INFO) return IStatus.INFO;
-        return IStatus.CANCEL;
-    }
-
-    /**
-     * Converts the Eclipse status severity level to a non-Eclipse severity.
-     * 
-     * @param severity the eclipse status severity level
-     * @return the converted severity level
-     * @see IStatus
-     * @since 0.6
-     */
-    public static Severity convertSeverity( int severity ) {
-        if (severity == IStatus.OK) return Severity.OK;
-        if (severity == IStatus.ERROR) return Severity.ERROR;
-        if (severity == IStatus.WARNING) return Severity.WARNING;
-        if (severity == IStatus.INFO) return Severity.INFO;
-        return Severity.UNKNOWN;
-    }
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
-     * The Eclipse status.
-     * 
-     * @since 0.6
-     */
-    private final IStatus delegate;
-
-    // ===========================================================================================================================
-    // Constructors
-    // ===========================================================================================================================
-
-    /**
-     * @param delegate the eclipse status delegate
-     * @since 0.6
-     */
-    public EclipseStatus( IStatus delegate ) {
-        this.delegate = delegate;
-        this.severity = convertSeverity(delegate.getSeverity());
-        this.message = delegate.getMessage();
-        this.exception = delegate.getException();
-    }
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * @return the Eclipse status object
-     * @since 0.6
-     */
-    public IStatus getDelegate() {
-        return this.delegate;
-    }
-
-}

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -32,17 +32,19 @@
  * @since 0.6
  */
 public final class I18n extends NLS {
+    
+    public static String BasePublishingActionPublishingWizardErrorMsg;
+    public static String BasePublishingActionUnpublishingWizardErrorMsg;
 
     public static String CollapseActionToolTip;
 
-    public static String DeleteServerActionText;
     public static String DeleteServerActionToolTip;
 
+    public static String DeleteServerDialogErrorsOccurredMsg;
+    public static String DeleteServerDialogMultipleServersMsg;
+    public static String DeleteServerDialogOneServerMsg;
     public static String DeleteServerDialogTitle;
-    public static String DeleteServerDialogOneServerMessage;
-    public static String DeleteServerDialogMultipleServersMessage;
 
-    public static String EditServerActionText;
     public static String EditServerActionToolTip;
     
     public static String ErrorDialogTitle;
@@ -57,12 +59,16 @@
     public static String PublishPageMissingRepositoryStatusMsg;
     public static String PublishPageMissingServerStatusMsg;
     public static String PublishPageMissingWorkspaceStatusMsg;
+    public static String PublishPageNewServerButton;
     public static String PublishPageNoAvailableRepositoriesStatusMsg;
     public static String PublishPageNoAvailableServersStatusMsg;
     public static String PublishPageNoAvailableWorkspacesStatusMsg;
     public static String PublishPageNoResourcesStatusMsg;
     public static String PublishPagePublishOkStatusMsg;
     public static String PublishPagePublishResourcesLabel;
+    public static String PublishPageRecurseCheckBox;
+    public static String PublishPageRecurseCheckBoxToolTip;
+    public static String PublishPageRecurseProcessingErrorMsg;
     public static String PublishPageRepositoryLabel;
     public static String PublishPageRepositoryToolTip;
     public static String PublishPageServerLabel;
@@ -93,10 +99,11 @@
     public static String ServerPageUserLabel;
     public static String ServerPageUserToolTip;
 
+    public static String ServerWizardEditServerErrorMsg;
     public static String ServerWizardEditServerTitle;
+    public static String ServerWizardNewServerErrorMsg;
     public static String ServerWizardNewServerTitle;
     
-    public static String NewServerActionText;
     public static String NewServerActionToolTip;
 
     static {

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -36,14 +36,30 @@
      */
     String PLUGIN_ID = "org.jboss.dna.publish.ui.swt"; //$NON-NLS-1$
 
-    String ICON_PATH = "icons/full/"; //$NON-NLS-1$
+    String ICON_PATH = "icons/"; //$NON-NLS-1$
+    
+    //
+    // /icons/objects/
+    //
 
-    String OBJ16 = ICON_PATH + "obj16/"; //$NON-NLS-1$
+    String OBJECT_ICONS_FOLDER = ICON_PATH + "objects/"; //$NON-NLS-1$
 
-    String REPOSITORY_IMAGE_PATH = OBJ16 + "repository.gif"; //$NON-NLS-1$
+    String REPOSITORY_IMAGE_PATH = OBJECT_ICONS_FOLDER + "repository.gif"; //$NON-NLS-1$
 
-    String SERVER_IMAGE_PATH = OBJ16 + "server.gif"; //$NON-NLS-1$
+    String SERVER_IMAGE_PATH = OBJECT_ICONS_FOLDER + "server.gif"; //$NON-NLS-1$
 
-    String WORKSPACE_IMAGE_PATH = OBJ16 + "workspace.gif"; //$NON-NLS-1$
+    String WORKSPACE_IMAGE_PATH = OBJECT_ICONS_FOLDER + "workspace.gif"; //$NON-NLS-1$
+    
+    //
+    // /icons/views/
+    //
 
+    String VIEW_ICONS_FOLDER = ICON_PATH + "views/"; //$NON-NLS-1$
+
+    String DELETE_SERVER_PATH = VIEW_ICONS_FOLDER + "delete.gif"; //$NON-NLS-1$
+
+    String EDIT_SERVER_IMAGE_PATH = VIEW_ICONS_FOLDER + "edit_server.gif"; //$NON-NLS-1$
+
+    String NEW_SERVER_IMAGE_PATH = VIEW_ICONS_FOLDER + "new_server.gif"; //$NON-NLS-1$
+
 }

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Utils.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Utils.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Utils.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,86 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt;
+
+import org.eclipse.core.runtime.IStatus;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class Utils {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * Converts the non-Eclipse status severity to an Eclipse severity level. An {@link Status.Severity#UNKNOWN unknown status} is
+     * converted to {@link IStatus#CANCEL cancel}. A {@link Status.Severity} is
+     * 
+     * @param severity the eclipse status severity level
+     * @return the converted severity level
+     * @see IStatus
+     * @since 0.6
+     */
+    public static int convertSeverity( Severity severity ) {
+        if (severity == Severity.OK) return IStatus.OK;
+        if (severity == Severity.ERROR) return IStatus.ERROR;
+        if (severity == Severity.WARNING) return IStatus.WARNING;
+        if (severity == Severity.INFO) return IStatus.INFO;
+        return IStatus.CANCEL;
+    }
+
+    /**
+     * Converts the Eclipse status severity level to a non-Eclipse severity.
+     * 
+     * @param severity the eclipse status severity level
+     * @return the converted severity level
+     * @see IStatus
+     * @since 0.6
+     */
+    public static Severity convertSeverity( int severity ) {
+        if (severity == IStatus.OK) return Severity.OK;
+        if (severity == IStatus.ERROR) return Severity.ERROR;
+        if (severity == IStatus.WARNING) return Severity.WARNING;
+        if (severity == IStatus.INFO) return Severity.INFO;
+        return Severity.UNKNOWN;
+    }
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Don't allow construction.
+     * 
+     * @since 0.6
+     */
+    public Utils() {
+        // nothing to do
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Utils.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -26,14 +26,19 @@
 import java.util.Collections;
 import java.util.List;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
 import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.I18n;
 import org.jboss.dna.publish.ui.swt.wizards.PublishWizard;
 import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
@@ -60,7 +65,7 @@
      * @since 0.6
      */
     private Shell shell;
-    
+
     /**
      * Indicates if this is a publishing or unpublishing action.
      * 
@@ -76,10 +81,10 @@
      * @param type indicates the type of action
      * @since 0.6
      */
-    public BasePublishingAction(Type type) {
+    public BasePublishingAction( Type type ) {
         this.type = type;
     }
-    
+
     // ===========================================================================================================================
     // Methods
     // ===========================================================================================================================
@@ -105,7 +110,20 @@
         }
 
         // run wizard
-        new WizardDialog(shell, new PublishWizard(this.type, resources, Activator.getDefault().getServerManager()));
+        try {
+            new WizardDialog(shell, new PublishWizard(this.type, resources, Activator.getDefault().getServerManager())).open();
+        } catch (CoreException e) {
+            String msg = null;
+
+            if (this.type == Type.PUBLISH) {
+                msg = I18n.BasePublishingActionPublishingWizardErrorMsg;
+            } else {
+                msg = I18n.BasePublishingActionUnpublishingWizardErrorMsg;
+            }
+
+            Activator.getDefault().log(new Status(Severity.ERROR, msg, e));
+            MessageDialog.openError(this.shell, I18n.ErrorDialogTitle, msg);
+        }
     }
 
     /**

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/DeleteServerAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/DeleteServerAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/DeleteServerAction.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,160 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.dialogs.DeleteServerDialog;
+
+/**
+ * The DeleteServerAction deletes one or more servers from the server registry.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class DeleteServerAction extends BaseSelectionListenerAction {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The server manager used to delete servers.
+     * 
+     * @since 0.6
+     */
+    private final ServerManager serverManager;
+
+    /**
+     * The servers being deleted (never <code>null</code>).
+     * 
+     * @since 0.6
+     */
+    private final List<Server> serversToDelete;
+
+    /**
+     * The shell used to display the delete confirmation dialog.
+     * 
+     * @since 0.6
+     */
+    private final Shell shell;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param shell the parent shell used to display the confirmation dialog
+     * @param serverManager the server manager to use when deleting servers
+     * @since 0.6
+     */
+    public DeleteServerAction( Shell shell,
+                               ServerManager serverManager ) {
+        super(""); //$NON-NLS-1$
+        setToolTipText(I18n.DeleteServerActionToolTip);
+        setImageDescriptor(Activator.getDefault().getSharedImageDescriptor(ISharedImages.IMG_ETOOL_DELETE));
+        setDisabledImageDescriptor(Activator.getDefault().getSharedImageDescriptor(ISharedImages.IMG_ETOOL_DELETE_DISABLED));
+        setEnabled(false);
+
+        this.serversToDelete = new ArrayList<Server>(5);
+        this.shell = shell;
+        this.serverManager = serverManager;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.action.Action#run()
+     * @since 0.6
+     */
+    @Override
+    public void run() {
+        Dialog dialog = new DeleteServerDialog(this.shell, this.serversToDelete);
+
+        if (dialog.getReturnCode() == Window.OK) {
+            boolean errorsOccurred = false;
+
+            for (Server server : this.serversToDelete) {
+                Status status = this.serverManager.removeServer(server);
+
+                if (!status.isOk()) {
+                    Activator.getDefault().log(status);
+
+                    if (status.isError()) {
+                        errorsOccurred = true;
+                    }
+                }
+            }
+
+            if (errorsOccurred) {
+                MessageDialog.openError(this.shell, I18n.ErrorDialogTitle, I18n.DeleteServerDialogErrorsOccurredMsg);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
+     * @since 0.6
+     */
+    @Override
+    protected boolean updateSelection( IStructuredSelection selection ) {
+        // disable if empty selection
+        if (selection.isEmpty()) {
+            this.serversToDelete.clear();
+            return false;
+        }
+
+        // disable if one non-server is found
+        for (Object obj : selection.toArray()) {
+            if (obj instanceof Server) {
+                this.serversToDelete.add((Server)obj);
+            } else {
+                this.serversToDelete.clear();
+                return false;
+            }
+        }
+
+        // enable since all objects are servers
+        return true;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/DeleteServerAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/EditServerAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/EditServerAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/EditServerAction.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,131 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt.actions;
+
+import static org.jboss.dna.publish.ui.swt.IUiConstants.EDIT_SERVER_IMAGE_PATH;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.wizards.ServerWizard;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class EditServerAction extends BaseSelectionListenerAction {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The selected server being edited.
+     * 
+     * @since 0.6
+     */
+    private Server serverBeingEdited;
+
+    /**
+     * The server manager used to create and edit servers.
+     * 
+     * @since 0.6
+     */
+    private final ServerManager serverManager;
+
+    /**
+     * The shell used to display the dialog that edits and creates servers.
+     * 
+     * @since 0.6
+     */
+    private final Shell shell;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param shell the parent shell used to display the dialog
+     * @param serverManager the server manager to use when creating and editing servers
+     * @since 0.6
+     */
+    public EditServerAction( Shell shell,
+                             ServerManager serverManager ) {
+        super(""); //$NON-NLS-1$
+        setToolTipText(I18n.EditServerActionToolTip);
+        setImageDescriptor(Activator.getDefault().getImageDescriptor(EDIT_SERVER_IMAGE_PATH));
+        setEnabled(false);
+
+        this.shell = shell;
+        this.serverManager = serverManager;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.action.Action#run()
+     * @since 0.6
+     */
+    @Override
+    public void run() {
+        ServerWizard wizard = new ServerWizard(this.serverManager, this.serverBeingEdited);
+        new WizardDialog(this.shell, wizard).open();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
+     * @since 0.6
+     */
+    @Override
+    protected boolean updateSelection( IStructuredSelection selection ) {
+        // disable if empty selection or multiple objects selected
+        if (selection.isEmpty() || (selection.size() > 1)) {
+            this.serverBeingEdited = null;
+            return false;
+        }
+
+        Object obj = selection.getFirstElement();
+
+        // enable if server is selected
+        if (obj instanceof Server) {
+            this.serverBeingEdited = (Server)obj;
+            return true;
+        }
+
+        // disable if non-server is selected
+        this.serverBeingEdited = null;
+        return false;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/EditServerAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/NewServerAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/NewServerAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/NewServerAction.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,97 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors.
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt.actions;
+
+import static org.jboss.dna.publish.ui.swt.IUiConstants.NEW_SERVER_IMAGE_PATH;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.wizards.ServerWizard;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class NewServerAction extends BaseSelectionListenerAction {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The server manager used to create and edit servers.
+     * 
+     * @since 0.6
+     */
+    private final ServerManager serverManager;
+
+    /**
+     * The shell used to display the dialog that edits and creates servers.
+     * 
+     * @since 0.6
+     */
+    private final Shell shell;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param shell the parent shell used to display the dialog
+     * @param serverManager the server manager to use when creating and editing servers
+     * @since 0.6
+     */
+    public NewServerAction( Shell shell,
+                            ServerManager serverManager ) {
+        super(""); //$NON-NLS-1$
+        setToolTipText(I18n.NewServerActionToolTip);
+        setImageDescriptor(Activator.getDefault().getImageDescriptor(NEW_SERVER_IMAGE_PATH));
+        setImageDescriptor(Activator.getDefault().getSharedImageDescriptor(ISharedImages.IMG_ELCL_REMOVE));
+//        setDisabledImageDescriptor(Activator.getDefault().getSharedImageDescriptor(ISharedImages.IMG_ETOOL_DELETE_DISABLED));
+
+        this.shell = shell;
+        this.serverManager = serverManager;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.action.Action#run()
+     * @since 0.6
+     */
+    @Override
+    public void run() {
+        ServerWizard wizard = new ServerWizard(this.serverManager);
+        new WizardDialog(this.shell, wizard).open();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/NewServerAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -91,9 +91,9 @@
 
         if (this.serversBeingDeleted.size() == 1) {
             IDnaObject server = this.serversBeingDeleted.iterator().next();
-            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, server.getName());
+            title = NLS.bind(I18n.DeleteServerDialogOneServerMsg, server.getName());
         } else {
-            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, this.serversBeingDeleted.size());
+            title = NLS.bind(I18n.DeleteServerDialogMultipleServersMsg, this.serversBeingDeleted.size());
         }
 
         shell.setText(title);

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,18 +1,42 @@
+#
+# JBoss DNA (http://www.jboss.org/dna)
+# See the COPYRIGHT.txt file distributed with this work for information
+# regarding copyright ownership.  Some portions may be licensed
+# to Red Hat, Inc. under one or more contributor license agreements.
+# See the AUTHORS.txt file in the distribution for a full listing of 
+# individual contributors. 
+#
+# JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+# is licensed to you under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# JBoss DNA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+BasePublishingActionPublishingWizardErrorMsg = Unexpected error running the publishing wizard. See log for more details.
+BasePublishingActionUnpublishingWizardErrorMsg = Unexpected error running the unpublishing wizard. See log for more details.
+
 CollapseActionToolTip = Collapse All
 
-DeleteServerActionText = Delete Server
 DeleteServerActionToolTip = Delete Server
 
+DeleteServerDialogErrorsOccurredMsg = There were errors deleting servers from the server registry. See log for more details.
+DeleteServerDialogMultipleServersMsg = Are you sure you want to delete these {0} servers?
+DeleteServerDialogOneServerMsg = Are you sure you want to delete the "{0}" server?
 DeleteServerDialogTitle = Confirm Delete Server
-DeleteServerDialogOneServerMessage = Are you sure you want to delete the "{0}" server?
-DeleteServerDialogMultipleServersMessage = Are you sure you want to delete these {0} servers?
 
-EditServerActionText = Edit Server
 EditServerActionToolTip = Edit Server
 
 ErrorDialogTitle = Error
 
-NewServerActionText = New Server
 NewServerActionToolTip = New Server
 
 PublishOperationPublishTaskName = Publishing resources
@@ -25,12 +49,16 @@
 PublishPageMissingRepositoryStatusMsg = A repository must be selected
 PublishPageMissingServerStatusMsg = A server must be selected
 PublishPageMissingWorkspaceStatusMsg = A workspace must be selected
+PublishPageNewServerButton = New...
 PublishPageNoAvailableRepositoriesStatusMsg = There are no repositories available on that server
 PublishPageNoAvailableServersStatusMsg = A server must be created first
 PublishPageNoAvailableWorkspacesStatusMsg = There are no workspaces availabe on that server and repository
 PublishPageNoResourcesStatusMsg = You must select one or more workspace resources
 PublishPagePublishOkStatusMsg = Choose the server, repository, and workspace where the selected resources will be published.
 PublishPagePublishResourcesLabel = These resources will be published to the specified DNA repository:
+PublishPageRecurseCheckBox = Recurse folders and projects
+PublishPageRecurseCheckBoxToolTip = Add all files under folders recursively under selected projects and folders
+PublishPageRecurseProcessingErrorMsg = Unexpected error processing resources. See log for more details.
 PublishPageRepositoryLabel = Repository:
 PublishPageRepositoryToolTip = The repository where the workspace is located
 PublishPageServerLabel = Server:
@@ -61,5 +89,7 @@
 ServerPageUserLabel = User:
 ServerPageUserToolTip = The user login used when connecting to the server
 
+ServerWizardEditServerErrorMsg = There were errors editing a server. See log for more details.
 ServerWizardEditServerTitle = Edit Server
+ServerWizardNewServerErrorMsg = There were errors creating a new server. See log for more details.
 ServerWizardNewServerTitle = New Server

Deleted: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,184 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.publish.ui.swt.views;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Image;
-import org.jboss.dna.publish.domain.IDnaObject;
-import org.jboss.dna.publish.ui.swt.Activator;
-
-/**
- * The RepositoryContentProvider is a content and label provider for DNA repositories.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class RepositoryContentProvider implements ITreeContentProvider, ILabelProvider {
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     * @since 0.6
-     */
-    @Override
-    public void addListener( ILabelProviderListener listener ) {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-     * @since 0.6
-     */
-    @Override
-    public void dispose() {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object[] getChildren( Object parentElement ) {
-        if (parentElement instanceof IDnaObject) {
-            return ((IDnaObject)parentElement).getChildren().toArray();
-        }
-
-        // should not happen
-        assert false;
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object[] getElements( Object inputElement ) {
-        return Activator.getDefault().getServerManager().getServers().toArray();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Image getImage( Object element ) {
-        return Activator.getDefault().getImage(element);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object getParent( Object element ) {
-        if (element instanceof IDnaObject) {
-            return ((IDnaObject)element).getParent();
-        }
-
-        // should not happen
-        assert false;
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public String getText( Object element ) {
-        assert (element instanceof IDnaObject);
-        return ((IDnaObject)element).getName();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public boolean hasChildren( Object element ) {
-        return getChildren(element).length > 0;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
-     *      java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public void inputChanged( Viewer viewer,
-                              Object oldInput,
-                              Object newInput ) {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-     * @since 0.6
-     */
-    @Override
-    public boolean isLabelProperty( Object element,
-                                    String property ) {
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     * @since 0.6
-     */
-    @Override
-    public void removeListener( ILabelProviderListener listener ) {
-        // nothing to do
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -1,257 +0,0 @@
-/*
- * JBoss DNA (http://www.jboss.org/dna)
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * See the AUTHORS.txt file in the distribution for a full listing of 
- * individual contributors. 
- *
- * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
- * is licensed to you under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * JBoss DNA is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.publish.ui.swt.views;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.part.ViewPart;
-import org.jboss.dna.publish.domain.IDnaObject;
-import org.jboss.dna.publish.domain.Server;
-import org.jboss.dna.publish.ui.swt.I18n;
-
-/**
- * The RepositoryView shows all defined servers and their DNA repositories.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class RepositoryView extends ViewPart {
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
-     * Collapses all tree nodes.
-     * 
-     * @since 0.6
-     */
-    private IAction collapseAllAction;
-
-    /**
-     * Deletes a server.
-     * 
-     * @since 0.6
-     */
-    private IAction deleteAction;
-
-    /**
-     * Edits a server's properties.
-     * 
-     * @since 0.6
-     */
-    private IAction editAction;
-
-    /**
-     * Creates a new server.
-     * 
-     * @since 0.6
-     */
-    private IAction newAction;
-
-    /**
-     * The viewer's content and label provider.
-     * 
-     * @since 0.6
-     */
-    private RepositoryContentProvider provider;
-
-    /**
-     * @since 0.6
-     */
-    private TreeViewer viewer;
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * @since 0.6
-     */
-    private void constructActions() {
-        // the collapse all action is always enabled
-        this.collapseAllAction = new Action() {
-            @Override
-            public void run() {
-                getViewer().collapseAll();
-            }
-        };
-
-        this.collapseAllAction.setToolTipText(I18n.CollapseActionToolTip);
-        this.collapseAllAction.setImageDescriptor(null);
-
-        // the delete action will delete one or more servers
-        this.deleteAction = null;
-        this.deleteAction.setText(I18n.DeleteServerActionText);
-        this.deleteAction.setToolTipText(I18n.DeleteServerActionToolTip);
-        this.deleteAction.setImageDescriptor(null);
-        this.deleteAction.setEnabled(false);
-
-        // the edit action is only enabled when one server is selected
-        this.editAction = null;
-        this.editAction.setText(I18n.EditServerActionText);
-        this.editAction.setToolTipText(I18n.EditServerActionToolTip);
-        this.editAction.setImageDescriptor(null);
-        this.editAction.setEnabled(false);
-
-        // the new server action is always enabled
-        this.newAction = null;
-        this.newAction.setText(I18n.NewServerActionText);
-        this.newAction.setToolTipText(I18n.NewServerActionToolTip);
-        this.newAction.setImageDescriptor(null);
-    }
-
-    /**
-     * @since 0.6
-     */
-    private void constructContextMenu() {
-        MenuManager menuMgr = new MenuManager();
-        menuMgr.add(this.newAction);
-        menuMgr.add(this.editAction);
-        menuMgr.add(this.deleteAction);
-        // menuMgr.setRemoveAllWhenShown(true);
-
-        Menu menu = menuMgr.createContextMenu(this.viewer.getTree());
-        this.viewer.getTree().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, this.viewer);
-    }
-
-    /**
-     * @since 0.6
-     */
-    private void constructToolBar() {
-        IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
-        toolBar.add(this.newAction);
-        toolBar.add(this.editAction);
-        toolBar.add(this.deleteAction);
-        toolBar.add(this.collapseAllAction);
-    }
-
-    /**
-     * @param parent the viewer's parent
-     * @since 0.6
-     */
-    private void constructTreeViewer( Composite parent ) {
-        this.provider = new RepositoryContentProvider();
-        this.viewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-        this.viewer.setContentProvider(this.provider);
-        this.viewer.setLabelProvider(this.provider);
-        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-             */
-            @Override
-            public void selectionChanged( SelectionChangedEvent event ) {
-                handleSelectionChanged(event);
-            }
-        });
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     * @since 0.6
-     */
-    @Override
-    public void createPartControl( Composite parent ) {
-        constructTreeViewer(parent);
-        constructActions();
-        constructToolBar();
-        constructContextMenu();
-    }
-    
-    /**
-     * @return the tree viewer
-     * @since 0.6
-     */
-    TreeViewer getViewer() {
-        return this.viewer;
-    }
-
-    /**
-     * @param event the event being processed
-     * @since 0.6
-     */
-    void handleSelectionChanged( SelectionChangedEvent event ) {
-        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
-        updateStatusLine(selection);
-        updateActionBars(selection);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-     * @since 0.6
-     */
-    @Override
-    public void setFocus() {
-        if (!this.viewer.getControl().isDisposed()) {
-            this.viewer.getControl().setFocus();
-        }
-    }
-
-    /**
-     * @param selection the current viewer selection (never <code>null</code>)
-     * @since 0.6
-     */
-    private void updateActionBars( IStructuredSelection selection ) {
-        if (selection.isEmpty()) {
-            this.deleteAction.setEnabled(false);
-            this.editAction.setEnabled(false);
-        } else {
-            assert (selection.size() == 1);
-
-            IDnaObject obj = (IDnaObject)selection.getFirstElement();
-            boolean enable = (obj instanceof Server);
-            this.deleteAction.setEnabled(enable);
-            this.editAction.setEnabled(enable);
-        }
-    }
-
-    /**
-     * @param selection the current viewer selection (never <code>null</code>)
-     * @since 0.6
-     */
-    private void updateStatusLine( IStructuredSelection selection ) {
-        assert (selection.size() < 2);
-
-        String msg = (selection.isEmpty() ? "" : ((IDnaObject)selection.getFirstElement()).getShortDescription()); //$NON-NLS-1$
-        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
-    }
-
-}

Copied: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerContentProvider.java (from rev 1062, branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java)
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerContentProvider.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerContentProvider.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,215 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt.views;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.domain.Repository;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.Workspace;
+import org.jboss.dna.publish.ui.swt.Activator;
+
+/**
+ * The ServerContentProvider is a content and label provider for DNA repositories.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerContentProvider implements ITreeContentProvider, ILabelProvider {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    private final ServerManager serverManager;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param serverManager the server manager being used to find servers, repositories, and workspaces
+     * @since 0.6
+     */
+    public ServerContentProvider( ServerManager serverManager ) {
+        this.serverManager = serverManager;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @since 0.6
+     */
+    @Override
+    public void addListener( ILabelProviderListener listener ) {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+     * @since 0.6
+     */
+    @Override
+    public void dispose() {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object[] getChildren( Object parentElement ) {
+        assert (parentElement instanceof IDnaObject);
+
+        if (parentElement instanceof Server) {
+            return this.serverManager.getRepositories((Server)parentElement).toArray();
+        }
+
+        if (parentElement instanceof Repository) {
+            return this.serverManager.getWorkspaces((Repository)parentElement).toArray();
+        }
+
+        return new Object[0];
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object[] getElements( Object inputElement ) {
+        return this.serverManager.getServers().toArray();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Image getImage( Object element ) {
+        return Activator.getDefault().getImage(element);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object getParent( Object element ) {
+        assert (element instanceof IDnaObject);
+
+        if (element instanceof Workspace) {
+            return ((Workspace)element).getRepository();
+        }
+
+        if (element instanceof Repository) {
+            return ((Repository)element).getServer();
+        }
+
+        // server
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public String getText( Object element ) {
+        assert (element instanceof IDnaObject);
+        return ((IDnaObject)element).getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public boolean hasChildren( Object element ) {
+        return getChildren(element).length > 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
+     *      java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public void inputChanged( Viewer viewer,
+                              Object oldInput,
+                              Object newInput ) {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+     * @since 0.6
+     */
+    @Override
+    public boolean isLabelProperty( Object element,
+                                    String property ) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @since 0.6
+     */
+    @Override
+    public void removeListener( ILabelProviderListener listener ) {
+        // nothing to do
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerContentProvider.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Copied: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerView.java (from rev 1062, branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java)
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerView.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerView.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -0,0 +1,261 @@
+/*
+ * JBoss DNA (http://www.jboss.org/dna)
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership.  Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ * See the AUTHORS.txt file in the distribution for a full listing of 
+ * individual contributors. 
+ *
+ * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
+ * is licensed to you under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * JBoss DNA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.publish.ui.swt.views;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.part.ViewPart;
+import org.jboss.dna.publish.IServerRegistryListener;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.ServerRegistryEvent;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.actions.DeleteServerAction;
+import org.jboss.dna.publish.ui.swt.actions.EditServerAction;
+import org.jboss.dna.publish.ui.swt.actions.NewServerAction;
+
+/**
+ * The ServerView shows all defined servers and their DNA repositories.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerView extends ViewPart implements IServerRegistryListener {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * Collapses all tree nodes.
+     * 
+     * @since 0.6
+     */
+    private IAction collapseAllAction;
+
+    /**
+     * Deletes a server.
+     * 
+     * @since 0.6
+     */
+    private BaseSelectionListenerAction deleteAction;
+
+    /**
+     * Edits a server's properties.
+     * 
+     * @since 0.6
+     */
+    private BaseSelectionListenerAction editAction;
+
+    /**
+     * Creates a new server.
+     * 
+     * @since 0.6
+     */
+    private BaseSelectionListenerAction newAction;
+
+    /**
+     * The viewer's content and label provider.
+     * 
+     * @since 0.6
+     */
+    private ServerContentProvider provider;
+
+    /**
+     * @since 0.6
+     */
+    private TreeViewer viewer;
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @since 0.6
+     */
+    private void constructActions() {
+        // the collapse all action is always enabled
+        this.collapseAllAction = new Action() {
+            @Override
+            public void run() {
+                getViewer().collapseAll();
+            }
+        };
+
+        this.collapseAllAction.setToolTipText(I18n.CollapseActionToolTip);
+        this.collapseAllAction.setImageDescriptor(Activator.getDefault().getSharedImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL));
+
+        // the shell used for dialogs that the actions display
+        Shell shell = this.getSite().getShell();
+
+        // the delete action will delete one or more servers
+        this.deleteAction = new DeleteServerAction(shell, getServerManager());
+        this.viewer.addSelectionChangedListener(this.deleteAction);
+
+        // the edit action is only enabled when one server is selected
+        this.editAction = new EditServerAction(shell, getServerManager());
+        this.viewer.addSelectionChangedListener(this.editAction);
+
+        // the new server action is always enabled
+        this.newAction = new NewServerAction(shell, getServerManager());
+        this.viewer.addSelectionChangedListener(this.newAction);
+    }
+
+    /**
+     * @since 0.6
+     */
+    private void constructContextMenu() {
+        MenuManager menuMgr = new MenuManager();
+        menuMgr.add(this.newAction);
+        menuMgr.add(this.editAction);
+        menuMgr.add(this.deleteAction);
+        // menuMgr.setRemoveAllWhenShown(true);
+
+        Menu menu = menuMgr.createContextMenu(this.viewer.getTree());
+        this.viewer.getTree().setMenu(menu);
+        getSite().registerContextMenu(menuMgr, this.viewer);
+    }
+
+    /**
+     * @since 0.6
+     */
+    private void constructToolBar() {
+        IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
+        toolBar.add(this.newAction);
+        toolBar.add(this.editAction);
+        toolBar.add(this.deleteAction);
+        toolBar.add(this.collapseAllAction);
+    }
+
+    /**
+     * @param parent the viewer's parent
+     * @since 0.6
+     */
+    private void constructTreeViewer( Composite parent ) {
+        this.provider = new ServerContentProvider(getServerManager());
+        this.viewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+        this.viewer.setContentProvider(this.provider);
+        this.viewer.setLabelProvider(this.provider);
+        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+            @Override
+            public void selectionChanged( SelectionChangedEvent event ) {
+                handleSelectionChanged(event);
+            }
+        });
+        
+        // need to call this (doesn't matter what the param is) to bootstrap the provider.
+        this.viewer.setInput(this);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+     * @since 0.6
+     */
+    @Override
+    public void createPartControl( Composite parent ) {
+        constructTreeViewer(parent);
+        constructActions();
+        constructToolBar();
+        constructContextMenu();
+
+        // register to receive changes to the server registry
+        getServerManager().addRegistryListener(this);
+    }
+
+    /**
+     * @return the server manager being used by this view
+     * @since 0.6
+     */
+    private ServerManager getServerManager() {
+        return Activator.getDefault().getServerManager();
+    }
+
+    /**
+     * @return the tree viewer
+     * @since 0.6
+     */
+    TreeViewer getViewer() {
+        return this.viewer;
+    }
+
+    /**
+     * @param event the event being processed
+     * @since 0.6
+     */
+    void handleSelectionChanged( SelectionChangedEvent event ) {
+        updateStatusLine((IStructuredSelection)event.getSelection());
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.publish.IServerRegistryListener#serverRegistryChanged(org.jboss.dna.publish.ServerRegistryEvent)
+     * @since 0.6
+     */
+    @Override
+    public Exception[] serverRegistryChanged( ServerRegistryEvent event ) {
+        this.viewer.refresh();
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+     * @since 0.6
+     */
+    @Override
+    public void setFocus() {
+        if (!this.viewer.getControl().isDisposed()) {
+            this.viewer.getControl().setFocus();
+        }
+    }
+
+    /**
+     * @param selection the current viewer selection (never <code>null</code>)
+     * @since 0.6
+     */
+    private void updateStatusLine( IStructuredSelection selection ) {
+        assert (selection.size() < 2);
+
+        String msg = (selection.isEmpty() ? "" : ((IDnaObject)selection.getFirstElement()).getShortDescription()); //$NON-NLS-1$
+        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/ServerView.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -23,9 +23,10 @@
  */
 package org.jboss.dna.publish.ui.swt.wizards;
 
+import java.io.File;
 import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import org.eclipse.core.resources.IResource;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.jboss.dna.publish.domain.Workspace;
@@ -67,11 +68,11 @@
     // ===========================================================================================================================
 
     /**
-     * The resources being published or unpublished.
+     * The files being published or unpublished.
      * 
      * @since 0.6
      */
-    private final Collection<IResource> resources;
+    private final List<IFile> files;
 
     /**
      * The operation type.
@@ -85,7 +86,7 @@
      * 
      * @since 0.6
      */
-    private Workspace workspace;
+    private final Workspace workspace;
 
     // ===========================================================================================================================
     // Constructors
@@ -93,12 +94,16 @@
 
     /**
      * @param type the operation type
-     * @param resources the resources being published or unpublished
+     * @param files the files being published or unpublished
+     * @param workspace the workspace to use when publishing or unpublishing
+     * @since 0.6
      */
     public PublishOperation( Type type,
-                             Collection<IResource> resources ) {
+                             List<IFile> files,
+                             Workspace workspace ) {
         this.type = type;
-        this.resources = resources;
+        this.files = files;
+        this.workspace = workspace;
     }
 
     // ===========================================================================================================================
@@ -138,15 +143,19 @@
     @Override
     public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
         assert (this.workspace != null);
-        
+
         try {
-            // TODO
             String name = (isPublishing() ? I18n.PublishOperationPublishTaskName : I18n.PublishOperationUnpublishTaskName);
-            monitor.beginTask(name, this.resources.size());
-            
-            for (IResource resource : this.resources) {
-                // TODO call publisher here
+            monitor.beginTask(name, this.files.size());
+
+            for (IFile eclipseFile : this.files) {
+                File file = eclipseFile.getLocation().toFile();
+                // TODO call publisher here (timeout?)
                 monitor.worked(1);
+
+                if (monitor.isCanceled()) {
+                    break;
+                }
             }
         } catch (Exception e) {
             throw new InvocationTargetException(e);
@@ -155,14 +164,4 @@
         }
     }
 
-    /**
-     * The workspace must be set prior to executing the operation.
-     * 
-     * @param workspace the workspace used when publishing or unpublishing (never <code>null</code>)
-     * @since 0.6
-     */
-    protected void setWorkspace( Workspace workspace ) {
-        this.workspace = workspace;
-    }
-
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -25,15 +25,28 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.WizardPage;
 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.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
@@ -44,7 +57,9 @@
 import org.jboss.dna.publish.domain.Repository;
 import org.jboss.dna.publish.domain.Server;
 import org.jboss.dna.publish.domain.Workspace;
+import org.jboss.dna.publish.ui.swt.Activator;
 import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.actions.NewServerAction;
 import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
 /**
@@ -54,6 +69,181 @@
 public final class PublishPage extends WizardPage implements ModifyListener {
 
     // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The key in the wizard <code>IDialogSettings</code> for the recurse flag.
+     * 
+     * @since 0.6
+     */
+    private static final String RECURSE_KEY = "recurse"; //$NON-NLS-1$
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param container the project or folder whose files are being requested
+     * @param recurse the flag indicating if child containers should be traversed
+     * @return the list of files contained in the specified container (never <code>null</code>)
+     * @throws CoreException if there is a problem finding the files
+     * @since 0.6
+     */
+    private static List<IFile> findFiles( IContainer container,
+                                          boolean recurse ) throws CoreException {
+        List<IFile> result = new ArrayList<IFile>();
+
+        for (IResource member : container.members()) {
+            if (recurse && (member instanceof IContainer)) {
+                // don't publish closed projects
+                if ((member instanceof IProject) && !((IProject)member).isOpen()) {
+                    continue;
+                }
+
+                result.addAll(findFiles((IContainer)member, recurse));
+            } else if ((member instanceof IFile) && ((IFile)member).getLocation().toFile().exists()) {
+                result.add((IFile)member);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Processes the specified list of files and for (1) each file found adds it to the result and (2) for each project or folder
+     * adds all contained files. For projects and folders processing will be recursive based on saved wizard settings.
+     * 
+     * @param resources the resources being processed
+     * @param recurse the flag indicating if child containers should be traversed
+     * @return the files being published or unpublished (never <code>null</code>)
+     * @throws CoreException if there is a problem processing the resources
+     * @since 0.6
+     */
+    private static List<IFile> processResources( List<IResource> resources,
+                                                 boolean recurse ) throws CoreException {
+        List<IFile> result = new ArrayList<IFile>();
+
+        // Project Map - the outer map. Its keys are IProjects and its values are a Parent Map
+        // Parent Map - the inner map. Its keys are IContainers (IProject, IFolder) and its values are a list of files
+        Map<IProject, Map<IContainer, List<IFile>>> projectMap = new HashMap<IProject, Map<IContainer, List<IFile>>>();
+
+        // Step 1: Process resources
+        // - For each file make sure there is a project entry and parent entry then add the file to the Parent Map.
+        // - For each folder make sure there is a project entry then add folder entry.
+        // - For each project make sure there is a project entry.
+        //
+        // Step 2: Process maps
+        // - In the Project Map, when the recurse flag is set, entries for projects that have a null value (parent map) will be
+        // traversed finding all child files and them to results.
+        // - In the internal parent map, when the recurse flag is set, entries for parents that have a null value (child
+        // collection) will be traversed finding all child files and add them to results.
+        //
+        // Step 3: Add files from Step 1 to results
+
+        // Step 1 (see above for processing description)
+        for (IResource resource : resources) {
+            IFile file = null;
+            IProject project = null;
+            List<IFile> files = null;
+            Map<IContainer, List<IFile>> parentMap = null;
+
+            if (resource instanceof IFile) {
+                IContainer parent = null; // project or folder
+                file = (IFile)resource;
+                parent = file.getParent();
+                project = file.getProject();
+
+                // make sure there is a project entry
+                if (!projectMap.containsKey(project)) {
+                    projectMap.put(project, null);
+                }
+
+                parentMap = projectMap.get(project);
+
+                // make sure there is a parent entry
+                if (parentMap == null) {
+                    parentMap = new HashMap<IContainer, List<IFile>>();
+                    projectMap.put(project, parentMap);
+                }
+
+                files = parentMap.get(parent);
+
+                // make sure there is a files collection
+                if (files == null) {
+                    files = new ArrayList<IFile>();
+                    parentMap.put(parent, files);
+                }
+
+                // add file
+                files.add(file);
+            } else if (resource instanceof IFolder) {
+                IFolder folder = (IFolder)resource;
+                project = folder.getProject();
+
+                // make sure there is a project entry
+                if (!projectMap.containsKey(project)) {
+                    projectMap.put(project, null);
+                }
+
+                parentMap = projectMap.get(project);
+
+                // make sure there is a folder entry
+                if (parentMap == null) {
+                    parentMap = new HashMap<IContainer, List<IFile>>();
+                    projectMap.put(project, parentMap);
+                }
+
+                // add folder only if not already there
+                if (!parentMap.containsKey(folder)) {
+                    parentMap.put(folder, null);
+                }
+            } else if (resource instanceof IProject) {
+                project = (IProject)resource;
+
+                // if map does not have entry create one
+                if (!projectMap.containsKey(project)) {
+                    projectMap.put(project, null);
+                }
+            }
+        }
+
+        // Step 2 (see above for processing description)
+        // Process projects that have nothing under them selected
+        for (IProject project : projectMap.keySet()) {
+            Map<IContainer, List<IFile>> parentMap = projectMap.get(project);
+
+            if (parentMap == null) {
+                result.addAll(findFiles(project, recurse));
+            } else {
+                // process folders with no folder entries
+                for (IContainer folder : parentMap.keySet()) {
+                    List<IFile> files = parentMap.get(folder);
+
+                    if (files == null) {
+                        result.addAll(findFiles(folder, recurse));
+                    }
+                }
+            }
+        }
+
+        // Step 3 (see above for processing description)
+        for (IProject project : projectMap.keySet()) {
+            Map<IContainer, List<IFile>> parentMap = projectMap.get(project);
+
+            if (parentMap != null) {
+                for (Entry<IContainer, List<IFile>> entry : parentMap.entrySet()) {
+                    if (entry.getValue() != null) {
+                        result.addAll(entry.getValue());
+                    }
+                }
+            }
+        }
+
+        return result;
+    }
+
+    // ===========================================================================================================================
     // Fields
     // ===========================================================================================================================
 
@@ -79,27 +269,34 @@
     private Combo cbxWorkspace;
 
     /**
-     * Indicates if publishing or unpublishing is being done.
+     * The files being published or unpublished (never <code>null</code>).
      * 
      * @since 0.6
      */
-    private final Type type;
+    private List<IFile> files;
 
     /**
-     * The collection of resources being published/unpublished.
+     * The method in control of registering/unregistering combobox listners or <code>null</code>.
      * 
      * @since 0.6
      */
-    private final List<IResource> resources;
+    private String listenerControlLock = null;
 
     /**
-     * The repository where the workspace is located.
+     * The control containing all the files being published or unpublished.
      * 
      * @since 0.6
      */
-    private Repository repository;
+    private org.eclipse.swt.widgets.List lstResources;
 
     /**
+     * The flag indicating if child containers should be traversed.
+     * 
+     * @since 0.6
+     */
+    private boolean recurse;
+
+    /**
      * A collection of repositories for the selected server (never <code>null</code>).
      * 
      * @since 0.6
@@ -107,6 +304,20 @@
     private List<Repository> repositories;
 
     /**
+     * The repository where the workspace is located.
+     * 
+     * @since 0.6
+     */
+    private Repository repository;
+
+    /**
+     * The collection of resources selected by the user to be published or unpublished.
+     * 
+     * @since 0.6
+     */
+    private final List<IResource> resources;
+
+    /**
      * The server where the repository is located.
      * 
      * @since 0.6
@@ -128,6 +339,13 @@
     private Status status;
 
     /**
+     * Indicates if publishing or unpublishing is being done.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
+    /**
      * The workspace where the resources are being published/unpublished (may be <code>null</code>).
      * 
      * @since 0.6
@@ -148,15 +366,18 @@
     /**
      * @param type indicates if publishing or unpublishing is being done
      * @param resources the resources being published or unpublished (never <code>null</code>)
+     * @throws CoreException if there is a problem processing the input resources
      * @since 0.6
      */
     public PublishPage( Type type,
-                        List<IResource> resources ) {
+                        List<IResource> resources ) throws CoreException {
         super(PublishPage.class.getSimpleName());
         setTitle((type == Type.PUBLISH) ? I18n.PublishPagePublishTitle : I18n.PublishPageUnpublishTitle);
+        setPageComplete(false);
 
         this.type = type;
         this.resources = resources;
+        this.files = processResources(resources, this.recurse);
     }
 
     // ===========================================================================================================================
@@ -169,14 +390,40 @@
         pnl.setLayout(new GridLayout(2, false));
         pnl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 
+        // row 1: label combobox button
+        // row 2: label combobox
+        // row 3: label combobox
+
         { // server row
-            Label lblServer = new Label(pnl, SWT.LEFT);
+            Composite pnlServer = new Composite(pnl, SWT.NONE);
+            GridLayout layout = new GridLayout(3, false);
+            layout.marginHeight = 0;
+            layout.marginWidth = 0;
+            pnlServer.setLayout(layout);
+            GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+            gd.horizontalSpan = 2;
+            pnlServer.setLayoutData(gd);
+
+            Label lblServer = new Label(pnlServer, SWT.LEFT);
             lblServer.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
             lblServer.setText(I18n.PublishPageServerLabel);
 
-            this.cbxServer = new Combo(pnl, SWT.DROP_DOWN | SWT.READ_ONLY);
+            this.cbxServer = new Combo(pnlServer, SWT.DROP_DOWN | SWT.READ_ONLY);
             this.cbxServer.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
             this.cbxServer.setToolTipText(I18n.PublishPageServerToolTip);
+
+            final IAction action = new NewServerAction(this.getShell(), getServerManager());
+            Button btnNewServer = new Button(pnlServer, SWT.PUSH);
+            btnNewServer.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            btnNewServer.setText(I18n.PublishPageNewServerButton);
+            btnNewServer.setToolTipText(action.getToolTipText());
+            btnNewServer.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected( SelectionEvent e ) {
+                    action.run();
+                    refreshServers();
+                }
+            });
         }
 
         { // repository row
@@ -207,28 +454,44 @@
 
     private void constructResourcesPanel( Composite parent ) {
         Composite pnl = new Composite(parent, SWT.NONE);
-        pnl.setLayout(new GridLayout());
+        pnl.setLayout(new GridLayout(2, false));
         pnl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
-        Label lbl = new Label(pnl, SWT.LEFT);
-        lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+        // pnl layout:
+        // row 1: lbl chk
+        // row 2: lstResources
 
-        if (type == Type.PUBLISH) {
-            lbl.setText(I18n.PublishPagePublishResourcesLabel);
-        } else {
-            lbl.setText(I18n.PublishPageUnpublishResourcesLabel);
+        { // row 1
+            Label lbl = new Label(pnl, SWT.LEFT);
+            lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+
+            if (type == Type.PUBLISH) {
+                lbl.setText(I18n.PublishPagePublishResourcesLabel);
+            } else {
+                lbl.setText(I18n.PublishPageUnpublishResourcesLabel);
+            }
+
+            final Button chk = new Button(pnl, SWT.CHECK);
+            chk.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+            chk.setText(I18n.PublishPageRecurseCheckBox);
+            chk.setToolTipText(I18n.PublishPageRecurseCheckBoxToolTip);
+            chk.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected( SelectionEvent e ) {
+                    handleRecurseChanged(chk.getSelection());
+                }
+            });
         }
 
-        org.eclipse.swt.widgets.List lstResources = new org.eclipse.swt.widgets.List(pnl, SWT.BORDER | SWT.H_SCROLL
-                                                                                          | SWT.V_SCROLL);
-        lstResources.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        { // row 2
+            this.lstResources = new org.eclipse.swt.widgets.List(pnl, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+            GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+            gd.horizontalSpan = 2;
+            this.lstResources.setLayoutData(gd);
 
-        // set initial value
-        // TODO implement load resources
-        String[] data = new String[20];
-        for (int i = 0; i < 20; ++i)
-            data[i] = "my/resource" + i + ".xmi"; //$NON-NLS-1$ //$NON-NLS-2$
-        lstResources.setItems(data);
+            // load list with initial files
+            loadFiles();
+        }
     }
 
     /**
@@ -245,20 +508,28 @@
         constructResourcesPanel(pnlMain);
         setControl(pnlMain);
 
-        resetServers();
-        installLocationListeners();
+        refreshServers();
+        installLocationListeners(null);
     }
 
     /**
+     * @return the file to publish or unpublish (never <code>null</code>)
+     * @since 0.6
+     */
+    public List<IFile> getFiles() {
+        return this.files;
+    }
+
+    /**
      * @return the server manager obtained from the wizard
      * @since 0.6
      */
     private ServerManager getServerManager() {
-        return ((ServerWizard)getWizard()).getServerManager();
+        return ((PublishWizard)getWizard()).getServerManager();
     }
 
     /**
-     * @return thw workspace to use when publishing or unpublishing
+     * @return thw workspace to use when publishing or unpublishing (page must be complete)
      * @since 0.6
      */
     public Workspace getWorkspace() {
@@ -267,6 +538,25 @@
     }
 
     /**
+     * Saves the recurse setting and reloads the files to be published or unpublished.
+     * 
+     * @param selected the flag indicating the new recurse setting
+     * @since 0.6
+     */
+    void handleRecurseChanged( boolean selected ) {
+        this.recurse = selected;
+        saveRecurseSetting();
+
+        try {
+            this.files = processResources(this.resources, isRecursing());
+            loadFiles();
+        } catch (CoreException e) {
+            Activator.getDefault().log(new Status(Severity.ERROR, I18n.PublishPageRecurseProcessingErrorMsg, e));
+            MessageDialog.openError(getShell(), I18n.ErrorDialogTitle, I18n.PublishPageRecurseProcessingErrorMsg);
+        }
+    }
+
+    /**
      * Handler for when the repository control value is modified
      * 
      * @since 0.6
@@ -276,7 +566,7 @@
         this.repository = this.repositories.get(index);
 
         // clear loaded workspaces
-        resetWorkspaces();
+        refreshWorkspaces();
 
         // update page state
         updateState();
@@ -291,7 +581,7 @@
         this.server = this.servers.get(this.cbxServer.getSelectionIndex());
 
         // need to reload repositories since server changed
-        resetRepositories();
+        refreshRepositories();
 
         // update page state
         updateState();
@@ -310,15 +600,53 @@
     /**
      * Installs the combobox listeners.
      * 
+     * @param listenerControlLock the method in control of registering/unregistering combobox listeners
      * @since 0.6
      */
-    private void installLocationListeners() {
-        this.cbxRepository.addModifyListener(this);
-        this.cbxServer.addModifyListener(this);
-        this.cbxWorkspace.addModifyListener(this);
+    private void installLocationListeners( String listenerControlLock ) {
+        if ((this.listenerControlLock == null) || this.listenerControlLock.equals(listenerControlLock)) {
+            this.cbxRepository.addModifyListener(this);
+            this.cbxServer.addModifyListener(this);
+            this.cbxWorkspace.addModifyListener(this);
+            this.listenerControlLock = listenerControlLock;
+            this.listenerControlLock = null;
+        }
     }
 
     /**
+     * @return the flag indicating if resources found recursively under projects and folders should also be published or
+     *         unpublished
+     * @since 0.6
+     */
+    protected boolean isRecursing() {
+        boolean recurse = true;
+
+        if (getDialogSettings().get(RECURSE_KEY) != null) {
+            recurse = getDialogSettings().getBoolean(RECURSE_KEY);
+        }
+
+        return recurse;
+    }
+
+    /**
+     * Populates the list of files to be published based on the recurse flag and the list of workspace selected resources.
+     * Pre-condition is that {@link #processResources(List, boolean)} has been called.
+     * 
+     * @since 0.6
+     */
+    private void loadFiles() {
+        String[] data = new String[this.files.size()];
+        int i = 0;
+
+        for (IResource resource : this.files) {
+            data[i] = resource.getFullPath().toString();
+            ++i;
+        }
+
+        this.lstResources.setItems(data);
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
@@ -337,21 +665,23 @@
     }
 
     /**
-     * Resets the repository-related fields and controls.
+     * Refreshes the repository-related fields and controls based on the server registry. This in turn causes the workspaces to
+     * also to be refreshed.
      * 
      * @since 0.6
      */
-    private void resetRepositories() {
+    private void refreshRepositories() {
+        final String LOCK_ID = "refreshRepositories"; //$NON-NLS-1$
         this.repository = null;
 
         if (this.server == null) {
             this.repositories = Collections.emptyList();
         } else {
-            this.repositories = new ArrayList<Repository>(this.server.getRepositories());
+            this.repositories = new ArrayList<Repository>(getServerManager().getRepositories(this.server));
         }
 
         // uninstall listeners to prevent handling events
-        uninstallLocationListeners();
+        uninstallLocationListeners(LOCK_ID);
 
         // clear items
         this.cbxRepository.removeAll();
@@ -384,21 +714,26 @@
         }
 
         // must reload workspaces
-        resetWorkspaces();
+        refreshWorkspaces();
 
         // reinstall listening
-        installLocationListeners();
+        installLocationListeners(LOCK_ID);
     }
 
     /**
-     * Resets the server-related fields and controls.
+     * Refreshes the server-related fields and controls based on the server registry. This in turn causes the repositories and
+     * workspaces to also to be refreshed.
      * 
      * @since 0.6
      */
-    private void resetServers() {
+    void refreshServers() {
+        final String LOCK_ID = "refreshServers"; //$NON-NLS-1$
         this.server = null;
         this.servers = new ArrayList<Server>(getServerManager().getServers());
 
+        // uninstall listeners to prevent handling events
+        uninstallLocationListeners(LOCK_ID);
+
         if (this.servers.size() == 0) {
             // disable control if necessary
             if (this.cbxServer.getEnabled()) {
@@ -426,25 +761,29 @@
         }
 
         // must reload repositories
-        resetRepositories();
+        refreshRepositories();
+
+        // reinstall listening
+        installLocationListeners(LOCK_ID);
     }
 
     /**
-     * Resets the workspace-related fields and controls.
+     * Refreshes the workspace-related fields and controls based on the server registry.
      * 
      * @since 0.6
      */
-    private void resetWorkspaces() {
+    private void refreshWorkspaces() {
+        final String LOCK_ID = "refreshWorkspaces"; //$NON-NLS-1$
         this.workspace = null;
 
         if (this.repository == null) {
             this.workspaces = Collections.emptyList();
         } else {
-            this.workspaces = new ArrayList<Workspace>(this.repository.getWorkspaces());
+            this.workspaces = new ArrayList<Workspace>(getServerManager().getWorkspaces(this.repository));
         }
 
         // uninstall listeners to prevent handling events
-        uninstallLocationListeners();
+        uninstallLocationListeners(LOCK_ID);
 
         // clear items
         this.cbxWorkspace.removeAll();
@@ -477,10 +816,19 @@
         }
 
         // reinstall listening
-        installLocationListeners();
+        installLocationListeners(LOCK_ID);
     }
 
     /**
+     * Saves the current recurse value to the wizard <code>IDialogSettings</code>.
+     * 
+     * @since 0.6
+     */
+    protected void saveRecurseSetting() {
+        getDialogSettings().put(RECURSE_KEY, this.recurse);
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
@@ -502,12 +850,17 @@
     /**
      * Uninstalls the combobox listeners.
      * 
+     * @param listenerControlLock the method in control of registering/unregistering combobox listeners
      * @since 0.6
      */
-    private void uninstallLocationListeners() {
-        this.cbxRepository.removeModifyListener(this);
-        this.cbxServer.removeModifyListener(this);
-        this.cbxWorkspace.removeModifyListener(this);
+    private void uninstallLocationListeners( String listenerControlLock ) {
+        if (this.listenerControlLock == null) {
+            this.listenerControlLock = listenerControlLock;
+            this.cbxRepository.removeModifyListener(this);
+            this.cbxServer.removeModifyListener(this);
+            this.cbxWorkspace.removeModifyListener(this);
+            this.listenerControlLock = listenerControlLock;
+        }
     }
 
     /**

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -25,12 +25,12 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
 import org.jboss.dna.publish.ServerManager;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.Status.Severity;
@@ -50,13 +50,6 @@
     // ===========================================================================================================================
 
     /**
-     * The publishing or unpublishing operation.
-     * 
-     * @since 0.6
-     */
-    private final PublishOperation operation;
-    
-    /**
      * The wizard page containing all the controls that allow publishing/unpublishing of resources.
      * 
      * @since 0.6
@@ -70,6 +63,13 @@
      */
     private final ServerManager serverManager;
 
+    /**
+     * Indicates if the wizard will perform a publishing or unpublishing operation.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
     // ===========================================================================================================================
     // Constructors
     // ===========================================================================================================================
@@ -78,16 +78,17 @@
      * @param type the publishing or unpublishing indicator
      * @param resources the resources being published or unpublished (never <code>null</code>)
      * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
+     * @throws CoreException if there is a problem processing the resources
      * @since 0.6
      */
     public PublishWizard( Type type,
                           List<IResource> resources,
-                          ServerManager serverManager ) {
-        this.operation = new PublishOperation(type, resources);
+                          ServerManager serverManager ) throws CoreException {
+        this.type = type;
         this.page = new PublishPage(type, resources);
         this.serverManager = serverManager;
 
-        setWindowTitle(this.operation.isPublishing() ? I18n.PublishWizardPublishTitle : I18n.PublishWizardUnpublishTitle);
+        setWindowTitle((type == Type.PUBLISH) ? I18n.PublishWizardPublishTitle : I18n.PublishWizardUnpublishTitle);
     }
 
     // ===========================================================================================================================
@@ -106,6 +107,30 @@
     }
 
     /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#getDialogSettings()
+     * @since 0.6
+     */
+    @Override
+    public IDialogSettings getDialogSettings() {
+        IDialogSettings settings = super.getDialogSettings();
+
+        if (settings == null) {
+            IDialogSettings temp = Activator.getDefault().getDialogSettings();
+            settings = temp.getSection(getClass().getSimpleName());
+
+            if (settings == null) {
+                settings = temp.addNewSection(getClass().getSimpleName());
+            }
+
+            setDialogSettings(settings);
+        }
+
+        return super.getDialogSettings();
+    }
+
+    /**
      * @return the server manager (never <code>null</code>)
      * @since 0.6
      */
@@ -122,42 +147,21 @@
     @Override
     public boolean performFinish() {
         Workspace workspace = this.page.getWorkspace();
-        this.operation.setWorkspace(workspace);
-        
+        List<IFile> files = this.page.getFiles();
+        PublishOperation operation = new PublishOperation(this.type, files, workspace);
+
         try {
-            getContainer().run(true, true, this.operation);
+            getContainer().run(true, true, operation);
         } catch (InterruptedException e) {
             return false;
         } catch (InvocationTargetException e) {
-            String message = (this.operation.isPublishing() ? I18n.PublishWizardPublishErrorMsg : I18n.PublishWizardUnpublishErrorMsg);
-            Activator.getDefault().log(getClass(), new Status(Severity.ERROR, message, e.getTargetException()));
+            String message = (operation.isPublishing() ? I18n.PublishWizardPublishErrorMsg : I18n.PublishWizardUnpublishErrorMsg);
+            Activator.getDefault().log(new Status(Severity.ERROR, message, e.getTargetException()));
             MessageDialog.openError(getContainer().getShell(), I18n.ErrorDialogTitle, message);
             return false;
         }
-        
-        return true; //!status.isError();
-    }
 
-    // ===========================================================================================================================
-    // Test UI
-    // ===========================================================================================================================
-
-    public static void main( String[] args ) {
-        Display display = new Display();
-
-        Shell shell = new Shell(display);
-        shell.setText("Shell"); //$NON-NLS-1$
-        shell.setSize(200, 200);
-        shell.open();
-        
-        WizardDialog dialog = new WizardDialog(shell, new PublishWizard(Type.PUBLISH, null, new ServerManager("/home/dan"))); //$NON-NLS-1$
-        dialog.open();
-
-        while (!shell.isDisposed()) {
-            if (!display.readAndDispatch()) display.sleep();
-        }
-
-        display.dispose();
+        return true;
     }
 
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -85,11 +85,23 @@
     // Constructors
     // ===========================================================================================================================
 
+    /**
+     * Constructs a wizard page that will create a new server.
+     * 
+     * @since 0.6
+     */
     public ServerPage() {
         super(ServerPage.class.getSimpleName());
         setTitle(I18n.ServerPageTitle);
+        setPageComplete(false);
     }
 
+    /**
+     * Constructs a wizard page that edits the specified server's properties.
+     * 
+     * @param server the server being edited
+     * @since 0.6
+     */
     public ServerPage( Server server ) {
         super(ServerPage.class.getSimpleName());
         setTitle(I18n.ServerPageTitle);
@@ -97,6 +109,7 @@
         this.url = server.getUrl();
         this.user = server.getUser();
         this.password = server.getPassword();
+        setPageComplete(false);
     }
 
     // ===========================================================================================================================
@@ -166,7 +179,7 @@
             Label lblImage = new Label(pnl, SWT.NONE);
             lblImage.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
             lblImage.setImage(Display.getDefault().getSystemImage(SWT.ICON_INFORMATION));
-            
+
             StyledText st = new StyledText(pnl, SWT.READ_ONLY | SWT.MULTI | SWT.NO_FOCUS | SWT.WRAP);
             st.setText(I18n.ServerPageSavePasswordLabel);
             st.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
@@ -288,9 +301,9 @@
         super.setVisible(visible);
 
         if (visible) {
-           // set initial state
-           validate();
-            
+            // set initial state
+            validate();
+
             // set initial message
             setMessage(I18n.ServerPageOkStatusMsg);
         }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java	2009-06-28 02:14:25 UTC (rev 1067)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java	2009-07-01 22:20:46 UTC (rev 1068)
@@ -23,13 +23,12 @@
  */
 package org.jboss.dna.publish.ui.swt.wizards;
 
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
 import org.jboss.dna.publish.ServerManager;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.Activator;
 import org.jboss.dna.publish.ui.swt.I18n;
 
 /**
@@ -43,6 +42,13 @@
     // ===========================================================================================================================
 
     /**
+     * Non-<code>null</code> if the wizard is editing an existing server.
+     * 
+     * @since 0.6
+     */
+    private Server existingServer;
+
+    /**
      * The wizard page containing all the controls that allow editing of server properties.
      * 
      * @since 0.6
@@ -61,6 +67,8 @@
     // ===========================================================================================================================
 
     /**
+     * Constructs a wizard that creates a new server.
+     * 
      * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
      * @since 0.6
      */
@@ -71,6 +79,8 @@
     }
 
     /**
+     * Constructs a wizard that edits an existing server.
+     * 
      * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
      * @param server the server whose properties are being edited (never <code>null</code>)
      * @since 0.6
@@ -79,6 +89,7 @@
                          Server server ) {
         this.page = new ServerPage(server);
         this.serverManager = serverManager;
+        this.existingServer = server;
         setWindowTitle(I18n.ServerWizardEditServerTitle);
     }
 
@@ -113,32 +124,29 @@
      */
     @Override
     public boolean performFinish() {
+        Status status = null;
         Server server = this.page.getServer();
-        Status status = this.serverManager.addServer(server);
-        return !status.isError();
-    }
 
-    // ===========================================================================================================================
-    // Test UI
-    // ===========================================================================================================================
+        if (this.existingServer == null) {
+            status = this.serverManager.addServer(server);
 
-    public static void main( String[] args ) {
-        Display display = new Display();
+            if (status.isError()) {
+                MessageDialog.openError(getShell(), I18n.ErrorDialogTitle, I18n.ServerWizardEditServerErrorMsg);
+            }
+        } else {
+            status = this.serverManager.updateServer(this.existingServer, server);
 
-        Shell shell = new Shell(display);
-        shell.setText("Shell"); //$NON-NLS-1$
-        shell.setSize(200, 200);
-        shell.open();
+            if (status.isError()) {
+                MessageDialog.openError(getShell(), I18n.ErrorDialogTitle, I18n.ServerWizardNewServerErrorMsg);
+            }
+        }
 
-        WizardDialog dialog = new WizardDialog(shell, new ServerWizard(new ServerManager("/home/dan"))); //$NON-NLS-1$
-//        WizardDialog dialog = new WizardDialog(shell, new ServerWizard(new ServerManager("/home/dan"), new Server("file:", "user", null)));
-        dialog.open();
-
-        while (!shell.isDisposed()) {
-            if (!display.readAndDispatch()) display.sleep();
+        // log if necessary
+        if (!status.isOk()) {
+            Activator.getDefault().log(status);
         }
 
-        display.dispose();
+        return !status.isError();
     }
 
 }




More information about the dna-commits mailing list