[dna-commits] DNA SVN: r1289 - in trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client: jobs and 1 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Wed Oct 7 12:18:30 EDT 2009


Author: elvisisking
Date: 2009-10-07 12:18:30 -0400 (Wed, 07 Oct 2009)
New Revision: 1289

Modified:
   trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/RestClientI18n.properties
   trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/jobs/PublishJob.java
   trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/DnaContentProvider.java
   trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/ServerView.java
Log:
DNA 533 Decorator Does Not Add/Remove Overaly Image Immediately After The Publishing Operation: DnaContentProvider had some left over overrided, unimplemented interface methods that I just deleted. Everything started working.
DNA 538 Duplicate Error Messages Generated When A Connection To A Server Cannot Be Established: If a connection to a server fails, we won't try connecting again until a certain amount of time has gone by (currently set to 10 seconds).

Modified: trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/RestClientI18n.properties
===================================================================
--- trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/RestClientI18n.properties	2009-10-07 15:43:05 UTC (rev 1288)
+++ trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/RestClientI18n.properties	2009-10-07 16:18:30 UTC (rev 1289)
@@ -139,7 +139,7 @@
 serverReconnectActionToolTip = Reconnect to the selected server
 
 serverManagerGetRepositoriesExceptionMsg = There was a problem obtaining repositories for the server "{0}."
-serverManagerGetWorkspacesExceptionMsg = There was a problem obtaining workspaces for repository "{0}."
+serverManagerGetWorkspacesExceptionMsg = There was a problem obtaining workspaces for "{0}."
 
 serverPageAuthenticationGroupTitle = Authentication
 serverPageInvalidServerProperties = Cannot construct a server because all server properties are not valid

Modified: trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/jobs/PublishJob.java
===================================================================
--- trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/jobs/PublishJob.java	2009-10-07 15:43:05 UTC (rev 1288)
+++ trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/jobs/PublishJob.java	2009-10-07 16:18:30 UTC (rev 1289)
@@ -226,11 +226,6 @@
                     // set persistent property on resource indicating it has been published
                     if (!status.isError()) {
                         resourceHelper.addPublishedProperty(eclipseFile, workspace);
-                        DnaContentProvider decorator = DnaContentProvider.getDecorator();
-
-                        if (decorator != null) {
-                            // decorator.refresh(eclipseFile);
-                        }
                     }
                 } else {
                     status = getServerManager().unpublish(this.workspace, path, file);
@@ -238,17 +233,19 @@
                     // clear persistent property on resource indicating it has been unpublished
                     if (!status.isError()) {
                         resourceHelper.removePublishedProperty(eclipseFile, workspace);
-                        DnaContentProvider decorator = DnaContentProvider.getDecorator();
-
-                        if (decorator != null) {
-                            // decorator.refresh(eclipseFile);
-                        }
                     }
                 }
 
                 ++numProcessed;
                 monitor.worked(1);
 
