Skip to content

Commit

Permalink
fixes #894 merge SimpleConfiguration Objects (#902)
Browse files Browse the repository at this point in the history
  • Loading branch information
cjmctague authored and keith-turner committed Aug 14, 2017
1 parent db0bdad commit a349a9d
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 1 deletion.
Expand Up @@ -27,6 +27,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
Expand Down Expand Up @@ -213,7 +214,6 @@ public void save(File file) {
}
}


public void save(OutputStream out) {
PropertiesConfiguration pconf = new PropertiesConfiguration();
pconf.setDelimiterParsingDisabled(true);
Expand Down Expand Up @@ -250,6 +250,44 @@ public SimpleConfiguration subset(String prefix) {
return new SimpleConfiguration(internalConfig.subset(prefix));
}

/**
* @param fallback SimpleConfiguration to join together
* @return a new simple configuration that contains all of the current properties from this plus
* the properties from fallback that are not present in this.
*
* @since 1.2.0
*/
public SimpleConfiguration orElse(SimpleConfiguration fallback) {
SimpleConfiguration copy = new SimpleConfiguration(this);
for (Map.Entry<String, String> entry : fallback.toMap().entrySet()) {
if (!copy.containsKey(entry.getKey())) {
copy.setProperty(entry.getKey(), entry.getValue());
}
}
return copy;
}

@Override
public int hashCode() {
return Objects.hashCode(this.toMap().entrySet());
}

@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}

if (o instanceof SimpleConfiguration) {
Map<String, String> th = this.toMap();
Map<String, String> sc = ((SimpleConfiguration) o).toMap();
if (th.size() == sc.size()) {
return th.entrySet().equals(sc.entrySet());
}
}
return false;
}

@Override
public String toString() {
return ConfigurationUtils.toString(internalConfig);
Expand Down
@@ -0,0 +1,90 @@
/*
* 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.fluo.api.config;

import org.junit.Assert;
import org.junit.Test;

/**
* @since 1.2.0
*/
public class SimpleConfigurationTest {

@Test
public void testMerge() {
SimpleConfiguration empty = new SimpleConfiguration();
SimpleConfiguration sc1 = new SimpleConfiguration();
SimpleConfiguration sc2 = new SimpleConfiguration();
SimpleConfiguration sc3 = new SimpleConfiguration();
SimpleConfiguration testEmpty = sc1.orElse(sc2).orElse(sc3);

Assert.assertEquals(empty, testEmpty);

sc1.setProperty("set1", "value1");
sc1.setProperty("set1", "value2");
sc1.setProperty("set3", "value3");
sc2.setProperty("set4", "value4");
sc2.setProperty("set5", "value5");
sc2.setProperty("set1", "value6"); // wont include as sc1 already has set1
sc3.setProperty("set7", "value7");
sc3.setProperty("set5", "value8"); // wont include as sc2 already has set5

SimpleConfiguration msc = sc1.orElse(sc2).orElse(sc3);

SimpleConfiguration expected = new SimpleConfiguration();
expected.setProperty("set1", "value2");
expected.setProperty("set3", "value3");
expected.setProperty("set4", "value4");
expected.setProperty("set5", "value5");
expected.setProperty("set7", "value7");

SimpleConfiguration expNoOrder = new SimpleConfiguration();
expNoOrder.setProperty("set7", "value7");
expNoOrder.setProperty("set4", "value4");
expNoOrder.setProperty("set5", "value5");
expNoOrder.setProperty("set1", "value2");
expNoOrder.setProperty("set3", "value3");

SimpleConfiguration diff = new SimpleConfiguration();
diff.setProperty("set7", "value7");
diff.setProperty("set4", "value11");
diff.setProperty("set5", "value12");
diff.setProperty("set1", "value13");
diff.setProperty("set3", "value14");

SimpleConfiguration sc4 = sc3.orElse(sc1).orElse(sc2);
SimpleConfiguration noChange = new SimpleConfiguration(sc4);
sc3.setProperty("set25", "value25");
sc1.setProperty("set26", "value26");
sc2.setProperty("set27", "value27");

Assert.assertEquals(noChange, sc4);

Assert.assertEquals(expected, msc);
Assert.assertEquals(expNoOrder, msc);
Assert.assertNotEquals(diff, msc);

Assert.assertNotEquals(expected, sc1);
Assert.assertNotEquals(expNoOrder, sc1);

Assert.assertNotEquals(expected, sc2);
Assert.assertNotEquals(expected, sc3);

Assert.assertNotEquals(expNoOrder, sc2);
Assert.assertNotEquals(expNoOrder, sc3);

Assert.assertNotEquals(expNoOrder.toString(), msc.toString());
}
}

0 comments on commit a349a9d

Please sign in to comment.