You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by pl...@apache.org on 2016/09/06 17:18:10 UTC
[14/50] [abbrv] incubator-tamaya-sandbox git commit: Moved mutable
config module to sandbox.
Moved mutable config module to sandbox.
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/a4799717
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/a4799717
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/a4799717
Branch: refs/heads/master
Commit: a4799717e6146dc0022dbae61c0bc05977a80f4f
Parents: 90f544d
Author: Anatole Tresch <an...@apache.org>
Authored: Wed Oct 28 02:12:13 2015 +0100
Committer: Anatole Tresch <an...@apache.org>
Committed: Wed Oct 28 02:12:13 2015 +0100
----------------------------------------------------------------------
mutable-config/pom.xml | 81 +++++++++++
.../tamaya/mutableconfig/ChangeSummary.java | 105 ++++++++++++++
.../mutableconfig/ConfigChangeProvider.java | 50 +++++++
.../mutableconfig/ConfigChangeRequest.java | 136 +++++++++++++++++++
.../spi/ConfigurationChangeProviderSpi.java | 37 +++++
pom.xml | 1 +
6 files changed, 410 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/mutable-config/pom.xml
----------------------------------------------------------------------
diff --git a/mutable-config/pom.xml b/mutable-config/pom.xml
new file mode 100644
index 0000000..c20a60a
--- /dev/null
+++ b/mutable-config/pom.xml
@@ -0,0 +1,81 @@
+<!--
+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 current the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-extensions</artifactId>
+ <version>0.2-incubating-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+
+ <artifactId>tamaya-mutable-config</artifactId>
+ <name>Apache Tamaya Mutable Configuration Support</name>
+ <description>This module provides abstraction, if your scenario needs to actively change configuration entries
+ and write changes back to some property sources, files etc.</description>
+ <packaging>bundle</packaging>
+
+ <properties>
+ <jdkVersion>1.7</jdkVersion>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tamaya</groupId>
+ <artifactId>tamaya-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-events</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tamaya</groupId>
+ <artifactId>tamaya-core</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package>
+ org.apache.tamaya.mutableconfig
+ </Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ChangeSummary.java
----------------------------------------------------------------------
diff --git a/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ChangeSummary.java b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ChangeSummary.java
new file mode 100644
index 0000000..63d084c
--- /dev/null
+++ b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ChangeSummary.java
@@ -0,0 +1,105 @@
+/*
+ * 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.mutableconfig;
+
+import org.apache.tamaya.events.delta.ConfigurationChange;
+import org.apache.tamaya.events.delta.PropertySourceChange;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * Summaray class of a configuration change operation.
+ * This class is immutable, read-only and thread-safe.
+ */
+public final class ChangeSummary implements Serializable{
+
+ private static final long serialVersionUID = 1L;
+
+ private String changeId;
+ private ConfigurationChange configChange;
+ private List<PropertySourceChange> sourceChanges = new ArrayList<>();
+ private long commitTS;
+
+ private ChangeSummary(Builder builder){
+ this.changeId = builder.changeId;
+ this.commitTS = builder.commitTS;
+ this.configChange = Objects.requireNonNull(builder.configChange);
+ this.sourceChanges.addAll(builder.sourceChanges);
+ }
+
+ public String getChangeId(){
+ return changeId;
+ }
+
+ public long getTimestampMillis(){
+ return commitTS;
+ }
+
+ public ConfigurationChange getConfigurationChange(){
+ return configChange;
+ }
+
+ public Collection<PropertySourceChange> getPropertySourceChanges(){
+ return Collections.unmodifiableList(this.sourceChanges);
+ }
+
+
+
+
+
+ public static final class Builder {
+
+ private String changeId;
+ private ConfigurationChange configChange;
+ private List<PropertySourceChange> sourceChanges = new ArrayList<>();
+ private long commitTS = System.currentTimeMillis();
+
+ public Builder(){
+ this(UUID.randomUUID().toString());
+ }
+
+ public Builder(String changeId){
+ this.changeId = Objects.requireNonNull(changeId);
+ }
+
+ public Builder setConfigChange(ConfigurationChange configChange){
+ this.configChange = configChange;
+ return this;
+ }
+
+ public Builder addPropertySourceChange(PropertySourceChange propertyChange){
+ this.sourceChanges.add(propertyChange);
+ return this;
+ }
+
+ public Builder setTimestamp(long timestamp){
+ this.commitTS = timestamp;
+ return this;
+ }
+
+ public ChangeSummary build(){
+ return new ChangeSummary(this);
+ }
+
+
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeProvider.java
----------------------------------------------------------------------
diff --git a/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeProvider.java b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeProvider.java
new file mode 100644
index 0000000..f8842ea
--- /dev/null
+++ b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeProvider.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.mutableconfig;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.mutableconfig.spi.ConfigurationChangeProviderSpi;
+import org.apache.tamaya.spi.ServiceContextManager;
+
+/**
+ * Accessor for creating {@link ConfigChangeRequest} instances to change and commite configuration.
+ */
+public final class ConfigChangeProvider {
+
+ /**
+ * Creates a new change request for the given Configuration.
+ * @param config the configuration.
+ * @return a new ChangeRequest
+ * @throws UnsupportedOperationException if no change providers are registered.
+ */
+ public static ConfigChangeRequest createChangeRequest(Configuration config){
+ return ServiceContextManager.getServiceContext().getService(ConfigurationChangeProviderSpi.class)
+ .createChangeRequest(config);
+ }
+
+ /**
+ * Creates a new change request for the current Configuration.
+ * @return a new ChangeRequest
+ */
+ public static ConfigChangeRequest createChangeRequest(){
+ return createChangeRequest(ConfigurationProvider.getConfiguration());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeRequest.java
----------------------------------------------------------------------
diff --git a/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeRequest.java b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeRequest.java
new file mode 100644
index 0000000..6d393cf
--- /dev/null
+++ b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/ConfigChangeRequest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.mutableconfig;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+
+import java.util.Collection;
+import java.util.Map;
+
+
+/**
+ * This interface extends the Configuration interface hereby adding methods to change configuration entries.
+ * Hereby not all configuration entries are necessarily mutable, since some entries may be read from non
+ * mutable areas of configuration. Of course, it is always possible to add a mutable shadow layer on top of all
+ * configuration to enable whatever changes applied. The exact management and storage persistence algorithm should be
+ * transparent.<br/>
+ * As a consequence clients should first check, using the corresponding methods, if entries are to edited or removed
+ * actually are eligible for change/creation or removal.
+ */
+public interface ConfigChangeRequest{
+
+ /**
+ * Returns the configuration onto which the change should be applied.
+ * @return the corresponding configuration, not null.
+ */
+ Configuration getConfiguration();
+
+ /**
+ * Checks if a configuration key is writable (or it can be added).
+ *
+ * @param keyExpression the key to be cheched for write access (including creation), not null. Here this could also
+ * be a regulat expression, such "as a.b.c.*".
+ */
+ boolean isWritable(String keyExpression);
+
+ /**
+ * Checks if a configuration key is removable. This also implies that it is writable, but there might be writable
+ * keys that cannot be removed.
+ *
+ * @param keyExpression the keyExpression the key to be cheched for write access (including creation), not null. Here this could also
+ * be a regulat expression, such "as a.b.c.*".
+ */
+ boolean isRemovable(String keyExpression);
+
+ /**
+ * Sets a property.
+ *
+ * @param key the property's key, not null.
+ * @param value the property's value, not null.
+ * @return the former property value, or null.
+ * @throws ConfigException if the key/value cannot be added.
+ */
+ String put(String key, String value);
+
+ /**
+ * Puts all given configuration entries. This method should check that all given properties are
+ * basically removable, as defined by #isWritable. If any of the passed keys is not writable during this initial
+ * check, the operation should not perform any configuration changes and throw a {@link ConfigException}. If errors
+ * occur afterwards, when the properties are effectively written back to the backends, the errors should be
+ * collected and returned as part of the ConfigException payload. Nevertheless the operation should in that case
+ * remove all entries as far as possible and abort the writing operation.
+ *
+ * @param properties the properties tobe written, not null.
+ * @throws ConfigException if any of the given properties could not be written.
+ */
+ void putAll(Map<String, String> properties);
+
+ /**
+ * Removes a configuration entry.
+ *
+ * @param key the property's key, not null.
+ * @throws ConfigException if the given cannot be removed.
+ * @return the property's keys.
+ */
+ void remove(String key);
+
+ /**
+ * Removes all given configuration entries. This method should check that all given properties are
+ * basically removable, as defined by #isRemovable. If any of the passed keys is not removable during this initial
+ * check, the operation should not perform any configuration changes and throw a {@link ConfigException}. If errors
+ * occur afterwards, when the properties are effectively written back to the backends, the errors should be
+ * collected and returned as part of the ConfigException payload. Nevertheless the operation should in that case
+ * remove all entries as far as possible and abort the writing operation.
+ *
+ * @param keys the property's keys to be removed, not null.
+ * @throws ConfigException if any of the given keys could not be removed.
+ */
+ void removeAll(Collection<String> keys);
+
+ /**
+ * Resets all changes, leaving the request still open for further operations.
+ */
+ void reset();
+
+ /**
+ * Closes the request, sby default any uncommitted changes are committed.
+ */
+ void commit();
+
+ /**
+ * Closes the request,
+ * @param saveChanges flag to control if any uncommitted changes ahould be written (default: yes).
+ */
+ void commit(boolean saveChanges);
+
+ /**
+ * Operation to check, if the current request is closed. Closed requests are read-only and can not be used
+ * for preparing/submitting any configuration changes.
+ * @return true, if this instance is closed.
+ */
+ boolean isCommitted();
+
+ /**
+ * Access the summary of the changes applied
+ * @return
+ */
+ ChangeSummary getChangeSummary();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/spi/ConfigurationChangeProviderSpi.java
----------------------------------------------------------------------
diff --git a/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/spi/ConfigurationChangeProviderSpi.java b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/spi/ConfigurationChangeProviderSpi.java
new file mode 100644
index 0000000..e378c0d
--- /dev/null
+++ b/mutable-config/src/main/java/org/apache/tamaya/mutableconfig/spi/ConfigurationChangeProviderSpi.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.mutableconfig.spi;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.mutableconfig.ConfigChangeRequest;
+
+/**
+ * Provider SPI for the {@link org.apache.tamaya.mutableconfig.ConfigChangeProvider}.
+ */
+public interface ConfigurationChangeProviderSpi {
+
+ /**
+ * Creates a new change request for the given Configuration.
+ * @param config the configuration.
+ * @return a new ChangeRequest
+ * @throws UnsupportedOperationException if no change providers are registered.
+ */
+ ConfigChangeRequest createChangeRequest(Configuration config);
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/a4799717/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 4f8c9c8..8168c47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@ under the License.
<module>sysprops</module>
<module>environment</module>
<module>collections</module>
+ <module>mutable-config</module>
<module>ui</module>
</modules>