Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/hocon support #243

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 10 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
language: java
jdk:
- oraclejdk8
- oraclejdk7
- openjdk7

before_install:
# Workaround for missing crypto in openjdk7
- |
if [ "$TRAVIS_JDK_VERSION" == "openjdk7" ]; then
sudo wget "https://bouncycastle.org/download/bcprov-ext-jdk15on-158.jar" -O "${JAVA_HOME}/jre/lib/ext/bcprov-ext-jdk15on-158.jar"
sudo perl -pi.bak -e 's/^(security\.provider\.)([0-9]+)/$1.($2+1)/ge' /etc/java-7-openjdk/security/java.security
echo "security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider" | sudo tee -a /etc/java-7-openjdk/security/java.security
fi
6 changes: 6 additions & 0 deletions cfg4j-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ dependencies {
compile group: "com.github.drapostolos", name: "type-parser", version: "0.6.0"
// JSON support
compile group: "org.json", name: "json", version: "20160212"
// HOCON support
compile group: 'com.typesafe', name: 'config', version: '1.3.2'

}

// ----------- Task configurations -----------
Expand All @@ -39,3 +42,6 @@ jar {
}

archivesBaseName = "${artifactName}"

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@
import org.cfg4j.source.context.environment.Environment;
import org.cfg4j.source.context.environment.MissingEnvironmentException;
import org.cfg4j.source.context.filesprovider.ConfigFilesProvider;
import org.cfg4j.source.context.propertiesprovider.JsonBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.PropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.PropertiesProviderSelector;
import org.cfg4j.source.context.propertiesprovider.PropertyBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.YamlBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.*;

