diff --git a/config/src/main/java/tech/pegasys/pantheon/config/GenesisConfigFile.java b/config/src/main/java/tech/pegasys/pantheon/config/GenesisConfigFile.java index 1fbf33a19f..07c639dfe7 100644 --- a/config/src/main/java/tech/pegasys/pantheon/config/GenesisConfigFile.java +++ b/config/src/main/java/tech/pegasys/pantheon/config/GenesisConfigFile.java @@ -19,12 +19,17 @@ import java.io.IOException; import java.util.Optional; import java.util.stream.Stream; +import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.Streams; import com.google.common.io.Resources; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; public class GenesisConfigFile { + static final Logger LOG = LogManager.getLogger(); + public static final GenesisConfigFile DEFAULT = new GenesisConfigFile(JsonUtil.createEmptyObjectNode()); @@ -53,10 +58,23 @@ public class GenesisConfigFile { } public static GenesisConfigFile fromConfig(final String jsonString) { - // TODO: Should we disable comments? - final boolean allowComments = true; - final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, allowComments); - return fromConfig(rootNode); + try { + final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, false); + return fromConfig(rootNode); + } catch (final RuntimeException re) { + if (re.getCause() instanceof JsonParseException) { + // we had a runtime exception cause by a jsom parse exception. + // try again with comments enabled + final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, true); + // if we get here comments is what broke things, warn and move on. + LOG.warn( + "The provided genesis file contains comments. " + + "In a future release of Pantheon this will not be supported."); + return fromConfig(rootNode); + } else { + throw re; + } + } } public static GenesisConfigFile fromConfig(final ObjectNode config) { diff --git a/config/src/test/java/tech/pegasys/pantheon/config/GenesisConfigFileTest.java b/config/src/test/java/tech/pegasys/pantheon/config/GenesisConfigFileTest.java index 2044f12d9f..2c06360564 100644 --- a/config/src/test/java/tech/pegasys/pantheon/config/GenesisConfigFileTest.java +++ b/config/src/test/java/tech/pegasys/pantheon/config/GenesisConfigFileTest.java @@ -203,6 +203,17 @@ public class GenesisConfigFileTest { "31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095")); } + @Test + public void acceptComments() { + // this test will change in the future to reject comments. + final GenesisConfigFile config = + GenesisConfigFile.fromConfig( + "{\"config\": { \"chainId\": 2017 }\n/* C comment }*/\n//C++ comment }\n}"); + + assertThat(config.getConfigOptions().getChainId()).contains(new BigInteger("2017")); + // Unfortunately there is no good (non-flakey) way to assert logs. + } + private GenesisConfigFile configWithProperty(final String key, final String value) { return GenesisConfigFile.fromConfig("{\"" + key + "\":\"" + value + "\"}"); }