+                // let decorator know publishing state has changed on this file
+                DnaContentProvider decorator = DnaContentProvider.getDecorator();
+
+                if (decorator != null) {
+                    decorator.refresh(eclipseFile);
+                }
+
                 // write outcome message to console
                 if (isPublishing() && status.isOk()) {
                     URL url = getServerManager().getUrl(file, path, this.workspace);

Modified: trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/DnaContentProvider.java
===================================================================
--- trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/DnaContentProvider.java	2009-10-07 15:43:05 UTC (rev 1288)
+++ trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/DnaContentProvider.java	2009-10-07 16:18:30 UTC (rev 1289)
@@ -24,11 +24,15 @@
 package org.jboss.dna.eclipse.jcr.rest.client.views;
 
 import static org.jboss.dna.eclipse.jcr.rest.client.IUiConstants.PUBLISHED_OVERLAY_IMAGE;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import net.jcip.annotations.GuardedBy;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ILightweightLabelDecorator;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.LabelProviderChangedEvent;
@@ -40,7 +44,9 @@
 import org.jboss.dna.eclipse.jcr.rest.client.DnaResourceHelper;
 import org.jboss.dna.eclipse.jcr.rest.client.RestClientI18n;
 import org.jboss.dna.eclipse.jcr.rest.client.Utils;
+import org.jboss.dna.web.jcr.rest.client.IServerRegistryListener;
 import org.jboss.dna.web.jcr.rest.client.ServerManager;
+import org.jboss.dna.web.jcr.rest.client.ServerRegistryEvent;
 import org.jboss.dna.web.jcr.rest.client.Status;
 import org.jboss.dna.web.jcr.rest.client.Status.Severity;
 import org.jboss.dna.web.jcr.rest.client.domain.IDnaObject;
@@ -49,9 +55,11 @@
 import org.jboss.dna.web.jcr.rest.client.domain.Workspace;
 
 /**
- * The <code>DnaContentProvider</code> is a content and label provider for DNA repositories.
+ * The <code>DnaContentProvider</code> is a content and label provider for DNA repositories. This class <strong>MUST</strong> be
+ * registered, and then unregistered, to receive server registry events.
  */
-public final class DnaContentProvider extends ColumnLabelProvider implements ILightweightLabelDecorator, ITreeContentProvider {
+public final class DnaContentProvider extends ColumnLabelProvider
+    implements ILightweightLabelDecorator, IServerRegistryListener, ITreeContentProvider {
 
     // ===========================================================================================================================
     // Constants
@@ -62,6 +70,11 @@
      */
     private static final String ID = "org.jboss.dna.eclipse.jcr.rest.client.dnaDecorator"; //$NON-NLS-1$
 
+    /**
+     * If a server connection cannot be established, wait this amount of time before trying again.
+     */
+    private static final long RETRY_DURATION = 10000;
+
     // ===========================================================================================================================
     // Class Methods
     // ===========================================================================================================================
@@ -79,11 +92,23 @@
         return null;
     }
 
-    // ===========================================dnaDecorator================================================================================
+    // ===========================================================================================================================
     // Fields
     // ===========================================================================================================================
 
     /**
+     * Servers that a connection can't be established. Value is the last time a establishing a connection was tried.
+     */
+    @GuardedBy( "offlineServersLock" )
+    private final Map<Server, Long> offlineServerMap = new HashMap<Server, Long>();
+
+    /**
+     * Lock used for when accessing the offline server map. The map will be accessed in different threads as the decorator runs in
+     * its own thread (not the UI thread).
+     */
+    private final ReadWriteLock offlineServersLock = new ReentrantReadWriteLock();
+
+    /**
      * The server manager where the server registry is managed.
      */
     private ServerManager serverManager;
@@ -93,13 +118,15 @@
     // ===========================================================================================================================
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @param server the server that is offline
      */
-    @Override
-    public void addListener( ILabelProviderListener listener ) {
-        // nothing to do
+    private void addOfflineServer( Server server ) {
+        try {
+            this.offlineServersLock.writeLock().lock();
+            this.offlineServerMap.put(server, System.currentTimeMillis());
+        } finally {
+            this.offlineServersLock.writeLock().unlock();
+        }
     }
 
     /**
@@ -117,11 +144,18 @@
             return;
         }
 
-        // must be an IDnaObject
         if (getServerManager() != null) {
             if (element instanceof Server) {
-                Status status = getServerManager().ping((Server)element);
-                overlay = Utils.getOverlayImage(status);
+                Server server = (Server)element;
+
+                if (isOkToConnect(server)) {
+                    Status status = getServerManager().ping(server);
+                    overlay = Utils.getOverlayImage(status);
+
+                    if (status.isError()) {
+                        addOfflineServer(server);
+                    }
+                }
             } else if ((element instanceof IFile) && new DnaResourceHelper(getServerManager()).isPublished((IFile)element)) {
                 overlay = Activator.getDefault().getImageDescriptor(PUBLISHED_OVERLAY_IMAGE);
             }
@@ -152,22 +186,30 @@
         assert (parentElement instanceof IDnaObject);
 
         if (getServerManager() != null) {
-            try {
-                if ((parentElement instanceof Server) && getServerManager().ping((Server)parentElement).isOk()) {
-                    return getServerManager().getRepositories((Server)parentElement).toArray();
+            if (parentElement instanceof Server) {
+                Server server = (Server)parentElement;
+
+                if (isOkToConnect(server)) {
+                    try {
+                        return getServerManager().getRepositories(server).toArray();
+                    } catch (Exception e) {
+                        addOfflineServer(server);
+                        String msg = RestClientI18n.serverManagerGetRepositoriesExceptionMsg.text(server.getShortDescription());
+                        Activator.getDefault().log(new Status(Severity.ERROR, msg, e));
+                    }
                 }
-            } catch (Exception e) {
-                String msg = RestClientI18n.serverManagerGetRepositoriesExceptionMsg.text(((Server)parentElement).getShortDescription());
-                Activator.getDefault().log(new Status(Severity.ERROR, msg, e));
-            }
+            } else if (parentElement instanceof Repository) {
+                Repository repository = (Repository)parentElement;
 
-            try {
-                if (parentElement instanceof Repository) {
-                    return getServerManager().getWorkspaces((Repository)parentElement).toArray();
+                if (isOkToConnect(repository.getServer())) {
+                    try {
+                        return getServerManager().getWorkspaces(repository).toArray();
+                    } catch (Exception e) {
+                        addOfflineServer(repository.getServer());
+                        String msg = RestClientI18n.serverManagerGetWorkspacesExceptionMsg.text(repository.getShortDescription());
+                        Activator.getDefault().log(new Status(Severity.ERROR, msg, e));
+                    }
                 }
-            } catch (Exception e) {
-                String msg = RestClientI18n.serverManagerGetWorkspacesExceptionMsg.text();
-                Activator.getDefault().log(new Status(Severity.ERROR, msg, e));
             }
         }
 
@@ -291,20 +333,9 @@
     public void inputChanged( Viewer viewer,
                               Object oldInput,
                               Object newInput ) {
-        // this.viewer = (StructuredViewer)viewer;
+        // nothing to do
     }
 
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-     */
-    @Override
-    public boolean isLabelProperty( Object element,
-                                    String property ) {
-        return false;
-    }
-
     public void refresh( final Object element ) {
         final Display display = Display.getDefault();
 
@@ -327,13 +358,68 @@
     }
 
     /**
+     * Determines if a try to connect to a server should be done based on the last time a try was done and failed.
+     * 
+     * @param server the server being checked
+     * @return <code>true</code> if it is OK to try and connect
+     */
+    private boolean isOkToConnect( Server server ) {
+        boolean check = false; // check map for time
+
+        try {
+            this.offlineServersLock.readLock().lock();
+            check = this.offlineServerMap.containsKey(server);
+        } finally {
+            this.offlineServersLock.readLock().unlock();
+        }
+
+        if (check) {
+            try {
+                this.offlineServersLock.writeLock().lock();
+
+                if (this.offlineServerMap.containsKey(server)) {
+                    long checkTime = this.offlineServerMap.get(server);
+
+                    // OK to try and connect if last failed attempt was too long ago
+                    if ((System.currentTimeMillis() - checkTime) > RETRY_DURATION) {
+                        this.offlineServerMap.remove(server);
+                        return true;
+                    }
+
+                    // don't try and connect because we just tried and failed
+                    return false;
+                }
+            } finally {
+                this.offlineServersLock.writeLock().unlock();
+            }
+        }
+
+        // OK to try and connect
+        return true;
+    }
+
+    /**
      * {@inheritDoc}
      * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @see org.jboss.dna.web.jcr.rest.client.IServerRegistryListener#serverRegistryChanged(org.jboss.dna.web.jcr.rest.client.ServerRegistryEvent)
      */
     @Override
-    public void removeListener( ILabelProviderListener listener ) {
-        // nothing to do
+    public Exception[] serverRegistryChanged( ServerRegistryEvent event ) {
+        Exception[] errors = null;
+
+        // only care about servers being removed or updated
+        if (event.isRemove() || event.isUpdate()) {
+            try {
+                this.offlineServersLock.writeLock().lock();
+                this.offlineServerMap.remove(event.getServer());
+            } catch (Exception e) {
+                errors = new Exception[] {e};
+            } finally {
+                this.offlineServersLock.writeLock().unlock();
+            }
+        }
+
+        return errors;
     }
 
 }

Modified: trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/ServerView.java
===================================================================
--- trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/ServerView.java	2009-10-07 15:43:05 UTC (rev 1288)
+++ trunk/tools/org.jboss.dna.eclipse.jcr.rest.client/src/org/jboss/dna/eclipse/jcr/rest/client/views/ServerView.java	2009-10-07 16:18:30 UTC (rev 1289)
@@ -218,6 +218,7 @@
 
         // register to receive changes to the server registry
         getServerManager().addRegistryListener(this);
+        getServerManager().addRegistryListener(this.provider);
 
         // register with the help system
         IWorkbenchHelpSystem helpSystem = Activator.getDefault().getWorkbench().getHelpSystem();
@@ -232,6 +233,11 @@
     @Override
     public void dispose() {
         getServerManager().removeRegistryListener(this);
+
+        if (this.provider != null) {
+            getServerManager().removeRegistryListener(this.provider);
+        }
+
         super.dispose();
     }
 
@@ -283,14 +289,14 @@
                 }
             }
         });
-        
+
         // don't want cut, copy, or paste actions so hook them up with a disabled action
         class NoOpAction extends Action {
             NoOpAction() {
                 setEnabled(false);
             }
         }
-        
+
         IAction noop = new NoOpAction();
         bars.setGlobalActionHandler(ActionFactory.CUT.getId(), noop);
         bars.setGlobalActionHandler(ActionFactory.COPY.getId(), noop);



More information about the dna-commits mailing list