blob: 0cb27e3cdebd01f3be9bc7e21a26f292072eb357 [file] [log] [blame]
/*
* 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 org.apache.felix.connect.launch.BundleDescriptor
import org.apache.felix.connect.launch.PojoServiceRegistry
import groovy.json.JsonOutput
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.osgi.framework.Constants
import org.osgi.service.cm.Configuration
import org.osgi.service.cm.ConfigurationAdmin
import static org.apache.jackrabbit.oak.run.osgi.OakOSGiRepositoryFactory.*
class ConfigTest {
TestRepositoryFactory factory = new TestRepositoryFactory()
Map config
File workDir
PojoServiceRegistry registry
ConfigurationAdmin cm
@Rule
public final TemporaryFolder tmpFolder = new TemporaryFolder(new File("target"))
@Before
void setUp(){
workDir = tmpFolder.getRoot();
config = [
(REPOSITORY_HOME) : workDir.absolutePath,
'magic.spell' : 'Alohomora'
]
}
@After
void shutDown(){
OakOSGiRepositoryFactory.shutdown(registry, 5)
}
@Test
void testRuntimeConfig(){
config[REPOSITORY_CONFIG] = createConfigMap()
initRegistry(config)
assertConfig()
}
@Test
void testFileConfig(){
def jf1 = new File(workDir, "config1.json")
def jf2 = new File(workDir, "config2.json")
jf1 << JsonOutput.toJson(createConfigMap())
jf2 << JsonOutput.toJson([bar : [a:'a3', b:4]])
config[REPOSITORY_CONFIG_FILE] = "${jf1.absolutePath},${jf2.absolutePath}" as String
initRegistry(config)
assertConfig()
Configuration c1 = cm.getConfiguration('bar', null)
assert c1.properties
assert c1.properties.get('a') == 'a3'
assert c1.properties.get('b') == 4
}
@Test
void testConfigSync(){
config[REPOSITORY_CONFIG] = [
foo : [a:'a', b:1],
bar : [a:'a1', b:2],
foo2 : [a:'a2', b:2]
]
initRegistry(config)
Configuration c = cm.getConfiguration('baz')
c.update(new Hashtable([a :'a2']))
assert cm.getConfiguration('baz').properties.get('a') == 'a2'
assert cm.getConfiguration('foo').properties.get('a') == 'a'
assert cm.getConfiguration('bar').properties.get('a') == 'a1'
assert cm.getConfiguration('foo2').properties.get('a') == 'a2'
shutDown()
//Now re init and remove the pid bar
config[REPOSITORY_CONFIG] = [
foo : [a:'a-new', b:1],
foo2 : [a:'a2', b:2]
]
initRegistry(config)
assert cm.getConfiguration('baz').properties.get('a') == 'a2'
assert cm.getConfiguration('foo').properties.get('a') == 'a-new'
assert cm.getConfiguration('bar').properties == null
assert cm.getConfiguration('foo2').properties.get('a') == 'a2'
}
private static Map createConfigMap() {
[
'foo' : [a: 'a', b: 1, c:'${magic.spell}'],
'foo.bar-default': [a: 'a1', b: 2],
'foo.bar-simple' : [a: 'a2', b: 3],
]
}
private void assertConfig() {
Configuration c1 = cm.getConfiguration('foo', null)
assert c1.properties
assert c1.properties.get('a') == 'a'
assert c1.properties.get('b') == 1
assert c1.properties.get('c') == 'Alohomora'
Configuration[] fcs = cm.listConfigurations('(service.factoryPid=foo.bar)')
assert fcs.size() == 2
}
private void initRegistry(Map config){
registry = factory.initializeServiceRegistry(config)
cm = registry.getService(registry.getServiceReference(ConfigurationAdmin.class.name)) as ConfigurationAdmin
}
private static class TestRepositoryFactory extends OakOSGiRepositoryFactory {
@Override
protected List<BundleDescriptor> processDescriptors(List<BundleDescriptor> descriptors) {
//skip the oak bundles to prevent repository initialization
return super.processDescriptors(descriptors).findAll {BundleDescriptor bd ->
!bd.headers[Constants.BUNDLE_SYMBOLICNAME]?.startsWith('org.apache.jackrabbit')
}
}
}
}