SLING-8120 - pass the ResourceResolver to CapabilitiesSource
diff --git a/pom.xml b/pom.xml
index 0f5afd7..ac924c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -205,5 +205,11 @@
<version>${org.ops4j.pax.exam.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.23.0</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
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 74ee64b..aafe20b 100644
--- a/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java
+++ b/src/main/java/org/apache/sling/capabilities/jcr/SearchSource.java
@@ -25,6 +25,7 @@
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
+import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.capabilities.CapabilitiesSource;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.serviceusermapping.ServiceUserMapped;
@@ -89,8 +90,8 @@
}
@Override
- public Map<String, Object> getCapabilities() throws Exception {
- refreshCachedValues();
+ public Map<String, Object> getCapabilities(ResourceResolver rr) throws Exception {
+ refreshCachedValues(rr);
final Map<String, Object> result = new HashMap<>();
result.put("similarity.search.active", similaritySearchActiveResult);
return result;
@@ -100,7 +101,8 @@
* searching for any index definition that has useInSimilarity=true.
* Cache the result to avoid making too many searches.
*/
- private void refreshCachedValues() {
+ private void refreshCachedValues(ResourceResolver unused) {
+
if(System.currentTimeMillis() < similaritySearchCacheExpires) {
log.debug("Using cached similaritySearchActive value");
return;
@@ -111,6 +113,11 @@
synchronized(this) {
Session session = null;
try {
+ // TODO for now we need a service user as in general users do not have
+ // access to /oak:index where the information that we need is found.
+ // This information should be provided by Oak in a different way such as
+ // JCR Repository descriptors or OSGi service properties on the Repository
+ // object.
session = repository.loginService(SUBSERVICE_NAME, null);
final QueryManager qm = session.getWorkspace().getQueryManager();
final QueryResult qr = qm.createQuery(similarityIndexQuery, Query.XPATH).execute();
diff --git a/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java b/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
index 7f72acf..f7fb275 100644
--- a/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
+++ b/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
@@ -19,14 +19,12 @@
package org.apache.sling.capabilities.jcr;
import java.io.IOException;
-import java.math.BigDecimal;
import java.util.Dictionary;
import java.util.Hashtable;
-import java.util.Map;
import java.util.UUID;
-import javax.inject.Inject;
import javax.jcr.Node;
import javax.jcr.Session;
+import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.capabilities.CapabilitiesSource;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.serviceusermapping.ServiceUserMapped;
@@ -36,9 +34,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.mockito.Mockito;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
@@ -50,6 +48,7 @@
private static final String SIMILARITY_ACTIVE_CAP = "similarity.search.active";
private CapabilitiesSource searchSource;
+ private ResourceResolver resolver = Mockito.mock(ResourceResolver.class);
private Dictionary<String, Object> props(Object ... nameValuePairs) {
final Dictionary<String, Object> props = new Hashtable<>();
@@ -95,8 +94,8 @@
@Test
public void testNoSimilarity() throws Exception {
registerSearchSource(true);
- assertNotNull(searchSource.getCapabilities());
- assertEquals("false", searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP));
+ assertNotNull(searchSource.getCapabilities(resolver));
+ assertEquals("false", searchSource.getCapabilities(resolver).get(SIMILARITY_ACTIVE_CAP));
}
@Test
@@ -104,8 +103,8 @@
registerSearchSource(true);
createMockIndexNode("/oak:index", "foo", "useInSimilarity", true);
- assertNotNull(searchSource.getCapabilities());
- assertEquals("true", searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP));
+ assertNotNull(searchSource.getCapabilities(resolver));
+ assertEquals("true", searchSource.getCapabilities(resolver).get(SIMILARITY_ACTIVE_CAP));
}
@Test(expected=ReferenceViolationException.class)
@@ -123,8 +122,8 @@
"cacheLifetimeSeconds", lifetimeSeconds);
// With our custom query we get false first
- assertNotNull(searchSource.getCapabilities());
- assertEquals("false", searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP));
+ assertNotNull(searchSource.getCapabilities(resolver));
+ assertEquals("false", searchSource.getCapabilities(resolver).get(SIMILARITY_ACTIVE_CAP));
// Create a node that causes the query to return something
// The capability value will change after some time, once its cache expires
@@ -136,7 +135,7 @@
int nTrue = 0;
final long testEnd = System.currentTimeMillis() + lifetimeSeconds * 1000L + 1500L;
while(System.currentTimeMillis() < testEnd) {
- final Object value = searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP);
+ final Object value = searchSource.getCapabilities(resolver).get(SIMILARITY_ACTIVE_CAP);
if("false".equals(value)) {
assertEquals("Expecting true value to come after all false values", 0, nTrue);
nFalse++;