You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2016/11/26 00:14:15 UTC
[1/2] incubator-tamaya-sandbox git commit: TAMAYA-202: Use
bnd-maven-plugin. Minimize required config. Renamed invalid package in yaml
format module.
Repository: incubator-tamaya-sandbox
Updated Branches:
refs/heads/master 487e924fe -> 2949a137a
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigAdminImpl.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigAdminImpl.java b/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigAdminImpl.java
new file mode 100644
index 0000000..7bf4da7
--- /dev/null
+++ b/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigAdminImpl.java
@@ -0,0 +1,196 @@
+/*
+ * 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.tamaya.integration.osgi;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ManagedService;
+import org.osgi.service.cm.ManagedServiceFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Tamaya based implementation of an OSGI {@link ConfigurationAdmin}.
+ */
+public class TamayaConfigAdminImpl implements ConfigurationAdmin {
+ /** the logger. */
+ private static final Logger LOG = Logger.getLogger(TamayaConfigAdminImpl.class.getName());
+
+ /** The OSGI context. */
+ private final BundleContext context;
+ /** THe optional OSGI parent service. */
+ private ConfigurationAdmin parent;
+ /** The cached configurations. */
+ private Map<String,Configuration> configs = new ConcurrentHashMap<>();
+ /** The configuration section mapper. */
+ private OSGIConfigRootMapper configRootMapper;
+
+ /**
+ * Create a new config.
+ * @param context the OSGI context
+ */
+ TamayaConfigAdminImpl(BundleContext context) {
+ this.context = context;
+ this.configRootMapper = loadConfigRootMapper();
+ ServiceReference<ConfigurationAdmin> ref = context.getServiceReference(ConfigurationAdmin.class);
+ this.parent = ref!=null?context.getService(ref):null;
+ ServiceTracker<ManagedService, ManagedService> serviceTracker = new ServiceTracker<ManagedService,
+ ManagedService>(context, ManagedService.class, null) {
+ @Override
+ public ManagedService addingService(ServiceReference<ManagedService> reference) {
+ ManagedService service = context.getService(reference);
+ Object pidObj = reference.getProperty(Constants.SERVICE_PID);
+ if (pidObj instanceof String) {
+ String pid = (String) pidObj;
+ try {
+ Configuration config = getConfiguration(pid);
+ if(config==null){
+ service.updated(null);
+ } else{
+ service.updated(config.getProperties());
+ }
+ } catch (Exception e) {
+ LOG.log(Level.WARNING, "Error configuring ManagedService: " + service, e);
+ }
+ } else {
+ LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
+ }
+ return service;
+ }
+
+ @Override
+ public void removedService(ServiceReference<ManagedService> reference, ManagedService service) {
+ context.ungetService(reference);
+ }
+ };
+ serviceTracker.open();
+
+ ServiceTracker<ServiceFactory, ServiceFactory> factoryTracker
+ = new ServiceTracker<ServiceFactory, ServiceFactory>(context, ServiceFactory.class, null) {
+ @Override
+ public ServiceFactory addingService(ServiceReference<ServiceFactory> reference) {
+ ServiceFactory factory = context.getService(reference);
+ if(factory instanceof ManagedServiceFactory) {
+ Object pidObj = reference.getProperty(Constants.SERVICE_PID);
+ if (pidObj instanceof String) {
+ String pid = (String) pidObj;
+ try {
+ Configuration config = getConfiguration(pid);
+ if (config != null) {
+ ((ManagedServiceFactory) factory).updated(config.getFactoryPid(), config.getProperties());
+ }
+ } catch (Exception e) {
+ LOG.log(Level.WARNING, "Error configuring ManagedServiceFactory: " + factory, e);
+ }
+ } else {
+ LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
+ }
+ }
+ return factory;
+ }
+
+ @Override
+ public void removedService(ServiceReference<ServiceFactory> reference, ServiceFactory service) {
+ super.removedService(reference, service);
+ }
+ };
+ factoryTracker.open();
+ }
+
+ @Override
+ public Configuration createFactoryConfiguration(String factoryPid) throws IOException {
+ return createFactoryConfiguration(factoryPid, null);
+ }
+
+ @Override
+ public Configuration createFactoryConfiguration(String factoryPid, String location) throws IOException {
+ return new TamayaConfigurationImpl(factoryPid, null, configRootMapper, this.parent);
+ }
+
+ @Override
+ public Configuration getConfiguration(String pid, String location) throws IOException {
+ return getConfiguration(pid);
+ }
+
+ @Override
+ public Configuration getConfiguration(String pid) throws IOException {
+ return new TamayaConfigurationImpl(pid, null, configRootMapper, this.parent);
+ }
+
+ @Override
+ public Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException {
+ Collection<Configuration> result;
+ if (filter == null) {
+ result = this.configs.values();
+ } else {
+ result = new ArrayList<>();
+ Filter flt = context.createFilter(filter);
+ for (Configuration config : this.configs.values()) {
+ if (flt.match(config.getProperties())) {
+ result.add(config);
+ }
+ }
+ }
+ return result.isEmpty() ? null : result.toArray(new Configuration[configs.size()]);
+ }
+
+ /**
+ * Loads the configuration toor mapper using the OSGIConfigRootMapper OSGI service resolving mechanism. If no
+ * such service is available it loads the default mapper.
+ * @return the mapper to be used, bever null.
+ */
+ private OSGIConfigRootMapper loadConfigRootMapper() {
+ OSGIConfigRootMapper mapper = null;
+ ServiceReference<OSGIConfigRootMapper> ref = context.getServiceReference(OSGIConfigRootMapper.class);
+ if(ref!=null){
+ mapper = context.getService(ref);
+ }
+ if(mapper==null){
+ mapper = new OSGIConfigRootMapper() {
+ @Override
+ public String getTamayaConfigRoot(String pid, String factoryPid) {
+ if(pid!=null) {
+ return "[bundle:" + pid +']';
+ } else{
+ return "[bundle:" + factoryPid +']';
+ }
+ }
+ @Override
+ public String toString(){
+ return "Default OSGIConfigRootMapper(pid -> [bundle:pid], factoryPid -> [bundle:factoryPid]";
+ }
+ };
+ }
+ return mapper;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigurationImpl.java b/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigurationImpl.java
new file mode 100644
index 0000000..c7b0864
--- /dev/null
+++ b/osgi/src/main/java/org/apache/tamaya/osgi/TamayaConfigurationImpl.java
@@ -0,0 +1,127 @@
+/*
+ * 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.tamaya.integration.osgi;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.functions.PropertyMatcher;
+import org.apache.tamaya.functions.ConfigurationFunctions;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Tamaya based implementation of an OSGI {@link Configuration}.
+ */
+public class TamayaConfigurationImpl implements Configuration {
+ private static final Logger LOG = Logger.getLogger(TamayaConfigurationImpl.class.getName());
+ private final String pid;
+ private final String factoryPid;
+ private Map<String, String> properties = new HashMap<>();
+ private org.apache.tamaya.Configuration config;
+
+ /**
+ * Constructor.
+ * @param confPid the OSGI pid
+ * @param factoryPid the factory pid
+ * @param configRootMapper the mapper that maps the pids to a tamaya root section.
+ * @param parent the (optional delegating parent, used as default).
+ */
+ TamayaConfigurationImpl(String confPid, String factoryPid, OSGIConfigRootMapper configRootMapper,
+ ConfigurationAdmin parent) {
+ this.pid = confPid;
+ this.factoryPid = factoryPid;
+ if(parent!=null){
+ try {
+ Dictionary<String, Object> conf = parent.getConfiguration(confPid, factoryPid).getProperties();
+ if(conf!=null) {
+ LOG.info("Configuration: Adding default parameters from parent: " + parent.getClass().getName());
+ Enumeration<String> keys = conf.keys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ this.properties.put(key, conf.get(key).toString());
+ }
+ }
+ } catch (IOException e) {
+ LOG.log(Level.WARNING, "Error reading parent OSGI config.", e);
+ }
+ }
+ this.config = ConfigurationProvider.getConfiguration();
+ final String rootKey = configRootMapper.getTamayaConfigRoot(pid, factoryPid);
+ LOG.info("Configuration: Evaluating Tamaya configuration for '" + rootKey + "'.");
+ this.properties.putAll(
+ config.with(ConfigurationFunctions.section(rootKey, true)).getProperties());
+ }
+
+ @Override
+ public String getPid() {
+ return pid;
+ }
+
+ @Override
+ public Dictionary<String, Object> getProperties() {
+ return new Hashtable<String, Object>(properties);
+ }
+
+ @Override
+ public void update(Dictionary<String, ?> properties) throws IOException {
+ throw new UnsupportedOperationException("Nuatability not yet supported.");
+ // ConfigChangeProvider.createChangeRequest(this.config)
+ }
+
+ @Override
+ public void delete() throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getFactoryPid() {
+ return factoryPid;
+ }
+
+ @Override
+ public void update() throws IOException {
+ this.config = ConfigurationProvider.getConfiguration();
+ this.properties = config.with(ConfigurationFunctions.filter(new PropertyMatcher() {
+ @Override
+ public boolean test(String key, String value) {
+// TODO define name space / SPI
+ return false;
+ }
+ })).getProperties();
+ }
+
+ @Override
+ public void setBundleLocation(String location) {
+ }
+
+ @Override
+ public String getBundleLocation() {
+ return null;
+ }
+
+ @Override
+ public long getChangeCount() {
+ return 0;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/test/resources/felix.properties
----------------------------------------------------------------------
diff --git a/osgi/src/test/resources/felix.properties b/osgi/src/test/resources/felix.properties
index de50401..4630fa2 100644
--- a/osgi/src/test/resources/felix.properties
+++ b/osgi/src/test/resources/felix.properties
@@ -16,7 +16,7 @@
# under the License.
#
# org.osgi.service.cm;org.apache.felix.cm;org.apache.tamaya;org.apache.tamaya.spi;
-org.osgi.framework.bootdelegation=org.apache.tamaya,org.apache.tamaya.integration.osgi,org.apache.tamaya.integration.osgi.test
+org.osgi.framework.bootdelegation=org.apache.tamaya,org.apache.tamaya.osgi,org.apache.tamaya.osgi.test
felix.log.level=4 #debug logging
# felix.auto.deploy.dir=../test-bundles
org.osgi.framework.storage=target/felix-cache
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/propertysources/bnd.bnd
----------------------------------------------------------------------
diff --git a/propertysources/bnd.bnd b/propertysources/bnd.bnd
new file mode 100644
index 0000000..22420aa
--- /dev/null
+++ b/propertysources/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.propertysources
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/remote/bnd.bnd
----------------------------------------------------------------------
diff --git a/remote/bnd.bnd b/remote/bnd.bnd
new file mode 100644
index 0000000..0097b76
--- /dev/null
+++ b/remote/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.remote
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/server/bnd.bnd
----------------------------------------------------------------------
diff --git a/server/bnd.bnd b/server/bnd.bnd
new file mode 100644
index 0000000..5e15dba
--- /dev/null
+++ b/server/bnd.bnd
@@ -0,0 +1,3 @@
+Export-Package: \
+ org.apache.tamaya.server,\
+ org.apache.tamaya.server.spi
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/tamaya-sandbox.iml
----------------------------------------------------------------------
diff --git a/tamaya-sandbox.iml b/tamaya-sandbox.iml
new file mode 100644
index 0000000..1e73e41
--- /dev/null
+++ b/tamaya-sandbox.iml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/../tamaya/target/classes" />
+ <output-test url="file://$MODULE_DIR$/../tamaya/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" name="Maven: org.apache.geronimo.specs:geronimo-annotation_1.2_spec:1.0-alpha-1" level="project" />
+ </component>
+</module>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/usagetracker/bnd.bnd
----------------------------------------------------------------------
diff --git a/usagetracker/bnd.bnd b/usagetracker/bnd.bnd
new file mode 100644
index 0000000..5aa0155
--- /dev/null
+++ b/usagetracker/bnd.bnd
@@ -0,0 +1,3 @@
+Export-Package: \
+ org.apache.tamaya.usagetracker,\
+ org.apache.tamaya.usagetracker.spi
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/validation/bnd.bnd
----------------------------------------------------------------------
diff --git a/validation/bnd.bnd b/validation/bnd.bnd
new file mode 100644
index 0000000..bb9e43a
--- /dev/null
+++ b/validation/bnd.bnd
@@ -0,0 +1,3 @@
+Export-Package: \
+ org.apache.tamaya.validation,\
+ org.apache.tamaya.validation.spi
\ No newline at end of file
[2/2] incubator-tamaya-sandbox git commit: TAMAYA-202: Use
bnd-maven-plugin. Minimize required config. Renamed invalid package in yaml
format module.
Posted by an...@apache.org.
TAMAYA-202:
Use bnd-maven-plugin. Minimize required config.
Renamed invalid package in yaml format module.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/commit/2949a137
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/2949a137
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/2949a137
Branch: refs/heads/master
Commit: 2949a137a09206aca5e6656bd38736ff975f0f0b
Parents: 487e924
Author: anatole <an...@apache.org>
Authored: Sat Nov 26 01:13:57 2016 +0100
Committer: anatole <an...@apache.org>
Committed: Sat Nov 26 01:13:57 2016 +0100
----------------------------------------------------------------------
apache-commons/bnd.bnd | 2 +
.../commons/CommonsConfigPropertySource.java | 88 +++++
.../tamaya/commons/IniConfigurationFormat.java | 75 ++++
.../commons/CommonsConfigPropertySource.java | 88 -----
.../commons/IniConfigurationFormat.java | 75 ----
camel/bnd.bnd | 2 +
configured-sysprops/bnd.bnd | 2 +
.../se/ConfiguredSystemProperties.java | 340 -------------------
.../sysprops/ConfiguredSystemProperties.java | 340 +++++++++++++++++++
consul/bnd.bnd | 2 +
etcd/bnd.bnd | 2 +
hazelcast/bnd.bnd | 2 +
jodatime/bnd.bnd | 2 +
metamodel/bnd.bnd | 4 +
osgi/bnd.bnd | 2 +
.../tamaya/integration/osgi/Activator.java | 134 --------
.../integration/osgi/OSGIConfigRootMapper.java | 36 --
.../osgi/OSGIEnhancedConfiguration.java | 117 -------
.../integration/osgi/TamayaConfigAdminImpl.java | 196 -----------
.../osgi/TamayaConfigurationImpl.java | 127 -------
.../java/org/apache/tamaya/osgi/Activator.java | 134 ++++++++
.../tamaya/osgi/OSGIConfigRootMapper.java | 36 ++
.../tamaya/osgi/OSGIEnhancedConfiguration.java | 117 +++++++
.../tamaya/osgi/TamayaConfigAdminImpl.java | 196 +++++++++++
.../tamaya/osgi/TamayaConfigurationImpl.java | 127 +++++++
osgi/src/test/resources/felix.properties | 2 +-
propertysources/bnd.bnd | 2 +
remote/bnd.bnd | 2 +
server/bnd.bnd | 3 +
tamaya-sandbox.iml | 13 +
usagetracker/bnd.bnd | 3 +
validation/bnd.bnd | 3 +
32 files changed, 1160 insertions(+), 1114 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/apache-commons/bnd.bnd
----------------------------------------------------------------------
diff --git a/apache-commons/bnd.bnd b/apache-commons/bnd.bnd
new file mode 100644
index 0000000..2e5837e
--- /dev/null
+++ b/apache-commons/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.commons
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/apache-commons/src/main/java/org/apache/tamaya/commons/CommonsConfigPropertySource.java
----------------------------------------------------------------------
diff --git a/apache-commons/src/main/java/org/apache/tamaya/commons/CommonsConfigPropertySource.java b/apache-commons/src/main/java/org/apache/tamaya/commons/CommonsConfigPropertySource.java
new file mode 100644
index 0000000..4aa47ad
--- /dev/null
+++ b/apache-commons/src/main/java/org/apache/tamaya/commons/CommonsConfigPropertySource.java
@@ -0,0 +1,88 @@
+/*
+ * 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.tamaya.commons;
+
+//X TODO Move out into separate commons-config integration module...
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * PropertySource that wraps {@link org.apache.commons.configuration.Configuration}.
+ */
+public class CommonsConfigPropertySource implements PropertySource {
+
+ private Configuration commonsConfig;
+ private int ordinal;
+ private String name;
+
+ public CommonsConfigPropertySource(int ordinal, String name, Configuration commonsConfig) {
+ this.commonsConfig = Objects.requireNonNull(commonsConfig);
+ this.ordinal = ordinal;
+ this.name = Objects.requireNonNull(name);
+ }
+
+ public CommonsConfigPropertySource(String name, Configuration commonsConfig) {
+ commonsConfig = Objects.requireNonNull(commonsConfig);
+ this.name = Objects.requireNonNull(name);
+ try {
+ this.ordinal = commonsConfig.getInt(PropertySource.TAMAYA_ORDINAL);
+ } catch (Exception e) {
+ this.ordinal = 0;
+ }
+ }
+
+ @Override
+ public int getOrdinal() {
+ return ordinal;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public PropertyValue get(String key) {
+ return PropertyValue.of(key, commonsConfig.getString(key),
+ getName());
+ }
+
+ @Override
+ public Map<String, String> getProperties() {
+ Map<String, String> config = new HashMap<>();
+ Iterator<String> keyIter = commonsConfig.getKeys();
+ while (keyIter.hasNext()) {
+ String key = keyIter.next();
+ config.put(key, commonsConfig.getString(key));
+ }
+ return config;
+ }
+
+ @Override
+ public boolean isScannable() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/apache-commons/src/main/java/org/apache/tamaya/commons/IniConfigurationFormat.java
----------------------------------------------------------------------
diff --git a/apache-commons/src/main/java/org/apache/tamaya/commons/IniConfigurationFormat.java b/apache-commons/src/main/java/org/apache/tamaya/commons/IniConfigurationFormat.java
new file mode 100644
index 0000000..916d4ed
--- /dev/null
+++ b/apache-commons/src/main/java/org/apache/tamaya/commons/IniConfigurationFormat.java
@@ -0,0 +1,75 @@
+/*
+ * 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.tamaya.commons;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalINIConfiguration;
+import org.apache.commons.configuration.SubnodeConfiguration;
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationDataBuilder;
+import org.apache.tamaya.format.ConfigurationFormat;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Implements a ini file format based on the APache Commons
+ * {@link org.apache.commons.configuration.HierarchicalINIConfiguration}.
+ */
+public class IniConfigurationFormat implements ConfigurationFormat {
+
+ public ConfigurationData readConfiguration(URL url) {
+ ConfigurationDataBuilder builder = ConfigurationDataBuilder.of(url.toString(), this);
+ try {
+ HierarchicalINIConfiguration commonIniConfiguration = new HierarchicalINIConfiguration(url);
+ for(String section:commonIniConfiguration.getSections()){
+ SubnodeConfiguration sectionConfig = commonIniConfiguration.getSection(section);
+ Map<String, String> properties = new HashMap<>();
+ Iterator<String> keyIter = sectionConfig.getKeys();
+ while(keyIter.hasNext()){
+ String key = keyIter.next();
+ properties.put(key, sectionConfig.getString(key));
+ }
+ builder.addSectionProperties(section, properties);
+ }
+ } catch (ConfigurationException e) {
+ throw new ConfigException("Failed to parse ini-file format from " + url, e);
+ }
+ return builder.build();
+ }
+
+ @Override
+ public String getName() {
+ throw new RuntimeException("Not implemented yet!");
+ }
+
+ @Override
+ public boolean accepts(URL url) {
+ throw new RuntimeException("Not implemented yet!");
+ }
+
+ @Override
+ public ConfigurationData readConfiguration(String resource, InputStream inputStream) {
+ throw new RuntimeException("Not implemented yet!");
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/apache-commons/src/main/java/org/apache/tamaya/integration/commons/CommonsConfigPropertySource.java
----------------------------------------------------------------------
diff --git a/apache-commons/src/main/java/org/apache/tamaya/integration/commons/CommonsConfigPropertySource.java b/apache-commons/src/main/java/org/apache/tamaya/integration/commons/CommonsConfigPropertySource.java
deleted file mode 100644
index 2cbd4c3..0000000
--- a/apache-commons/src/main/java/org/apache/tamaya/integration/commons/CommonsConfigPropertySource.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.tamaya.integration.commons;
-
-//X TODO Move out into separate commons-config integration module...
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * PropertySource that wraps {@link org.apache.commons.configuration.Configuration}.
- */
-public class CommonsConfigPropertySource implements PropertySource {
-
- private Configuration commonsConfig;
- private int ordinal;
- private String name;
-
- public CommonsConfigPropertySource(int ordinal, String name, Configuration commonsConfig) {
- this.commonsConfig = Objects.requireNonNull(commonsConfig);
- this.ordinal = ordinal;
- this.name = Objects.requireNonNull(name);
- }
-
- public CommonsConfigPropertySource(String name, Configuration commonsConfig) {
- commonsConfig = Objects.requireNonNull(commonsConfig);
- this.name = Objects.requireNonNull(name);
- try {
- this.ordinal = commonsConfig.getInt(PropertySource.TAMAYA_ORDINAL);
- } catch (Exception e) {
- this.ordinal = 0;
- }
- }
-
- @Override
- public int getOrdinal() {
- return ordinal;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public PropertyValue get(String key) {
- return PropertyValue.of(key, commonsConfig.getString(key),
- getName());
- }
-
- @Override
- public Map<String, String> getProperties() {
- Map<String, String> config = new HashMap<>();
- Iterator<String> keyIter = commonsConfig.getKeys();
- while (keyIter.hasNext()) {
- String key = keyIter.next();
- config.put(key, commonsConfig.getString(key));
- }
- return config;
- }
-
- @Override
- public boolean isScannable() {
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/apache-commons/src/main/java/org/apache/tamaya/integration/commons/IniConfigurationFormat.java
----------------------------------------------------------------------
diff --git a/apache-commons/src/main/java/org/apache/tamaya/integration/commons/IniConfigurationFormat.java b/apache-commons/src/main/java/org/apache/tamaya/integration/commons/IniConfigurationFormat.java
deleted file mode 100644
index 67cf7fc..0000000
--- a/apache-commons/src/main/java/org/apache/tamaya/integration/commons/IniConfigurationFormat.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.tamaya.integration.commons;
-
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.HierarchicalINIConfiguration;
-import org.apache.commons.configuration.SubnodeConfiguration;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.format.ConfigurationData;
-import org.apache.tamaya.format.ConfigurationDataBuilder;
-import org.apache.tamaya.format.ConfigurationFormat;
-
-import java.io.InputStream;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Implements a ini file format based on the APache Commons
- * {@link org.apache.commons.configuration.HierarchicalINIConfiguration}.
- */
-public class IniConfigurationFormat implements ConfigurationFormat {
-
- public ConfigurationData readConfiguration(URL url) {
- ConfigurationDataBuilder builder = ConfigurationDataBuilder.of(url.toString(), this);
- try {
- HierarchicalINIConfiguration commonIniConfiguration = new HierarchicalINIConfiguration(url);
- for(String section:commonIniConfiguration.getSections()){
- SubnodeConfiguration sectionConfig = commonIniConfiguration.getSection(section);
- Map<String, String> properties = new HashMap<>();
- Iterator<String> keyIter = sectionConfig.getKeys();
- while(keyIter.hasNext()){
- String key = keyIter.next();
- properties.put(key, sectionConfig.getString(key));
- }
- builder.addSectionProperties(section, properties);
- }
- } catch (ConfigurationException e) {
- throw new ConfigException("Failed to parse ini-file format from " + url, e);
- }
- return builder.build();
- }
-
- @Override
- public String getName() {
- throw new RuntimeException("Not implemented yet!");
- }
-
- @Override
- public boolean accepts(URL url) {
- throw new RuntimeException("Not implemented yet!");
- }
-
- @Override
- public ConfigurationData readConfiguration(String resource, InputStream inputStream) {
- throw new RuntimeException("Not implemented yet!");
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/camel/bnd.bnd
----------------------------------------------------------------------
diff --git a/camel/bnd.bnd b/camel/bnd.bnd
new file mode 100644
index 0000000..94e84d1
--- /dev/null
+++ b/camel/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.integration.camel
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/configured-sysprops/bnd.bnd
----------------------------------------------------------------------
diff --git a/configured-sysprops/bnd.bnd b/configured-sysprops/bnd.bnd
new file mode 100644
index 0000000..97daf88
--- /dev/null
+++ b/configured-sysprops/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.sysprops
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/configured-sysprops/src/main/java/org/apache/tamaya/integration/se/ConfiguredSystemProperties.java
----------------------------------------------------------------------
diff --git a/configured-sysprops/src/main/java/org/apache/tamaya/integration/se/ConfiguredSystemProperties.java b/configured-sysprops/src/main/java/org/apache/tamaya/integration/se/ConfiguredSystemProperties.java
deleted file mode 100644
index bb4abbe..0000000
--- a/configured-sysprops/src/main/java/org/apache/tamaya/integration/se/ConfiguredSystemProperties.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * 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.tamaya.integration.se;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-
-/**
- * Properties implementation class that can be applied as current System properties by calling
- * {@link ConfiguredSystemProperties#install()}. The system properties will
- * then behave contextually depending on the current runtime configuration active.
- */
-public class ConfiguredSystemProperties extends Properties {
-
- private static final long serialVersionUID = 2152870929299226804L;
-
- private static final Logger LOG = Logger.getLogger(ConfiguredSystemProperties.class.getName());
- private Properties initialProperties;
- private static volatile Properties contextualProperties;
-
- private final Object LOCK = new Object();
-
-
- private ConfiguredSystemProperties(Properties initialProperties) {
- super(initialProperties);
- this.initialProperties = initialProperties;
- }
-
- public static void install() {
- Properties props = System.getProperties();
- if (props instanceof ConfiguredSystemProperties) {
- return;
- }
- ConfiguredSystemProperties systemProps = new ConfiguredSystemProperties(props);
- LOG.finest("Installing enhanced system properties...");
- System.setProperties(systemProps);
- LOG.info("Installed enhanced system properties successfully.");
- }
-
- public static void uninstall() {
- Properties props = System.getProperties();
- if (props instanceof ConfiguredSystemProperties) {
- Properties initialProperties = ((ConfiguredSystemProperties) props).initialProperties;
- LOG.finest("Uninstalling enhanced system properties...");
- System.setProperties(initialProperties);
- LOG.info("Uninstalled enhanced system properties successfully.");
- }
- }
-
- @Override
- public String getProperty(String key) {
- return getContextualProperties().getProperty(key);
- }
-
- @Override
- public String getProperty(String key, String defaultValue) {
- return getContextualProperties().getProperty(key, defaultValue);
- }
-
- @Override
- public Enumeration<?> propertyNames() {
- return getContextualProperties().propertyNames();
- }
-
- @Override
- public Set<String> stringPropertyNames() {
- return getContextualProperties().stringPropertyNames();
- }
-
- @Override
- public synchronized int size() {
- return getContextualProperties().size();
- }
-
- @Override
- public synchronized Enumeration<Object> keys() {
- return getContextualProperties().keys();
- }
-
- @Override
- public synchronized Enumeration<Object> elements() {
- return getContextualProperties().elements();
- }
-
- @Override
- public synchronized boolean contains(Object value) {
- return getContextualProperties().contains(value);
- }
-
- @Override
- public boolean containsValue(Object value) {
- return getContextualProperties().containsValue(value);
- }
-
- @Override
- public synchronized boolean containsKey(Object key) {
- return getContextualProperties().containsKey(key);
- }
-
- @Override
- public synchronized Object get(Object key) {
- return getContextualProperties().get(key);
- }
-
- @Override
- public synchronized Object clone() {
- return getContextualProperties().clone();
- }
-
- @Override
- public Set<Object> keySet() {
- return getContextualProperties().keySet();
- }
-
- @Override
- public Set<Map.Entry<Object, Object>> entrySet() {
- return getContextualProperties().entrySet();
- }
-
- @Override
- public Collection<Object> values() {
- return getContextualProperties().values();
- }
-
-
- @Override
- public String toString() {
- return getContextualProperties().toString();
- }
-
- @Override
- public synchronized Object setProperty(String key, String value) {
- return getContextualProperties().setProperty(key, value);
- }
-
- @Override
- public synchronized void load(Reader reader) throws IOException {
- getContextualProperties().load(reader);
- }
-
- @Override
- public synchronized void load(InputStream inStream) throws IOException {
- getContextualProperties().load(inStream);
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public void save(OutputStream out, String comments) {
- super.save(out, comments);
- }
-
- @Override
- public void store(Writer writer, String comments) throws IOException {
- getContextualProperties().store(writer, comments);
- }
-
- @Override
- public void store(OutputStream out, String comments) throws IOException {
- getContextualProperties().store(out, comments);
- }
-
- @Override
- public void loadFromXML(InputStream in) throws IOException {
- getContextualProperties().loadFromXML(in);
- }
-
- @Override
- public void storeToXML(OutputStream os, String comment) throws IOException {
- getContextualProperties().storeToXML(os, comment);
- }
-
- @Override
- public void storeToXML(OutputStream os, String comment, String encoding) throws IOException {
- getContextualProperties().storeToXML(os, comment, encoding);
- }
-
- @Override
- public void list(PrintStream out) {
- getContextualProperties().list(out);
- }
-
- @Override
- public void list(PrintWriter out) {
- getContextualProperties().list(out);
- }
-
- @Override
- public boolean isEmpty() {
- return getContextualProperties().isEmpty();
- }
-
- @Override
- public Object put(Object key, Object value) {
- return getContextualProperties().put(key, value);
- }
-
- @Override
- public Object remove(Object key) {
- return getContextualProperties().remove(key);
- }
-
- @Override
- public void putAll(Map<?, ?> t) {
- getContextualProperties().putAll(t);
- }
-
- @Override
- public void clear() {
- getContextualProperties().clear();
- }
-
- @Override
- public boolean equals(Object o) {
- return getContextualProperties().equals(o);
- }
-
- @Override
- public int hashCode() {
- return getContextualProperties().hashCode();
- }
-
-// JDK 8 and later...
-// @Override
-// public Object getOrDefault(Object key, Object defaultValue) {
-// return getContextualProperties().getOrDefault(key, defaultValue);
-// }
-//
-// @Override
-// public void forEach(BiConsumer<? super Object, ? super Object> action) {
-// getContextualProperties().forEach(action);
-// }
-//
-//
-// @Override
-// public Object computeIfAbsent(Object key, Function<? super Object, ?> mappingFunction) {
-// return getContextualProperties().computeIfAbsent(key, mappingFunction);
-// }
-//
-// @Override
-// public synchronized Object computeIfPresent(Object key, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
-// return getContextualProperties().computeIfPresent(key, remappingFunction);
-// }
-//
-// @Override
-// public synchronized Object compute(Object key, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
-// return getContextualProperties().compute(key, remappingFunction);
-// }
-// @Override
-// public void replaceAll(BiFunction<? super Object, ? super Object, ?> function) {
-// getContextualProperties().replaceAll(function);
-// }
-//
-// @Override
-// public Object putIfAbsent(Object key, Object value) {
-// return getContextualProperties().putIfAbsent(key, value);
-// }
-//
-// @Override
-// public boolean remove(Object key, Object value) {
-// return getContextualProperties().remove(key, value);
-// }
-//
-// @Override
-// public boolean replace(Object key, Object oldValue, Object newValue) {
-// return getContextualProperties().replace(key, oldValue, newValue);
-// }
-//
-// @Override
-// public Object replace(Object key, Object value) {
-// return getContextualProperties().replace(key, value);
-// }
-//
-// @Override
-// public Object merge(Object key, Object value, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
-// return getContextualProperties().merge(key, value, remappingFunction);
-// }
-
- public Properties getInitialProperties() {
- return initialProperties;
- }
-
- /**
- * Uninstalls the contextual system properties for the current context, as determined by the current
- * context provider active.
- */
- public static void resetProperties() {
- contextualProperties.clear();
- }
-
- protected Properties getContextualProperties() {
- if (contextualProperties == null) {
- synchronized (LOCK) {
- if (contextualProperties == null) {
- contextualProperties = createNewProperties();
- }
- }
- }
- return contextualProperties;
- }
-
- protected Properties createNewProperties() {
- Properties props = new Properties(initialProperties);
- Configuration config = ConfigurationProvider.getConfiguration();
- Map<String, String> configMap = config.getProperties();
- for (Map.Entry<String, String> en : configMap.entrySet()) {
- props.put(en.getKey(), en.getValue());
- }
- return props;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/configured-sysprops/src/main/java/org/apache/tamaya/sysprops/ConfiguredSystemProperties.java
----------------------------------------------------------------------
diff --git a/configured-sysprops/src/main/java/org/apache/tamaya/sysprops/ConfiguredSystemProperties.java b/configured-sysprops/src/main/java/org/apache/tamaya/sysprops/ConfiguredSystemProperties.java
new file mode 100644
index 0000000..18f0349
--- /dev/null
+++ b/configured-sysprops/src/main/java/org/apache/tamaya/sysprops/ConfiguredSystemProperties.java
@@ -0,0 +1,340 @@
+/*
+ * 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.tamaya.sysprops;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+
+/**
+ * Properties implementation class that can be applied as current System properties by calling
+ * {@link ConfiguredSystemProperties#install()}. The system properties will
+ * then behave contextually depending on the current runtime configuration active.
+ */
+public class ConfiguredSystemProperties extends Properties {
+
+ private static final long serialVersionUID = 2152870929299226804L;
+
+ private static final Logger LOG = Logger.getLogger(ConfiguredSystemProperties.class.getName());
+ private Properties initialProperties;
+ private static volatile Properties contextualProperties;
+
+ private final Object LOCK = new Object();
+
+
+ private ConfiguredSystemProperties(Properties initialProperties) {
+ super(initialProperties);
+ this.initialProperties = initialProperties;
+ }
+
+ public static void install() {
+ Properties props = System.getProperties();
+ if (props instanceof ConfiguredSystemProperties) {
+ return;
+ }
+ ConfiguredSystemProperties systemProps = new ConfiguredSystemProperties(props);
+ LOG.finest("Installing enhanced system properties...");
+ System.setProperties(systemProps);
+ LOG.info("Installed enhanced system properties successfully.");
+ }
+
+ public static void uninstall() {
+ Properties props = System.getProperties();
+ if (props instanceof ConfiguredSystemProperties) {
+ Properties initialProperties = ((ConfiguredSystemProperties) props).initialProperties;
+ LOG.finest("Uninstalling enhanced system properties...");
+ System.setProperties(initialProperties);
+ LOG.info("Uninstalled enhanced system properties successfully.");
+ }
+ }
+
+ @Override
+ public String getProperty(String key) {
+ return getContextualProperties().getProperty(key);
+ }
+
+ @Override
+ public String getProperty(String key, String defaultValue) {
+ return getContextualProperties().getProperty(key, defaultValue);
+ }
+
+ @Override
+ public Enumeration<?> propertyNames() {
+ return getContextualProperties().propertyNames();
+ }
+
+ @Override
+ public Set<String> stringPropertyNames() {
+ return getContextualProperties().stringPropertyNames();
+ }
+
+ @Override
+ public synchronized int size() {
+ return getContextualProperties().size();
+ }
+
+ @Override
+ public synchronized Enumeration<Object> keys() {
+ return getContextualProperties().keys();
+ }
+
+ @Override
+ public synchronized Enumeration<Object> elements() {
+ return getContextualProperties().elements();
+ }
+
+ @Override
+ public synchronized boolean contains(Object value) {
+ return getContextualProperties().contains(value);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return getContextualProperties().containsValue(value);
+ }
+
+ @Override
+ public synchronized boolean containsKey(Object key) {
+ return getContextualProperties().containsKey(key);
+ }
+
+ @Override
+ public synchronized Object get(Object key) {
+ return getContextualProperties().get(key);
+ }
+
+ @Override
+ public synchronized Object clone() {
+ return getContextualProperties().clone();
+ }
+
+ @Override
+ public Set<Object> keySet() {
+ return getContextualProperties().keySet();
+ }
+
+ @Override
+ public Set<Map.Entry<Object, Object>> entrySet() {
+ return getContextualProperties().entrySet();
+ }
+
+ @Override
+ public Collection<Object> values() {
+ return getContextualProperties().values();
+ }
+
+
+ @Override
+ public String toString() {
+ return getContextualProperties().toString();
+ }
+
+ @Override
+ public synchronized Object setProperty(String key, String value) {
+ return getContextualProperties().setProperty(key, value);
+ }
+
+ @Override
+ public synchronized void load(Reader reader) throws IOException {
+ getContextualProperties().load(reader);
+ }
+
+ @Override
+ public synchronized void load(InputStream inStream) throws IOException {
+ getContextualProperties().load(inStream);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void save(OutputStream out, String comments) {
+ super.save(out, comments);
+ }
+
+ @Override
+ public void store(Writer writer, String comments) throws IOException {
+ getContextualProperties().store(writer, comments);
+ }
+
+ @Override
+ public void store(OutputStream out, String comments) throws IOException {
+ getContextualProperties().store(out, comments);
+ }
+
+ @Override
+ public void loadFromXML(InputStream in) throws IOException {
+ getContextualProperties().loadFromXML(in);
+ }
+
+ @Override
+ public void storeToXML(OutputStream os, String comment) throws IOException {
+ getContextualProperties().storeToXML(os, comment);
+ }
+
+ @Override
+ public void storeToXML(OutputStream os, String comment, String encoding) throws IOException {
+ getContextualProperties().storeToXML(os, comment, encoding);
+ }
+
+ @Override
+ public void list(PrintStream out) {
+ getContextualProperties().list(out);
+ }
+
+ @Override
+ public void list(PrintWriter out) {
+ getContextualProperties().list(out);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return getContextualProperties().isEmpty();
+ }
+
+ @Override
+ public Object put(Object key, Object value) {
+ return getContextualProperties().put(key, value);
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return getContextualProperties().remove(key);
+ }
+
+ @Override
+ public void putAll(Map<?, ?> t) {
+ getContextualProperties().putAll(t);
+ }
+
+ @Override
+ public void clear() {
+ getContextualProperties().clear();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return getContextualProperties().equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return getContextualProperties().hashCode();
+ }
+
+// JDK 8 and later...
+// @Override
+// public Object getOrDefault(Object key, Object defaultValue) {
+// return getContextualProperties().getOrDefault(key, defaultValue);
+// }
+//
+// @Override
+// public void forEach(BiConsumer<? super Object, ? super Object> action) {
+// getContextualProperties().forEach(action);
+// }
+//
+//
+// @Override
+// public Object computeIfAbsent(Object key, Function<? super Object, ?> mappingFunction) {
+// return getContextualProperties().computeIfAbsent(key, mappingFunction);
+// }
+//
+// @Override
+// public synchronized Object computeIfPresent(Object key, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
+// return getContextualProperties().computeIfPresent(key, remappingFunction);
+// }
+//
+// @Override
+// public synchronized Object compute(Object key, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
+// return getContextualProperties().compute(key, remappingFunction);
+// }
+// @Override
+// public void replaceAll(BiFunction<? super Object, ? super Object, ?> function) {
+// getContextualProperties().replaceAll(function);
+// }
+//
+// @Override
+// public Object putIfAbsent(Object key, Object value) {
+// return getContextualProperties().putIfAbsent(key, value);
+// }
+//
+// @Override
+// public boolean remove(Object key, Object value) {
+// return getContextualProperties().remove(key, value);
+// }
+//
+// @Override
+// public boolean replace(Object key, Object oldValue, Object newValue) {
+// return getContextualProperties().replace(key, oldValue, newValue);
+// }
+//
+// @Override
+// public Object replace(Object key, Object value) {
+// return getContextualProperties().replace(key, value);
+// }
+//
+// @Override
+// public Object merge(Object key, Object value, BiFunction<? super Object, ? super Object, ?> remappingFunction) {
+// return getContextualProperties().merge(key, value, remappingFunction);
+// }
+
+ public Properties getInitialProperties() {
+ return initialProperties;
+ }
+
+ /**
+ * Uninstalls the contextual system properties for the current context, as determined by the current
+ * context provider active.
+ */
+ public static void resetProperties() {
+ contextualProperties.clear();
+ }
+
+ protected Properties getContextualProperties() {
+ if (contextualProperties == null) {
+ synchronized (LOCK) {
+ if (contextualProperties == null) {
+ contextualProperties = createNewProperties();
+ }
+ }
+ }
+ return contextualProperties;
+ }
+
+ protected Properties createNewProperties() {
+ Properties props = new Properties(initialProperties);
+ Configuration config = ConfigurationProvider.getConfiguration();
+ Map<String, String> configMap = config.getProperties();
+ for (Map.Entry<String, String> en : configMap.entrySet()) {
+ props.put(en.getKey(), en.getValue());
+ }
+ return props;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/consul/bnd.bnd
----------------------------------------------------------------------
diff --git a/consul/bnd.bnd b/consul/bnd.bnd
new file mode 100644
index 0000000..47b26c8
--- /dev/null
+++ b/consul/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.consul
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/etcd/bnd.bnd
----------------------------------------------------------------------
diff --git a/etcd/bnd.bnd b/etcd/bnd.bnd
new file mode 100644
index 0000000..fc51493
--- /dev/null
+++ b/etcd/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.etcd
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/hazelcast/bnd.bnd
----------------------------------------------------------------------
diff --git a/hazelcast/bnd.bnd b/hazelcast/bnd.bnd
new file mode 100644
index 0000000..1a7a3a7
--- /dev/null
+++ b/hazelcast/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.hazelcast
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/jodatime/bnd.bnd
----------------------------------------------------------------------
diff --git a/jodatime/bnd.bnd b/jodatime/bnd.bnd
new file mode 100644
index 0000000..ecd9d5d
--- /dev/null
+++ b/jodatime/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.jodatime
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/metamodel/bnd.bnd
----------------------------------------------------------------------
diff --git a/metamodel/bnd.bnd b/metamodel/bnd.bnd
new file mode 100644
index 0000000..c61ef5e
--- /dev/null
+++ b/metamodel/bnd.bnd
@@ -0,0 +1,4 @@
+Export-Package: \
+ org.apache.tamaya.metamodel,\
+ org.apache.tamaya.metamodel.dsl,\
+ org.apache.tamaya.metamodel.spi
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/bnd.bnd
----------------------------------------------------------------------
diff --git a/osgi/bnd.bnd b/osgi/bnd.bnd
new file mode 100644
index 0000000..222f607
--- /dev/null
+++ b/osgi/bnd.bnd
@@ -0,0 +1,2 @@
+Export-Package: \
+ org.apache.tamaya.osgi
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/integration/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/integration/osgi/Activator.java b/osgi/src/main/java/org/apache/tamaya/integration/osgi/Activator.java
deleted file mode 100644
index 7425dfb..0000000
--- a/osgi/src/main/java/org/apache/tamaya/integration/osgi/Activator.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.tamaya.integration.osgi;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.inject.ConfigurationInjection;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.util.tracker.ServiceTracker;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Activator that registers the Tamaya based Service Class for {@link ConfigurationAdmin},
- * using a default service priority of {@code 0}. This behaviour is configurable based on OSGI properties:
- * <ul>
- * <li><p><b>org.tamaya.integration.osgi.cm.ranking, type: int</b> allows to configure the OSGI service ranking for
- * Tamaya based ConfigurationAdmin instance. The default ranking used is 10.</p></li>
- * <li><p><b>org.tamaya.integration.osgi.cm.override, type: boolean</b> allows to configure if Tamaya should
- * register its ConfigAdmin service. Default is true.</p></li>
- * </ul>
- */
-public class Activator implements BundleActivator {
-
- private static final String SERVICE_RANKING_PROP = "org.tamaya.integration.osgi.cm.ranking";
-
- private static final String SERVICE_OVERRIDE_PROP = "org.tamaya.integration.osgi.cm.override";
-
- private static final String SERVICE_INJECT_PROP = "org.tamaya.integration.osgi.cm.inject";
-
- private static final Integer DEFAULT_RANKING = 10;
-
- private static final Logger LOG = Logger.getLogger(Activator.class.getName());
-
- private ServiceRegistration<ConfigurationAdmin> registration;
-
- private ServiceTracker<Object, Object> injectionTracker;
-
- @Override
- public void start(BundleContext context) throws Exception {
- String val = context.getProperty(SERVICE_OVERRIDE_PROP);
- if(val == null || Boolean.parseBoolean(val)){
- Dictionary<String, Object> props = new Hashtable<>();
- String ranking = context.getProperty(SERVICE_RANKING_PROP);
- if (ranking == null) {
- props.put(Constants.SERVICE_RANKING, DEFAULT_RANKING);
- } else {
- props.put(Constants.SERVICE_RANKING, Integer.valueOf(ranking));
- }
- TamayaConfigAdminImpl cm = new TamayaConfigAdminImpl(context);
- registration = context.registerService(ConfigurationAdmin.class, cm, props);
- }
-
- // register injection mechanisms, if not configured otherwise
- val = context.getProperty(SERVICE_INJECT_PROP);
- if(val == null || Boolean.parseBoolean(val)){
- injectionTracker = new ServiceTracker<Object, Object>(context, Object.class, null) {
- @Override
- public Object addingService(ServiceReference<Object> reference) {
- Object service = context.getService(reference);
- Object pidObj = reference.getProperty(Constants.SERVICE_PID);
- if (pidObj instanceof String) {
- String pid = (String) pidObj;
- ConfigurationAdmin configAdmin = null;
- ServiceReference<ConfigurationAdmin> adminRef =
- context.getServiceReference(ConfigurationAdmin.class);
- if(adminRef!=null){
- configAdmin = context.getService(adminRef);
- }
- try {
- Configuration targetConfig = null;
- if(configAdmin != null){
- org.osgi.service.cm.Configuration osgiConfig = configAdmin.getConfiguration(pid);
- if(osgiConfig!=null){
- targetConfig = new OSGIEnhancedConfiguration(osgiConfig);
- }
- }
- if(targetConfig==null){
- targetConfig = ConfigurationProvider.getConfiguration();
- }
- ConfigurationInjection.getConfigurationInjector().configure(service, targetConfig);
- } catch (Exception e) {
- LOG.log(Level.WARNING, "Error configuring Service: " + service, e);
- }
- } else {
- LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
- }
- return service;
- }
-
- @Override
- public void removedService(ServiceReference<Object> reference, Object service) {
- context.ungetService(reference);
- }
- };
- injectionTracker.open();
- }
- }
-
- @Override
- public void stop(BundleContext context) throws Exception {
- if (registration != null) {
- registration.unregister();
- }
- if(injectionTracker!=null){
- injectionTracker.close();
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIConfigRootMapper.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIConfigRootMapper.java b/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIConfigRootMapper.java
deleted file mode 100644
index 836df8b..0000000
--- a/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIConfigRootMapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.tamaya.integration.osgi;
-
-/**
- * Mapping function for mapping Tamaya configuration sections to OSGI pids.
- */
-public interface OSGIConfigRootMapper {
-
- /**
- * Map the given OSGI pid to a corresponding configuration section in Tamaya. Es an example (and this is also the
- * default implemented) a configuration mapping for {@code pid/factoryPid==myBundle} could be {@code [bundle:myBundle]}.
- * This mapping is used as a prefix when collecting the corresponding entries for the OSGI configuration.
- * @param pid the OSGI pid, or null
- * @param factoryPid the OSGI factoryPid, or null
- * @return return the corresponding config root section. For ommitting any root section simply return an empty
- * String.
- */
- String getTamayaConfigRoot(String pid, String factoryPid);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIEnhancedConfiguration.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIEnhancedConfiguration.java b/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIEnhancedConfiguration.java
deleted file mode 100644
index 5e813af..0000000
--- a/osgi/src/main/java/org/apache/tamaya/integration/osgi/OSGIEnhancedConfiguration.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.tamaya.integration.osgi;
-
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spisupport.BasePropertySource;
-import org.apache.tamaya.spisupport.DefaultConfiguration;
-import org.apache.tamaya.spisupport.DefaultConfigurationContext;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Configuration object that also reflects the values provided by the OSGI ConfigAdmin Configuration.
- * Similar to other tamaya areas adding a tamaya.ordinal into the corresponding OSGI configuration for
- * a pif/factoryPid allows to control the ordinal/priority of the OSGI configuration related to other
- * configured Tamaya Property Sources. Overall the configuration evaluation for Tamaya follows the
- * same rules, with the difference that each bunldle owns its own ConfigAdmin based part. From
- * Tamaya, the granularity depends on the implementation of the ConfigurationProviderSpi. By default
- * Tamaya configuration is managed as a global resource/config tree, wheres bundle specific sections are
- * selected only.
- */
-public class OSGIEnhancedConfiguration extends DefaultConfiguration{
- /** The default ordinal used for the OSGI config, */
- private static final int OSGI_DEFAULT_ORDINAL = 0;
-
- /**
- * Constructor.
- *
- * @param osgiConfiguration The OSGI configuration found.
- */
- public OSGIEnhancedConfiguration(org.osgi.service.cm.Configuration osgiConfiguration) {
- super(new OSGIConfigurationContext(osgiConfiguration));
- }
-
- /**
- * Class that models a Tamaya ConfigurationContext, which implicitly contains the bundle specific
- * Configuration wrapped into a Tamaya PropertySource.
- */
- private static final class OSGIConfigurationContext extends DefaultConfigurationContext{
- private OSGIPropertySource osgiPropertySource;
-
- public OSGIConfigurationContext(org.osgi.service.cm.Configuration osgiConfiguration){
- if(osgiConfiguration!=null) {
- this.osgiPropertySource = new OSGIPropertySource(osgiConfiguration);
- }
- }
-
- @Override
- public List<PropertySource> getPropertySources() {
- List<PropertySource> sources = super.getPropertySources();
- if(osgiPropertySource!=null){
- sources.add(osgiPropertySource);
- }
- return sources;
- }
- }
-
- /**
- * Tamaya PropertySource providing the values from an OSGI Configuration.
- */
- private static final class OSGIPropertySource extends BasePropertySource{
-
- private final org.osgi.service.cm.Configuration osgiConfiguration;
-
- public OSGIPropertySource(org.osgi.service.cm.Configuration osgiConfiguration){
- this.osgiConfiguration = Objects.requireNonNull(osgiConfiguration);
- }
-
- @Override
- public int getDefaultOrdinal() {
- String val = System.getProperty("osgi.defaultOrdinal");
- if(val!=null){
- return Integer.parseInt(val.trim());
- }
- return OSGI_DEFAULT_ORDINAL;
- }
-
- @Override
- public String getName() {
- return "OSGIConfig:pid="+
- (osgiConfiguration.getPid()!=null?osgiConfiguration.getPid():osgiConfiguration.getFactoryPid());
- }
-
- @Override
- public Map<String, String> getProperties() {
- Map<String, String> map = new HashMap<>();
- Dictionary<String,Object> dict = osgiConfiguration.getProperties();
- Enumeration<String> keys = dict.keys();
- while(keys.hasMoreElements()){
- String key = keys.nextElement();
- map.put(key,String.valueOf(dict.get(key)));
- }
- return map;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigAdminImpl.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigAdminImpl.java b/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigAdminImpl.java
deleted file mode 100644
index 7bf4da7..0000000
--- a/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigAdminImpl.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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.tamaya.integration.osgi;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.cm.ManagedService;
-import org.osgi.service.cm.ManagedServiceFactory;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * Tamaya based implementation of an OSGI {@link ConfigurationAdmin}.
- */
-public class TamayaConfigAdminImpl implements ConfigurationAdmin {
- /** the logger. */
- private static final Logger LOG = Logger.getLogger(TamayaConfigAdminImpl.class.getName());
-
- /** The OSGI context. */
- private final BundleContext context;
- /** THe optional OSGI parent service. */
- private ConfigurationAdmin parent;
- /** The cached configurations. */
- private Map<String,Configuration> configs = new ConcurrentHashMap<>();
- /** The configuration section mapper. */
- private OSGIConfigRootMapper configRootMapper;
-
- /**
- * Create a new config.
- * @param context the OSGI context
- */
- TamayaConfigAdminImpl(BundleContext context) {
- this.context = context;
- this.configRootMapper = loadConfigRootMapper();
- ServiceReference<ConfigurationAdmin> ref = context.getServiceReference(ConfigurationAdmin.class);
- this.parent = ref!=null?context.getService(ref):null;
- ServiceTracker<ManagedService, ManagedService> serviceTracker = new ServiceTracker<ManagedService,
- ManagedService>(context, ManagedService.class, null) {
- @Override
- public ManagedService addingService(ServiceReference<ManagedService> reference) {
- ManagedService service = context.getService(reference);
- Object pidObj = reference.getProperty(Constants.SERVICE_PID);
- if (pidObj instanceof String) {
- String pid = (String) pidObj;
- try {
- Configuration config = getConfiguration(pid);
- if(config==null){
- service.updated(null);
- } else{
- service.updated(config.getProperties());
- }
- } catch (Exception e) {
- LOG.log(Level.WARNING, "Error configuring ManagedService: " + service, e);
- }
- } else {
- LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
- }
- return service;
- }
-
- @Override
- public void removedService(ServiceReference<ManagedService> reference, ManagedService service) {
- context.ungetService(reference);
- }
- };
- serviceTracker.open();
-
- ServiceTracker<ServiceFactory, ServiceFactory> factoryTracker
- = new ServiceTracker<ServiceFactory, ServiceFactory>(context, ServiceFactory.class, null) {
- @Override
- public ServiceFactory addingService(ServiceReference<ServiceFactory> reference) {
- ServiceFactory factory = context.getService(reference);
- if(factory instanceof ManagedServiceFactory) {
- Object pidObj = reference.getProperty(Constants.SERVICE_PID);
- if (pidObj instanceof String) {
- String pid = (String) pidObj;
- try {
- Configuration config = getConfiguration(pid);
- if (config != null) {
- ((ManagedServiceFactory) factory).updated(config.getFactoryPid(), config.getProperties());
- }
- } catch (Exception e) {
- LOG.log(Level.WARNING, "Error configuring ManagedServiceFactory: " + factory, e);
- }
- } else {
- LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
- }
- }
- return factory;
- }
-
- @Override
- public void removedService(ServiceReference<ServiceFactory> reference, ServiceFactory service) {
- super.removedService(reference, service);
- }
- };
- factoryTracker.open();
- }
-
- @Override
- public Configuration createFactoryConfiguration(String factoryPid) throws IOException {
- return createFactoryConfiguration(factoryPid, null);
- }
-
- @Override
- public Configuration createFactoryConfiguration(String factoryPid, String location) throws IOException {
- return new TamayaConfigurationImpl(factoryPid, null, configRootMapper, this.parent);
- }
-
- @Override
- public Configuration getConfiguration(String pid, String location) throws IOException {
- return getConfiguration(pid);
- }
-
- @Override
- public Configuration getConfiguration(String pid) throws IOException {
- return new TamayaConfigurationImpl(pid, null, configRootMapper, this.parent);
- }
-
- @Override
- public Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException {
- Collection<Configuration> result;
- if (filter == null) {
- result = this.configs.values();
- } else {
- result = new ArrayList<>();
- Filter flt = context.createFilter(filter);
- for (Configuration config : this.configs.values()) {
- if (flt.match(config.getProperties())) {
- result.add(config);
- }
- }
- }
- return result.isEmpty() ? null : result.toArray(new Configuration[configs.size()]);
- }
-
- /**
- * Loads the configuration toor mapper using the OSGIConfigRootMapper OSGI service resolving mechanism. If no
- * such service is available it loads the default mapper.
- * @return the mapper to be used, bever null.
- */
- private OSGIConfigRootMapper loadConfigRootMapper() {
- OSGIConfigRootMapper mapper = null;
- ServiceReference<OSGIConfigRootMapper> ref = context.getServiceReference(OSGIConfigRootMapper.class);
- if(ref!=null){
- mapper = context.getService(ref);
- }
- if(mapper==null){
- mapper = new OSGIConfigRootMapper() {
- @Override
- public String getTamayaConfigRoot(String pid, String factoryPid) {
- if(pid!=null) {
- return "[bundle:" + pid +']';
- } else{
- return "[bundle:" + factoryPid +']';
- }
- }
- @Override
- public String toString(){
- return "Default OSGIConfigRootMapper(pid -> [bundle:pid], factoryPid -> [bundle:factoryPid]";
- }
- };
- }
- return mapper;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigurationImpl.java b/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigurationImpl.java
deleted file mode 100644
index c7b0864..0000000
--- a/osgi/src/main/java/org/apache/tamaya/integration/osgi/TamayaConfigurationImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.tamaya.integration.osgi;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.functions.PropertyMatcher;
-import org.apache.tamaya.functions.ConfigurationFunctions;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-
-/**
- * Tamaya based implementation of an OSGI {@link Configuration}.
- */
-public class TamayaConfigurationImpl implements Configuration {
- private static final Logger LOG = Logger.getLogger(TamayaConfigurationImpl.class.getName());
- private final String pid;
- private final String factoryPid;
- private Map<String, String> properties = new HashMap<>();
- private org.apache.tamaya.Configuration config;
-
- /**
- * Constructor.
- * @param confPid the OSGI pid
- * @param factoryPid the factory pid
- * @param configRootMapper the mapper that maps the pids to a tamaya root section.
- * @param parent the (optional delegating parent, used as default).
- */
- TamayaConfigurationImpl(String confPid, String factoryPid, OSGIConfigRootMapper configRootMapper,
- ConfigurationAdmin parent) {
- this.pid = confPid;
- this.factoryPid = factoryPid;
- if(parent!=null){
- try {
- Dictionary<String, Object> conf = parent.getConfiguration(confPid, factoryPid).getProperties();
- if(conf!=null) {
- LOG.info("Configuration: Adding default parameters from parent: " + parent.getClass().getName());
- Enumeration<String> keys = conf.keys();
- while (keys.hasMoreElements()) {
- String key = keys.nextElement();
- this.properties.put(key, conf.get(key).toString());
- }
- }
- } catch (IOException e) {
- LOG.log(Level.WARNING, "Error reading parent OSGI config.", e);
- }
- }
- this.config = ConfigurationProvider.getConfiguration();
- final String rootKey = configRootMapper.getTamayaConfigRoot(pid, factoryPid);
- LOG.info("Configuration: Evaluating Tamaya configuration for '" + rootKey + "'.");
- this.properties.putAll(
- config.with(ConfigurationFunctions.section(rootKey, true)).getProperties());
- }
-
- @Override
- public String getPid() {
- return pid;
- }
-
- @Override
- public Dictionary<String, Object> getProperties() {
- return new Hashtable<String, Object>(properties);
- }
-
- @Override
- public void update(Dictionary<String, ?> properties) throws IOException {
- throw new UnsupportedOperationException("Nuatability not yet supported.");
- // ConfigChangeProvider.createChangeRequest(this.config)
- }
-
- @Override
- public void delete() throws IOException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getFactoryPid() {
- return factoryPid;
- }
-
- @Override
- public void update() throws IOException {
- this.config = ConfigurationProvider.getConfiguration();
- this.properties = config.with(ConfigurationFunctions.filter(new PropertyMatcher() {
- @Override
- public boolean test(String key, String value) {
-// TODO define name space / SPI
- return false;
- }
- })).getProperties();
- }
-
- @Override
- public void setBundleLocation(String location) {
- }
-
- @Override
- public String getBundleLocation() {
- return null;
- }
-
- @Override
- public long getChangeCount() {
- return 0;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/osgi/Activator.java b/osgi/src/main/java/org/apache/tamaya/osgi/Activator.java
new file mode 100644
index 0000000..91dfda4
--- /dev/null
+++ b/osgi/src/main/java/org/apache/tamaya/osgi/Activator.java
@@ -0,0 +1,134 @@
+/*
+ * 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.tamaya.integration.osgi;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.inject.ConfigurationInjection;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Activator that registers the Tamaya based Service Class for {@link ConfigurationAdmin},
+ * using a default service priority of {@code 0}. This behaviour is configurable based on OSGI properties:
+ * <ul>
+ * <li><p><b>org.tamaya.integration.osgi.cm.ranking, type: int</b> allows to configure the OSGI service ranking for
+ * Tamaya based ConfigurationAdmin instance. The default ranking used is 10.</p></li>
+ * <li><p><b>org.tamaya.integration.osgi.cm.override, type: boolean</b> allows to configure if Tamaya should
+ * register its ConfigAdmin service. Default is true.</p></li>
+ * </ul>
+ */
+public class Activator implements BundleActivator {
+
+ private static final String SERVICE_RANKING_PROP = "org.tamaya.integration.osgi.cm.ranking";
+
+ private static final String SERVICE_OVERRIDE_PROP = "org.tamaya.integration.osgi.cm.override";
+
+ private static final String SERVICE_INJECT_PROP = "org.tamaya.integration.osgi.cm.inject";
+
+ private static final Integer DEFAULT_RANKING = 10;
+
+ private static final Logger LOG = Logger.getLogger(Activator.class.getName());
+
+ private ServiceRegistration<ConfigurationAdmin> registration;
+
+ private ServiceTracker<Object, Object> injectionTracker;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ String val = context.getProperty(SERVICE_OVERRIDE_PROP);
+ if(val == null || Boolean.parseBoolean(val)){
+ Dictionary<String, Object> props = new Hashtable<>();
+ String ranking = context.getProperty(SERVICE_RANKING_PROP);
+ if (ranking == null) {
+ props.put(Constants.SERVICE_RANKING, DEFAULT_RANKING);
+ } else {
+ props.put(Constants.SERVICE_RANKING, Integer.valueOf(ranking));
+ }
+ TamayaConfigAdminImpl cm = new TamayaConfigAdminImpl(context);
+ registration = context.registerService(ConfigurationAdmin.class, cm, props);
+ }
+
+ // register injection mechanisms, if not configured otherwise
+// val = context.getProperty(SERVICE_INJECT_PROP);
+// if(val == null || Boolean.parseBoolean(val)){
+// injectionTracker = new ServiceTracker<Object, Object>(context, Object.class, null) {
+// @Override
+// public Object addingService(ServiceReference<Object> reference) {
+// Object service = context.getService(reference);
+// Object pidObj = reference.getProperty(Constants.SERVICE_PID);
+// if (pidObj instanceof String) {
+// String pid = (String) pidObj;
+// ConfigurationAdmin configAdmin = null;
+// ServiceReference<ConfigurationAdmin> adminRef =
+// context.getServiceReference(ConfigurationAdmin.class);
+// if(adminRef!=null){
+// configAdmin = context.getService(adminRef);
+// }
+// try {
+// Configuration targetConfig = null;
+// if(configAdmin != null){
+// org.osgi.service.cm.Configuration osgiConfig = configAdmin.getConfiguration(pid);
+// if(osgiConfig!=null){
+// targetConfig = new OSGIEnhancedConfiguration(osgiConfig);
+// }
+// }
+// if(targetConfig==null){
+// targetConfig = ConfigurationProvider.getConfiguration();
+// }
+// ConfigurationInjection.getConfigurationInjector().configure(service, targetConfig);
+// } catch (Exception e) {
+// LOG.log(Level.WARNING, "Error configuring Service: " + service, e);
+// }
+// } else {
+// LOG.log(Level.SEVERE, "Unsupported pid: " + pidObj);
+// }
+// return service;
+// }
+//
+// @Override
+// public void removedService(ServiceReference<Object> reference, Object service) {
+// context.ungetService(reference);
+// }
+// };
+// injectionTracker.open();
+// }
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (registration != null) {
+ registration.unregister();
+ }
+ if(injectionTracker!=null){
+ injectionTracker.close();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/osgi/OSGIConfigRootMapper.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/osgi/OSGIConfigRootMapper.java b/osgi/src/main/java/org/apache/tamaya/osgi/OSGIConfigRootMapper.java
new file mode 100644
index 0000000..836df8b
--- /dev/null
+++ b/osgi/src/main/java/org/apache/tamaya/osgi/OSGIConfigRootMapper.java
@@ -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.tamaya.integration.osgi;
+
+/**
+ * Mapping function for mapping Tamaya configuration sections to OSGI pids.
+ */
+public interface OSGIConfigRootMapper {
+
+ /**
+ * Map the given OSGI pid to a corresponding configuration section in Tamaya. Es an example (and this is also the
+ * default implemented) a configuration mapping for {@code pid/factoryPid==myBundle} could be {@code [bundle:myBundle]}.
+ * This mapping is used as a prefix when collecting the corresponding entries for the OSGI configuration.
+ * @param pid the OSGI pid, or null
+ * @param factoryPid the OSGI factoryPid, or null
+ * @return return the corresponding config root section. For ommitting any root section simply return an empty
+ * String.
+ */
+ String getTamayaConfigRoot(String pid, String factoryPid);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2949a137/osgi/src/main/java/org/apache/tamaya/osgi/OSGIEnhancedConfiguration.java
----------------------------------------------------------------------
diff --git a/osgi/src/main/java/org/apache/tamaya/osgi/OSGIEnhancedConfiguration.java b/osgi/src/main/java/org/apache/tamaya/osgi/OSGIEnhancedConfiguration.java
new file mode 100644
index 0000000..5e813af
--- /dev/null
+++ b/osgi/src/main/java/org/apache/tamaya/osgi/OSGIEnhancedConfiguration.java
@@ -0,0 +1,117 @@
+/*
+ * 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.tamaya.integration.osgi;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.BasePropertySource;
+import org.apache.tamaya.spisupport.DefaultConfiguration;
+import org.apache.tamaya.spisupport.DefaultConfigurationContext;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Configuration object that also reflects the values provided by the OSGI ConfigAdmin Configuration.
+ * Similar to other tamaya areas adding a tamaya.ordinal into the corresponding OSGI configuration for
+ * a pif/factoryPid allows to control the ordinal/priority of the OSGI configuration related to other
+ * configured Tamaya Property Sources. Overall the configuration evaluation for Tamaya follows the
+ * same rules, with the difference that each bunldle owns its own ConfigAdmin based part. From
+ * Tamaya, the granularity depends on the implementation of the ConfigurationProviderSpi. By default
+ * Tamaya configuration is managed as a global resource/config tree, wheres bundle specific sections are
+ * selected only.
+ */
+public class OSGIEnhancedConfiguration extends DefaultConfiguration{
+ /** The default ordinal used for the OSGI config, */
+ private static final int OSGI_DEFAULT_ORDINAL = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param osgiConfiguration The OSGI configuration found.
+ */
+ public OSGIEnhancedConfiguration(org.osgi.service.cm.Configuration osgiConfiguration) {
+ super(new OSGIConfigurationContext(osgiConfiguration));
+ }
+
+ /**
+ * Class that models a Tamaya ConfigurationContext, which implicitly contains the bundle specific
+ * Configuration wrapped into a Tamaya PropertySource.
+ */
+ private static final class OSGIConfigurationContext extends DefaultConfigurationContext{
+ private OSGIPropertySource osgiPropertySource;
+
+ public OSGIConfigurationContext(org.osgi.service.cm.Configuration osgiConfiguration){
+ if(osgiConfiguration!=null) {
+ this.osgiPropertySource = new OSGIPropertySource(osgiConfiguration);
+ }
+ }
+
+ @Override
+ public List<PropertySource> getPropertySources() {
+ List<PropertySource> sources = super.getPropertySources();
+ if(osgiPropertySource!=null){
+ sources.add(osgiPropertySource);
+ }
+ return sources;
+ }
+ }
+
+ /**
+ * Tamaya PropertySource providing the values from an OSGI Configuration.
+ */
+ private static final class OSGIPropertySource extends BasePropertySource{
+
+ private final org.osgi.service.cm.Configuration osgiConfiguration;
+
+ public OSGIPropertySource(org.osgi.service.cm.Configuration osgiConfiguration){
+ this.osgiConfiguration = Objects.requireNonNull(osgiConfiguration);
+ }
+
+ @Override
+ public int getDefaultOrdinal() {
+ String val = System.getProperty("osgi.defaultOrdinal");
+ if(val!=null){
+ return Integer.parseInt(val.trim());
+ }
+ return OSGI_DEFAULT_ORDINAL;
+ }
+
+ @Override
+ public String getName() {
+ return "OSGIConfig:pid="+
+ (osgiConfiguration.getPid()!=null?osgiConfiguration.getPid():osgiConfiguration.getFactoryPid());
+ }
+
+ @Override
+ public Map<String, String> getProperties() {
+ Map<String, String> map = new HashMap<>();
+ Dictionary<String,Object> dict = osgiConfiguration.getProperties();
+ Enumeration<String> keys = dict.keys();
+ while(keys.hasMoreElements()){
+ String key = keys.nextElement();
+ map.put(key,String.valueOf(dict.get(key)));
+ }
+ return map;
+ }
+ }
+}