This is an automated email from the ASF dual-hosted git repository.
kturner pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fluo.git
The following commit(s) were added to refs/heads/master by this push:
new 57b154e Updated commons config from ver 1 to 2 (#1077)
57b154e is described below
commit 57b154e13c5c0877bb565fcabf620aa0f30c9f24
Author: Keith Turner <[email protected]>
AuthorDate: Wed Aug 14 16:34:17 2019 -0400
Updated commons config from ver 1 to 2 (#1077)
---
modules/api/pom.xml | 4 +-
.../fluo/api/config/SimpleConfiguration.java | 82 +++++++++++++++-------
.../fluo/api/config/FluoConfigurationTest.java | 4 +-
modules/api/src/test/resources/fluo-app.properties | 2 +-
modules/api/src/test/resources/fluo.properties | 6 +-
.../src/main/config/fluo-app.properties | 2 +-
.../src/main/config/fluo.properties.deprecated | 8 +--
modules/distribution/src/main/lib/fetch.sh | 3 +-
pom.xml | 10 +--
9 files changed, 77 insertions(+), 44 deletions(-)
diff --git a/modules/api/pom.xml b/modules/api/pom.xml
index 7052929..2e1ad5d 100644
--- a/modules/api/pom.xml
+++ b/modules/api/pom.xml
@@ -33,8 +33,8 @@
<artifactId>guava</artifactId>
</dependency>
<dependency>
- <groupId>commons-configuration</groupId>
- <artifactId>commons-configuration</artifactId>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-configuration2</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
diff --git
a/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
b/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
index afe8c6f..b48dd83 100644
---
a/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
+++
b/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
@@ -23,7 +23,13 @@ import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
import java.io.Serializable;
+import java.io.StringReader;
+import java.io.UncheckedIOException;
+import java.io.Writer;
+import java.nio.file.Files;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
@@ -31,13 +37,15 @@ import java.util.Objects;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
-import org.apache.commons.configuration.CompositeConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.ConfigurationUtils;
-import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.configuration2.CompositeConfiguration;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ConfigurationUtils;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.fluo.api.exceptions.FluoException;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
/**
* A simple configuration wrapper for Apache Commons configuration. The
implementation supports
* reading and writing properties style config and interpolation.
@@ -57,7 +65,6 @@ public class SimpleConfiguration implements Serializable {
private void init() {
CompositeConfiguration compositeConfig = new CompositeConfiguration();
compositeConfig.setThrowExceptionOnMissing(true);
- compositeConfig.setDelimiterParsingDisabled(true);
internalConfig = compositeConfig;
}
@@ -176,9 +183,7 @@ public class SimpleConfiguration implements Serializable {
public void load(InputStream in) {
try {
PropertiesConfiguration config = new PropertiesConfiguration();
- // disabled to prevent accumulo classpath value from being shortened
- config.setDelimiterParsingDisabled(true);
- config.load(in);
+ config.getLayout().load(config, checkProps(in));
((CompositeConfiguration) internalConfig).addConfiguration(config);
} catch (ConfigurationException e) {
throw new IllegalArgumentException(e);
@@ -192,34 +197,30 @@ public class SimpleConfiguration implements Serializable {
* @since 1.2.0
*/
public void load(File file) {
- try {
+ try (InputStream in = Files.newInputStream(file.toPath())) {
PropertiesConfiguration config = new PropertiesConfiguration();
- // disabled to prevent accumulo classpath value from being shortened
- config.setDelimiterParsingDisabled(true);
- config.load(file);
+ config.getLayout().load(config, checkProps(in));
((CompositeConfiguration) internalConfig).addConfiguration(config);
- } catch (ConfigurationException e) {
+ } catch (ConfigurationException | IOException e) {
throw new IllegalArgumentException(e);
}
}
public void save(File file) {
- PropertiesConfiguration pconf = new PropertiesConfiguration();
- pconf.setDelimiterParsingDisabled(true);
- pconf.append(internalConfig);
- try {
- pconf.save(file);
- } catch (ConfigurationException e) {
+ try (Writer writer = Files.newBufferedWriter(file.toPath())) {
+ PropertiesConfiguration pconf = new PropertiesConfiguration();
+ pconf.append(internalConfig);
+ pconf.getLayout().save(pconf, writer);
+ } catch (ConfigurationException | IOException e) {
throw new FluoException(e);
}
}
public void save(OutputStream out) {
- PropertiesConfiguration pconf = new PropertiesConfiguration();
- pconf.setDelimiterParsingDisabled(true);
- pconf.append(internalConfig);
try {
- pconf.save(out);
+ PropertiesConfiguration pconf = new PropertiesConfiguration();
+ pconf.append(internalConfig);
+ pconf.getLayout().save(pconf, new OutputStreamWriter(out, UTF_8));
} catch (ConfigurationException e) {
throw new FluoException(e);
}
@@ -335,4 +336,37 @@ public class SimpleConfiguration implements Serializable {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
load(bais);
}
+
+ private String stream2String(InputStream in) {
+ try {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ byte[] buffer = new byte[4096];
+ int length;
+ while ((length = in.read(buffer)) != -1) {
+ result.write(buffer, 0, length);
+ }
+
+ return result.toString(UTF_8.name());
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ /*
+ * Commons config 1 was used previously to implement this class. Commons
config 1 required
+ * escaping interpolation. This escaping is no longer required with commmons
config 2. If
+ * interpolation is escaped, then this API behaves differently. This
function suppresses escaped
+ * interpolation in order to maintain behavior for reading.
+ */
+ private Reader checkProps(InputStream in) {
+ String propsData = stream2String(in);
+ if (propsData.contains("\\${")) {
+ throw new IllegalArgumentException(
+ "A Fluo properties value contains \\${. In the past Fluo used
Apache Commons Config 1 and this was required for "
+ + "interpolation. Fluo now uses Commons Config 2 and this is no
longer required. Please remove the slash "
+ + "preceding the interpolation.");
+ }
+
+ return new StringReader(propsData);
+ }
}
diff --git
a/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
b/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
index 3193f7f..c983bcc 100644
---
a/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
+++
b/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
@@ -201,8 +201,8 @@ public class FluoConfigurationTest {
} catch (IllegalArgumentException e) {
}
try {
- config.getAccumuloTable();
- Assert.fail();
+ String act = config.getAccumuloTable();
+ Assert.fail("Saw " + act);
} catch (IllegalArgumentException e) {
}
try {
diff --git a/modules/api/src/test/resources/fluo-app.properties
b/modules/api/src/test/resources/fluo-app.properties
index cd0b30f..7c2da3e 100644
--- a/modules/api/src/test/resources/fluo-app.properties
+++ b/modules/api/src/test/resources/fluo-app.properties
@@ -42,7 +42,7 @@ fluo.dfs.root=hdfs://myhost:10000
## Accumulo instance to connect to
fluo.accumulo.instance=myInstance
## Accumulo table to initialize
-fluo.accumulo.table=\${fluo.connection.application.name}
+fluo.accumulo.table=${fluo.connection.application.name}
## Accumulo user
fluo.accumulo.user=testUser
## Accumulo password
diff --git a/modules/api/src/test/resources/fluo.properties
b/modules/api/src/test/resources/fluo.properties
index 4f408ab..d490219 100644
--- a/modules/api/src/test/resources/fluo.properties
+++ b/modules/api/src/test/resources/fluo.properties
@@ -29,7 +29,7 @@ fluo.client.application.name=app1
# Zookeeper connection string specifying host and chroot where Fluo stores
data.
# A chroot directory suffix must be specified but doesn't need to be named
# '/fluo'. If not specified, a Fluo application cannot be initialized.
-# Interpolation (i.e \${fluo.client.accumulo.zookeepers}/fluo) can be used
+# Interpolation (i.e ${fluo.client.accumulo.zookeepers}/fluo) can be used
# when setting this to reuse Accumulo's zookeeper connection string.
fluo.client.zookeeper.connect=localhost/fluo2
# Zookeeper timeout
@@ -57,7 +57,7 @@ fluo.admin.hdfs.root=hdfs://localhost:10000
# every tablet server. For the default jars below, `fluo init` will place them
# in HDFS. If you add more jars to the classpath below, you will need to
# add them to HDFS.
-fluo.admin.accumulo.classpath=\${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${project.version}.jar,\${fluo.admin.hdfs.root}/fluo/lib/fluo-accumulo-${project.version}.jar
+fluo.admin.accumulo.classpath=${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${project.version}.jar,${fluo.admin.hdfs.root}/fluo/lib/fluo-accumulo-${project.version}.jar
# Observer properties
# -------------------
@@ -139,7 +139,7 @@
fluo.admin.accumulo.classpath=\${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${proje
# MiniFluo properties
# -------------------
# Path to directory where MiniFluo stores its data
-#fluo.mini.data.dir=\${env:FLUO_HOME}/apps/\${fluo.client.application.name}/mini
+#fluo.mini.data.dir=${env:FLUO_HOME}/apps/${fluo.client.application.name}/mini
# Indicates if MiniFluo should start a MiniAccumulo cluster
#fluo.mini.start.accumulo=true
diff --git a/modules/distribution/src/main/config/fluo-app.properties
b/modules/distribution/src/main/config/fluo-app.properties
index 88ffa74..a59cd12 100644
--- a/modules/distribution/src/main/config/fluo-app.properties
+++ b/modules/distribution/src/main/config/fluo-app.properties
@@ -48,7 +48,7 @@ fluo.dfs.root=hdfs://localhost:8020/fluo
fluo.accumulo.instance=
## Accumulo table to initialize
-fluo.accumulo.table=\${fluo.connection.application.name}
+fluo.accumulo.table=${fluo.connection.application.name}
## Accumulo user
fluo.accumulo.user=
diff --git a/modules/distribution/src/main/config/fluo.properties.deprecated
b/modules/distribution/src/main/config/fluo.properties.deprecated
index 324f022..8f675f0 100644
--- a/modules/distribution/src/main/config/fluo.properties.deprecated
+++ b/modules/distribution/src/main/config/fluo.properties.deprecated
@@ -32,7 +32,7 @@ fluo.client.application.name=
# Zookeeper connection string specifying host and chroot where Fluo stores
data.
# A chroot directory suffix must be specified but doesn't need to be named
# '/fluo'. If not specified, a Fluo application cannot be initialized.
-# Interpolation (i.e \${fluo.client.accumulo.zookeepers}/fluo) can be used
+# Interpolation (i.e ${fluo.client.accumulo.zookeepers}/fluo) can be used
# when setting this to reuse Accumulo's zookeeper connection string.
#fluo.client.zookeeper.connect=localhost/fluo
@@ -57,7 +57,7 @@ fluo.client.accumulo.password=
# Admin properties
# ----------------
# Accumulo table to initialize
-fluo.admin.accumulo.table=\${fluo.client.application.name}
+fluo.admin.accumulo.table=${fluo.client.application.name}
# HDFS root path. Should match 'fs.defaultFS' property in Hadoop's
core-site.xml
fluo.admin.hdfs.root=hdfs://localhost:10000
@@ -68,7 +68,7 @@ fluo.admin.hdfs.root=hdfs://localhost:10000
# every tablet server. For the default jars below, `fluo init` will place them
# in HDFS. If you add more jars to the classpath below, you will need to
# add them to HDFS.
-fluo.admin.accumulo.classpath=\${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${project.version}.jar,\${fluo.admin.hdfs.root}/fluo/lib/fluo-accumulo-${project.version}.jar
+fluo.admin.accumulo.classpath=${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${project.version}.jar,${fluo.admin.hdfs.root}/fluo/lib/fluo-accumulo-${project.version}.jar
# Observer properties
# -------------------
@@ -156,7 +156,7 @@
fluo.admin.accumulo.classpath=\${fluo.admin.hdfs.root}/fluo/lib/fluo-api-${proje
# MiniFluo properties
# -------------------
# Path to directory where MiniFluo stores its data
-#fluo.mini.data.dir=\${env:FLUO_HOME}/apps/\${fluo.client.application.name}/mini
+#fluo.mini.data.dir=${env:FLUO_HOME}/apps/${fluo.client.application.name}/mini
# Indicates if MiniFluo should start a MiniAccumulo cluster
#fluo.mini.start.accumulo=true
diff --git a/modules/distribution/src/main/lib/fetch.sh
b/modules/distribution/src/main/lib/fetch.sh
index c23c97b..74320a9 100755
--- a/modules/distribution/src/main/lib/fetch.sh
+++ b/modules/distribution/src/main/lib/fetch.sh
@@ -60,8 +60,7 @@ extra)
download com.google.guava:guava:jar:27.0-jre
download com.google.inject:guice:jar:4.0
download org.apache.commons:commons-collections4:jar:4.2
- download commons-configuration:commons-configuration:jar:1.10
- download commons-lang:commons-lang:jar:2.6
+ download org.apache.commons:commons-configuration2:jar:2.5
download commons-io:commons-io:jar:2.6
download io.dropwizard.metrics:metrics-core:jar:3.1.1
download io.dropwizard.metrics:metrics-graphite:jar:3.1.1
diff --git a/pom.xml b/pom.xml
index dd3eed2..cadbbd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -93,11 +93,6 @@
<version>27.0-jre</version>
</dependency>
<dependency>
- <groupId>commons-configuration</groupId>
- <artifactId>commons-configuration</artifactId>
- <version>1.10</version>
- </dependency>
- <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
@@ -144,6 +139,11 @@
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
+ <artifactId>commons-configuration2</artifactId>
+ <version>2.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>