| | |
| | | import javax.swing.JSeparator; |
| | | import javax.swing.JSplitPane; |
| | | import javax.swing.JTree; |
| | | import javax.swing.SwingUtilities; |
| | | import javax.swing.event.TreeSelectionEvent; |
| | | import javax.swing.event.TreeSelectionListener; |
| | | import javax.swing.tree.TreePath; |
| | | |
| | | import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo; |
| | | import org.opends.guitools.controlpanel.datamodel.CustomSearchResult; |
| | | import org.opends.guitools.controlpanel.datamodel.ServerDescriptor; |
| | | import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent; |
| | | import org.opends.guitools.controlpanel.event.EntryReadErrorEvent; |
| | |
| | | |
| | | private boolean ignoreTreeSelectionEvents = false; |
| | | |
| | | private ArrayList<LDAPEntryReader> entryReaderQueue = |
| | | new ArrayList<LDAPEntryReader>(); |
| | | private LDAPEntryReader entryReader; |
| | | |
| | | private Thread entryReaderThread; |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | |
| | | controller.findConnectionForDisplayedEntry(node); |
| | | LDAPEntryReader reader = new LDAPEntryReader(dn, ctx); |
| | | reader.addEntryReadListener(entryPane); |
| | | cleanupReaderQueue(); |
| | | // Required to update the browser controller properly if the entry is |
| | | // deleted. |
| | | entryPane.setTreePath(path); |
| | | reader.startBackgroundTask(); |
| | | entryReaderQueue.add(reader); |
| | | stopCurrentReader(); |
| | | startReader(reader); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | cleanupReaderQueue(); |
| | | stopCurrentReader(); |
| | | if ((paths != null) && (paths.length > 1)) |
| | | { |
| | | entryPane.multipleEntriesSelected(); |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Cleans up the reader queue (the queue where we store the entries that we |
| | | * must read). |
| | | * |
| | | */ |
| | | private void cleanupReaderQueue() |
| | | private void stopCurrentReader() |
| | | { |
| | | ArrayList<LDAPEntryReader> toRemove = new ArrayList<LDAPEntryReader>(); |
| | | for (LDAPEntryReader r : entryReaderQueue) |
| | | if (entryReader != null) |
| | | { |
| | | if (r.isOver()) |
| | | { |
| | | toRemove.add(r); |
| | | } |
| | | else |
| | | { |
| | | r.interrupt(); |
| | | } |
| | | entryReader.setNotifyListeners(false); |
| | | } |
| | | entryReaderQueue.removeAll(toRemove); |
| | | } |
| | | |
| | | /** |
| | | * Starts the provider reader. |
| | | * @param reader the LDAPEntryReader. |
| | | */ |
| | | private void startReader(LDAPEntryReader reader) |
| | | { |
| | | entryReader = reader; |
| | | if ((entryReaderThread == null) || !entryReaderThread.isAlive()) |
| | | { |
| | | entryReaderThread = new Thread(new Runnable() |
| | | { |
| | | LDAPEntryReader reader; |
| | | CustomSearchResult sr; |
| | | Throwable t; |
| | | public void run() |
| | | { |
| | | while (true) |
| | | { |
| | | try |
| | | { |
| | | synchronized (entryReaderThread) |
| | | { |
| | | while ((reader = entryReader) == null) |
| | | { |
| | | entryReaderThread.wait(); |
| | | } |
| | | } |
| | | sr = null; |
| | | t = null; |
| | | try |
| | | { |
| | | sr = reader.processBackgroundTask(); |
| | | } |
| | | catch (Throwable th) |
| | | { |
| | | t = th; |
| | | } |
| | | SwingUtilities.invokeAndWait(new Runnable() |
| | | { |
| | | public void run() |
| | | { |
| | | reader.backgroundTaskCompleted(sr, t); |
| | | if (reader == entryReader) |
| | | { |
| | | entryReader = null; |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | entryReader = null; |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | entryReaderThread.start(); |
| | | } |
| | | synchronized (entryReaderThread) |
| | | { |
| | | entryReaderThread.notify(); |
| | | } |
| | | } |
| | | |
| | | /** |