You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2015/08/12 09:24:13 UTC
svn commit: r1695434 - in /jackrabbit/oak/trunk:
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/
oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/
oak-run/src/main/java/org/apache/jackrabbit/oak/run/
Author: alexparvulescu
Date: Wed Aug 12 07:24:13 2015
New Revision: 1695434
URL: http://svn.apache.org/r1695434
Log:
OAK-2828 Jcr builder class does not allow overriding most of its dependencies
- patch provided by Robert Munteanu (@rombert), applied with minor twkeaks
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
jackrabbit/oak/trunk/oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/RemoteServerIT.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1695434&r1=1695433&r2=1695434&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java Wed Aug 12 07:24:13 2015
@@ -17,8 +17,11 @@
package org.apache.jackrabbit.oak.jcr;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Sets.newLinkedHashSet;
import static org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler.createJcrConflictHandler;
+import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
@@ -28,6 +31,7 @@ import javax.jcr.Repository;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.api.ContentRepository;
import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
+import org.apache.jackrabbit.oak.plugins.atomic.AtomicCounterEditorProvider;
import org.apache.jackrabbit.oak.plugins.commit.ConflictValidatorProvider;
import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
@@ -47,7 +51,6 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.version.VersionEditorProvider;
import org.apache.jackrabbit.oak.query.QueryEngineSettings;
import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
-import org.apache.jackrabbit.oak.plugins.atomic.AtomicCounterEditorProvider;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.CompositeConflictHandler;
import org.apache.jackrabbit.oak.spi.commit.Editor;
@@ -59,18 +62,47 @@ import org.apache.jackrabbit.oak.spi.lif
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+/**
+ * Builder class which encapsulates the details of building a JCR
+ * <tt>Repository</tt> backed by an Oak <tt>ContentRepository</tt> instance
+ *
+ * <p>The backing <tt>ContentRepository</tt> instance will be constructed with
+ * reasonable defaults and additional components can be registered by calling
+ * the <tt>with</tt> methods. Note that it is not possible to remove components
+ * once registered.</p>
+ *
+ * <p>The Jcr builder is a lazy initializer, to have a working repository make sure
+ * you call {@link Jcr#createContentRepository()} or
+ * {@link Jcr#createRepository()}.</p>
+ */
public class Jcr {
public static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = 1000;
private final Oak oak;
- private final CompositeConflictHandler conflictHandler = createJcrConflictHandler();
+ private final Set<RepositoryInitializer> repositoryInitializers = newLinkedHashSet();
+ private final Set<QueryIndexProvider> queryIndexProviders = newLinkedHashSet();
+ private final Set<CommitHook> commitHooks = newLinkedHashSet();
+ private final Set<IndexEditorProvider> indexEditorProviders = newLinkedHashSet();
+ private final Set<EditorProvider> editorProviders = newLinkedHashSet();
+ private final Set<Editor> editors = newLinkedHashSet();
+ private final Set<Observer> observers = newLinkedHashSet();
+
+ private final CompositeConflictHandler conflictHandler = createJcrConflictHandler();
private SecurityProvider securityProvider;
- private int observationQueueLength = DEFAULT_OBSERVATION_QUEUE_LENGTH;
private CommitRateLimiter commitRateLimiter;
+ private ScheduledExecutorService scheduledExecutor;
+ private Executor executor;
+ private QueryEngineSettings queryEngineSettings;
+ private String defaultWorkspaceName;
+ private Whiteboard whiteboard;
+
+ private int observationQueueLength = DEFAULT_OBSERVATION_QUEUE_LENGTH;
private boolean fastQueryResultSize;
+ private ContentRepository contentRepository;
private Repository repository;
public Jcr(Oak oak) {
@@ -78,7 +110,6 @@ public class Jcr {
with(new InitialContent());
- oak.with(conflictHandler);
with(new EditorHook(new VersionEditorProvider()));
with(new SecurityProviderImpl());
@@ -98,7 +129,7 @@ public class Jcr {
with(new PropertyIndexProvider());
with(new OrderedPropertyIndexProvider());
with(new NodeTypeIndexProvider());
-
+
with(new OrderedPropertyIndexEditorProvider());
}
@@ -112,117 +143,227 @@ public class Jcr {
@Nonnull
public final Jcr with(@Nonnull RepositoryInitializer initializer) {
- oak.with(checkNotNull(initializer));
- return this;
+ ensureRepositoryIsNotCreated();
+ repositoryInitializers.add(checkNotNull(initializer));
+ return this;
+ }
+
+ private void ensureRepositoryIsNotCreated() {
+ checkState(repository == null && contentRepository == null,
+ "Repository was already created");
}
@Nonnull
public final Jcr with(@Nonnull QueryIndexProvider provider) {
- oak.with(checkNotNull(provider));
+ ensureRepositoryIsNotCreated();
+ queryIndexProviders.add(checkNotNull(provider));
return this;
}
@Nonnull
public final Jcr with(@Nonnull IndexEditorProvider indexEditorProvider) {
- oak.with(checkNotNull(indexEditorProvider));
+ ensureRepositoryIsNotCreated();
+ indexEditorProviders.add(checkNotNull(indexEditorProvider));
return this;
}
@Nonnull
public final Jcr with(@Nonnull CommitHook hook) {
- oak.with(checkNotNull(hook));
+ ensureRepositoryIsNotCreated();
+ commitHooks.add(checkNotNull(hook));
return this;
}
@Nonnull
public final Jcr with(@Nonnull EditorProvider provider) {
- oak.with(checkNotNull(provider));
+ ensureRepositoryIsNotCreated();
+ editorProviders.add(checkNotNull(provider));
return this;
}
@Nonnull
public final Jcr with(@Nonnull Editor editor) {
- oak.with(checkNotNull(editor));
+ ensureRepositoryIsNotCreated();
+ editors.add(checkNotNull(editor));
return this;
}
@Nonnull
public final Jcr with(@Nonnull SecurityProvider securityProvider) {
- oak.with(checkNotNull(securityProvider));
- this.securityProvider = securityProvider;
+ ensureRepositoryIsNotCreated();
+ this.securityProvider = checkNotNull(securityProvider);
return this;
}
@Nonnull
public final Jcr with(@Nonnull PartialConflictHandler conflictHandler) {
+ ensureRepositoryIsNotCreated();
this.conflictHandler.addHandler(checkNotNull(conflictHandler));
return this;
}
@Nonnull
public final Jcr with(@Nonnull ScheduledExecutorService executor) {
- oak.with(checkNotNull(executor));
+ ensureRepositoryIsNotCreated();
+ this.scheduledExecutor = checkNotNull(executor);
return this;
}
@Nonnull
public final Jcr with(@Nonnull Executor executor) {
- oak.with(checkNotNull(executor));
+ ensureRepositoryIsNotCreated();
+ this.executor = checkNotNull(executor);
return this;
}
@Nonnull
public final Jcr with(@Nonnull Observer observer) {
- oak.with(checkNotNull(observer));
+ ensureRepositoryIsNotCreated();
+ observers.add(checkNotNull(observer));
return this;
}
@Nonnull
public Jcr withAsyncIndexing() {
+ ensureRepositoryIsNotCreated();
oak.withAsyncIndexing();
return this;
}
@Nonnull
public Jcr withObservationQueueLength(int observationQueueLength) {
+ ensureRepositoryIsNotCreated();
this.observationQueueLength = observationQueueLength;
return this;
}
@Nonnull
- public Jcr with(CommitRateLimiter commitRateLimiter) {
- oak.with(commitRateLimiter);
- this.commitRateLimiter = commitRateLimiter;
+ public Jcr with(@Nonnull CommitRateLimiter commitRateLimiter) {
+ ensureRepositoryIsNotCreated();
+ this.commitRateLimiter = checkNotNull(commitRateLimiter);
return this;
}
-
+
@Nonnull
- public Jcr with(QueryEngineSettings qs) {
- oak.with(qs);
+ public Jcr with(@Nonnull QueryEngineSettings qs) {
+ ensureRepositoryIsNotCreated();
+ this.queryEngineSettings = checkNotNull(qs);
return this;
}
@Nonnull
public Jcr withFastQueryResultSize(boolean fastQueryResultSize) {
+ ensureRepositoryIsNotCreated();
this.fastQueryResultSize = fastQueryResultSize;
return this;
}
+ @Nonnull
+ public Jcr with(@Nonnull String defaultWorkspaceName) {
+ ensureRepositoryIsNotCreated();
+ this.defaultWorkspaceName = checkNotNull(defaultWorkspaceName);
+ return this;
+ }
+
+ @Nonnull
+ public Jcr with(@Nonnull Whiteboard whiteboard) {
+ ensureRepositoryIsNotCreated();
+ this.whiteboard = checkNotNull(whiteboard);
+ return this;
+ }
+
+ private void setUpOak() {
+ // whiteboard
+ if (whiteboard != null) {
+ oak.with(whiteboard);
+ }
+
+ // repository initializers
+ for (RepositoryInitializer repositoryInitializer : repositoryInitializers) {
+ oak.with(repositoryInitializer);
+ }
+
+ // query index providers
+ for (QueryIndexProvider queryIndexProvider : queryIndexProviders) {
+ oak.with(queryIndexProvider);
+ }
+
+ // commit hooks
+ for (CommitHook commitHook : commitHooks) {
+ oak.with(commitHook);
+ }
+
+ // conflict handlers
+ oak.with(conflictHandler);
+
+ // index editor providers
+ for (IndexEditorProvider indexEditorProvider : indexEditorProviders) {
+ oak.with(indexEditorProvider);
+ }
+
+ // editors
+ for (Editor editor : editors) {
+ oak.with(editor);
+ }
+
+ // editor providers
+ for (EditorProvider editorProvider : editorProviders) {
+ oak.with(editorProvider);
+ }
+
+ // securityProvider
+ oak.with(securityProvider);
+
+ // executors
+ if (scheduledExecutor != null) {
+ oak.with(scheduledExecutor);
+ }
+ if (executor != null) {
+ oak.with(executor);
+ }
+
+ // observers
+ for (Observer observer : observers) {
+ oak.with(observer);
+ }
+
+ // commit rate limiter
+ if (commitRateLimiter != null) {
+ oak.with(commitRateLimiter);
+ }
+
+ // query engine settings
+ if (queryEngineSettings != null) {
+ oak.with(queryEngineSettings);
+ }
+
+ // default workspace name
+ if (defaultWorkspaceName != null) {
+ oak.with(defaultWorkspaceName);
+ }
+
+ }
+
+ @Nonnull
public ContentRepository createContentRepository() {
- return oak.createContentRepository();
+ if (contentRepository == null) {
+ setUpOak();
+ contentRepository = oak.createContentRepository();
+ }
+ return contentRepository;
}
+ @Nonnull
public Repository createRepository() {
if (repository == null) {
repository = new RepositoryImpl(
- oak.createContentRepository(),
+ createContentRepository(),
oak.getWhiteboard(),
securityProvider,
observationQueueLength,
commitRateLimiter,
fastQueryResultSize);
}
-
return repository;
}
Modified: jackrabbit/oak/trunk/oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/RemoteServerIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/RemoteServerIT.java?rev=1695434&r1=1695433&r2=1695434&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/RemoteServerIT.java (original)
+++ jackrabbit/oak/trunk/oak-remote/src/test/java/org/apache/jackrabbit/oak/remote/http/handler/RemoteServerIT.java Wed Aug 12 07:24:13 2015
@@ -41,6 +41,7 @@ import org.junit.Test;
import javax.jcr.SimpleCredentials;
import java.io.ByteArrayInputStream;
+import java.io.Closeable;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.ServerSocket;
@@ -94,11 +95,7 @@ public class RemoteServerIT extends OakB
}
private ContentRepository getContentRepository() {
- Oak oak = new Oak(store);
-
- new Jcr(oak);
-
- return oak.createContentRepository();
+ return new Jcr(new Oak(store)).createContentRepository();
}
private ContentSession getContentSession(ContentRepository repository) throws Exception {
@@ -146,6 +143,9 @@ public class RemoteServerIT extends OakB
public void tearDown() throws Exception {
remoteServer.stop();
contentSession.close();
+ if (contentRepository instanceof Closeable) {
+ IOUtils.closeQuietly((Closeable) contentRepository);
+ }
}
@Test
Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1695434&r1=1695433&r2=1695434&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java Wed Aug 12 07:24:13 2015
@@ -1160,7 +1160,7 @@ public final class Main {
Jcr jcr = new Jcr(oak);
// 1 - OakServer
- ContentRepository repository = oak.createContentRepository();
+ ContentRepository repository = jcr.createContentRepository();
ServletHolder holder = new ServletHolder(new OakServlet(repository));
context.addServlet(holder, path + "/*");