This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository nuiton-config. See https://gitlab.nuiton.org/nuiton/nuiton-config.git commit 471d063dac03fefe3fa64de1a0d03f1a36aeaaf8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Oct 7 14:15:31 2016 +0200 Add ini io implementation --- nuiton-config-io-ini/pom.xml | 5 ++ .../config/io/ini/ApplicationConfigIOIni.java | 37 ++++++++- .../org.nuiton.config.io.ApplicationConfigIO | 0 .../config/io/ini/ApplicationConfigIOIniTest.java | 93 ++++++++++++++++++++++ .../src/test/resources/NuitonConfigExample.ini | 5 ++ 5 files changed, 138 insertions(+), 2 deletions(-) diff --git a/nuiton-config-io-ini/pom.xml b/nuiton-config-io-ini/pom.xml index 7a13c3e..ee920a3 100644 --- a/nuiton-config-io-ini/pom.xml +++ b/nuiton-config-io-ini/pom.xml @@ -32,6 +32,11 @@ <artifactId>commons-configuration2</artifactId> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + </dependencies> </project> diff --git a/nuiton-config-io-ini/src/main/java/org/nuiton/config/io/ini/ApplicationConfigIOIni.java b/nuiton-config-io-ini/src/main/java/org/nuiton/config/io/ini/ApplicationConfigIOIni.java index bfadbc3..fd0ed9e 100644 --- a/nuiton-config-io-ini/src/main/java/org/nuiton/config/io/ini/ApplicationConfigIOIni.java +++ b/nuiton-config-io-ini/src/main/java/org/nuiton/config/io/ini/ApplicationConfigIOIni.java @@ -1,5 +1,8 @@ package org.nuiton.config.io.ini; +import com.google.common.base.Joiner; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import com.google.common.io.Files; import org.apache.commons.configuration2.INIConfiguration; import org.apache.commons.configuration2.SubnodeConfiguration; @@ -15,7 +18,11 @@ import java.io.Reader; import java.io.Writer; import java.net.URL; import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.Properties; /** @@ -70,9 +77,35 @@ public class ApplicationConfigIOIni implements ApplicationConfigIO { INIConfiguration iniConfiguration = new INIConfiguration(); - //FIXME See how to manage sections ? guess them from keys ? + Multimap<String, String> splits = ArrayListMultimap.create(); + for (String key : properties.stringPropertyNames()) { - iniConfiguration.addProperty(key, properties.getProperty(key, null)); + List<String> split = new ArrayList<>(Arrays.asList(key.split("\\."))); + if (split.size() == 1) { + // simple property + iniConfiguration.addProperty(key, properties.getProperty(key)); + } else { + String lastKey = split.remove(split.size() - 1); + splits.put(Joiner.on(".").join(split), lastKey); + } + } + + for (String sectionName : splits.keySet()) { + Collection<String> keyNames = splits.get(sectionName); + if (keyNames.size() > 1) { + + // use section + SubnodeConfiguration section = iniConfiguration.getSection(sectionName); + for (String keyName : keyNames) { + section.addProperty(keyName, properties.getProperty(sectionName + "." + keyName)); + } + + } else { + + // simple property + String keyName = keyNames.iterator().next(); + iniConfiguration.addProperty(sectionName + "." + keyName, properties.getProperty(sectionName + "." + keyName)); + } } try (Writer writer = Files.newWriter(file, Charset.forName(encoding))) { diff --git a/nuiton-config-io-ini/src/main/resources/services/org.nuiton.config.io.ApplicationConfigIO b/nuiton-config-io-ini/src/main/resources/META-INF/services/org.nuiton.config.io.ApplicationConfigIO similarity index 100% rename from nuiton-config-io-ini/src/main/resources/services/org.nuiton.config.io.ApplicationConfigIO rename to nuiton-config-io-ini/src/main/resources/META-INF/services/org.nuiton.config.io.ApplicationConfigIO diff --git a/nuiton-config-io-ini/src/test/java/org/nuiton/config/io/ini/ApplicationConfigIOIniTest.java b/nuiton-config-io-ini/src/test/java/org/nuiton/config/io/ini/ApplicationConfigIOIniTest.java new file mode 100644 index 0000000..024311c --- /dev/null +++ b/nuiton-config-io-ini/src/test/java/org/nuiton/config/io/ini/ApplicationConfigIOIniTest.java @@ -0,0 +1,93 @@ +package org.nuiton.config.io.ini; + +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.config.io.ApplicationConfigIO; +import org.nuiton.config.io.ApplicationConfigIOHelper; +import org.nuiton.config.io.ApplicationConfigReadFormat; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.Properties; + +/** + * Created by tchemit on 07/10/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ApplicationConfigIOIniTest { + + @Test + public void readProperties() throws Exception { + + ApplicationConfigIO io = new ApplicationConfigIOIni(); + + File file = Paths.get(new File("").getAbsolutePath(), "src", "test", "resources", "NuitonConfigExample.ini").toFile(); + + Properties properties = io.readProperties(file.toURI().toURL(), StandardCharsets.UTF_8.name()); + + assertProperties(properties); + + } + + @Test + public void readPropertiesFromHelper() throws Exception { + + File file = Paths.get(new File("").getAbsolutePath(), "src", "test", "resources", "NuitonConfigExample.ini").toFile(); + + Properties properties = new ApplicationConfigIOHelper(ApplicationConfigReadFormat.ini).readProperties(file.toURI().toURL(), StandardCharsets.UTF_8.name()); + + assertProperties(properties); + + } + + @Test + public void writeProperties() throws Exception { + + ApplicationConfigIO io = new ApplicationConfigIOIni(); + + Properties properties = new Properties(); + properties.put("identity.firstName", "Joshua"); + properties.put("identity.lastName", "Bloch"); + properties.put("identity.age", "56"); + properties.put("identity.twitter", "jbloch"); + + File file = Paths.get(new File("").getAbsolutePath(), "target", "surefire-workdir", "NuitonConfigExample" + System.currentTimeMillis() + ".ini").toFile(); + + io.writeProperties(properties, file, StandardCharsets.UTF_8.name(), null); + + Properties properties2 = io.readProperties(file.toURI().toURL(), StandardCharsets.UTF_8.name()); + + assertProperties(properties2); + + } + + @Test + public void writePropertiesFromHelper() throws Exception { + + Properties properties = new Properties(); + properties.put("identity.firstName", "Joshua"); + properties.put("identity.lastName", "Bloch"); + properties.put("identity.age", "56"); + properties.put("identity.twitter", "jbloch"); + + File file = Paths.get(new File("").getAbsolutePath(), "target", "surefire-workdir", "NuitonConfigExample" + System.currentTimeMillis() + ".ini").toFile(); + new ApplicationConfigIOHelper(ApplicationConfigReadFormat.ini).writeProperties(properties, file, StandardCharsets.UTF_8.name(), null); + + Properties properties2 = new ApplicationConfigIOHelper(ApplicationConfigReadFormat.ini).readProperties(file.toURI().toURL(), StandardCharsets.UTF_8.name()); + + assertProperties(properties2); + + } + + private void assertProperties(Properties properties) { + Assert.assertNotNull(properties); + Assert.assertNotNull(properties.getProperty("identity.firstName")); + Assert.assertEquals("Joshua", properties.getProperty("identity.firstName")); + Assert.assertEquals("Bloch", properties.getProperty("identity.lastName")); + Assert.assertEquals("56", properties.getProperty("identity.age")); + Assert.assertEquals("jbloch", properties.getProperty("identity.twitter")); + } + +} \ No newline at end of file diff --git a/nuiton-config-io-ini/src/test/resources/NuitonConfigExample.ini b/nuiton-config-io-ini/src/test/resources/NuitonConfigExample.ini new file mode 100644 index 0000000..cee47b5 --- /dev/null +++ b/nuiton-config-io-ini/src/test/resources/NuitonConfigExample.ini @@ -0,0 +1,5 @@ +[identity] +firstName = Joshua +lastName = Bloch +age = 56 +twitter = jbloch -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.