You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2010/01/14 14:58:46 UTC

svn commit: r899200 - in /directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors: EntryEditorManager.java OpenEntryEditorJob.java

Author: pamarcelot
Date: Thu Jan 14 13:58:46 2010
New Revision: 899200

URL: http://svn.apache.org/viewvc?rev=899200&view=rev
Log:
Fix for DIRSTUDIO-616 (Entry Editor Manager does not ensure that the entry's attributes are initialized (loaded) before testing and opening editors).

New fix as the previous one introduced a regression (the opening of the editor was synchronous with the load of attributes of the entry in the UI thread which could lead to a non responding UI in case the load of attributes takes a while).
This fix uses an asynchronous job, separate from the UI thread which gives the control back to the UI as soon as the job is scheduled.

Added:
    directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/OpenEntryEditorJob.java
Modified:
    directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/EntryEditorManager.java

Modified: directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/EntryEditorManager.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/EntryEditorManager.java?rev=899200&r1=899199&r2=899200&view=diff
==============================================================================
--- directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/EntryEditorManager.java (original)
+++ directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/EntryEditorManager.java Thu Jan 14 13:58:46 2010
@@ -47,16 +47,13 @@
 import org.apache.directory.studio.ldapbrowser.core.events.ValueModifiedEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.ValueMultiModificationEvent;
 import org.apache.directory.studio.ldapbrowser.core.events.ValueRenamedEvent;
-import org.apache.directory.studio.ldapbrowser.core.jobs.StudioBrowserJob;
 import org.apache.directory.studio.ldapbrowser.core.jobs.UpdateEntryRunnable;
 import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
 import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
 import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
-import org.apache.directory.studio.ldapbrowser.core.model.IContinuation;
 import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
 import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
 import org.apache.directory.studio.ldapbrowser.core.model.IValue;
-import org.apache.directory.studio.ldapbrowser.core.model.IContinuation.State;
 import org.apache.directory.studio.ldapbrowser.core.utils.CompoundModification;
 import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
 import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
@@ -81,7 +78,6 @@
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchPartReference;
 import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 
@@ -730,72 +726,8 @@
     public void openEntryEditor( EntryEditorExtension extension, IEntry[] entries, ISearchResult[] searchResults,
         IBookmark[] bookmarks )
     {
-        EntryEditorInput input = null;
-        IEntry entry;
-        if ( entries.length == 1 )
-        {
-            input = new EntryEditorInput( entries[0], extension );
-            entry = entries[0];
-        }
-        else if ( searchResults.length == 1 )
-        {
-            input = new EntryEditorInput( searchResults[0], extension );
-            entry = searchResults[0].getEntry();
-        }
-        else if ( bookmarks.length == 1 )
-        {
-            input = new EntryEditorInput( bookmarks[0], extension );
-            entry = bookmarks[0].getEntry();
-            if ( entry.getBrowserConnection().getEntryFromCache( entry.getDn() ) == null )
-            {
-                EntryEditorUtils.ensureAttributesInitialized( entry );
-            }
-        }
-        else
-        {
-            input = new EntryEditorInput( ( IEntry ) null, extension );
-            entry = null;
-        }
-
-        if ( entry != null )
-        {
-            if ( entry instanceof IContinuation )
-            {
-                IContinuation continuation = ( IContinuation ) entry;
-                if ( continuation.getState() == State.UNRESOLVED )
-                {
-                    continuation.resolve();
-                }
-            }
-            else
-            {
-                try
-                {
-                    // Making sure attributes are initialized
-                    StudioBrowserJob job = EntryEditorUtils.ensureAttributesInitialized( entry );
-                    if ( job != null )
-                    {
-                        // Waiting for the entry's attributes to be initialized
-                        job.join();
-                    }
-                }
-                catch ( InterruptedException e )
-                {
-                    // Nothing to do
-                }
-            }
-        }
-
-        String editorId = extension.getEditorId();
-
-        try
-        {
-            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor( input, editorId, false );
-        }
-        catch ( PartInitException e )
-        {
-            throw new RuntimeException( e );
-        }
+        OpenEntryEditorJob runnable = new OpenEntryEditorJob( extension, entries, searchResults, bookmarks );
+        runnable.schedule();
     }
 
 
@@ -813,50 +745,8 @@
      */
     public void openEntryEditor( IEntry[] entries, ISearchResult[] searchResults, IBookmark[] bookmarks )
     {
-        // Looking for the entry to test the editor on
-        IEntry entry = null;
-        if ( entries.length == 1 )
-        {
-            entry = entries[0];
-        }
-        else if ( searchResults.length == 1 )
-        {
-            entry = searchResults[0].getEntry();
-        }
-        else if ( bookmarks.length == 1 )
-        {
-            entry = bookmarks[0].getEntry();
-        }
-
-        if ( entry != null )
-        {
-            try
-            {
-                // Making sure attributes are initialized
-                StudioBrowserJob job = EntryEditorUtils.ensureAttributesInitialized( entry );
-                if ( job != null )
-                {
-                    // Waiting for the entry's attributes to be initialized
-                    job.join();
-                }
-            }
-            catch ( InterruptedException e )
-            {
-                // Nothing to do
-            }
-        }
-
-        // Looking for the correct entry editor
-        for ( EntryEditorExtension entryEditor : getSortedEntryEditorExtensions() )
-        {
-            // Verifying that the editor can handle the entry
-            if ( entryEditor.getEditorInstance().canHandle( entry ) )
-            {
-                // The correct editor has been found, let's open the entry in the editor
-                openEntryEditor( entryEditor, entries, searchResults, bookmarks );
-                return;
-            }
-        }
+        OpenEntryEditorJob runnable = new OpenEntryEditorJob( entries, searchResults, bookmarks );
+        runnable.schedule();
     }
 
 

Added: directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/OpenEntryEditorJob.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/OpenEntryEditorJob.java?rev=899200&view=auto
==============================================================================
--- directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/OpenEntryEditorJob.java (added)
+++ directory/studio/trunk/ldapbrowser-ui/src/main/java/org/apache/directory/studio/entryeditors/OpenEntryEditorJob.java Thu Jan 14 13:58:46 2010
@@ -0,0 +1,214 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.directory.studio.entryeditors;
+
+
+import org.apache.directory.studio.ldapbrowser.core.jobs.StudioBrowserJob;
+import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
+import org.apache.directory.studio.ldapbrowser.core.model.IContinuation;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
+import org.apache.directory.studio.ldapbrowser.core.model.IContinuation.State;
+import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+
+/**
+ * Job to open an entry editor. 
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class OpenEntryEditorJob extends Job
+{
+    private IEntry[] entries;
+    private ISearchResult[] searchResults;
+    private IBookmark[] bookmarks;
+    private EntryEditorExtension extension;
+
+
+    /**
+     * Creates a new instance of OpenEntryEditorJob.
+     * <p>
+     * Opens an entry editor from one of the given entries, 
+     * search results or bookmarks.
+     * 
+     * @param entries
+     *      an array of entries
+     * @param searchResults
+     *      an array of search results
+     * @param bookmarks
+     *      an arrays of bookmarks
+     */
+    public OpenEntryEditorJob( IEntry[] entries, ISearchResult[] searchResults, IBookmark[] bookmarks )
+    {
+        super( "" ); //$NON-NLS-1$
+        this.entries = entries;
+        this.searchResults = searchResults;
+        this.bookmarks = bookmarks;
+
+        // Using a high priority for this job
+        setPriority( Job.INTERACTIVE );
+    }
+
+
+    /**
+     * Creates a new instance of OpenEntryEditorJob.
+     * <p>
+     * Opens an entry editor with the given entry editor extension and one of 
+     * the given entries, search results or bookmarks.
+     * 
+     * @param extension
+     *      the entry editor extension
+     * @param entries
+     *      an array of entries
+     * @param searchResults
+     *      an array of search results
+     * @param bookmarks
+     *      an arrays of bookmarks
+     */
+    public OpenEntryEditorJob( EntryEditorExtension extension, IEntry[] entries, ISearchResult[] searchResults,
+        IBookmark[] bookmarks )
+    {
+        super( "" ); //$NON-NLS-1$
+        this.extension = extension;
+        this.entries = entries;
+        this.searchResults = searchResults;
+        this.bookmarks = bookmarks;
+
+        // Using a high priority for this job
+        setPriority( Job.INTERACTIVE );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    protected IStatus run( IProgressMonitor monitor )
+    {
+        // Getting the entry to open
+        IEntry entry = null;
+
+        if ( entries.length == 1 )
+        {
+            entry = entries[0];
+        }
+        else if ( searchResults.length == 1 )
+        {
+            entry = searchResults[0].getEntry();
+        }
+        else if ( bookmarks.length == 1 )
+        {
+            entry = bookmarks[0].getEntry();
+        }
+
+        if ( entry != null )
+        {
+            if ( entry instanceof IContinuation )
+            {
+                IContinuation continuation = ( IContinuation ) entry;
+                if ( continuation.getState() == State.UNRESOLVED )
+                {
+                    continuation.resolve();
+                }
+            }
+            else
+            {
+                try
+                {
+                    // Making sure attributes are initialized
+                    StudioBrowserJob job = EntryEditorUtils.ensureAttributesInitialized( entry );
+                    if ( job != null )
+                    {
+                        // Waiting for the entry's attributes to be initialized
+                        job.join();
+                    }
+                }
+                catch ( InterruptedException e )
+                {
+                    // Nothing to do
+                }
+            }
+        }
+
+        // If no entry editor was provided, find the correct one
+        if ( extension == null )
+        {
+            // Looking for the correct entry editor
+            for ( EntryEditorExtension entryEditorExtension : BrowserUIPlugin.getDefault().getEntryEditorManager()
+                .getSortedEntryEditorExtensions() )
+            {
+                // Verifying that the editor can handle the entry
+                if ( entryEditorExtension.getEditorInstance().canHandle( entry ) )
+                {
+                    extension = entryEditorExtension;
+                    break;
+                }
+            }
+        }
+
+        // Getting the editor's ID and creating the proper editor input
+        final String editorId = extension.getEditorId();
+        final EntryEditorInput editorInput;
+        if ( entries.length == 1 )
+        {
+            editorInput = new EntryEditorInput( entries[0], extension );
+        }
+        else if ( searchResults.length == 1 )
+        {
+            editorInput = new EntryEditorInput( searchResults[0], extension );
+        }
+        else if ( bookmarks.length == 1 )
+        {
+            editorInput = new EntryEditorInput( bookmarks[0], extension );
+        }
+        else
+        {
+            editorInput = new EntryEditorInput( ( IEntry ) null, extension );
+        }
+
+        // Opening the editor
+        Display.getDefault().asyncExec( new Runnable()
+        {
+
+            public void run()
+            {
+                try
+                {
+                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor( editorInput,
+                        editorId, true );
+                }
+                catch ( PartInitException e )
+                {
+                    throw new RuntimeException( e );
+                }
+            }
+        } );
+
+        return Status.OK_STATUS;
+    }
+}