Author: mreutegg Date: Mon Oct 1 14:36:57 2012 New Revision: 1392352 URL: http://svn.apache.org/viewvc?rev=1392352&view=rev Log: OAK-41: Initial repository setup
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java (with props) jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java (with props) jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/InitialContent.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java (with props) jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java (with props) jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java (with props) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/BuiltInNodeTypes.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractOakTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Mon Oct 1 14:36:57 2012 @@ -23,7 +23,11 @@ import javax.annotation.Nonnull; import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.core.MicroKernelImpl; import org.apache.jackrabbit.oak.api.ContentRepository; +import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.core.ContentRepositoryImpl; +import org.apache.jackrabbit.oak.core.RootImpl; +import org.apache.jackrabbit.oak.kernel.KernelNodeStore; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; import org.apache.jackrabbit.oak.spi.commit.CommitHook; import org.apache.jackrabbit.oak.spi.commit.CompositeHook; import org.apache.jackrabbit.oak.spi.commit.CompositeValidatorProvider; @@ -33,6 +37,7 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider; import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.spi.state.NodeStore; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -81,6 +86,13 @@ public class Oak { } public ContentRepository createContentRepository() { + return new ContentRepositoryImpl( + kernel, + CompositeQueryIndexProvider.compose(providers), + createCommitHook()); + } + + private CommitHook createCommitHook() { CommitHook hook; if (!validators.isEmpty()) { hook = CompositeHook.compose(ImmutableList.<CommitHook>builder() @@ -91,11 +103,35 @@ public class Oak { } else { hook = CompositeHook.compose(hooks); } - return new ContentRepositoryImpl( - kernel, - CompositeQueryIndexProvider.compose(providers), - hook); + return hook; } + /** + * Creates a {@link NodeStore} based on the previously set micro kernel, + * hooks and validators. + * <p/> + * This method will return an in memory node store without hooks nor + * validators if no {@link MicroKernel} was set. + * + * @return a {@link NodeStore}. + */ + public NodeStore createNodeStore() { + if (kernel != null) { + KernelNodeStore nodeStore = new KernelNodeStore(kernel); + nodeStore.setHook(createCommitHook()); + return nodeStore; + } else { + return new MemoryNodeStore(); + } + } + /** + * Creates a {@link Root} based on the previously set {@link MicroKernel}, + * {@link CommitHook} and {@link ValidatorProvider}. + * + * @return a {@link Root} instance. + */ + public Root createRoot() { + return new RootImpl(createNodeStore(), null); + } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Mon Oct 1 14:36:57 2012 @@ -39,7 +39,6 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider; import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; import org.apache.jackrabbit.oak.spi.security.authentication.LoginContextProvider; -import org.apache.jackrabbit.oak.spi.state.NodeState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,24 +120,6 @@ public class ContentRepositoryImpl imple // TODO: use configurable context provider loginContextProvider = new LoginContextProviderImpl(this); - - // FIXME: repository setup must be done elsewhere... - // FIXME: depends on CoreValue's name mangling - NodeState root = nodeStore.getRoot(); - if (root.hasChildNode("jcr:system")) { - microKernel.commit("/", "^\"jcr:primaryType\":\"nam:rep:root\" ", null, null); - } else { - microKernel.commit("/", "^\"jcr:primaryType\":\"nam:rep:root\"" + - "+\"jcr:system\":{" + - "\"jcr:primaryType\" :\"nam:rep:system\"," + - // FIXME: user-mgt related unique properties are implementation detail and not generic for repo - // FIXME: rep:principalName only needs to be unique if defined with user/group nodes -> add defining nt-info to uniqueness constraint - "\":unique\" :{\"jcr:uuid\":{},\"rep:authorizableId\":{},\"rep:principalName\":{}}," + - "\"jcr:versionStorage\" :{\"jcr:primaryType\":\"nam:rep:versionStorage\"}," + - "\"jcr:nodeTypes\" :{\"jcr:primaryType\":\"nam:rep:nodeTypes\"}," + - "\"jcr:activities\" :{\"jcr:primaryType\":\"nam:rep:Activities\"}," + - "\"rep:privileges\" :{\"jcr:primaryType\":\"nam:rep:Privileges\"}}", null, null); - } } @Nonnull Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java Mon Oct 1 14:36:57 2012 @@ -28,7 +28,6 @@ import org.apache.jackrabbit.oak.api.Con import org.apache.jackrabbit.oak.api.CoreValueFactory; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.SessionQueryEngine; -import org.apache.jackrabbit.oak.plugins.type.BuiltInNodeTypes; import org.apache.jackrabbit.oak.query.QueryEngineImpl; import org.apache.jackrabbit.oak.query.SessionQueryEngineImpl; import org.apache.jackrabbit.oak.spi.commit.ConflictHandlerProvider; @@ -51,8 +50,6 @@ class ContentSessionImpl implements Cont private final ConflictHandlerProvider conflictHandlerProvider; private final SessionQueryEngine queryEngine; - private boolean initialised; - public ContentSessionImpl(LoginContext loginContext, String workspaceName, NodeStore store, ConflictHandlerProvider conflictHandlerProvider, QueryEngineImpl queryEngine) { @@ -77,14 +74,6 @@ class ContentSessionImpl implements Cont @Nonnull @Override public Root getLatestRoot() { - // TODO: improve initial repository/session. See OAK-41 - synchronized (this) { - if (!initialised) { - initialised = true; - BuiltInNodeTypes.register(getLatestRoot()); - } - } - RootImpl root = new RootImpl(store, workspaceName, loginContext.getSubject()); if (conflictHandlerProvider != null) { root.setConflictHandler(conflictHandlerProvider.getConflictHandler(getCoreValueFactory())); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java Mon Oct 1 14:36:57 2012 @@ -30,7 +30,9 @@ import org.apache.jackrabbit.oak.api.Cha import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.plugins.commit.DefaultConflictHandler; import org.apache.jackrabbit.oak.spi.commit.ConflictHandler; +import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.api.Tree; import org.apache.jackrabbit.oak.api.TreeLocation; import org.apache.jackrabbit.oak.security.authorization.AccessControlContextImpl; import org.apache.jackrabbit.oak.spi.security.authorization.AccessControlContext; @@ -55,6 +57,11 @@ public class RootImpl implements Root { */ private static final int PURGE_LIMIT = 100; + /** + * A dummy subject used when no subject is provided in the constructor. + */ + private static final Subject DUMMY_SUBJECT = new Subject(); + /** The underlying store to which this root belongs */ private final NodeStore store; @@ -107,6 +114,16 @@ public class RootImpl implements Root { refresh(); } + /** + * New instance bases on a given {@link NodeStore} and a workspace + * @param store node store + * @param workspaceName name of the workspace + */ + @SuppressWarnings("UnusedParameters") + public RootImpl(NodeStore store, String workspaceName) { + this(store, workspaceName, DUMMY_SUBJECT); + } + public void setConflictHandler(ConflictHandler conflictHandler) { this.conflictHandler = conflictHandler; } @@ -263,9 +280,13 @@ public class RootImpl implements Root { } CompiledPermissions getPermissions() { - AccessControlContext context = new AccessControlContextImpl(); - context.initialize(subject.getPrincipals()); - return context.getPermissions(); + if (subject == DUMMY_SUBJECT) { + return new AllPermissions(); + } else { + AccessControlContext context = new AccessControlContextImpl(); + context.initialize(subject.getPrincipals()); + return context.getPermissions(); + } } //------------------------------------------------------------< private >--- @@ -288,4 +309,28 @@ public class RootImpl implements Root { } } + private static final class AllPermissions implements CompiledPermissions { + @Override + public boolean canRead(String path, boolean isProperty) { + return true; + } + + @Override + public boolean isGranted(int permissions) { + return true; + } + + @Override + public boolean isGranted(Tree tree, int permissions) { + return true; + } + + @Override + public boolean isGranted(Tree parent, + PropertyState property, + int permissions) { + return true; + } + } + } Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,101 @@ +/* + * 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.jackrabbit.oak.osgi; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; + +/** + * <code>AbstractServiceTracker</code> is a base class for the various OSGi based + * providers. + */ +public abstract class AbstractServiceTracker<T> implements ServiceTrackerCustomizer { + + private BundleContext context; + + private ServiceTracker tracker; + + private final Map<ServiceReference, T> services = + new HashMap<ServiceReference, T>(); + + private final Class<T> serviceClass; + + public AbstractServiceTracker(Class<T> serviceClass) { + this.serviceClass = serviceClass; + } + + public void start(BundleContext bundleContext) throws Exception { + context = bundleContext; + tracker = new ServiceTracker( + bundleContext, serviceClass.getName(), this); + tracker.open(); + } + + public void stop() throws Exception { + tracker.close(); + } + + /** + * Returns all services of type <code>T</code> currently available. + * + * @return services currently available. + */ + protected List<T> getServices() { + synchronized (this) { + return new ArrayList<T>(services.values()); + } + } + + //------------------------< ServiceTrackerCustomizer >---------------------- + + @Override + public Object addingService(ServiceReference reference) { + Object service = context.getService(reference); + + if (serviceClass.isInstance(service)) { + synchronized (this) { + services.put(reference, (T) service); + } + return service; + } else { + context.ungetService(reference); + return null; + } + } + + @Override + public void modifiedService(ServiceReference reference, Object service) { + // nothing to do + } + + @Override + public void removedService(ServiceReference reference, Object service) { + synchronized (this) { + services.remove(reference); + } + context.ungetService(reference); + } +} Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java Mon Oct 1 14:36:57 2012 @@ -21,10 +21,9 @@ import java.util.Map; import java.util.Properties; import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.api.ContentRepository; -import org.apache.jackrabbit.oak.core.ContentRepositoryImpl; import org.apache.jackrabbit.oak.plugins.type.DefaultTypeEditor; -import org.apache.jackrabbit.oak.spi.commit.CommitHook; import org.apache.jackrabbit.oak.spi.commit.CompositeHook; import org.apache.jackrabbit.oak.spi.commit.ValidatingHook; import org.osgi.framework.BundleActivator; @@ -44,6 +43,8 @@ public class Activator implements Bundle private final OsgiValidatorProvider validatorProvider = new OsgiValidatorProvider(); + private final OsgiMicroKernelTracker kernelTracker = new OsgiMicroKernelTracker(); + private final Map<ServiceReference, ServiceRegistration> services = new HashMap<ServiceReference, ServiceRegistration>(); @@ -55,6 +56,7 @@ public class Activator implements Bundle indexProvider.start(bundleContext); validatorProvider.start(bundleContext); + kernelTracker.start(bundleContext); tracker = new ServiceTracker( context, MicroKernel.class.getName(), this); @@ -67,6 +69,7 @@ public class Activator implements Bundle indexProvider.stop(); validatorProvider.stop(); + kernelTracker.stop(); } //-------------------------------------------< ServiceTrackerCustomizer >--- @@ -75,15 +78,18 @@ public class Activator implements Bundle public Object addingService(ServiceReference reference) { Object service = context.getService(reference); if (service instanceof MicroKernel) { - CommitHook hook = new CompositeHook( - new DefaultTypeEditor(), - new ValidatingHook(validatorProvider)); - // new LuceneEditor()); - MicroKernel kernel = (MicroKernel) service; + kernelTracker.available(kernel); + Oak oak = new Oak(kernel) + .with(new CompositeHook( + // TODO: DefaultTypeEditor is JCR specific and does not belong here + new DefaultTypeEditor(), + new ValidatingHook(validatorProvider))) + // new LuceneEditor()); + .with(indexProvider); services.put(reference, context.registerService( ContentRepository.class.getName(), - new ContentRepositoryImpl(kernel, indexProvider, hook), + oak.createContentRepository(), new Properties())); return service; } else { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java Mon Oct 1 14:36:57 2012 @@ -18,9 +18,7 @@ */ package org.apache.jackrabbit.oak.osgi; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.annotation.Nonnull; @@ -28,63 +26,23 @@ import org.apache.jackrabbit.oak.spi.que import org.apache.jackrabbit.oak.spi.query.QueryIndex; import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; import org.apache.jackrabbit.oak.spi.state.NodeStore; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.util.tracker.ServiceTrackerCustomizer; /** * This index provider combines all indexes of all available OSGi index * providers. */ -public class OsgiIndexProvider implements ServiceTrackerCustomizer, QueryIndexProvider { +public class OsgiIndexProvider + extends AbstractServiceTracker<QueryIndexProvider> + implements QueryIndexProvider { - private BundleContext context; - - private ServiceTracker tracker; - - private final Map<ServiceReference, QueryIndexProvider> providers = - new HashMap<ServiceReference, QueryIndexProvider>(); - - public void start(BundleContext bundleContext) throws Exception { - context = bundleContext; - tracker = new ServiceTracker( - bundleContext, QueryIndexProvider.class.getName(), this); - tracker.open(); - } - - public void stop() throws Exception { - tracker.close(); - } - - @Override - public Object addingService(ServiceReference reference) { - Object service = context.getService(reference); - if (service instanceof QueryIndexProvider) { - QueryIndexProvider provider = (QueryIndexProvider) service; - providers.put(reference, provider); - return service; - } else { - context.ungetService(reference); - return null; - } - } - - @Override - public void modifiedService(ServiceReference reference, Object service) { - // nothing to do - } - - @Override - public void removedService(ServiceReference reference, Object service) { - providers.remove(reference); - context.ungetService(reference); + public OsgiIndexProvider() { + super(QueryIndexProvider.class); } @Override @Nonnull public List<? extends QueryIndex> getQueryIndexes(NodeStore nodeStore) { QueryIndexProvider composite = - CompositeQueryIndexProvider.compose(providers.values()); + CompositeQueryIndexProvider.compose(getServices()); return composite.getQueryIndexes(nodeStore); } Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,64 @@ +/* + * 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.jackrabbit.oak.osgi; + +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.oak.spi.lifecycle.MicroKernelTracker; +import org.osgi.framework.ServiceReference; + +/** + * Implements a service tracker that keeps track of all + * {@link MicroKernelTracker}s in the system and calls the available + * method once the micro kernel is available. + */ +public class OsgiMicroKernelTracker + extends AbstractServiceTracker<MicroKernelTracker> + implements MicroKernelTracker { + + /** + * The reference to the micro kernel once available. + */ + private volatile MicroKernel mk; + + public OsgiMicroKernelTracker() { + super(MicroKernelTracker.class); + } + + @Override + public void available(MicroKernel mk) { + this.mk = mk; + if (mk != null) { + for (MicroKernelTracker mki : getServices()) { + mki.available(mk); + } + } + } + + @Override + public Object addingService(ServiceReference reference) { + MicroKernelTracker mki = + (MicroKernelTracker) super.addingService(reference); + MicroKernel microKernel = mk; + if (microKernel != null) { + mki.available(mk); + } + return mki; + } + +} Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiMicroKernelTracker.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiValidatorProvider.java Mon Oct 1 14:36:57 2012 @@ -22,69 +22,24 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.commit.Validator; import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider; import org.apache.jackrabbit.oak.spi.state.NodeState; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.util.tracker.ServiceTrackerCustomizer; - -import java.util.HashMap; -import java.util.Map; /** * This validator provider combines all validators of all available OSGi validator * providers. */ -public class OsgiValidatorProvider implements ServiceTrackerCustomizer, ValidatorProvider { - - private BundleContext context; - - private ServiceTracker tracker; - - private final Map<ServiceReference, ValidatorProvider> providers = - new HashMap<ServiceReference, ValidatorProvider>(); - - public void start(BundleContext bundleContext) throws Exception { - context = bundleContext; - tracker = new ServiceTracker( - bundleContext, ValidatorProvider.class.getName(), this); - tracker.open(); - } - - public void stop() throws Exception { - tracker.close(); - } +public class OsgiValidatorProvider + extends AbstractServiceTracker<ValidatorProvider> + implements ValidatorProvider { - //------------------------------------------------------------< ServiceTrackerCustomizer >--- - - @Override - public Object addingService(ServiceReference reference) { - Object service = context.getService(reference); - if (service instanceof ValidatorProvider) { - ValidatorProvider provider = (ValidatorProvider) service; - providers.put(reference, provider); - return service; - } else { - context.ungetService(reference); - return null; - } - } - - @Override - public void modifiedService(ServiceReference reference, Object service) { - // nothing to do - } - - @Override - public void removedService(ServiceReference reference, Object service) { - providers.remove(reference); - context.ungetService(reference); + public OsgiValidatorProvider() { + super(ValidatorProvider.class); } //------------------------------------------------------------< ValidatorProvider >--- @Override public Validator getRootValidator(NodeState before, NodeState after) { - return CompositeValidatorProvider.compose(providers.values()) + return CompositeValidatorProvider.compose(getServices()) .getRootValidator(before, after); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/BuiltInNodeTypes.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/BuiltInNodeTypes.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/BuiltInNodeTypes.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/BuiltInNodeTypes.java Mon Oct 1 14:36:57 2012 @@ -18,14 +18,11 @@ package org.apache.jackrabbit.oak.plugin import java.io.InputStream; import java.io.InputStreamReader; -import java.security.PrivilegedAction; import javax.annotation.Nonnull; -import javax.security.auth.Subject; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; -import org.apache.jackrabbit.oak.spi.security.principal.AdminPrincipal; import static org.apache.jackrabbit.oak.plugins.type.NodeTypeConstants.NODE_TYPES_PATH; @@ -68,25 +65,17 @@ public class BuiltInNodeTypes { // not have sufficient permission to register node types or may // even have limited read-permission on the jcr:nodetypes path. if (!nodeTypesInContent()) { - Subject admin = new Subject(); - admin.getPrincipals().add(AdminPrincipal.INSTANCE); - Subject.doAs(admin, new PrivilegedAction<Void>() { - @Override - public Void run() { - try { - InputStream stream = BuiltInNodeTypes.class.getResourceAsStream("builtin_nodetypes.cnd"); - try { - ntMgr.registerNodeTypes(new InputStreamReader(stream, "UTF-8")); - } finally { - stream.close(); - } - } catch (Exception e) { - throw new IllegalStateException( - "Unable to load built-in node types", e); - } - return null; + try { + InputStream stream = BuiltInNodeTypes.class.getResourceAsStream("builtin_nodetypes.cnd"); + try { + ntMgr.registerNodeTypes(new InputStreamReader(stream, "UTF-8")); + } finally { + stream.close(); } - }); + } catch (Exception e) { + throw new IllegalStateException( + "Unable to load built-in node types", e); + } } } Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/InitialContent.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/InitialContent.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/InitialContent.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/InitialContent.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,56 @@ +/* + * 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.jackrabbit.oak.plugins.type; + +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Service; +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.spi.lifecycle.DefaultMicroKernelTracker; +import org.apache.jackrabbit.oak.spi.lifecycle.MicroKernelTracker; +import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.spi.state.NodeStore; + +/** + * <code>InitialContent</code> implements a {@link MicroKernelTracker} and + * registers built-in node types when the micro kernel becomes available. + */ +@Component +@Service(MicroKernelTracker.class) +public class InitialContent extends DefaultMicroKernelTracker { + + @Override + public void available(MicroKernel mk) { + NodeStore nodeStore = new Oak(mk).createNodeStore(); + // FIXME: depends on CoreValue's name mangling + NodeState root = nodeStore.getRoot(); + if (root.hasChildNode("jcr:system")) { + mk.commit("/", "^\"jcr:primaryType\":\"nam:rep:root\" ", null, null); + } else { + mk.commit("/", "^\"jcr:primaryType\":\"nam:rep:root\"" + + "+\"jcr:system\":{" + + "\"jcr:primaryType\" :\"nam:rep:system\"," + + "\":unique\" :{\"jcr:uuid\":{},\"rep:authorizableId\":{},\"rep:principalName\":{}}," + + "\"jcr:versionStorage\" :{\"jcr:primaryType\":\"nam:rep:versionStorage\"}," + + "\"jcr:nodeTypes\" :{\"jcr:primaryType\":\"nam:rep:nodeTypes\"}," + + "\"jcr:activities\" :{\"jcr:primaryType\":\"nam:rep:Activities\"}," + + "\"rep:privileges\" :{\"jcr:primaryType\":\"nam:rep:Privileges\"}}", null, null); + } + + BuiltInNodeTypes.register(new Oak(mk).createRoot()); + } +} Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,50 @@ +/* + * 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.jackrabbit.oak.spi.lifecycle; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.apache.jackrabbit.mk.api.MicroKernel; + +/** + * <code>CompositeMicroKernelTracker</code> consists of multiple micro kernel + * trackers and calls them all on {@link #available(MicroKernel)}. + */ +public class CompositeMicroKernelTracker implements MicroKernelTracker { + + private final List<MicroKernelTracker> trackers = new ArrayList<MicroKernelTracker>(); + + public CompositeMicroKernelTracker(Collection<MicroKernelTracker> trackers) { + this.trackers.addAll(trackers); + } + + public CompositeMicroKernelTracker(MicroKernelTracker... trackers) { + this.trackers.addAll(Arrays.asList(trackers)); + } + + @Override + public void available(MicroKernel mk) { + for (MicroKernelTracker tracker : trackers) { + tracker.available(mk); + } + } +} Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeMicroKernelTracker.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,36 @@ +/* + * 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.jackrabbit.oak.spi.lifecycle; + +import org.apache.jackrabbit.mk.api.MicroKernel; + +/** + * <code>DefaultMicroKernelTracker</code> is a default implementation of all methods + * specified in {@link MicroKernelTracker}. The methods immediately return and do + * nothing. + * </p> + * This class can be used when a tracker only wants to get callbacks for some of + * the life cycle events and does not want to implement all methods specified + * in {@link MicroKernelTracker}. This also guarantees forward compatibility when + * new methods are introduced in later versions. + */ +public class DefaultMicroKernelTracker implements MicroKernelTracker { + + @Override + public void available(MicroKernel mk) { + } +} Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/DefaultMicroKernelTracker.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java?rev=1392352&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java (added) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java Mon Oct 1 14:36:57 2012 @@ -0,0 +1,37 @@ +/* + * 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.jackrabbit.oak.spi.lifecycle; + +import org.apache.jackrabbit.mk.api.MicroKernel; +import org.apache.jackrabbit.oak.api.ContentRepository; + +/** + * This interface is mainly used in an OSGi environment where various components + * of Oak are started by container and one would like to plug in some code that + * is executed when the micro kernel becomes available in the system. + */ +public interface MicroKernelTracker { + + /** + * This method is called when both the {@link MicroKernel} service and this + * tracker become available in the system. + * @param mk the {@link MicroKernel} instance. + */ + public void available(MicroKernel mk); +} Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/MicroKernelTracker.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Rev URL Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractOakTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractOakTest.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractOakTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/AbstractOakTest.java Mon Oct 1 14:36:57 2012 @@ -16,6 +16,9 @@ */ package org.apache.jackrabbit.oak; +import java.util.ArrayList; +import java.util.List; + import javax.jcr.Credentials; import javax.jcr.GuestCredentials; import javax.jcr.NoSuchWorkspaceException; @@ -25,6 +28,9 @@ import javax.security.auth.login.LoginEx import org.apache.jackrabbit.oak.api.ContentRepository; import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.core.ContentRepositoryImpl; +import org.apache.jackrabbit.oak.plugins.type.InitialContent; +import org.apache.jackrabbit.oak.spi.lifecycle.CompositeMicroKernelTracker; +import org.apache.jackrabbit.oak.spi.lifecycle.MicroKernelTracker; import org.junit.Before; /** @@ -62,4 +68,10 @@ public abstract class AbstractOakTest { return new SimpleCredentials("admin", "admin".toCharArray()); } + protected static MicroKernelTracker createDefaultKernelTracker() { + List<MicroKernelTracker> hooks = new ArrayList<MicroKernelTracker>(); + hooks.add(new InitialContent()); + return new CompositeMicroKernelTracker(hooks); + } + } \ No newline at end of file Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/lucene/AbstractLuceneQueryTest.java Mon Oct 1 14:36:57 2012 @@ -16,10 +16,9 @@ */ package org.apache.jackrabbit.oak.plugins.lucene; -import static org.apache.jackrabbit.oak.spi.query.IndexUtils.DEFAULT_INDEX_HOME; - import java.text.ParseException; +import org.apache.jackrabbit.mk.api.MicroKernel; import org.apache.jackrabbit.mk.core.MicroKernelImpl; import org.apache.jackrabbit.oak.AbstractOakTest; import org.apache.jackrabbit.oak.api.ContentRepository; @@ -37,6 +36,8 @@ import org.apache.jackrabbit.oak.spi.que import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; import org.junit.Before; +import static org.apache.jackrabbit.oak.spi.query.IndexUtils.DEFAULT_INDEX_HOME; + /** * base class for lucene search tests */ @@ -67,7 +68,9 @@ public abstract class AbstractLuceneQuer new LuceneIndexProvider(DEFAULT_INDEX_HOME)); CommitHook ch = new CompositeHook(new LuceneReindexHook( DEFAULT_INDEX_HOME), new LuceneHook(DEFAULT_INDEX_HOME)); - return new ContentRepositoryImpl(new MicroKernelImpl(), qip, ch); + MicroKernel mk = new MicroKernelImpl(); + createDefaultKernelTracker().available(mk); + return new ContentRepositoryImpl(mk, qip, ch); } protected void createIndexNode() throws Exception { Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Mon Oct 1 14:36:57 2012 @@ -55,6 +55,7 @@ public abstract class AbstractQueryTest PropertyIndexer pi = new PropertyIndexer(indexer); QueryIndexProvider qip = new CompositeQueryIndexProvider(pi); CompositeHook hook = new CompositeHook(pi); + createDefaultKernelTracker().available(mk); return new ContentRepositoryImpl(mk, qip, hook); } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java?rev=1392352&r1=1392351&r2=1392352&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java Mon Oct 1 14:36:57 2012 @@ -34,6 +34,7 @@ import org.apache.jackrabbit.oak.api.Con import org.apache.jackrabbit.oak.core.ContentRepositoryImpl; import org.apache.jackrabbit.oak.plugins.name.NameValidatorProvider; import org.apache.jackrabbit.oak.plugins.name.NamespaceValidatorProvider; +import org.apache.jackrabbit.oak.plugins.type.InitialContent; import org.apache.jackrabbit.oak.plugins.type.TypeValidatorProvider; import org.apache.jackrabbit.oak.plugins.unique.UniqueIndexHook; import org.apache.jackrabbit.oak.plugins.commit.ConflictValidatorProvider; @@ -90,8 +91,8 @@ public class RepositoryImpl implements R public RepositoryImpl( MicroKernel kernel, ScheduledExecutorService executor) { - this(new ContentRepositoryImpl(kernel, null, DEFAULT_COMMIT_HOOK), - executor); + this(new ContentRepositoryImpl(setupInitialContent(kernel), null, + DEFAULT_COMMIT_HOOK), executor); } /** @@ -214,4 +215,9 @@ public class RepositoryImpl implements R public Session login(String workspace) throws RepositoryException { return login(null, workspace); } + + private static MicroKernel setupInitialContent(MicroKernel mk) { + new InitialContent().available(mk); + return mk; + } } \ No newline at end of file