This is an automated email from the ASF dual-hosted git repository.

lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new e812655  Quicksearch API allows to check for cancel. (#2298)
e812655 is described below

commit e812655fa7ac17cc155c172754661922a51ebf26
Author: Svatopluk Dedic <svatopluk.de...@oracle.com>
AuthorDate: Tue Sep 29 04:35:08 2020 +0200

    Quicksearch API allows to check for cancel. (#2298)
    
    * Quicksearch API allows to check for cancel.
    
    * Added test for obsolete, fixed other tests.
---
 platform/spi.quicksearch/apichanges.xml            | 87 ++++++++++++++++++++++
 .../spi.quicksearch/nbproject/project.properties   |  1 +
 platform/spi.quicksearch/nbproject/project.xml     |  1 +
 .../modules/quicksearch/CategoryResult.java        |  4 +-
 .../netbeans/spi/quicksearch/SearchProvider.java   |  5 ++
 .../netbeans/spi/quicksearch/SearchResponse.java   | 14 ++++
 .../modules/quicksearch/ObsoleteSupportTest.java   |  2 +-
 .../modules/quicksearch/ProviderModelTest.java     |  2 +-
 .../modules/quicksearch/SlowProviderTest.java      | 41 +++++++++-
 .../modules/quicksearch/UnitTestUtils.java         |  4 +-
 10 files changed, 152 insertions(+), 9 deletions(-)

diff --git a/platform/spi.quicksearch/apichanges.xml 
b/platform/spi.quicksearch/apichanges.xml
new file mode 100644
index 0000000..083e845
--- /dev/null
+++ b/platform/spi.quicksearch/apichanges.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<?xml-stylesheet type="text/xml" 
href="CHANGEME/nbbuild/javadoctools/apichanges.xsl"?>
+<!DOCTYPE apichanges PUBLIC "-//NetBeans//DTD API changes list 1.0//EN" 
"../../nbbuild/javadoctools/apichanges.dtd">
+
+
+<apichanges>
+    <apidefs>
+        <apidef name="quicksearch_spi">Quicksearch SPI</apidef>
+    </apidefs>
+
+  <changes>
+      <change id="isObsolete">
+          <api name="quicksearch_spi"/>
+          <summary>
+              Allows to check for obsoleted resultset.
+          </summary>
+          <version major="1" minor="37"/>
+          <date day="7" month="8" year="2020"/>
+          <author login="sdedic"/>
+          <compatibility binary="compatible" source="compatible" 
addition="yes"/>
+          <description>
+              A <a 
href="@TOP@/org/netbeans/spi/quicksearch/SearchProvider.html">SearchProvider</a>
 that 
+              is searching and cannot find a result can check whether the 
result is still valid, using
+              <a 
href="@TOP@/org/netbeans/spi/quicksearch/SearchResponse.html#isObsolete--"><code>SearchResponse.isObsolete()</code></a>.
+              It was only possible to check for terminated search when a new 
item was added.
+          </description>
+          <class package="org.netbeans.spi.quicksearch" name="SearchResponse"/>
+      </change>
+      
+  </changes>
+
+    <!-- Now the surrounding HTML text and document structure: -->
+
+    <htmlcontents>
+<!--
+
+                            NO NO NO NO NO!
+
+         ==============>    DO NOT EDIT ME!  <==============
+
+          AUTOMATICALLY GENERATED FROM APICHANGES.XML, DO NOT EDIT
+
+                SEE CHANGEME/apichanges.xml
+
+-->
+    <head>
+      <title>Change History for the Progress API</title>
+      <link rel="stylesheet" href="prose.css" type="text/css"/>
+    </head>
+    <body>
+
+<p class="overviewlink"><a href="overview-summary.html">Overview</a></p>
+
+<h1>Introduction</h1>
+
+<p>This document lists changes made to the Progress API/SPI.</p>
+
+<!-- The actual lists of changes, as summaries and details: -->
+
+      <hr/><standard-changelists 
module-code-name="org.netbeans.spi.quicksearch"/>
+
+      <hr/><p>@FOOTER@</p>
+
+    </body>
+  </htmlcontents>
+
+</apichanges>
diff --git a/platform/spi.quicksearch/nbproject/project.properties 
b/platform/spi.quicksearch/nbproject/project.properties
index 02b43d0..e86c855 100644
--- a/platform/spi.quicksearch/nbproject/project.properties
+++ b/platform/spi.quicksearch/nbproject/project.properties
@@ -18,5 +18,6 @@ is.autoload=true
 javac.source=1.6
 javac.compilerargs=-Xlint -Xlint:-serial
 javadoc.arch=${basedir}/arch.xml
+javadoc.apichanges=${basedir}/apichanges.xml
 
 test.config.stableBTD.includes=**/*Test.class
diff --git a/platform/spi.quicksearch/nbproject/project.xml 
b/platform/spi.quicksearch/nbproject/project.xml
index 2bfbc72..7ef05d5 100644
--- a/platform/spi.quicksearch/nbproject/project.xml
+++ b/platform/spi.quicksearch/nbproject/project.xml
@@ -117,6 +117,7 @@
                     </test-dependency>
                     <test-dependency>
                         
<code-name-base>org.netbeans.core.startup</code-name-base>
+                        <recursive/>
                     </test-dependency>
                     <test-dependency>
                         
<code-name-base>org.netbeans.libs.junit4</code-name-base>
diff --git 
a/platform/spi.quicksearch/src/org/netbeans/modules/quicksearch/CategoryResult.java
 
b/platform/spi.quicksearch/src/org/netbeans/modules/quicksearch/CategoryResult.java
index d5ff7ad..64deac3 100644
--- 
a/platform/spi.quicksearch/src/org/netbeans/modules/quicksearch/CategoryResult.java
+++ 
b/platform/spi.quicksearch/src/org/netbeans/modules/quicksearch/CategoryResult.java
@@ -121,7 +121,9 @@ public final class CategoryResult implements Runnable {
     }
 
     public boolean isObsolete() {
-        return obsolete;
+        synchronized (LOCK) {
+            return obsolete;
+        }
     }
 
     /** Sends notification about category change, always runs in EQ thread */
diff --git 
a/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchProvider.java 
b/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchProvider.java
index 1a955ce..3cd1d0a 100644
--- 
a/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchProvider.java
+++ 
b/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchProvider.java
@@ -65,6 +65,11 @@ public interface SearchProvider {
      *  }
      * </pre>
      * 
+     * It may happen that the Provider searches for some considerable time, or 
searches
+     * a considerable number of items without any results. It may check use 
+     * {@link SearchResponse#isObsolete()} to determine if the search was 
cancelled 
+     * or obsoleted without adding any items.
+     * <p>
      * Threading: This method can be called outside EQ thread by 
infrastructure.
      * 
      * @param request Search request object that contains information what to
diff --git 
a/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchResponse.java 
b/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchResponse.java
index e44c6b5..cb78959 100644
--- 
a/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchResponse.java
+++ 
b/platform/spi.quicksearch/src/org/netbeans/spi/quicksearch/SearchResponse.java
@@ -99,5 +99,19 @@ public final class SearchResponse {
                 new ResultsModel.ItemResult(catResult, sRequest, action,
                 htmlDisplayName, shortcut, displayHint));
     }
+    
+    /**
+     * Determines if the response is already obsolete. The result is the same 
as the 
+     * return value from {@link #addResult(java.lang.Runnable, 
java.lang.String)}: if
+     * false, the Provider should terminate the search immediately. Provider 
can query
+     * this status in case it does not find any results so it does not waste 
time
+     * searching further. 
+     * 
+     * @return true, if the result is obsolete.
+     * @since 12.2
+     */
+    public boolean isObsolete() {
+        return catResult.isObsolete();
+    }
 
 }
diff --git 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ObsoleteSupportTest.java
 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ObsoleteSupportTest.java
index 32f271a..8e70f80 100644
--- 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ObsoleteSupportTest.java
+++ 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ObsoleteSupportTest.java
@@ -35,7 +35,7 @@ public class ObsoleteSupportTest extends NbTestCase {
     public void testObsoleteSupport () throws Exception {
         System.out.println("Testing obsolete support...");
 
-        UnitTestUtils.prepareTest(new String [] { 
"/org/netbeans/modules/quicksearch/resources/testGetProviders.xml" });
+        UnitTestUtils.prepareTest(new String [] { 
"org/netbeans/modules/quicksearch/resources/testGetProviders.xml" });
         ResultsModel rm = ResultsModel.getInstance();
 
         CommandEvaluator.evaluate("test obsolete 1", rm);
diff --git 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ProviderModelTest.java
 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ProviderModelTest.java
index 5f41707..86c8728 100644
--- 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ProviderModelTest.java
+++ 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/ProviderModelTest.java
@@ -41,7 +41,7 @@ public class ProviderModelTest extends NbTestCase {
     
     /** Tests ProviderModel functionality */
     public void testGetProviders () throws Exception {
-        UnitTestUtils.prepareTest(new String [] { 
"/org/netbeans/modules/quicksearch/resources/testGetProviders.xml" });
+        UnitTestUtils.prepareTest(new String [] { 
"org/netbeans/modules/quicksearch/resources/testGetProviders.xml" });
         
         ProviderModel model = ProviderModel.getInstance();
         
diff --git 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/SlowProviderTest.java
 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/SlowProviderTest.java
index a171115..c80dfe7 100644
--- 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/SlowProviderTest.java
+++ 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/SlowProviderTest.java
@@ -19,6 +19,7 @@
 
 package org.netbeans.modules.quicksearch;
 
+import java.util.concurrent.Semaphore;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.junit.RandomlyFails;
 import org.netbeans.spi.quicksearch.SearchProvider;
@@ -41,7 +42,7 @@ public class SlowProviderTest extends NbTestCase {
 
     @RandomlyFails
     public void testResponsiveness () throws Exception {
-        UnitTestUtils.prepareTest(new String [] { 
"/org/netbeans/modules/quicksearch/resources/testSlowProvider.xml" });
+        UnitTestUtils.prepareTest(new String [] { 
"org/netbeans/modules/quicksearch/resources/testSlowProvider.xml" });
 
         System.out.println("Testing resposiveness against slow providers...");
         
@@ -61,7 +62,7 @@ public class SlowProviderTest extends NbTestCase {
 
         // should be still running
         assertFalse(t.isFinished());
-
+        
         // wait for all providers
         t.waitFinished();
 
@@ -73,13 +74,47 @@ public class SlowProviderTest extends NbTestCase {
 
 
     }
+    
+    /**
+     * Checks that the slow search is given a flag to terminate even though
+     * it does not find anything
+     */
+    public void testSlowSearchObsoleted() throws Exception {
+        UnitTestUtils.prepareTest(new String [] { 
"org/netbeans/modules/quicksearch/resources/testSlowProvider.xml" });
+        
+        ResultsModel mod = ResultsModel.getInstance();
+        org.openide.util.Task t =
+                CommandEvaluator.evaluate("sample text", mod);
+
+        RequestProcessor.getDefault().post(t);
+
+        // should be still running
+        assertFalse(t.isFinished());
+        
+        assertFalse("Resultset must be valid initially", obsoleteAtStart);
+        
+        sync.acquire();
+        // cancel as if ESC was pressed in popup
+        mod.setContent(null);
+        
+        // wait for all providers
+        assertTrue("Must complete in approx 5secs", t.waitFinished(WAIT_TIME * 
2));
+        
+        assertTrue("The provider must saw obsoleted resultset", obsoleteAtEnd);
+    }
 
+    private static final Semaphore sync = new Semaphore(0);
+    private volatile static boolean obsoleteAtStart;
+    private volatile static boolean obsoleteAtEnd;
     
     public static class SlowProvider implements SearchProvider {
-
+        
         public void evaluate(SearchRequest request, SearchResponse response) {
             try {
+                obsoleteAtStart = response.isObsolete();
+                sync.release();
                 Thread.sleep(5000);
+                obsoleteAtEnd = response.isObsolete();
             } catch (InterruptedException ex) {
                 System.err.println("SlowProvider interrupted...");
             }
diff --git 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
index d5ae548..083b36b 100644
--- 
a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
+++ 
b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
@@ -22,9 +22,7 @@ package org.netbeans.modules.quicksearch;
 import java.beans.PropertyVetoException;
 import java.io.IOException;
 import java.net.URL;
-import javax.swing.text.Utilities;
 import junit.framework.Assert;
-import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.XMLFileSystem;
 import org.openide.util.Lookup;
@@ -59,7 +57,7 @@ public class UnitTestUtils extends ProxyLookup {
         URL[] layers = new URL[stringLayers.length];
         
         for (int cntr = 0; cntr < layers.length; cntr++) {
-            layers[cntr] = Utilities.class.getResource(stringLayers[cntr]);
+            layers[cntr] = 
UnitTestUtils.class.getClassLoader().getResource(stringLayers[cntr]);
         }
         
         XMLFileSystem system = new XMLFileSystem();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to