This is an automated email from the ASF dual-hosted git repository. sseifert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock-oak.git
The following commit(s) were added to refs/heads/master by this push: new 7a8c92c SLING-12266 - Implement repo snapshot support (#12) 7a8c92c is described below commit 7a8c92c3f6995c54d38aebecd8225d2fa3a2f5ee Author: Csaba Varga <csab...@gmail.com> AuthorDate: Thu Apr 11 14:16:45 2024 +0200 SLING-12266 - Implement repo snapshot support (#12) Return the root NodeState of the repo to make a snapshot, and use it to build new repository instances. When working from a snapshot, we don't need to initialize content since the snapshot was made from an already initialized repo. --- pom.xml | 2 +- .../sling/oak/OakMockResourceResolverAdapter.java | 13 +++++++++++ .../mock/sling/oak/OakMockSlingRepository.java | 27 ++++++++++++++++++++-- .../sling/testing/mock/sling/oak/package-info.java | 2 +- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 66b50cb..2917c2c 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ <properties> <oak.version>1.44.0</oak.version> <jackrabbit.version>2.20.9</jackrabbit.version> - <sling-mock.version>3.4.18</sling-mock.version> + <sling-mock.version>3.5.0-SNAPSHOT</sling-mock.version> <project.build.outputTimestamp>2023-05-16T08:40:51Z</project.build.outputTimestamp> </properties> diff --git a/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockResourceResolverAdapter.java b/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockResourceResolverAdapter.java index 73fb9ca..d78df7b 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockResourceResolverAdapter.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockResourceResolverAdapter.java @@ -18,6 +18,7 @@ */ package org.apache.sling.testing.mock.sling.oak; +import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.jcr.api.SlingRepository; import org.apache.sling.testing.mock.sling.spi.ResourceResolverTypeAdapter; @@ -36,4 +37,16 @@ public class OakMockResourceResolverAdapter implements ResourceResolverTypeAdapt public SlingRepository newSlingRepository() { return new OakMockSlingRepository(); } + + @Override + public Object snapshot(SlingRepository repository) { + OakMockSlingRepository mockRepository = (OakMockSlingRepository) repository; + return mockRepository.snapshot(); + } + + @Override + public SlingRepository newSlingRepositoryFromSnapshot(Object snapshot) { + NodeState rootNodeState = (NodeState) snapshot; + return new OakMockSlingRepository(rootNodeState); + } } diff --git a/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java b/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java index 2693cb5..c0ba571 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java @@ -41,6 +41,9 @@ import java.util.concurrent.ScheduledExecutorService; import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.apache.sling.jcr.api.SlingRepository; import org.apache.sling.testing.mock.sling.oak.impl.ComparableVersion; import org.osgi.framework.BundleContext; @@ -61,8 +64,21 @@ public final class OakMockSlingRepository implements SlingRepository { private ExecutorService executor; private ScheduledExecutorService scheduledExecutor; + private final NodeStore nodeStore; + private final boolean fromScratch; + private static final Logger log = LoggerFactory.getLogger(OakMockSlingRepository.class); + public OakMockSlingRepository() { + this.nodeStore = new MemoryNodeStore(); + this.fromScratch = true; + } + + public OakMockSlingRepository(NodeState startingState) { + this.nodeStore = new MemoryNodeStore(startingState); + this.fromScratch = false; + } + @Activate protected void activate(BundleContext bundleContext) throws IOException { executor = Executors.newSingleThreadExecutor(); @@ -72,9 +88,12 @@ public final class OakMockSlingRepository implements SlingRepository { bundleContext.registerService(Executor.class, executor, null); } - Oak oak = new Oak().with(executor).with(scheduledExecutor); + Oak oak = new Oak(this.nodeStore).with(executor).with(scheduledExecutor); - Jcr jcr = new Jcr(oak).with(new ExtraSlingContent()).with(executor).with(scheduledExecutor); + Jcr jcr = new Jcr(oak).with(executor).with(scheduledExecutor); + if (fromScratch) { + jcr.with(new ExtraSlingContent()); + } this.repository = jcr.createRepository(); // check if the right Oak version is loaded (older versions may be loaded in case of non-deliberate class loader @@ -123,6 +142,10 @@ public final class OakMockSlingRepository implements SlingRepository { } } + NodeState snapshot() { + return nodeStore.getRoot(); + } + public String getDescriptor(String key) { return repository.getDescriptor(key); } diff --git a/src/main/java/org/apache/sling/testing/mock/sling/oak/package-info.java b/src/main/java/org/apache/sling/testing/mock/sling/oak/package-info.java index 2d527c4..5b971ca 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/oak/package-info.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/oak/package-info.java @@ -19,5 +19,5 @@ /** * Sling Mock Jackrabbit Oak-based Resource Resolver */ -@org.osgi.annotation.versioning.Version("2.0.1") +@org.osgi.annotation.versioning.Version("2.1") package org.apache.sling.testing.mock.sling.oak;