You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by en...@apache.org on 2020/09/09 18:14:00 UTC
[sling-org-apache-sling-jcr-oak-server] branch master updated:
SLING-9719 Utilize any available oak EditorProvider components that were
declared
This is an automated email from the ASF dual-hosted git repository.
enorman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-oak-server.git
The following commit(s) were added to refs/heads/master by this push:
new 77c571f SLING-9719 Utilize any available oak EditorProvider components that were declared
77c571f is described below
commit 77c571f03362f1d7b4ec33842c09ef23c85759ed
Author: Eric Norman <en...@apache.org>
AuthorDate: Wed Sep 9 11:13:42 2020 -0700
SLING-9719 Utilize any available oak EditorProvider components that were
declared
---
.../server/internal/OakSlingRepositoryManager.java | 53 +++++++-------
.../OakSlingRepositoryManagerConfiguration.java | 7 ++
.../sling/jcr/oak/server/it/OakServerIT.java | 3 +-
.../jcr/oak/server/it/ResourceEventListener.java | 4 +-
.../oak/server/it/ResourceTypeResolutionIT.java | 20 +++---
.../sling/jcr/oak/server/it/Sling9719IT.java | 83 ++++++++++++++++++++++
6 files changed, 128 insertions(+), 42 deletions(-)
diff --git a/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java b/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java
index e37c71c..e07c11b 100644
--- a/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java
+++ b/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java
@@ -18,6 +18,11 @@
*/
package org.apache.sling.jcr.oak.server.internal;
+import static com.google.common.collect.ImmutableSet.of;
+import static java.util.Collections.singleton;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
+
import java.util.Collections;
import java.util.Dictionary;
@@ -25,20 +30,15 @@ import javax.jcr.Repository;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.api.JackrabbitRepository;
-import org.apache.jackrabbit.oak.InitialContent;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.jcr.Jcr;
import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
-import org.apache.jackrabbit.oak.plugins.commit.ConflictValidatorProvider;
import org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler;
import org.apache.jackrabbit.oak.plugins.index.WhiteboardIndexEditorProvider;
import org.apache.jackrabbit.oak.plugins.index.aggregate.SimpleNodeAggregator;
import org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper;
-import org.apache.jackrabbit.oak.plugins.name.NameValidatorProvider;
-import org.apache.jackrabbit.oak.plugins.name.NamespaceEditorProvider;
-import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
import org.apache.jackrabbit.oak.plugins.observation.CommitRateLimiter;
-import org.apache.jackrabbit.oak.plugins.version.VersionHook;
+import org.apache.jackrabbit.oak.spi.commit.WhiteboardEditorProvider;
import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
import org.apache.jackrabbit.oak.spi.query.QueryIndex.NodeAggregator;
import org.apache.jackrabbit.oak.spi.query.WhiteboardIndexProvider;
@@ -47,6 +47,7 @@ import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.apache.sling.jcr.base.AbstractSlingRepository2;
import org.apache.sling.jcr.base.AbstractSlingRepositoryManager;
@@ -64,11 +65,6 @@ import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;
import org.osgi.service.metatype.annotations.Designate;
-import static com.google.common.collect.ImmutableSet.of;
-import static java.util.Collections.singleton;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
-import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
-
/**
* A Sling repository implementation that wraps the Oak repository
* implementation from the Jackrabbit Oak project.
@@ -92,10 +88,14 @@ public class OakSlingRepositoryManager extends AbstractSlingRepositoryManager {
private ComponentContext componentContext;
+ private final WhiteboardEditorProvider editorProvider = new WhiteboardEditorProvider();
+
private final WhiteboardIndexProvider indexProvider = new WhiteboardIndexProvider();
private final WhiteboardIndexEditorProvider indexEditorProvider = new WhiteboardIndexEditorProvider();
+ private Tracker<RepositoryInitializer> initializers;
+
private CommitRateLimiter commitRateLimiter;
private OakSlingRepositoryManagerConfiguration configuration;
@@ -106,7 +106,7 @@ public class OakSlingRepositoryManager extends AbstractSlingRepositoryManager {
)
private SecurityProvider securityProvider;
- private ServiceRegistration nodeAggregatorRegistration;
+ private ServiceRegistration<NodeAggregator> nodeAggregatorRegistration;
@Override
protected ServiceUserMapper getServiceUserMapper() {
@@ -117,34 +117,31 @@ public class OakSlingRepositoryManager extends AbstractSlingRepositoryManager {
protected Repository acquireRepository() {
final BundleContext bundleContext = componentContext.getBundleContext();
final Whiteboard whiteboard = new OsgiWhiteboard(bundleContext);
+ this.initializers = whiteboard.track(RepositoryInitializer.class);
+ this.editorProvider.start(whiteboard);
this.indexProvider.start(whiteboard);
this.indexEditorProvider.start(whiteboard);
final Oak oak = new Oak(nodeStore)
.withAsyncIndexing("async", 5);
- final Jcr jcr = new Jcr(oak, false)
- .with(new InitialContent())
+ final Jcr jcr = new Jcr(oak)
.with(new ExtraSlingContent())
-
.with(JcrConflictHandler.createJcrConflictHandler())
- .with(new VersionHook())
-
+ .with(whiteboard)
.with(securityProvider)
-
- .with(new NameValidatorProvider())
- .with(new NamespaceEditorProvider())
- .with(new TypeEditorProvider())
- .with(new ConflictValidatorProvider())
-
+ .with(editorProvider)
// index stuff
.with(indexProvider)
.with(indexEditorProvider)
.with(getDefaultWorkspace())
- .with(whiteboard)
- .withFastQueryResultSize(true)
+ .withFastQueryResultSize(configuration.oak_query_fastResultSize())
.withObservationQueueLength(configuration.oak_observation_queue_length());
-
+
+ for (RepositoryInitializer initializer : initializers.getServices()){
+ jcr.with(initializer);
+ }
+
if (commitRateLimiter != null) {
jcr.with(commitRateLimiter);
}
@@ -172,8 +169,10 @@ public class OakSlingRepositoryManager extends AbstractSlingRepositoryManager {
@Override
protected void disposeRepository(Repository repository) {
+ this.initializers.stop();
this.indexProvider.stop();
this.indexEditorProvider.stop();
+ this.editorProvider.stop();
((JackrabbitRepository) repository).shutdown();
}
@@ -189,7 +188,7 @@ public class OakSlingRepositoryManager extends AbstractSlingRepositoryManager {
if (configuration.oak_observation_limitCommitRate()) {
commitRateLimiter = new CommitRateLimiter();
}
- this.nodeAggregatorRegistration = bundleContext.registerService(NodeAggregator.class.getName(), getNodeAggregator(), null);
+ this.nodeAggregatorRegistration = bundleContext.registerService(NodeAggregator.class, getNodeAggregator(), null);
super.start(bundleContext, new Config(defaultWorkspace, disableLoginAdministrative));
}
diff --git a/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManagerConfiguration.java b/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManagerConfiguration.java
index 7a14e9b..c36e587 100644
--- a/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManagerConfiguration.java
+++ b/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManagerConfiguration.java
@@ -66,4 +66,11 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
)
boolean oak_observation_limitCommitRate() default false;
+
+ @AttributeDefinition(
+ name = "Fast query result size",
+ description = "Whether the query result size should return an estimation (or -1 if disabled) for large queries"
+ )
+ boolean oak_query_fastResultSize() default true;
+
}
diff --git a/src/test/java/org/apache/sling/jcr/oak/server/it/OakServerIT.java b/src/test/java/org/apache/sling/jcr/oak/server/it/OakServerIT.java
index edd7a8b..85611fe 100644
--- a/src/test/java/org/apache/sling/jcr/oak/server/it/OakServerIT.java
+++ b/src/test/java/org/apache/sling/jcr/oak/server/it/OakServerIT.java
@@ -42,6 +42,7 @@ import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -218,7 +219,7 @@ public class OakServerIT extends OakServerTestSupport {
@Test
public void testOsgiResourceEvents() throws RepositoryException {
final ResourceEventListener listener = new ResourceEventListener();
- final ServiceRegistration reg = listener.register(bundleContext, SlingConstants.TOPIC_RESOURCE_ADDED);
+ final ServiceRegistration<EventHandler> reg = listener.register(bundleContext, SlingConstants.TOPIC_RESOURCE_ADDED);
final Session s = repository.loginAdministrative(null);
final int nPaths = 2500 * TEST_SCALE;
final int timeoutMsec = 2 * nPaths;
diff --git a/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceEventListener.java b/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceEventListener.java
index 00859a1..ba06def 100644
--- a/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceEventListener.java
+++ b/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceEventListener.java
@@ -37,10 +37,10 @@ public class ResourceEventListener implements EventHandler {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Set<String> paths = new HashSet<String>();
- ServiceRegistration register(BundleContext ctx, String osgiEventTopic) {
+ ServiceRegistration<EventHandler> register(BundleContext ctx, String osgiEventTopic) {
final Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put(EventConstants.EVENT_TOPIC, osgiEventTopic);
- return ctx.registerService(EventHandler.class.getName(), this, props);
+ return ctx.registerService(EventHandler.class, this, props);
}
@Override
diff --git a/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceTypeResolutionIT.java b/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceTypeResolutionIT.java
index bba1d53..f8c4ce4 100644
--- a/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceTypeResolutionIT.java
+++ b/src/test/java/org/apache/sling/jcr/oak/server/it/ResourceTypeResolutionIT.java
@@ -18,8 +18,15 @@
*/
package org.apache.sling.jcr.oak.server.it;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+
+import javax.jcr.Node;
+
import org.apache.jackrabbit.api.JackrabbitSession;
-import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
import org.apache.sling.api.resource.Resource;
@@ -28,22 +35,11 @@ import org.apache.sling.api.resource.ResourceResolverFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.junit.PaxExam;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.jcr.Node;
-import java.util.HashMap;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
@RunWith(PaxExam.class)
public class ResourceTypeResolutionIT extends OakServerTestSupport {
- private static final Logger LOG = LoggerFactory.getLogger(ResourceTypeResolutionIT.class);
-
@Test
public void checkResourceType() throws Exception {
JackrabbitSession adminSession = (JackrabbitSession)slingRepository.loginAdministrative(null);
diff --git a/src/test/java/org/apache/sling/jcr/oak/server/it/Sling9719IT.java b/src/test/java/org/apache/sling/jcr/oak/server/it/Sling9719IT.java
new file mode 100644
index 0000000..12daffa
--- /dev/null
+++ b/src/test/java/org/apache/sling/jcr/oak/server/it/Sling9719IT.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+package org.apache.sling.jcr.oak.server.it;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.jcr.Node;
+
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.PaxExam;
+
+
+@RunWith(PaxExam.class)
+public class Sling9719IT extends OakServerTestSupport {
+
+ /**
+ * SLING-9719 - test that the dynamic Atomic Counter EditorProvider was discovered and is
+ * active and functioning
+ */
+ @Test
+ public void checkAtomicCounter() throws Exception {
+ JackrabbitSession adminSession = (JackrabbitSession)slingRepository.loginAdministrative(null);
+
+ Node counter = JcrUtils.getOrCreateByPath("/content/sling9719/counter", "nt:unstructured", adminSession);
+ if (!counter.isNodeType("mix:atomicCounter")) {
+ counter.addMixin("mix:atomicCounter");
+ }
+ if (!counter.isNew()) {
+ // reset the property back to the default value
+ counter.setProperty("oak:counter", 0L);
+ }
+
+ adminSession.save();
+
+ // counter initial value is 0. the default value
+ assertEquals(0, counter.getProperty("oak:counter").getLong());
+
+ // incrementing by 5 the counter
+ counter.setProperty("oak:increment", 5);
+ adminSession.save();
+
+ // counter value is now 5
+ new Retry(5000) {
+ @Override
+ protected void exec() throws Exception {
+ assertEquals(5, counter.getProperty("oak:counter").getLong());
+ }
+ };
+
+ // decreasing by 1
+ counter.setProperty("oak:increment", -1);
+ adminSession.save();
+
+ // counter value is now 4
+ new Retry(5000) {
+ @Override
+ protected void exec() throws Exception {
+ assertEquals(4, counter.getProperty("oak:counter").getLong());
+ }
+ };
+
+ adminSession.logout();
+ }
+}