*/
Object createNewInstance(Object incomingObject);
+ /**
+ * Create an object of a sub type of this object.
+ *
+ * @param subType the sub type definition of this type
+ * @return a new object of the sub type
+ */
+ Object createNewSubInstance(String subType);
+
/**
* Unmarshal an object in schema format into a Java object.
*
import java.lang.reflect.Constructor;
+import org.apache.commons.lang3.NotImplementedException;
import org.onap.policy.apex.context.ContextRuntimeException;
import org.onap.policy.apex.context.SchemaHelper;
import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
throw new ContextRuntimeException(returnString);
}
}
+
+ /* (non-Javadoc)
+ * @see org.onap.policy.apex.context.SchemaHelper#createNewSubInstance(java.lang.String)
+ */
+ @Override
+ public Object createNewSubInstance(String subType) {
+ throw new NotImplementedException("sub types are not supported on this schema helper");
+ }
}
return gsonBuilder.create();
}
-
}
}
assertEquals(true, schemaHelper0.createNewInstance("true"));
-
try {
schemaHelper1.createNewInstance();
fail("this test should throw an exception here");
assertEquals("", schemaHelper2.createNewInstance());
assertEquals("true", schemaHelper2.createNewInstance("true"));
+
+ try {
+ schemaHelper1.createNewSubInstance("SomeSubtype");
+ fail("this test should throw an exception here");
+ } catch (final Exception e) {
+ assertEquals("sub types are not supported on this schema helper", e.getMessage());
+ }
}
}
import com.google.gson.JsonElement;
import java.io.ByteArrayOutputStream;
+import java.util.LinkedHashSet;
+import java.util.Set;
import org.apache.avro.Schema;
+import org.apache.avro.Schema.Field;
+import org.apache.avro.Schema.Type;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.JsonEncoder;
import org.onap.policy.apex.context.ContextRuntimeException;
import org.onap.policy.apex.context.impl.schema.AbstractSchemaHelper;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
import org.onap.policy.apex.model.basicmodel.concepts.AxKey;
import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
import org.slf4j.ext.XLogger;
// Create a new instance using the Avro object mapper
final Object newInstance = avroObjectMapper.createNewInstance(avroSchema);
- // If no new instance is created, use default schema handler behavior
+ // If no new instance is created, use default schema handler behaviour
if (newInstance != null) {
return newInstance;
} else {
}
}
+ @Override
+ public Object createNewSubInstance(final String subInstanceType) {
+ final Set<String> foundTypes = new LinkedHashSet<>();
+
+ Object subInstance = createNewSubInstance(avroSchema, subInstanceType, foundTypes);
+
+ if (subInstance != null) {
+ return subInstance;
+ } else {
+ final String returnString = getUserKey().getId() + ": the schema \"" + avroSchema.getName()
+ + "\" does not have a subtype of type \"" + subInstanceType + "\"";
+ LOGGER.warn(returnString);
+ throw new ContextRuntimeException(returnString);
+ }
+ }
+
+ /**
+ * Create an instance of a sub type of this type.
+ *
+ * @param schema the Avro schema of the the type
+ * @param subInstanceType the sub type
+ * @param foundTypes types we have already found
+ * @return the sub type schema or null if it is not created
+ */
+ private Object createNewSubInstance(Schema schema, String subInstanceType, final Set<String> foundTypes) {
+ // Try Array element types
+ if (Type.ARRAY == schema.getType()) {
+ Object newInstance = instantiateSubInstance(subInstanceType, schema.getElementType(), foundTypes);
+ if (newInstance != null) {
+ return newInstance;
+ }
+ }
+
+ if (Type.MAP == schema.getType()) {
+ Object newInstance = instantiateSubInstance(subInstanceType, schema.getValueType(), foundTypes);
+ if (newInstance != null) {
+ return newInstance;
+ }
+ }
+
+ if (Type.RECORD == schema.getType()) {
+ for (Field field : schema.getFields()) {
+ Object newInstance = instantiateSubInstance(subInstanceType, field.schema(), foundTypes);
+ if (newInstance != null) {
+ return newInstance;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Instantiate a sub instance of a type.
+ *
+ * @param subInstanceType the type of the sub instance to create
+ * @param subSchema the sub schema we have received
+ * @param foundTypes types we have already found
+ * @return an instance of the type or null if it is the incorrect type
+ */
+ private Object instantiateSubInstance(final String subInstanceType, final Schema subSchema,
+ final Set<String> foundTypes) {
+ if (subSchema == null) {
+ return null;
+ }
+
+ // Check for recursive use of field names in records, if we have already checked a field name
+ // skip it this time.
+ if (foundTypes.contains(subSchema.getName())) {
+ return null;
+ }
+
+ foundTypes.add(subSchema.getName());
+
+ if (subSchema.getName().equals(subInstanceType)) {
+ return new AvroObjectMapperFactory().get(AxArtifactKey.getNullKey(), subSchema)
+ .createNewInstance(subSchema);
+ }
+ return createNewSubInstance(subSchema, subInstanceType, foundTypes);
+ }
+
@Override
public Object unmarshal(final Object object) {
// If an object is already in the correct format, just carry on
import java.io.IOException;
import java.util.HashMap;
+import org.apache.avro.generic.GenericRecord;
import org.apache.avro.util.Utf8;
import org.junit.After;
import org.junit.Before;
* The Class TestAvroSchemaMap.
*
* @author Liam Fallon (liam.fallon@ericsson.com)
- * @version
+ * @version
*/
public class TestAvroSchemaMap {
private final AxKey testKey = new AxArtifactKey("AvroTest", "0.0.1");
ModelService.registerModel(AxContextSchemas.class, schemas);
longMapSchema = TextFileUtils.getTextFileAsString("src/test/resources/avsc/MapExampleLong.avsc");
addressMapSchema = TextFileUtils.getTextFileAsString("src/test/resources/avsc/MapExampleAddress.avsc");
- addressMapSchemaInvalidFields =
- TextFileUtils.getTextFileAsString("src/test/resources/avsc/MapExampleAddressInvalidFields.avsc");
+ addressMapSchemaInvalidFields = TextFileUtils
+ .getTextFileAsString("src/test/resources/avsc/MapExampleAddressInvalidFields.avsc");
}
/**
schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
schemaParameters.getSchemaHelperParameterMap().put("AVRO", new AvroSchemaHelperParameters());
ParameterService.register(schemaParameters);
-
+
}
/**
*/
@Test
public void testMapInit() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", addressMapSchema);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ addressMapSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
final HashMap<?, ?> newMapFull = (HashMap<?, ?>) schemaHelper.createNewInstance(inString);
assertEquals("{\"streetaddress\": \"221 B Baker St.\", \"city\": \"London\"}",
- newMapFull.get(new Utf8("address2")).toString());
+ newMapFull.get(new Utf8("address2")).toString());
}
/**
*/
@Test
public void testLongMapUnmarshalMarshal() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO", longMapSchema);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO",
+ longMapSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
*/
@Test
public void testAddressMapUnmarshalMarshal() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO", addressMapSchema);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO",
+ addressMapSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
testUnmarshalMarshal(schemaHelper, "src/test/resources/data/MapExampleAddressFull.json");
}
+ /**
+ * Test sub record create.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ @Test
+ public void testSubRecordCreateRecord() throws IOException {
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO",
+ addressMapSchema);
+
+ schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
+ final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
+
+ GenericRecord subRecord = (GenericRecord) schemaHelper.createNewSubInstance("AddressUSRecord");
+ assertEquals(null, subRecord.get("streetAddress"));
+ }
+
/**
* Test address map unmarshal marshal invalid fields.
*
*/
@Test
public void testAddressMapUnmarshalMarshalInvalidFields() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO", addressMapSchemaInvalidFields);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroMap", "0.0.1"), "AVRO",
+ addressMapSchemaInvalidFields);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
package org.onap.policy.apex.plugins.context.schema.avro;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.io.IOException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.onap.policy.apex.context.ContextRuntimeException;
import org.onap.policy.apex.context.SchemaHelper;
import org.onap.policy.apex.context.impl.schema.SchemaHelperFactory;
import org.onap.policy.apex.context.parameters.ContextParameterConstants;
* The Class TestAvroSchemaRecord.
*
* @author Liam Fallon (liam.fallon@ericsson.com)
- * @version
+ * @version
*/
public class TestAvroSchemaRecord {
private final AxKey testKey = new AxArtifactKey("AvroTest", "0.0.1");
recordSchema = TextFileUtils.getTextFileAsString("src/test/resources/avsc/RecordExample.avsc");
recordSchemaVpn = TextFileUtils.getTextFileAsString("src/test/resources/avsc/RecordExampleVPN.avsc");
recordSchemaVpnReuse = TextFileUtils.getTextFileAsString("src/test/resources/avsc/RecordExampleVPNReuse.avsc");
- recordSchemaInvalidFields =
- TextFileUtils.getTextFileAsString("src/test/resources/avsc/RecordExampleInvalidFields.avsc");
+ recordSchemaInvalidFields = TextFileUtils
+ .getTextFileAsString("src/test/resources/avsc/RecordExampleInvalidFields.avsc");
}
/**
schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
schemaParameters.getSchemaHelperParameterMap().put("AVRO", new AvroSchemaHelperParameters());
ParameterService.register(schemaParameters);
-
+
}
/**
*/
@Test
public void testRecordInit() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", recordSchema);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
*/
@Test
public void testRecordUnmarshalMarshal() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", recordSchema);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
testUnmarshalMarshal(schemaHelper, "src/test/resources/data/RecordExampleFull.json");
}
+ /**
+ * Test record create.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ @Test
+ public void testRecordCreateRecord() throws IOException {
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchema);
+
+ schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
+ final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
+
+ GenericRecord subRecord = (GenericRecord) schemaHelper.createNewSubInstance("AddressUSRecord");
+ assertEquals(null, subRecord.get("streetAddress"));
+
+ subRecord = (GenericRecord) schemaHelper.createNewSubInstance("EmailAddress");
+ assertEquals(null, subRecord.get("address"));
+
+ try {
+ subRecord = (GenericRecord) schemaHelper.createNewSubInstance("IDontExist");
+ fail("test should throw an exception here");
+ } catch (ContextRuntimeException cre) {
+ assertEquals("AvroTest:0.0.1: the schema \"User\" does not have a subtype of type \"IDontExist\"",
+ cre.getMessage());
+ }
+ }
+
/**
* Test record unmarshal marshal invalid.
*
*/
@Test
public void testRecordUnmarshalMarshalInvalid() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", recordSchemaInvalidFields);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchemaInvalidFields);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
*/
@Test
public void testVpnRecordUnmarshalMarshal() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", recordSchemaVpn);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchemaVpn);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
*/
@Test
public void testVpnRecordReuse() throws IOException {
- final AxContextSchema avroSchema =
- new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO", recordSchemaVpnReuse);
+ final AxContextSchema avroSchema = new AxContextSchema(new AxArtifactKey("AvroRecord", "0.0.1"), "AVRO",
+ recordSchemaVpnReuse);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);
schemas.getSchemasMap().put(avroSchema.getKey(), avroSchema);