import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -76,7 +72,7 @@ public Iterable<Path> getConfigFiles() {
*/
public ClasspathConfigurationSource(ConfigFilesProvider configFilesProvider) {
this(configFilesProvider, new PropertiesProviderSelector(
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider()
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider(), new HoconBasedPropertiesProvider()
));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.cfg4j.source.context.propertiesprovider;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigValue;

public class HoconBasedPropertiesProvider extends FormatBasedPropertiesProvider {

/**
* Get {@link Properties} for a given {@code inputStream} treating it as a HOCON file.
*
* @param inputStream input stream representing HOCON file
* @return properties representing values from {@code inputStream}
*/
@Override
public Properties getProperties(InputStream inputStream) {
Config config = ConfigFactory.parseReader(new InputStreamReader(inputStream));
final Set<Map.Entry<String, ConfigValue>> entries = config.entrySet();

Properties properties = new Properties();

Map<String, Object> map = new ConcurrentHashMap<>();
for (Map.Entry<String, ConfigValue> entry : entries) {
map.put(entry.getKey(), entry.getValue().unwrapped());
}
properties.putAll(flatten(map));

return properties;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,24 @@ public class PropertiesProviderSelector {
private final PropertiesProvider yamlProvider;
private final PropertiesProvider jsonProvider;
private final PropertiesProvider propertiesProvider;
private final PropertiesProvider hoconProvider;

/**
* Construct selector.
*
* @param propertiesProvider provider used for parsing properties files
* @param yamlProvider provider used for parsing Yaml files
* @param jsonProvider provider used for parsing JSON files
* @param hoconProvider provider used for parsing HOCON files
*/
public PropertiesProviderSelector(PropertiesProvider propertiesProvider, PropertiesProvider yamlProvider, PropertiesProvider jsonProvider) {
public PropertiesProviderSelector(PropertiesProvider propertiesProvider,
PropertiesProvider yamlProvider,
PropertiesProvider jsonProvider,
PropertiesProvider hoconProvider) {
this.propertiesProvider = requireNonNull(propertiesProvider);
this.yamlProvider = requireNonNull(yamlProvider);
this.jsonProvider = requireNonNull(jsonProvider);
this.hoconProvider = requireNonNull(hoconProvider);
}

/**
Expand All @@ -52,6 +58,8 @@ public PropertiesProvider getProvider(String filename) {
return yamlProvider;
} else if (filename.endsWith(".json")) {
return jsonProvider;
} else if (filename.endsWith(".conf")) {
return hoconProvider;
} else {
return propertiesProvider;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@
import org.cfg4j.source.context.environment.Environment;
import org.cfg4j.source.context.environment.MissingEnvironmentException;
import org.cfg4j.source.context.filesprovider.ConfigFilesProvider;
import org.cfg4j.source.context.propertiesprovider.JsonBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.PropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.PropertiesProviderSelector;
import org.cfg4j.source.context.propertiesprovider.PropertyBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.YamlBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.*;

import java.io.FileInputStream;
import java.io.IOException;
Expand Down Expand Up @@ -71,7 +67,7 @@ public Iterable<Path> getConfigFiles() {
*/
public FilesConfigurationSource(ConfigFilesProvider configFilesProvider) {
this(configFilesProvider, new PropertiesProviderSelector(
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider()
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider(), new HoconBasedPropertiesProvider()
));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright 2015-2016 Norbert Potocki (norbert.potocki@nort.pl)
*
* Licensed 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.cfg4j.source.context.propertiesprovider;

import org.assertj.core.data.MapEntry;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

import java.io.IOException;
import java.io.InputStream;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(MockitoJUnitRunner.class)
public class HoconBasedPropertiesProviderTest {

@Rule
public ExpectedException expectedException = ExpectedException.none();

private HoconBasedPropertiesProvider provider;

@Before
public void setUp() throws Exception {
provider = new HoconBasedPropertiesProvider();
}

@Test
public void readsNestedValues() throws IOException {
String path = "org/cfg4j/source/propertiesprovider/HoconBasedPropertiesProviderTest_readsNestedValues.conf";

try (InputStream input = getClass().getClassLoader().getResourceAsStream(path)) {
assertThat(provider.getProperties(input)).containsExactly(
MapEntry.entry("some.listSetting", "stringValue,102"),
MapEntry.entry("some.setting", "masterValue"),
MapEntry.entry("some.nestedSetting.integerSetting", 123)
);
}
}

@Test
public void throwsOnNullInput() throws IOException {
String path = "org/cfg4j/source/propertiesprovider/nonexistent.json";

try (InputStream input = getClass().getClassLoader().getResourceAsStream(path)) {
expectedException.expect(NullPointerException.class);
provider.getProperties(input);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ public class PropertiesProviderSelectorTest {
private PropertiesProvider propertiesProvider;
private Properties propertiesProperties;

@Mock
private PropertiesProvider hoconProvider;
private Properties hoconProperties;

private PropertiesProviderSelector selector;

@Before
Expand All @@ -63,7 +67,10 @@ public void setUp() throws Exception {
propertiesProperties = new Properties();
when(yamlProvider.getProperties(any(InputStream.class))).thenReturn(propertiesProperties);

selector = new PropertiesProviderSelector(propertiesProvider, yamlProvider, jsonProvider);
hoconProperties = new Properties();
when(hoconProvider.getProperties(any(InputStream.class))).thenReturn(hoconProperties);

selector = new PropertiesProviderSelector(propertiesProvider, yamlProvider, jsonProvider, hoconProvider);
}

@Test
Expand All @@ -82,7 +89,12 @@ public void returnsJsonProviderForJson() throws Exception {
}

@Test
public void returnsPropertiesProviderForNonYaml() throws Exception {
public void returnsPropertiesProviderForProperties() throws Exception {
assertThat(selector.getProvider("test.properties")).isEqualTo(propertiesProvider);
}

@Test
public void returnsPropertiesProviderForHocon() throws Exception {
assertThat(selector.getProvider("test.conf")).isEqualTo(hoconProvider);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
some {
setting = masterValue
nestedSetting {
integerSetting = 123
}
listSetting = ["stringValue", 102]
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,7 @@

import org.cfg4j.source.context.filesprovider.ConfigFilesProvider;
import org.cfg4j.source.context.filesprovider.DefaultConfigFilesProvider;
import org.cfg4j.source.context.propertiesprovider.JsonBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.PropertiesProviderSelector;
import org.cfg4j.source.context.propertiesprovider.PropertyBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.YamlBasedPropertiesProvider;
import org.cfg4j.source.context.propertiesprovider.*;

import java.nio.file.Path;
import java.nio.file.Paths;
Expand Down Expand Up @@ -59,7 +56,7 @@ public GitConfigurationSourceBuilder() {
tmpRepoPrefix = "cfg4j-git-config-repository";
configFilesProvider = new DefaultConfigFilesProvider();
propertiesProviderSelector = new PropertiesProviderSelector(
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider()
new PropertyBasedPropertiesProvider(), new YamlBasedPropertiesProvider(), new JsonBasedPropertiesProvider(), new HoconBasedPropertiesProvider()
);
}

Expand Down