diff -r c9cba4f80aef java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java
--- a/java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java Wed Nov 04 12:42:44 2009 +0300
+++ b/java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java Wed Nov 04 12:45:16 2009 +0100
@@ -347,13 +347,8 @@
}
if (types.isEmpty() && scanInProgress) {
- try {
- synchronized (JavaTypeProvider.this) {
- this.wait(2000);
- }
- } catch (InterruptedException ex) {
- Exceptions.printStackTrace(ex);
- }
+ res.pendingResult();
+ return;
}
if ( isCanceled ) {
diff -r c9cba4f80aef jumpto/apichanges.xml
--- a/jumpto/apichanges.xml Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/apichanges.xml Wed Nov 04 12:45:16 2009 +0100
@@ -121,6 +121,22 @@
+
+
+ Added method (Type|Symbol)Provider.Result.pendingResult()
+
+
+
+
+
+ Added method TypeProvider.Result.pendingResult() and
+ SymbolProvider.Result.pendingResult() to notify
+ provider's caller that the provider should be called again.
+
+
+
+
+
diff -r c9cba4f80aef jumpto/manifest.mf
--- a/jumpto/manifest.mf Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/manifest.mf Wed Nov 04 12:45:16 2009 +0100
@@ -2,5 +2,5 @@
OpenIDE-Module: org.netbeans.modules.jumpto/1
OpenIDE-Module-Layer: org/netbeans/modules/jumpto/resources/layer.xml
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/jumpto/resources/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.11
+OpenIDE-Module-Specification-Version: 1.12
AutoUpdate-Show-In-Client: false
diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java
--- a/jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java Wed Nov 04 12:45:16 2009 +0100
@@ -45,6 +45,7 @@
import org.netbeans.spi.jumpto.symbol.SymbolProvider;
import org.netbeans.spi.jumpto.type.SearchType;
import org.openide.util.Exceptions;
+import static org.netbeans.spi.jumpto.symbol.SymbolProvider.*;
/**
*
@@ -65,4 +66,6 @@
public abstract SymbolProvider.Context createContext(Project p, String text, SearchType t);
public abstract SymbolProvider.Result createResult(List super SymbolDescriptor> result, String[] message);
+
+ public abstract int getRetry(Result result);
}
diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java
--- a/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java Wed Nov 04 12:45:16 2009 +0100
@@ -63,6 +63,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
@@ -389,40 +390,51 @@
this.text = text;
this.createTime = System.currentTimeMillis();
LOGGER.fine( "Worker for " + text + " - created after " + ( System.currentTimeMillis() - panel.time ) + " ms." );
- }
-
+ }
+
public void run() {
-
- LOGGER.fine( "Worker for " + text + " - started " + ( System.currentTimeMillis() - createTime ) + " ms." );
-
- final List extends TypeDescriptor> types = getTypeNames( text );
- if ( isCanceled ) {
- LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." );
- return;
- }
- ListModel model = Models.fromList(types);
- if (typeFilter != null) {
- model = LazyListModel.create(model, GoToTypeAction.this, 0.1, "Not computed yet");
- }
- final ListModel fmodel = model;
- if ( isCanceled ) {
- LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." );
- return;
- }
-
- if ( !isCanceled && fmodel != null ) {
- LOGGER.fine( "Worker for text " + text + " finished after " + ( System.currentTimeMillis() - createTime ) + " ms." );
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- panel.setModel(fmodel);
- if (okButton != null && !types.isEmpty()) {
- okButton.setEnabled (true);
+ for (;;) {
+ final int[] retry = new int[1];
+ LOGGER.fine( "Worker for " + text + " - started " + ( System.currentTimeMillis() - createTime ) + " ms." );
+
+ final List extends TypeDescriptor> types = getTypeNames( text, retry);
+ if ( isCanceled ) {
+ LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." );
+ return;
+ }
+ ListModel model = Models.fromList(types);
+ if (typeFilter != null) {
+ model = LazyListModel.create(model, GoToTypeAction.this, 0.1, "Not computed yet");
+ }
+ final ListModel fmodel = model;
+ if ( isCanceled ) {
+ LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." );
+ return;
+ }
+
+ if ( !isCanceled && fmodel != null ) {
+ LOGGER.fine( "Worker for text " + text + " finished after " + ( System.currentTimeMillis() - createTime ) + " ms." );
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (!types.isEmpty() || retry[0] == 0) {
+ panel.setModel(fmodel);
+ }
+ if (okButton != null && !types.isEmpty()) {
+ okButton.setEnabled (true);
+ }
}
+ });
+ }
+ if (retry[0] > 0) {
+ try {
+ Thread.sleep(retry[0]);
+ } catch (InterruptedException ex) {
+ LOGGER.log(Level.WARNING, "Waiting for retry", ex);
}
- });
- }
-
-
+ } else {
+ return;
+ }
+ } // for
}
public void cancel() {
@@ -440,7 +452,7 @@
}
@SuppressWarnings("unchecked")
- private List extends TypeDescriptor> getTypeNames(String text) {
+ private List extends TypeDescriptor> getTypeNames(String text, int[] retry) {
// TODO: Search twice, first for current project, then for all projects
List items;
// Multiple providers: merge results
@@ -465,8 +477,8 @@
}
long delta = System.currentTimeMillis() - start;
LOGGER.fine("Provider '" + provider.getDisplayName() + "' took " + delta + " ms.");
-
}
+ retry[0] = TypeProviderAccessor.DEFAULT.getRetry(result);
if ( !isCanceled ) {
//time = System.currentTimeMillis();
Collections.sort(items, new TypeComparator());
@@ -513,7 +525,7 @@
final void waitSearchFinished() {
task.waitFinished();
}
-
+
private static class Renderer extends DefaultListCellRenderer implements ChangeListener {
private MyPanel rendererComponent;
diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java
--- a/jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java Wed Nov 04 12:45:16 2009 +0100
@@ -64,4 +64,6 @@
public abstract Context createContext(Project p, String text, SearchType t);
public abstract Result createResult(List super TypeDescriptor> result, String[] message);
+
+ public abstract int getRetry(Result result);
}
diff -r c9cba4f80aef jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java
--- a/jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java Wed Nov 04 12:45:16 2009 +0100
@@ -135,7 +135,14 @@
@Override
public Result createResult(List super SymbolDescriptor> result, String[] message) {
return new Result(result, message);
- }
+ }
+
+ @Override
+ public int getRetry(Result result) {
+ return result.retry;
+ }
+
+
};
}
@@ -179,6 +186,7 @@
private List super SymbolDescriptor> result;
private String[] message;
+ private int retry;
Result(List super SymbolDescriptor> result, String[] message) {
this.result = result;
@@ -213,6 +221,19 @@
public void addResult(List extends SymbolDescriptor> symbolDescriptor) {
((List)result).addAll(symbolDescriptor); //workaround javac issue http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6507334
}
+
+ /**
+ * Notify caller that a provider should be called again because
+ * of incomplete or inaccurate results.
+ *
+ * Method can be used when long running task blocks the provider
+ * to complete the data.
+ *
+ * @since 1.12
+ */
+ public void pendingResult() {
+ retry = 2000;
+ }
}
}
diff -r c9cba4f80aef jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java
--- a/jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java Wed Nov 04 12:42:44 2009 +0300
+++ b/jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java Wed Nov 04 12:45:16 2009 +0100
@@ -138,6 +138,11 @@
public Result createResult(List super TypeDescriptor> result, String[] message) {
return new Result(result, message);
}
+
+ @Override
+ public int getRetry(Result result) {
+ return result.retry;
+ }
};
}
@@ -182,6 +187,7 @@
private List super TypeDescriptor> result;
private String[] message;
+ private int retry;
Result(List super TypeDescriptor> result, String[] message) {
this.result = result;
@@ -216,6 +222,19 @@
public void addResult(List extends TypeDescriptor> typeDescriptor) {
((List)result).addAll(typeDescriptor); //workaround javac issue http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6507334
}
+
+ /**
+ * Notify caller that a provider should be called again because
+ * of incomplete or inaccurate results.
+ *
+ * Method can be used when long running task blocks the provider
+ * to complete the data.
+ *
+ * @since 1.12
+ */
+ public void pendingResult() {
+ retry = 2000;
+ }
}
}