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 + "/*");