Use a service user for search capabilities query
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.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 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 @@
* 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