Author: chetanm
Date: Tue Mar 11 07:41:03 2014
New Revision: 1576208
URL: http://svn.apache.org/r1576208
Log:
OAK-1522 - Provide PojoSR based RepositoryFactory implementation (wip)
Checking in initial implementation. The testcase is currently ignored as some
issue with SecurityConfig. Some pending features documented as part of TODOs
Added:
jackrabbit/oak/trunk/oak-pojosr/
jackrabbit/oak/trunk/oak-pojosr/README.md
jackrabbit/oak/trunk/oak-pojosr/pom.xml (with props)
jackrabbit/oak/trunk/oak-pojosr/src/
jackrabbit/oak/trunk/oak-pojosr/src/main/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config
(with props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml (with
props)
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties
(with props)
Modified:
jackrabbit/oak/trunk/README.md
jackrabbit/oak/trunk/pom.xml
Modified: jackrabbit/oak/trunk/README.md
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/README.md?rev=1576208&r1=1576207&r2=1576208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/README.md (original)
+++ jackrabbit/oak/trunk/README.md Tue Mar 11 07:41:03 2014
@@ -65,6 +65,7 @@ The build consists of the following main
- oak-http - HTTP binding for Oak
- oak-lucene - Lucene-based query index
- oak-run - runnable jar packaging
+ - oak-pojosr - integration with PojoSR
- oak-upgrade - tooling for upgrading Jackrabbit repositories to Oak
- oak-it - integration tests
- oak-it/mk - integration tests for MicroKernel
Added: jackrabbit/oak/trunk/oak-pojosr/README.md
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/README.md?rev=1576208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-pojosr/README.md (added)
+++ jackrabbit/oak/trunk/oak-pojosr/README.md Tue Mar 11 07:41:03 2014
@@ -0,0 +1,16 @@
+Oak PojoSR
+==========
+
+This module demonstrates running Oak outside of OSGi environments but using in
built OSGi
+support for configuring Oak. It makes use of [PojoSR][1] to provide the OSGi
framework
+support. This would enable usage of Oak in POJO env and would still enable
usage of OSGi features
+to customize Oak components.
+
+To make use of this following dependencies are required
+
+1. PojoSR - Provides the OSGi framework support
+2. Apache Felix SCR
+3. Apache Felix Config Admin
+4. Apache Felix Fileinstall - To provision configuration
+
+[1]: https://code.google.com/p/pojosr/
\ No newline at end of file
Added: jackrabbit/oak/trunk/oak-pojosr/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/pom.xml?rev=1576208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-pojosr/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-pojosr/pom.xml Tue Mar 11 07:41:03 2014
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd ">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>oak-parent</artifactId>
+ <version>0.19-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>oak-pojosr</artifactId>
+ <name>Oak PojoSR</name>
+
+ <properties>
+ <skip.deployment>true</skip.deployment>
+ </properties>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.rat</groupId>
+ <artifactId>apache-rat-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>README.md</exclude>
+ <exclude>src/test/resources/**/*.config</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <!-- Some component is creating derby.log in test. Need to be
deleted-->
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>2.5</version>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>${project.basedir}</directory>
+ <includes>
+ <include>derby.log</include>
+ </includes>
+ </fileset>
+ </filesets>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>oak-jcr</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.mongodb</groupId>
+ <artifactId>mongo-java-driver</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-data</artifactId>
+ <version>${jackrabbit.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>log4j-over-slf4j</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jul-to-slf4j</artifactId>
+ </dependency>
+
+ <!-- Required to route OSGi LogEvents to Slf4j-->
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.logservice</artifactId>
+ <version>1.0.2</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ </dependency>
+
+ <!-- Pojo SR -->
+
+ <dependency>
+ <groupId>com.googlecode.pojosr</groupId>
+ <artifactId>de.kalpatec.pojosr.framework.bare</artifactId>
+ <version>0.2.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr</artifactId>
+ <version>1.8.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.configadmin</artifactId>
+ <version>1.8.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.fileinstall</artifactId>
+ <version>3.2.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.jaas</artifactId>
+ <version>0.0.2</version>
+ </dependency>
+
+ <!-- Test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
Propchange: jackrabbit/oak/trunk/oak-pojosr/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,73 @@
+/*
+ * 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.run.osgi;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
+import de.kalpatec.pojosr.framework.launch.BundleDescriptor;
+import org.osgi.framework.Constants;
+
+/**
+ * Comparator to simulate start level support of OSgi framework by ordering
the startup
+ * sequence. This is required to ensure that required configured is
provisioned with
+ * ConfigAdmin before the SCR bundle starts
+ */
+class BundleDescriptorComparator implements Comparator<BundleDescriptor> {
+ public static final Integer DEFAULT_START_LEVEL = 20;
+
+ private final Map<String, Integer> startLevels;
+
+ public BundleDescriptorComparator() {
+ startLevels = defaultStartLevels();
+ }
+
+ public BundleDescriptorComparator(Map<String, Integer> startLevels) {
+ this.startLevels = startLevels;
+ }
+
+ private Map<String, Integer> defaultStartLevels() {
+ Map<String, Integer> defaultLevels = new HashMap<String, Integer>();
+
+ defaultLevels.put("org.apache.sling.commons.logservice", 1);
+
+ defaultLevels.put("org.apache.felix.configadmin", 2);
+ defaultLevels.put("org.apache.felix.fileinstall", 2);
+
+ defaultLevels.put("org.apache.felix.scr", 10);
+ return Collections.unmodifiableMap(defaultLevels);
+ }
+
+ @Override
+ public int compare(BundleDescriptor o1, BundleDescriptor o2) {
+ return getStartLevel(o1).compareTo(getStartLevel(o2));
+ }
+
+ private Integer getStartLevel(BundleDescriptor bd) {
+ String symbolicName =
bd.getHeaders().get(Constants.BUNDLE_SYMBOLICNAME);
+ Integer level = startLevels.get(symbolicName);
+ if (level == null) {
+ level = DEFAULT_START_LEVEL;
+ }
+ return level;
+ }
+}
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/BundleDescriptorComparator.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,311 @@
+/*
+ * 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.run.osgi;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.RepositoryFactory;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.SettableFuture;
+import de.kalpatec.pojosr.framework.launch.BundleDescriptor;
+import de.kalpatec.pojosr.framework.launch.ClasspathScanner;
+import de.kalpatec.pojosr.framework.launch.PojoServiceRegistry;
+import de.kalpatec.pojosr.framework.launch.PojoServiceRegistryFactory;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public class OakOSGiRepositoryFactory implements RepositoryFactory {
+
+ private static Logger log =
LoggerFactory.getLogger(OakOSGiRepositoryFactory.class);
+ /**
+ * Name of the repository home parameter.
+ */
+ public static final String REPOSITORY_HOME
+ = "org.apache.jackrabbit.repository.home";
+
+ public static final String REPOSITORY_STARTUP_TIMEOUT
+ = "org.apache.jackrabbit.repository.startupTimeOut";
+
+ /**
+ * Default timeout for repository creation
+ */
+ private static final int DEFAULT_TIMEOUT = (int)
TimeUnit.MINUTES.toSeconds(10);
+
+ @SuppressWarnings("unchecked")
+ public Repository getRepository(Map parameters) throws RepositoryException
{
+ Map config = new HashMap();
+ config.putAll(parameters);
+
+ //TODO Add support for passing config as map of PID -> Dictionary
+ //as part of parameters and hook it up with Felix ConfigAdmin
+ //Say via custom InMemory PersistenceManager or programatically
+ //registering it with using ConfigAdmin API
+ //For later part we would need to implement some sort of Start Level
+ //support such that
+ // 1. Some base bundles like ConfigAdmin get start first
+ // 2. We register the user provided config
+ // 3. Other bundles get started
+
+ //TODO With OSGi Whiteboard we need to provide support for handling
+ //execution and JMX support as so far they were provided by Sling
bundles
+ //in OSGi env
+
+ processConfig(config);
+
+ PojoServiceRegistry registry = createServiceRegistry(config);
+ preProcessRegistry(registry);
+ startBundles(registry);
+ postProcessRegistry(registry);
+
+ //Future which would be used to notify when repository is ready
+ // to be used
+ SettableFuture<Repository> repoFuture = SettableFuture.create();
+
+ //Start the tracker for repository creation
+ new RepositoryTracker(registry, repoFuture);
+
+ //Now wait for repository to be created with given timeout
+ //if repository creation takes more time. This is required to handle
case
+ // where OSGi runtime fails to start due to bugs (like cycles)
+ int timeout = getTimeoutInSeconds(config);
+ try {
+ return repoFuture.get(timeout, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new RepositoryException("Repository initialization was
interrupted");
+ } catch (ExecutionException e) {
+ throw new RepositoryException(e);
+ } catch (TimeoutException e) {
+ try {
+ shutdown(registry);
+ } catch (BundleException be) {
+ log.warn("Error occurred while shutting down the service
registry (due to " +
+ "startup timeout) backing the Repository ", be);
+ }
+ throw new RepositoryException("Repository could not be started in
" +
+ timeout + " seconds", e);
+ }
+ }
+
+ /**
+ * Enables pre processing of service registry by sub classes. This can be
+ * used to register services before any bundle gets started
+ *
+ * @param registry service registry
+ */
+ protected void preProcessRegistry(PojoServiceRegistry registry) {
+
+ }
+
+ /**
+ * Enables post processing of service registry e.g. registering new
services etc
+ * by sub classes
+ *
+ * @param registry service registry
+ */
+ protected void postProcessRegistry(PojoServiceRegistry registry) {
+
+ }
+
+ /**
+ * @param descriptors
+ * @return
+ */
+ protected List<BundleDescriptor> processDescriptors(List<BundleDescriptor>
descriptors) {
+ //If required sort the bundle descriptors such that configuration
admin and file install bundle
+ //gets started before SCR
+ Collections.sort(descriptors, new BundleDescriptorComparator());
+ return descriptors;
+ }
+
+ static void shutdown(PojoServiceRegistry registry) throws BundleException {
+ if (registry != null) {
+ registry.getBundleContext().getBundle().stop();
+ }
+ }
+
+ private static int getTimeoutInSeconds(Map config) {
+ Integer timeout = (Integer) config.get(REPOSITORY_STARTUP_TIMEOUT);
+ if (timeout == null) {
+ timeout = DEFAULT_TIMEOUT;
+ }
+ return timeout;
+ }
+
+ private static void processConfig(Map config) {
+ String home = (String) config.get(REPOSITORY_HOME);
+ checkNotNull(home, "Repository home not defined via [%s]",
REPOSITORY_HOME);
+
+ home = FilenameUtils.normalizeNoEndSeparator(home);
+
+ String bundleDir = FilenameUtils.concat(home, "bundles");
+ config.put(Constants.FRAMEWORK_STORAGE, bundleDir);
+
+ //FIXME Pojo SR currently reads this from system property instead of
Framework Property
+ System.setProperty(Constants.FRAMEWORK_STORAGE, bundleDir);
+
+ //Directory used by Felix File Install to watch for configs
+ config.put("felix.fileinstall.dir", FilenameUtils.concat(home,
"config"));
+
+ //Set log level for config to INFO LogService.LOG_INFO
+ config.put("felix.fileinstall.log.level", "3");
+
+ //This ensures that configuration is registered in main thread
+ //and not in a different thread
+ config.put("felix.fileinstall.noInitialDelay", "true");
+
+ //Directory used by Felix File Install to watch for configs
+ config.put("repository.home", FilenameUtils.concat(home,
"repository"));
+
+ copyConfigToSystemProps(config);
+ }
+
+ private static void copyConfigToSystemProps(Map config) {
+ //TODO This is a temporary workaround as the current release version
+ //of PojoSR reads value from System properties. Trunk version reads
from
+ //initial map. This should be removed when we move to version which
has the fix
+ Iterator<Map.Entry> itr = config.entrySet().iterator();
+ while (itr.hasNext()) {
+ Map.Entry e = itr.next();
+ if (e.getValue() instanceof String) {
+ System.setProperty((String) e.getKey(), (String) e.getValue());
+ }
+ }
+ }
+
+ private PojoServiceRegistry createServiceRegistry(Map<String, Object>
config) {
+ try {
+ ServiceLoader<PojoServiceRegistryFactory> loader =
ServiceLoader.load(PojoServiceRegistryFactory.class);
+ return loader.iterator().next().newPojoServiceRegistry(config);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ private void startBundles(PojoServiceRegistry registry) {
+ try {
+ List<BundleDescriptor> descriptors = new
ClasspathScanner().scanForBundles();
+ descriptors = processDescriptors(descriptors);
+ registry.startBundles(descriptors);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static class RepositoryTracker extends ServiceTracker {
+ private final SettableFuture<Repository> repoFuture;
+ private final PojoServiceRegistry registry;
+ private RepositoryProxy proxy;
+
+ public RepositoryTracker(PojoServiceRegistry registry,
SettableFuture<Repository> repoFuture) {
+ super(registry.getBundleContext(), Repository.class.getName(),
null);
+ this.repoFuture = repoFuture;
+ this.registry = registry;
+ this.open();
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ Object service = super.addingService(reference);
+ if (proxy == null) {
+ //As its possible that future is accessed before the service
+ //get registered with tracker. We also capture the initial
reference
+ //and use that for the first access case
+ repoFuture.set(createProxy((Repository) service));
+ }
+ return service;
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service)
{
+ if (proxy != null) {
+ proxy.clearInitialReference();
+ }
+ }
+
+ public PojoServiceRegistry getRegistry() {
+ return registry;
+ }
+
+ private Repository createProxy(Repository service) {
+ proxy = new RepositoryProxy(this, service);
+ return (Repository)
Proxy.newProxyInstance(getClass().getClassLoader(),
+ new Class[]{Repository.class, JackrabbitRepository.class},
proxy);
+ }
+ }
+
+ /**
+ * Due to the way SecurityConfiguration is managed in OSGi env its possible
+ * that repository gets created/shutdown few times. So need to have a proxy
+ * to access the latest service
+ */
+ private static class RepositoryProxy implements InvocationHandler {
+ private final RepositoryTracker tracker;
+ private Repository initialService;
+
+ private RepositoryProxy(RepositoryTracker tracker, Repository
initialService) {
+ this.tracker = tracker;
+ this.initialService = initialService;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
+ Object obj = tracker.getService();
+ if (obj == null) {
+ obj = initialService;
+ }
+
+ Preconditions.checkNotNull(obj, "Repository service is not
available");
+
+ if ("shutdown".equals(method.getName())) {
+ shutdown(tracker.getRegistry());
+ }
+
+ return method.invoke(obj, args);
+ }
+
+ public void clearInitialReference() {
+ this.initialService = null;
+ }
+ }
+}
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/main/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,164 @@
+/*
+ * 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.run.osgi;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.RepositoryFactory;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import de.kalpatec.pojosr.framework.launch.PojoServiceRegistry;
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import
org.apache.jackrabbit.oak.spi.security.user.action.AbstractAuthorizableAction;
+import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction;
+import
org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.apache.commons.io.FilenameUtils.concat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@Ignore("OAK-1522")
+public class OakOSGiRepositoryFactoryTest {
+
+ private String repositoryHome;
+ private RepositoryFactory repositoryFactory = new CustomOakFactory();
+ private Map config = new HashMap();
+ private String newPassword;
+
+ @Before
+ public void setUp() throws IOException {
+ repositoryHome = concat(getBaseDir(), "target/repository");
+ config.put("org.apache.jackrabbit.repository.home", repositoryHome);
+
+ File repoHome = new File(repositoryHome);
+ if (repoHome.exists()) {
+ FileUtils.cleanDirectory(new File(repositoryHome));
+ }
+ copyConfig("common");
+ }
+
+ @Test
+ public void testRepositoryTar() throws Exception {
+ copyConfig("tar");
+
+ Repository repository = repositoryFactory.getRepository(config);
+
+ //Give time for system to stablize :(
+ TimeUnit.SECONDS.sleep(1);
+
+ assertNotNull(repository);
+ System.out.println("Repository started ");
+
+ basicCrudTest(repository);
+
+ //For now SecurityConfig is giving some issue
+ //so disable that
+ testCallback(repository);
+
+ shutdown(repository);
+ }
+
+ private void testCallback(Repository repository) throws
RepositoryException {
+ JackrabbitSession session = (JackrabbitSession)
+ repository.login(new SimpleCredentials("admin",
"admin".toCharArray()));
+
+ String testUserId = "footest";
+
+ User testUser = (User)
session.getUserManager().getAuthorizable(testUserId);
+ if (testUser == null) {
+ testUser = session.getUserManager().createUser(testUserId,
"password");
+ }
+
+ session.save();
+
+ testUser.changePassword("newPassword");
+ session.save();
+
+ assertEquals("newPassword", newPassword);
+ }
+
+ private void basicCrudTest(Repository repository) throws
RepositoryException {
+ Session session = repository.login(new SimpleCredentials("admin",
"admin".toCharArray()));
+ Node rootNode = session.getRootNode();
+
+ Node child = JcrUtils.getOrAddNode(rootNode, "child",
"oak:Unstructured");
+ child.setProperty("foo3", "bar3");
+ session.logout();
+
+ System.out.println("Basic test passed");
+ }
+
+ private void shutdown(Repository repository) {
+ if (repository instanceof JackrabbitRepository) {
+ ((JackrabbitRepository) repository).shutdown();
+ }
+ }
+
+ private void copyConfig(String type) throws IOException {
+ FileUtils.copyDirectory(new File(concat(getBaseDir(),
"src/test/resources/config-" + type)),
+ new File(concat(repositoryHome, "config")));
+ }
+
+ private static String getBaseDir() {
+ return new File(".").getAbsolutePath();
+ }
+
+ private class CustomOakFactory extends OakOSGiRepositoryFactory {
+
+ @Override
+ protected void postProcessRegistry(PojoServiceRegistry registry) {
+
registry.registerService(AuthorizableActionProvider.class.getName(), new
AuthorizableActionProvider() {
+ @Override
+ public List<? extends AuthorizableAction>
getAuthorizableActions(SecurityProvider securityProvider) {
+ return Collections.singletonList(new TestAction());
+ }
+ }, null);
+ }
+ }
+
+ private class TestAction extends AbstractAuthorizableAction {
+
+ @Override
+ public void onPasswordChange(User user, String newPassword,
+ Root root, NamePathMapper namePathMapper)
throws RepositoryException {
+ OakOSGiRepositoryFactoryTest.this.newPassword = newPassword;
+ }
+ }
+}
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/java/org/apache/jackrabbit/oak/run/osgi/OakOSGiRepositoryFactoryTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,5 @@
+jaas.controlFlag="optional"
+jaas.classname="org.apache.jackrabbit.oak.spi.security.authentication.GuestLoginModule"
+jaas.ranking=I"300"
+jaas.realmName=""
+jaas.options=[""]
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-GuestLoginModule.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,5 @@
+jaas.controlFlag="required"
+jaas.classname="org.apache.jackrabbit.oak.security.authentication.user.LoginModuleImpl"
+jaas.ranking=I"100"
+jaas.realmName=""
+jaas.options=[""]
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-LoginModuleImpl.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,5 @@
+jaas.controlFlag="sufficient"
+jaas.classname="org.apache.jackrabbit.oak.security.authentication.token.TokenLoginModule"
+jaas.ranking=I"200"
+jaas.realmName=""
+jaas.options=[""]
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.Configuration.factory-TokenLoginModule.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,3 @@
+jaas.defaultRealmName="jackrabbit.oak"
+jaas.globalConfigPolicy="proxy"
+jaas.configProviderName="FelixJaasProvider"
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.felix.jaas.ConfigurationSpi.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1 @@
+importBehavior="besteffort"
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,4 @@
+groupsPath="/home/groups"
+usersPath="/home/users"
+defaultDepth="1"
+importBehavior="besteffort"
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.security.user.UserConfigurationImpl.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,3 @@
+enabledActions=["org.apache.jackrabbit.oak.spi.security.user.action.AccessControlAction"]
+userPrivilegeNames=["jcr:all"]
+groupPrivilegeNames=["jcr:read"]
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-common/org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,3 @@
+mongouri="mongodb://localhost:27017"
+db="oak"
+service.ranking=I"50"
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-mongo/org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreService.config
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config?rev=1576208&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config
(added)
+++
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config
Tue Mar 11 07:41:03 2014
@@ -0,0 +1,2 @@
+name="Oak-Tar"
+service.ranking=I"100"
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/config-tar/org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService.config
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml?rev=1576208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml (added)
+++ jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml Tue Mar
11 07:41:03 2014
@@ -0,0 +1,39 @@
+<!--
+ ~ 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.
+ -->
+<configuration>
+
+ <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} *%level* [%thread] %logger
%message%n</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="file" class="ch.qos.logback.core.FileAppender">
+ <file>target/unit-tests.log</file>
+ <encoder>
+ <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} *%level* [%thread] %logger
%message%n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="INFO">
+ <appender-ref ref="console"/>
+ <appender-ref ref="file"/>
+ </root>
+
+</configuration>
Propchange: jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logback-test.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties?rev=1576208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties
(added)
+++ jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties Tue
Mar 11 07:41:03 2014
@@ -0,0 +1,16 @@
+# 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.
+
+handlers = org.slf4j.bridge.SLF4JBridgeHandler
Propchange:
jackrabbit/oak/trunk/oak-pojosr/src/test/resources/logging.properties
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/pom.xml?rev=1576208&r1=1576207&r2=1576208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/pom.xml (original)
+++ jackrabbit/oak/trunk/pom.xml Tue Mar 11 07:41:03 2014
@@ -54,6 +54,7 @@
<module>oak-auth-ldap</module>
<module>oak-run</module>
<module>oak-it</module>
+ <module>oak-pojosr</module>
<!-- <module>oak-mk-perf</module> -->
</modules>