@Override public OverrideAlgorithm createConfigurationOverrideAlgorithm() { return new DefaultOverrideAlgorithm(); } }
/** * Resolve. * * @param name the parent name * @param namespace the namespace * @param childName the child name * @return the array merge strategy * @throws OverrideException the merge exception */ public ArrayOverrideStrategy resolve(String name, String namespace, String childName) throws OverrideException { Schema schemaForParent = schemaTypes.get(namespace + "." + name); if (schemaForParent == null) { throw new OverrideException(MessageFormat.format( "Failed to find Schema with Name ''{0}'' and namespace ''{1}''", name, namespace)); } String mergeStrategyName = findMergeStrategy(schemaForParent, childName); ArrayOverrideStrategy mergeStrategy = null; if (mergeStrategyName != null) { mergeStrategy = ArrayOverrideStrategy.getByName(mergeStrategyName); } if (mergeStrategy == null) { mergeStrategy = ArrayOverrideStrategy.REPLACE; } return mergeStrategy; }
@Test public void testMergeExceptionEmptyConstructor() { OverrideException mergeException = new OverrideException(); Assert.assertNull(mergeException.getMessage()); Assert.assertNull(mergeException.getCause()); }
@Test(expected = OverrideException.class) public void testResolveFailsWhenSchemaForParentIsNotFound() throws Exception { Path schemaUrl = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/schema.json").toURI()); DataSchema configurationSchema = new DataSchema(new String(Files.readAllBytes(schemaUrl))); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(configurationSchema); KaaSchema baseSchemaString = generator.getBaseSchema(); Schema.Parser baseParser = new Schema.Parser(); baseParser.parse(baseSchemaString.getRawSchema()); ArrayOverrideStrategyResolver arrayMergeStrategyResolver = new ArrayOverrideStrategyResolver(baseParser.getTypes()); arrayMergeStrategyResolver.resolve("wrong_parent_name", "org.kaa.config", "child_name"); }
@Test public void testMergeWhenConfigurationsIsEmpty() throws Exception { Path schemaUrl = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/schema.json").toURI()); DataSchema configuraionSchema = new DataSchema(new String(Files.readAllBytes(schemaUrl))); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(configuraionSchema); List<OverrideData> configurations = new ArrayList<>(); OverrideAlgorithm merger = new DefaultOverrideAlgorithm(); BaseData mergeResult = merger.override(null, configurations); Assert.assertNull(mergeResult); }
new BaseDataFactory()); } catch (ConfigurationGenerationException ex) { throw new OverrideException(ex); ArrayOverrideStrategyResolver arrayMergeStrategyResolver = new ArrayOverrideStrategyResolver( baseSchemaParser.getTypes()); for (OverrideData entry : overrideConfigurations) { GenericRecord nodeToApply = overrideConverter.decodeJson(configurationToApply); LOG.info("configurationToApply: {}", nodeToApply); applyNode(mergedConfiguration, nodeToApply, arrayMergeStrategyResolver); throw new OverrideException(ex);
configurationOverrideFactory.createConfigurationOverrideAlgorithm(); return configurationMerger.override(baseConfig, overrideConfigs);
getSchemaByName(sourceRecord.getSchema().getFullName())); destinationRoot.put(field.pos(), destinationRecord); applyNode(destinationRecord, sourceRecord, arrayMergeStrategyResolver); } else if (sourceChild instanceof GenericArray) { mergeStrategy = arrayMergeStrategyResolver.resolve( sourceRootSchema.getName(), sourceRootSchema.getNamespace(), sourceChildname); GenericRecord recordItem = (GenericRecord) item; GenericRecord destRecord = new GenericData.Record( getSchemaByName(recordItem.getSchema().getFullName())); applyNode(destRecord, recordItem, arrayMergeStrategyResolver); destArray.add(destRecord); GenericRecord recordItem = (GenericRecord) item; GenericRecord destRecord = new GenericData.Record( getSchemaByName(recordItem.getSchema().getFullName())); applyNode(destRecord, recordItem, arrayMergeStrategyResolver); destArray.add(destRecord);
@Test public void testGetByNameFailsForIncorrectName() { ArrayOverrideStrategy arrayMergeStrategy = ArrayOverrideStrategy.getByName("incorrect_name"); Assert.assertNull(arrayMergeStrategy); } }
@Test public void testMergeExceptionConstructorWithMessageParameter() { String message = "test_message"; OverrideException mergeException = new OverrideException(message); Assert.assertEquals(message, mergeException.getMessage()); Assert.assertNull(mergeException.getCause()); }
@Test public void testStrategyIsResolvedToOverrideWhenFieldsDefinitionIsEmpty() throws Exception { Path schemaUrl = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/schema_for_array_merge_strategy_resolver_with_empty_fields_definition.json").toURI()); DataSchema configurationSchema = new DataSchema(new String(Files.readAllBytes(schemaUrl))); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(configurationSchema); KaaSchema baseSchemaString = generator.getBaseSchema(); Schema.Parser baseParser = new Schema.Parser(); baseParser.parse(baseSchemaString.getRawSchema()); ArrayOverrideStrategyResolver arrayMergeStrategyResolver = new ArrayOverrideStrategyResolver(baseParser.getTypes()); ArrayOverrideStrategy actualArrayMergeStrategy = arrayMergeStrategyResolver.resolve("testT", "org.kaa.config", "child_name"); Assert.assertTrue(ArrayOverrideStrategy.REPLACE == actualArrayMergeStrategy); }
@Test public void testMergeOf3Configurations() throws Exception { // Create Configuration Schema Path schemaUrl = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/schema.json").toURI()); DataSchema configuraionSchema = new DataSchema(new String(Files.readAllBytes(schemaUrl))); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(configuraionSchema); BaseSchema baseSchemaString = generator.getBaseSchema(); OverrideSchema overrideSchemaString = generator.getOverrideSchema(); // Create Configuration weight 0 Path configuraionWeight0Path = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/config_weight_0.json").toURI()); BaseData baseData = new BaseData(baseSchemaString, new String(Files.readAllBytes(configuraionWeight0Path))); // Create Configuration weight 1 Path configuraionWeight1Path = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/config_weight_1.json").toURI()); OverrideData data1 = new OverrideData(overrideSchemaString, new String(Files.readAllBytes(configuraionWeight1Path))); // Create Configuration weight 2 Path configuraionWeight2Path = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/config_weight_2.json").toURI()); OverrideData data2 = new OverrideData(overrideSchemaString, new String(Files.readAllBytes(configuraionWeight2Path))); List<OverrideData> configurations = new ArrayList<>(); configurations.add(data1); configurations.add(data2); Path mergedConfiguraionPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/merged_config.json").toURI()); String mergedConfiguraionBody = new String(Files.readAllBytes(mergedConfiguraionPath)); OverrideAlgorithm merger = new DefaultOverrideAlgorithm(); BaseData mergeResult = merger.override(baseData, configurations); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(baseSchemaString.getRawSchema()); GenericRecord mergeResultGenericRecord = converter.decodeJson(mergeResult.getRawData()); GenericRecord expectedMergedConfiguraionGenericRecord = converter.decodeJson(mergedConfiguraionBody); Assert.assertTrue(mergeResultGenericRecord.equals(expectedMergedConfiguraionGenericRecord)); }
private Pair<BaseData, RawData> mergeConfiguration(String endpointId, String config, ConfigurationSchemaDto configSchema, Pair<BaseData, RawData> mergedConfiguration) throws GetDeltaException { OverrideAlgorithm configurationMerger = configurationOverrideFactory.createConfigurationOverrideAlgorithm(); OverrideSchema overrideSchema = new OverrideSchema(configSchema.getOverrideSchema()); try { LOG.trace("Merging group configuration with configuration: {}", config); BaseData baseData = configurationMerger.override(mergedConfiguration.getV1(), Collections.singletonList(new OverrideData(overrideSchema, config))); JsonNode json = new ObjectMapper().readTree(baseData.getRawData()); AvroUtils.removeUuids(json); RawData rawData = new RawData(new RawSchema(mergedConfiguration.getV2().getSchema().getRawSchema()), json.toString()); return new Pair<>(baseData, rawData); } catch (OverrideException | IOException oe) { LOG.error("[{}] Unexpected exception occurred while merging configuration: ", endpointId, oe); throw new GetDeltaException(oe); } finally { LOG.trace("[{}] getMergedConfiguration.compute end", endpointId); } }
@Test public void testMergeExceptionConstructorWithMessageAndCauseParameters() { String message = "test_message"; Exception cause = new RuntimeException(); OverrideException mergeException = new OverrideException(message, cause); Assert.assertEquals(message, mergeException.getMessage()); Assert.assertTrue(cause == mergeException.getCause()); }
@Test public void testResolveSuccessForUnionWithArrayType() throws Exception { Path schemaUrl = Paths.get(Thread.currentThread().getContextClassLoader().getResource("override/schema_for_array_merge_strategy_resolver_with_array_in_union_type.json").toURI()); DataSchema configurationSchema = new DataSchema(new String(Files.readAllBytes(schemaUrl))); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(configurationSchema); KaaSchema baseSchemaString = generator.getBaseSchema(); Schema.Parser baseParser = new Schema.Parser(); baseParser.parse(baseSchemaString.getRawSchema()); ArrayOverrideStrategyResolver arrayMergeStrategyResolver = new ArrayOverrideStrategyResolver(baseParser.getTypes()); ArrayOverrideStrategy actualArrayMergeStrategy = arrayMergeStrategyResolver.resolve("testT", "org.kaa.config", "field1"); Assert.assertTrue(ArrayOverrideStrategy.APPEND == actualArrayMergeStrategy); } }
@Test public void testMergeExceptionConstructorWithCauseParameter() { Exception cause = new RuntimeException(); OverrideException mergeException = new OverrideException(cause); Assert.assertEquals(cause.toString(), mergeException.getMessage()); Assert.assertTrue(cause == mergeException.getCause()); } }