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

bdelacretaz pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-capabilities-jcr.git

commit 22b31bd3c16733446ff7df3307ae82fc75a5fb34
Author: Bertrand Delacretaz <[email protected]>
AuthorDate: Fri Oct 19 11:59:12 2018 +0200

    Use a service user for search capabilities query
---
 pom.xml                                            |  8 +++++-
 .../sling/capabilities/jcr/SearchSource.java       | 33 ++++++++++++++--------
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5d1061f..69956ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,13 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.jcr.api</artifactId>
-      <version>2.0.6</version>
+      <version>2.2.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.serviceusermapper</artifactId>
+      <version>1.2.0</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
diff --git a/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java 
b/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java
index 250ed5a..31bad69 100644
--- a/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java
+++ b/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java
@@ -27,6 +27,7 @@ import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import org.apache.sling.capabilities.CapabilitiesSource;
 import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.serviceusermapping.ServiceUserMapped;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
@@ -40,20 +41,25 @@ public class SearchSource implements CapabilitiesSource {
 
     public static final String SSA_PROP_NAME = "similarity.search.active";
 
+    public static final String SUBSERVICE_NAME = "search";
+
     public static final int SIMILARITY_SEARCH_CACHE_LIFETIME_SECONDS = 60;
 
     private final Logger log = LoggerFactory.getLogger(getClass().getName());
-    private boolean similaritySearchActive;
+    private String similaritySearchActiveResult;
     private long similaritySearchCacheExpires;
 
     @Reference
     private SlingRepository repository;
     
+    @Reference(target="("+ServiceUserMapped.SUBSERVICENAME+"=" + 
SUBSERVICE_NAME + ")")
+    private ServiceUserMapped scriptServiceUserMapped;
+
     @Override
     public Map<String, Object> getCapabilities() throws Exception {
         refreshCachedValues();
         final Map<String, Object> result = new HashMap<>();
-        result.put("similarity.search.active", 
String.valueOf(similaritySearchActive));
+        result.put("similarity.search.active", similaritySearchActiveResult);
         return result;
     }
 
@@ -61,27 +67,32 @@ public class SearchSource implements CapabilitiesSource {
      *  searching for any index definition that has useInSimilarity=true.
      *  Cache the result to avoid making too many searches.
      */
-    private void refreshCachedValues() throws RepositoryException {
+    private void refreshCachedValues() {
         if(System.currentTimeMillis() < similaritySearchCacheExpires) {
             log.debug("Using cached similaritySearchActive value");
             return;
         }
 
         similaritySearchCacheExpires = System.currentTimeMillis() + 
(SIMILARITY_SEARCH_CACHE_LIFETIME_SECONDS * 1000L);
+        final String query = "/jcr:root/oak:index//* [@useInSimilarity = 
true]";
 
         synchronized(this) {
-            // TODO use a service user
-            final Session session = repository.loginAdministrative(null);
+            Session session = null;
             try {
-                    String query = "/jcr:root/oak:index//properties//* 
[@useInSimilarity = \"true\"]";
-                    final QueryManager qm = 
session.getWorkspace().getQueryManager();
-                    final QueryResult qr = qm.createQuery(query, 
Query.XPATH).execute();
-                    similaritySearchActive = qr.getNodes().hasNext();
-                    log.debug("Recomputed {}={} using query {}", 
SSA_PROP_NAME, similaritySearchActive, query);
+                session = repository.loginService(SUBSERVICE_NAME, null);
+                final QueryManager qm = 
session.getWorkspace().getQueryManager();
+                final QueryResult qr = qm.createQuery(query, 
Query.XPATH).execute();
+                similaritySearchActiveResult = 
String.valueOf(qr.getNodes().hasNext());
+            } catch(RepositoryException rex) {
+                similaritySearchActiveResult = rex.toString();
             } finally {
-                session.logout();
+                if(session != null) {
+                    session.logout();
+                }
             }
         }
+
+        log.debug("Recomputed {}={} using query {}", SSA_PROP_NAME, 
similaritySearchActiveResult, query);
     }
     
     @Override

Reply via email to