private boolean validateJsonConf() throws IOException, ProcessingException { JsonNode schemaNode = JsonLoader.fromFile(new File("src/main/resources/ConfigurationSchema.json")); JsonSchemaFactory schemaFactory = JsonSchemaFactory.byDefault(); /* Here we consume the original jsonConfigReader in the process of validation and recreate a Reader from JsonNode then assign it back to the jsonConfigReader, if the validation succeed. Can we improve this logic? */ if (schemaFactory.getSyntaxValidator().schemaIsValid(schemaNode)) { JsonSchema jsonSchema = schemaFactory.getJsonSchema(schemaNode); JsonNode topologyConfig = JsonLoader.fromReader(jsonConfigReader); ProcessingReport report = jsonSchema.validate(topologyConfig); if (report.isSuccess()) { log.info("Validation succeeded... "); log.info(report.toString()); jsonConfigReader = new InputStreamReader(new ByteArrayInputStream(topologyConfig.toString().getBytes())); return true; } else { log.error("Validation failed..."); log.error(report.toString()); throw new RuntimeException( "Configuration file validation failed, Please recheck configuration file and try again"); } } else { log.error("Json configuration schema is not valid "); log.error("Terminate the process ....."); throw new RuntimeException("Json Configuration schema is not valid"); } }
public static void main(final String... args) throws IOException { final JsonNode fstabSchema = loadResource("/fstab-inline.json"); final JsonNode good = loadResource("/fstab-good.json"); final JsonNode bad = loadResource("/fstab-bad.json"); final JsonNode bad2 = loadResource("/fstab-bad2.json"); final JsonSchemaFactory factory = JsonSchemaFactory.builder().addressingMode(AddressingMode.INLINE).build(); final JsonSchema schema = factory.fromSchema(fstabSchema); ValidationReport report; report = schema.validate(good); printReport(report); report = schema.validate(bad); printReport(report); report = schema.validate(bad2); printReport(report); }