Add YAML plugin and cleanup for checkstyle 55/54655/2
authorliamfallon <liam.fallon@ericsson.com>
Wed, 13 Jun 2018 15:50:59 +0000 (16:50 +0100)
committerliamfallon <liam.fallon@ericsson.com>
Thu, 14 Jun 2018 10:22:00 +0000 (11:22 +0100)
Bringing in the APEX YAML plugin, allows events with YAML bodies
to be consumed by APEX.

Also clean up of event protocol interface to make it not specific
for JSON.

Also some checkstyle changes on classes impacted by event
protocol interface change.

Change-Id: I7c3867ac508096fd8acad2488e61db87dfa1d6bd
Issue-ID: POLICY-862
Signed-off-by: liamfallon <liam.fallon@ericsson.com>
58 files changed:
context/context-management/src/main/java/org/onap/policy/apex/context/SchemaHelper.java
context/context-management/src/main/java/org/onap/policy/apex/context/impl/schema/java/JavaSchemaHelper.java
model/utilities/src/main/java/org/onap/policy/apex/model/utilities/typeutils/ClassBuilder.java
plugins/plugins-context/context-schema/context-schema-avro/src/main/java/org/onap/policy/apex/plugins/context/schema/avro/AvroSchemaHelper.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaArray.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaEnum.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaFixed.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaHelperMarshal.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaMap.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestAvroSchemaRecord.java
plugins/plugins-context/context-schema/context-schema-avro/src/test/java/org/onap/policy/apex/plugins/context/schema/avro/TestHealthCheckSchema.java
plugins/plugins-context/context-schema/pom.xml
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-xml/src/main/java/org/onap/policy/apex/plugins/event/protocol/xml/XMLEventProtocolParameters.java
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-xml/src/test/java/org/onap/policy/apex/plugins/event/protocol/xml/TestXMLTaggedEventConsumer.java
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/pom.xml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/Apex2YamlEventConverter.java [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/YamlEventProtocolParameters.java [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/package-info.java [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlEventProtocol.java [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlPluginStability.java [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection1.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection2.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection3.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection4.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection5.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty1.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure1.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure2.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure3.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure4.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure5.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/TOSCA0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection0_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection1_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection2_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection3_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection4_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection5_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Empty1_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_1.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_1.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure2_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure3_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure4_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure5_0.yaml [new file with mode: 0644]
plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/TOSCA0_0.yaml [new file with mode: 0644]
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/ApexEvent.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/filecarrierplugin/consumer/HeaderDelimitedTextBlockReader.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/Apex2JSONEventConverter.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/JSONEventProtocolParameters.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java
services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/eventprotocol/EventProtocolTextTokenDelimitedParameters.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/SuperTokenDelimitedEventProtocolParameters.java

index aa6ea9f..30af481 100644 (file)
@@ -20,8 +20,6 @@
 
 package org.onap.policy.apex.context;
 
-import com.google.gson.JsonElement;
-
 import org.onap.policy.apex.model.basicmodel.concepts.AxKey;
 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
 
@@ -86,12 +84,12 @@ public interface SchemaHelper {
     Object createNewInstance(String stringValue);
 
     /**
-     * Create a new instance of the schema class from a GSON JsonElement using whatever schema technology is being used.
+     * Create a new instance of the schema class from an object using whatever schema technology is being used.
      *
-     * @param jsonElement the JSON element that holds the Json representation of the object
+     * @param incomingObject the incoming object that holds the raw representation of the object to be created
      * @return the new instance
      */
-    Object createNewInstance(JsonElement jsonElement);
+    Object createNewInstance(Object incomingObject);
 
     /**
      * Unmarshal an object in schema format into a Java object.
@@ -107,13 +105,13 @@ public interface SchemaHelper {
      * @param schemaObject the object in schema format
      * @return the object as a Json string
      */
-    String marshal2Json(Object schemaObject);
+    String marshal2String(Object schemaObject);
 
     /**
-     * Marshal a Java object into a GSON json element.
+     * Marshal a Java object into an output object of an arbitrary type.
      *
      * @param schemaObject the object in schema format
-     * @return the object as a GSON Json element
+     * @return the object as output object of an arbitrary type
      */
-    JsonElement marshal2JsonElement(Object schemaObject);
+    Object marshal2Object(Object schemaObject);
 }
index b89efbf..e5d9239 100644 (file)
@@ -49,7 +49,7 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
     // This map defines the built in types in types in Java
     // @formatter:off
     private static final Map<String, Class<?>> BUILT_IN_MAP = new HashMap<>();
-    {
+    static {
         BUILT_IN_MAP.put("int",    Integer  .TYPE);
         BUILT_IN_MAP.put("long",   Long     .TYPE);
         BUILT_IN_MAP.put("double", Double   .TYPE);
@@ -69,7 +69,7 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
      * concepts. AxKey, org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema)
      */
     @Override
-    public void init(final AxKey userKey, final AxContextSchema schema) throws ContextRuntimeException {
+    public void init(final AxKey userKey, final AxContextSchema schema) {
         super.init(userKey, schema);
 
         final String javatype = schema.getSchema();
@@ -80,7 +80,7 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
         } catch (final IllegalArgumentException e) {
 
             String resultSting = userKey.getID() + ": class/type " + schema.getSchema() + " for context schema \""
-                    + schema.getID() + "\" not found.";
+                            + schema.getID() + "\" not found.";
             if (JavaSchemaHelper.BUILT_IN_MAP.get(javatype) != null) {
                 resultSting += " Primitive types are not supported. Use the appropriate Java boxing type instead.";
             } else {
@@ -94,13 +94,25 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
     /*
      * (non-Javadoc)
      *
-     * @see org.onap.policy.apex.context.SchemaHelper#createNewInstance(com.google.gson.JsonElement)
+     * @see org.onap.policy.apex.context.SchemaHelper#createNewInstance(java.lang.Object)
      */
     @Override
-    public Object createNewInstance(final JsonElement jsonElement) {
-        final String elementJsonString = new Gson().toJson(jsonElement);
+    public Object createNewInstance(final Object incomingObject) {
+        if (incomingObject instanceof JsonElement) {
+            final String elementJsonString = new Gson().toJson((JsonElement) incomingObject);
+            return new Gson().fromJson(elementJsonString, this.getSchemaClass());
+        }
+
+        if (getSchemaClass().isAssignableFrom(incomingObject.getClass())) {
+            return incomingObject;
+        }
 
-        return new Gson().fromJson(elementJsonString, this.getSchemaClass());
+        final String returnString = getUserKey().getID() + ": the object \"" + incomingObject + "\" of type \""
+                        + incomingObject.getClass().getCanonicalName()
+                        + "\" is not an instance of JsonObject and is not assignable to \""
+                        + getSchemaClass().getCanonicalName() + "\"";
+        LOGGER.warn(returnString);
+        throw new ContextRuntimeException(returnString);
     }
 
     /*
@@ -137,7 +149,7 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
      * @see org.onap.policy.apex.context.SchemaHelper#schemaObject2Json(java.lang.Object)
      */
     @Override
-    public String marshal2Json(final Object schemaObject) {
+    public String marshal2String(final Object schemaObject) {
         if (schemaObject == null) {
             return "null";
         }
@@ -148,8 +160,8 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
             return new Gson().toJson(schemaObject);
         } else {
             final String returnString = getUserKey().getID() + ": object \"" + schemaObject.toString()
-                    + "\" of class \"" + schemaObject.getClass().getCanonicalName() + "\" not compatible with class \""
-                    + getSchemaClass().getCanonicalName() + "\"";
+                            + "\" of class \"" + schemaObject.getClass().getCanonicalName()
+                            + "\" not compatible with class \"" + getSchemaClass().getCanonicalName() + "\"";
             LOGGER.warn(returnString);
             throw new ContextRuntimeException(returnString);
         }
@@ -161,7 +173,7 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
      * @see org.onap.policy.apex.context.SchemaHelper#marshal2JsonElement(java.lang.Object)
      */
     @Override
-    public JsonElement marshal2JsonElement(final Object schemaObject) {
+    public Object marshal2Object(final Object schemaObject) {
         // Use Gson to marshal the schema object into a Json element to return
         return new Gson().toJsonTree(schemaObject, getSchemaClass());
     }
@@ -169,7 +181,8 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
     /**
      * Do a numeric conversion between numeric types.
      *
-     * @param object The incoming numeric object
+     * @param object
+     *        The incoming numeric object
      * @return The converted object
      */
     private Object numericConversion(final Object object) {
@@ -195,7 +208,8 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
     /**
      * Do a string conversion to the class type.
      *
-     * @param object The incoming numeric object
+     * @param object
+     *        The incoming numeric object
      * @return The converted object
      */
     private Object stringConversion(final Object object) {
@@ -205,8 +219,8 @@ public class JavaSchemaHelper extends AbstractSchemaHelper {
             return stringConstructor.newInstance(object.toString());
         } catch (final Exception e) {
             final String returnString = getUserKey().getID() + ": object \"" + object.toString() + "\" of class \""
-                    + object.getClass().getCanonicalName() + "\" not compatible with class \""
-                    + getSchemaClass().getCanonicalName() + "\"";
+                            + object.getClass().getCanonicalName() + "\" not compatible with class \""
+                            + getSchemaClass().getCanonicalName() + "\"";
             LOGGER.warn(returnString);
             throw new ContextRuntimeException(returnString);
         }
index e806bd7..b4f9d2f 100644 (file)
@@ -36,7 +36,6 @@ import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
  * <a href="https://github.com/KetothXupack/stackoverflow-answers/tree/master/q39401083">
  * https://github.com/KetothXupack/stackoverflow-answers/tree/master/q39401083</a><br>
  */
-@SuppressWarnings("restriction")
 public class ClassBuilder {
     private final Class<?> clazz;
     private final List<ClassBuilder> parameters = new ArrayList<>();
index b4cc386..5fba274 100644 (file)
@@ -113,11 +113,19 @@ public class AvroSchemaHelper extends AbstractSchemaHelper {
     }
 
     @Override
-    public Object createNewInstance(final JsonElement jsonElement) {
-        final Gson gson = new GsonBuilder().serializeNulls().create();
-        final String elementJsonString = gson.toJson(jsonElement);
+    public Object createNewInstance(final Object incomingObject) {
+        if (incomingObject instanceof JsonElement) {
+            final Gson gson = new GsonBuilder().serializeNulls().create();
+            final String elementJsonString = gson.toJson((JsonElement) incomingObject);
 
-        return createNewInstance(elementJsonString);
+            return createNewInstance(elementJsonString);
+        }
+        else {
+            final String returnString = getUserKey().getID() + ": the object \"" + incomingObject
+            + "\" is not an instance of JsonObject";
+            LOGGER.warn(returnString);
+            throw new ContextRuntimeException(returnString);
+        }
     }
 
     @Override
@@ -191,7 +199,7 @@ public class AvroSchemaHelper extends AbstractSchemaHelper {
     }
 
     @Override
-    public String marshal2Json(final Object object) {
+    public String marshal2String(final Object object) {
         // Condition the object for Avro encoding
         final Object conditionedObject = avroObjectMapper.mapToAvro(object);
 
@@ -217,9 +225,9 @@ public class AvroSchemaHelper extends AbstractSchemaHelper {
     }
 
     @Override
-    public JsonElement marshal2JsonElement(final Object schemaObject) {
+    public JsonElement marshal2Object(final Object schemaObject) {
         // Get the object as a Json string
-        final String schemaObjectAsString = marshal2Json(schemaObject);
+        final String schemaObjectAsString = marshal2String(schemaObject);
 
         // Get a Gson instance to convert the Json string to an object created by Json
         final Gson gson = new Gson();
index dc65c10..21fab66 100644 (file)
@@ -101,7 +101,7 @@ public class TestAvroSchemaArray {
     private void testUnmarshalMarshal(final SchemaHelper schemaHelper, final String fileName) throws IOException {
         final String inString = TextFileUtils.getTextFileAsString(fileName);
         final Array<?> schemaObject = (Array<?>) schemaHelper.unmarshal(inString);
-        final String outString = schemaHelper.marshal2Json(schemaObject);
+        final String outString = schemaHelper.marshal2String(schemaObject);
         assertEquals(inString.replaceAll("\\s+", ""), outString.replaceAll("\\s+", ""));
     }
 }
index 0302345..ae19cd3 100644 (file)
@@ -114,7 +114,7 @@ public class TestAvroSchemaEnum {
     private void testUnmarshalMarshal(final SchemaHelper schemaHelper, final String fileName) throws IOException {
         final String inString = TextFileUtils.getTextFileAsString(fileName);
         final EnumSymbol decodedObject = (EnumSymbol) schemaHelper.unmarshal(inString);
-        final String outString = schemaHelper.marshal2Json(decodedObject);
+        final String outString = schemaHelper.marshal2String(decodedObject);
         assertEquals(inString.replaceAll("[\\r?\\n]+", " "), outString.replaceAll("[\\r?\\n]+", " "));
     }
 }
index f4906e5..41f6221 100644 (file)
@@ -124,7 +124,7 @@ public class TestAvroSchemaFixed {
     private void testUnmarshalMarshal(final SchemaHelper schemaHelper, final String fileName) throws IOException {
         final String inString = TextFileUtils.getTextFileAsString(fileName);
         final Fixed decodedObject = (Fixed) schemaHelper.unmarshal(inString);
-        final String outString = schemaHelper.marshal2Json(decodedObject);
+        final String outString = schemaHelper.marshal2String(decodedObject);
         assertEquals(inString.replaceAll("[\\r?\\n]+", " "), outString.replaceAll("[\\r?\\n]+", " "));
     }
 }
index 1b35d82..a710a23 100644 (file)
@@ -59,9 +59,9 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper0 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroNullSchema.getKey());
 
-        assertEquals("null", schemaHelper0.marshal2Json(null));
-        assertEquals("null", schemaHelper0.marshal2Json(123));
-        assertEquals("null", schemaHelper0.marshal2Json("Everything is marshalled to Null, no matter what it is"));
+        assertEquals("null", schemaHelper0.marshal2String(null));
+        assertEquals("null", schemaHelper0.marshal2String(123));
+        assertEquals("null", schemaHelper0.marshal2String("Everything is marshalled to Null, no matter what it is"));
     }
 
     @Test
@@ -73,10 +73,10 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper1 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroBooleanSchema.getKey());
 
-        assertEquals("true", schemaHelper1.marshal2Json(true));
-        assertEquals("false", schemaHelper1.marshal2Json(false));
+        assertEquals("true", schemaHelper1.marshal2String(true));
+        assertEquals("false", schemaHelper1.marshal2String(false));
         try {
-            schemaHelper1.marshal2Json(0);
+            schemaHelper1.marshal2String(0);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             e.printStackTrace();
@@ -85,7 +85,7 @@ public class TestAvroSchemaHelperMarshal {
                     e.getMessage());
         }
         try {
-            schemaHelper1.marshal2Json("0");
+            schemaHelper1.marshal2String("0");
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             e.printStackTrace();
@@ -104,22 +104,22 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper2 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroIntSchema.getKey());
 
-        assertEquals("0", schemaHelper2.marshal2Json(0));
-        assertEquals("1", schemaHelper2.marshal2Json(1));
-        assertEquals("-1", schemaHelper2.marshal2Json(-1));
-        assertEquals("1", schemaHelper2.marshal2Json(1.23));
-        assertEquals("-1", schemaHelper2.marshal2Json(-1.23));
-        assertEquals("2147483647", schemaHelper2.marshal2Json(2147483647));
-        assertEquals("-2147483648", schemaHelper2.marshal2Json(-2147483648));
+        assertEquals("0", schemaHelper2.marshal2String(0));
+        assertEquals("1", schemaHelper2.marshal2String(1));
+        assertEquals("-1", schemaHelper2.marshal2String(-1));
+        assertEquals("1", schemaHelper2.marshal2String(1.23));
+        assertEquals("-1", schemaHelper2.marshal2String(-1.23));
+        assertEquals("2147483647", schemaHelper2.marshal2String(2147483647));
+        assertEquals("-2147483648", schemaHelper2.marshal2String(-2147483648));
         try {
-            schemaHelper2.marshal2Json("Hello");
+            schemaHelper2.marshal2String("Hello");
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage().startsWith(
                     "AvroTest:0.0.1: object \"Hello\" Avro marshalling failed: java.lang.String cannot be cast to java.lang.Number"));
         }
         try {
-            schemaHelper2.marshal2Json(null);
+            schemaHelper2.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
@@ -136,20 +136,20 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper3 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroLongSchema.getKey());
 
-        assertEquals("0", schemaHelper3.marshal2Json(0L));
-        assertEquals("1", schemaHelper3.marshal2Json(1L));
-        assertEquals("-1", schemaHelper3.marshal2Json(-1L));
-        assertEquals("9223372036854775807", schemaHelper3.marshal2Json(9223372036854775807L));
-        assertEquals("-9223372036854775808", schemaHelper3.marshal2Json(-9223372036854775808L));
+        assertEquals("0", schemaHelper3.marshal2String(0L));
+        assertEquals("1", schemaHelper3.marshal2String(1L));
+        assertEquals("-1", schemaHelper3.marshal2String(-1L));
+        assertEquals("9223372036854775807", schemaHelper3.marshal2String(9223372036854775807L));
+        assertEquals("-9223372036854775808", schemaHelper3.marshal2String(-9223372036854775808L));
         try {
-            schemaHelper3.marshal2Json("Hello");
+            schemaHelper3.marshal2String("Hello");
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage().startsWith(
                     "AvroTest:0.0.1: object \"Hello\" Avro marshalling failed: java.lang.String cannot be cast to java.lang.Long"));
         }
         try {
-            schemaHelper3.marshal2Json(null);
+            schemaHelper3.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
@@ -166,24 +166,24 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper4 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroFloatSchema.getKey());
 
-        assertEquals("0.0", schemaHelper4.marshal2Json(0F));
-        assertEquals("1.0", schemaHelper4.marshal2Json(1F));
-        assertEquals("-1.0", schemaHelper4.marshal2Json(-1F));
-        assertEquals("1.23", schemaHelper4.marshal2Json(1.23F));
-        assertEquals("-1.23", schemaHelper4.marshal2Json(-1.23F));
-        assertEquals("9.223372E18", schemaHelper4.marshal2Json(9.223372E18F));
-        assertEquals("-9.223372E18", schemaHelper4.marshal2Json(-9.223372E18F));
-        assertEquals("9.223372E18", schemaHelper4.marshal2Json(9.223372E18F));
-        assertEquals("-9.223372E18", schemaHelper4.marshal2Json(-9.223372E18F));
+        assertEquals("0.0", schemaHelper4.marshal2String(0F));
+        assertEquals("1.0", schemaHelper4.marshal2String(1F));
+        assertEquals("-1.0", schemaHelper4.marshal2String(-1F));
+        assertEquals("1.23", schemaHelper4.marshal2String(1.23F));
+        assertEquals("-1.23", schemaHelper4.marshal2String(-1.23F));
+        assertEquals("9.223372E18", schemaHelper4.marshal2String(9.223372E18F));
+        assertEquals("-9.223372E18", schemaHelper4.marshal2String(-9.223372E18F));
+        assertEquals("9.223372E18", schemaHelper4.marshal2String(9.223372E18F));
+        assertEquals("-9.223372E18", schemaHelper4.marshal2String(-9.223372E18F));
         try {
-            schemaHelper4.marshal2Json("Hello");
+            schemaHelper4.marshal2String("Hello");
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage().startsWith(
                     "AvroTest:0.0.1: object \"Hello\" Avro marshalling failed: java.lang.String cannot be cast to java.lang.Float"));
         }
         try {
-            schemaHelper4.marshal2Json(null);
+            schemaHelper4.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
@@ -201,24 +201,24 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper5 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroDoubleSchema.getKey());
 
-        assertEquals("0.0", schemaHelper5.marshal2Json(0D));
-        assertEquals("1.0", schemaHelper5.marshal2Json(1D));
-        assertEquals("-1.0", schemaHelper5.marshal2Json(-1D));
-        assertEquals("1.23", schemaHelper5.marshal2Json(1.23));
-        assertEquals("-1.23", schemaHelper5.marshal2Json(-1.23));
-        assertEquals("9.223372036854776E18", schemaHelper5.marshal2Json(9.223372036854776E18));
-        assertEquals("-9.223372036854776E18", schemaHelper5.marshal2Json(-9.223372036854776E18));
-        assertEquals("9.223372036854776E18", schemaHelper5.marshal2Json(9.223372036854776E18));
-        assertEquals("-9.223372036854776E18", schemaHelper5.marshal2Json(-9.223372036854776E18));
+        assertEquals("0.0", schemaHelper5.marshal2String(0D));
+        assertEquals("1.0", schemaHelper5.marshal2String(1D));
+        assertEquals("-1.0", schemaHelper5.marshal2String(-1D));
+        assertEquals("1.23", schemaHelper5.marshal2String(1.23));
+        assertEquals("-1.23", schemaHelper5.marshal2String(-1.23));
+        assertEquals("9.223372036854776E18", schemaHelper5.marshal2String(9.223372036854776E18));
+        assertEquals("-9.223372036854776E18", schemaHelper5.marshal2String(-9.223372036854776E18));
+        assertEquals("9.223372036854776E18", schemaHelper5.marshal2String(9.223372036854776E18));
+        assertEquals("-9.223372036854776E18", schemaHelper5.marshal2String(-9.223372036854776E18));
         try {
-            schemaHelper5.marshal2Json("Hello");
+            schemaHelper5.marshal2String("Hello");
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage().startsWith(
                     "AvroTest:0.0.1: object \"Hello\" Avro marshalling failed: java.lang.String cannot be cast to java.lang.Double"));
         }
         try {
-            schemaHelper5.marshal2Json(null);
+            schemaHelper5.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
@@ -235,18 +235,18 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper7 =
                 new SchemaHelperFactory().createSchemaHelper(testKey, avroStringSchema.getKey());
 
-        assertEquals("\"0\"", schemaHelper7.marshal2Json("0"));
-        assertEquals("\"1\"", schemaHelper7.marshal2Json("1"));
-        assertEquals("\"-1\"", schemaHelper7.marshal2Json("-1"));
-        assertEquals("\"1.23\"", schemaHelper7.marshal2Json("1.23"));
-        assertEquals("\"-1.23\"", schemaHelper7.marshal2Json("-1.23"));
-        assertEquals("\"9223372036854775807\"", schemaHelper7.marshal2Json("9223372036854775807"));
-        assertEquals("\"-9223372036854775808\"", schemaHelper7.marshal2Json("-9223372036854775808"));
-        assertEquals("\"9223372036854775808\"", schemaHelper7.marshal2Json("9223372036854775808"));
-        assertEquals("\"-9223372036854775809\"", schemaHelper7.marshal2Json("-9223372036854775809"));
-        assertEquals("\"Hello\"", schemaHelper7.marshal2Json("Hello"));
+        assertEquals("\"0\"", schemaHelper7.marshal2String("0"));
+        assertEquals("\"1\"", schemaHelper7.marshal2String("1"));
+        assertEquals("\"-1\"", schemaHelper7.marshal2String("-1"));
+        assertEquals("\"1.23\"", schemaHelper7.marshal2String("1.23"));
+        assertEquals("\"-1.23\"", schemaHelper7.marshal2String("-1.23"));
+        assertEquals("\"9223372036854775807\"", schemaHelper7.marshal2String("9223372036854775807"));
+        assertEquals("\"-9223372036854775808\"", schemaHelper7.marshal2String("-9223372036854775808"));
+        assertEquals("\"9223372036854775808\"", schemaHelper7.marshal2String("9223372036854775808"));
+        assertEquals("\"-9223372036854775809\"", schemaHelper7.marshal2String("-9223372036854775809"));
+        assertEquals("\"Hello\"", schemaHelper7.marshal2String("Hello"));
         try {
-            schemaHelper7.marshal2Json(null);
+            schemaHelper7.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
@@ -263,11 +263,11 @@ public class TestAvroSchemaHelperMarshal {
         final SchemaHelper schemaHelper = new SchemaHelperFactory().createSchemaHelper(testKey, avroSchema.getKey());
 
         final byte[] helloBytes = {104, 101, 108, 108, 111};
-        final String helloOut = schemaHelper.marshal2Json(helloBytes);
+        final String helloOut = schemaHelper.marshal2String(helloBytes);
         assertEquals("\"hello\"", helloOut);
 
         try {
-            schemaHelper.marshal2Json(null);
+            schemaHelper.marshal2String(null);
             fail("Test should throw an exception here");
         } catch (final Exception e) {
             assertTrue(e.getMessage()
index 74591bb..33ca512 100644 (file)
@@ -118,7 +118,7 @@ public class TestAvroSchemaMap {
         final String originalInString = TextFileUtils.getTextFileAsString(fileName);
         final HashMap<?, ?> firstDecodedMap = (HashMap<?, ?>) schemaHelper.unmarshal(originalInString);
 
-        final String outString = schemaHelper.marshal2Json(firstDecodedMap);
+        final String outString = schemaHelper.marshal2String(firstDecodedMap);
 
         final File tempOutFile = File.createTempFile("ApexAvro", ".json");
         TextFileUtils.putStringAsFile(outString, tempOutFile);
index b793ef0..e142360 100644 (file)
@@ -124,7 +124,7 @@ public class TestAvroSchemaRecord {
     private void testUnmarshalMarshal(final SchemaHelper schemaHelper, final String fileName) throws IOException {
         final String inString = TextFileUtils.getTextFileAsString(fileName);
         final GenericRecord decodedObject = (GenericRecord) schemaHelper.unmarshal(inString);
-        final String outString = schemaHelper.marshal2Json(decodedObject);
+        final String outString = schemaHelper.marshal2String(decodedObject);
         assertEquals(inString.replaceAll("\\s+", ""), outString.replaceAll("\\s+", ""));
     }
 }
index c32d9b3..026125a 100644 (file)
@@ -106,14 +106,14 @@ public class TestHealthCheckSchema {
         commonHeaderFlagsRecord.put("mode", "EXCLUSIVE");
 
         final String eventString = TextFileUtils.getTextFileAsString("src/test/resources/data/HealthCheckEvent.json");
-        final String outString = schemaHelper.marshal2Json(healthCheckRecord);
+        final String outString = schemaHelper.marshal2String(healthCheckRecord);
         assertEquals(eventString.toString().replaceAll("\\s+", ""), outString.replaceAll("\\s+", ""));
     }
 
     private void testUnmarshalMarshal(final SchemaHelper schemaHelper, final String fileName) throws IOException {
         final String inString = TextFileUtils.getTextFileAsString(fileName);
         final GenericRecord decodedObject = (GenericRecord) schemaHelper.unmarshal(inString);
-        final String outString = schemaHelper.marshal2Json(decodedObject);
+        final String outString = schemaHelper.marshal2String(decodedObject);
         assertEquals(inString.replaceAll("\\s+", ""), outString.replaceAll("\\s+", ""));
     }
 }
index f72ec15..d60cb55 100644 (file)
@@ -35,4 +35,4 @@
     <modules>
         <module>context-schema-avro</module>
     </modules>
-</project>
\ No newline at end of file
+</project>
index e96a3f5..0eeb497 100644 (file)
@@ -45,7 +45,7 @@ public class XMLEventProtocolParameters extends EventProtocolTextTokenDelimitedP
         this.setLabel(XML_EVENT_PROTOCOL_LABEL);
 
         // Set the starting and ending delimiters for text blocks of XML events
-        this.setDelimiterToken(XML_TEXT_DELIMITER_TOKEN);
+        this.setStartDelimiterToken(XML_TEXT_DELIMITER_TOKEN);
 
         // Set the event protocol plugin class
         this.setEventProtocolPluginClass(Apex2XMLEventConverter.class.getCanonicalName());
index 761357a..e02c86a 100644 (file)
@@ -41,7 +41,7 @@ public class TestXMLTaggedEventConsumer {
     public void testGarbageTextLine() throws IOException {
         final InputStream xmlInputStream = new ByteArrayInputStream("hello there".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -54,7 +54,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream =
                 new ByteArrayInputStream("1469781869268</TestTimestamp></MainTag>".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -67,7 +67,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -80,7 +80,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "Garbage<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -92,7 +92,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "Garbage<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>Rubbish".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -104,7 +104,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>Rubbish".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -117,7 +117,7 @@ public class TestXMLTaggedEventConsumer {
     public void testGarbageTextMultiLine() throws IOException {
         final InputStream xmlInputStream = new ByteArrayInputStream("hello\nthere".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -129,7 +129,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream =
                 new ByteArrayInputStream("1469781869268\n</TestTimestamp>\n</MainTag>".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -141,7 +141,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n\n".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -155,7 +155,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "Garbage\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n\n".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -170,7 +170,7 @@ public class TestXMLTaggedEventConsumer {
                 "Garbage\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\nRubbish\n\n"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -184,7 +184,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\nRubbish".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -199,7 +199,7 @@ public class TestXMLTaggedEventConsumer {
                 "1469781869268</TestTimestamp></MainTag><?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp>"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -212,7 +212,7 @@ public class TestXMLTaggedEventConsumer {
                 "Garbage<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag><?xml><MainTag><TestTimestamp>"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -225,7 +225,7 @@ public class TestXMLTaggedEventConsumer {
                 "Garbage<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>Rubbish<?xml><MainTag><TestTimestamp>\nRefuse"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -238,7 +238,7 @@ public class TestXMLTaggedEventConsumer {
                 "<?xml><MainTag><TestTimestamp>1469781869268</TestTimestamp></MainTag>Rubbish<?xml><MainTag><TestTimestamp>Refuse"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -252,7 +252,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "1469781869268\n</TestTimestamp>\n</MainTag>\n<?xml>\n<MainTag>\n<TestTimestamp>".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -266,7 +266,7 @@ public class TestXMLTaggedEventConsumer {
                 "<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -286,7 +286,7 @@ public class TestXMLTaggedEventConsumer {
                 "Garbage\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\n"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -306,7 +306,7 @@ public class TestXMLTaggedEventConsumer {
                 "Garbage\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\nRubbish\n<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\nRefuse\n"
                         .getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         TextBlock textBlock = xmlTaggedReader.readTextBlock();
@@ -325,7 +325,7 @@ public class TestXMLTaggedEventConsumer {
         final InputStream xmlInputStream = new ByteArrayInputStream(
                 "<?xml>\n<MainTag>\n<TestTimestamp>1469781869268</TestTimestamp>\n</MainTag>\nRubbish".getBytes());
 
-        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml");
+        final HeaderDelimitedTextBlockReader xmlTaggedReader = new HeaderDelimitedTextBlockReader("<?xml", null, true);
         xmlTaggedReader.init(xmlInputStream);
 
         final TextBlock textBlock = xmlTaggedReader.readTextBlock();
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/pom.xml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/pom.xml
new file mode 100644 (file)
index 0000000..c44b09f
--- /dev/null
@@ -0,0 +1,50 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2018 Ericsson. All rights reserved.
+  ================================================================================
+  Licensed 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.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.policy.apex-pdp.plugins.plugins-event.plugins-event-protocol</groupId>
+        <artifactId>plugins-event-protocol</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>plugins-event-protocol-yaml</artifactId>
+    <name>${project.artifactId}</name>
+    <description>[${project.parent.artifactId}] Plugins for handling events that are being transported as YAML documents</description>
+
+    <properties>
+        <apex-plugins-event-protocol-yaml-dir>${project.basedir}/src</apex-plugins-event-protocol-yaml-dir>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>1.21</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.apex-pdp.plugins.plugins-context.context-schema</groupId>
+            <artifactId>context-schema-avro</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/Apex2YamlEventConverter.java b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/Apex2YamlEventConverter.java
new file mode 100644 (file)
index 0000000..689b1e7
--- /dev/null
@@ -0,0 +1,387 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.plugins.event.protocol.yaml;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.onap.policy.apex.context.SchemaHelper;
+import org.onap.policy.apex.context.impl.schema.SchemaHelperFactory;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
+import org.onap.policy.apex.model.eventmodel.concepts.AxField;
+import org.onap.policy.apex.service.engine.event.ApexEvent;
+import org.onap.policy.apex.service.engine.event.ApexEventException;
+import org.onap.policy.apex.service.engine.event.ApexEventProtocolConverter;
+import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
+import org.onap.policy.apex.service.parameters.eventprotocol.EventProtocolParameters;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+
+/**
+ * The Class Apex2YamlEventConverter converts {@link ApexEvent} instances to and from YAML string representations of
+ * Apex events.
+ *
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class Apex2YamlEventConverter implements ApexEventProtocolConverter {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(Apex2YamlEventConverter.class);
+
+    // The parameters for the YAML event protocol
+    private YamlEventProtocolParameters yamlPars;
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.onap.policy.apex.service.engine.event.ApexEventProtocolConverter#init(org.onap.policy.
+     * apex.service.parameters.eventprotocol.EventProtocolParameters)
+     */
+    @Override
+    public void init(final EventProtocolParameters parameters) {
+        // Check and get the YAML parameters
+        if (!(parameters instanceof YamlEventProtocolParameters)) {
+            final String errorMessage = "specified consumer properties are not applicable to the YAML event protocol";
+            LOGGER.warn(errorMessage);
+            throw new ApexEventRuntimeException(errorMessage);
+        }
+
+        yamlPars = (YamlEventProtocolParameters) parameters;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#toApexEvent(java.lang.String, java.lang.Object)
+     */
+    @Override
+    public List<ApexEvent> toApexEvent(final String eventName, final Object eventObject) throws ApexEventException {
+        // Check the event eventObject
+        if (eventObject == null) {
+            LOGGER.warn("event processing failed, event is null");
+            throw new ApexEventException("event processing failed, event is null");
+        }
+
+        // Cast the event to a string, if our conversion is correctly configured, this cast should
+        // always work
+        if (!(eventObject instanceof String)) {
+            final String errorMessage = "error converting event \"" + eventObject + "\" to a string";
+            LOGGER.debug(errorMessage);
+            throw new ApexEventException(errorMessage);
+        }
+
+        final String yamlEventString = (String) eventObject;
+
+        // The list of events we will return
+        final List<ApexEvent> eventList = new ArrayList<>();
+
+        // Convert the YAML document string into an object
+        Object yamlObject = new Yaml().load(yamlEventString);
+
+        // If the incoming YAML did not create a map it is a primitive type or a collection so we
+        // convert it into a map for processing
+        Map<?, ?> yamlMap;
+        if (yamlObject != null && yamlObject instanceof Map) {
+            // We already have a map so just cast the object
+            yamlMap = (Map<?, ?>) yamlObject;
+        }
+        else {
+            // Create a single entry map, new map creation and assignment is to avoid a
+            // type checking warning
+            LinkedHashMap<String, Object> newYamlMap = new LinkedHashMap<>();
+            newYamlMap.put(yamlPars.getYamlFieldName(), yamlObject);
+            yamlMap = newYamlMap;
+        }
+
+        try {
+            eventList.add(yamlMap2ApexEvent(eventName, yamlMap));
+        } catch (final Exception e) {
+            final String errorString = "Failed to unmarshal YAML event: " + e.getMessage() + ", event="
+                            + yamlEventString;
+            LOGGER.warn(errorString, e);
+            throw new ApexEventException(errorString, e);
+        }
+
+        // Return the list of events we have unmarshalled
+        return eventList;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#fromApexEvent(org.onap.policy.
+     * apex.service.engine.event.ApexEvent)
+     */
+    @Override
+    public Object fromApexEvent(final ApexEvent apexEvent) throws ApexEventException {
+        // Check the Apex event
+        if (apexEvent == null) {
+            LOGGER.warn("event processing failed, Apex event is null");
+            throw new ApexEventException("event processing failed, Apex event is null");
+        }
+
+        // Get the event definition for the event from the model service
+        final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(apexEvent.getName(),
+                        apexEvent.getVersion());
+
+        // Create a map for output of the APEX event to YAML
+        LinkedHashMap<String, Object> yamlMap = new LinkedHashMap<>();
+
+        yamlMap.put(ApexEvent.NAME_HEADER_FIELD, apexEvent.getName());
+        yamlMap.put(ApexEvent.VERSION_HEADER_FIELD, apexEvent.getVersion());
+        yamlMap.put(ApexEvent.NAMESPACE_HEADER_FIELD, apexEvent.getNameSpace());
+        yamlMap.put(ApexEvent.SOURCE_HEADER_FIELD, apexEvent.getSource());
+        yamlMap.put(ApexEvent.TARGET_HEADER_FIELD, apexEvent.getTarget());
+
+        if (apexEvent.getExceptionMessage() != null) {
+            yamlMap.put(ApexEvent.EXCEPTION_MESSAGE_HEADER_FIELD, apexEvent.getExceptionMessage());
+        }
+
+        for (final AxField eventField : eventDefinition.getFields()) {
+            final String fieldName = eventField.getKey().getLocalName();
+
+            if (!apexEvent.containsKey(fieldName)) {
+                if (!eventField.getOptional()) {
+                    final String errorMessage = "error parsing " + eventDefinition.getID() + " event to Json. "
+                                    + "Field \"" + fieldName + "\" is missing, but is mandatory. Fields: " + apexEvent;
+                    LOGGER.debug(errorMessage);
+                    throw new ApexEventRuntimeException(errorMessage);
+                }
+                continue;
+            }
+
+            yamlMap.put(fieldName,  apexEvent.get(fieldName));
+        }
+
+        // Use Snake YAML to convert the APEX event to YAML
+        Yaml yaml = new Yaml();
+        return yaml.dumpAs(yamlMap, null, FlowStyle.BLOCK);
+    }
+
+    /**
+     * This method converts a YAML map into an Apex event.
+     *
+     * @param eventName the name of the event
+     * @param yamlMap the YAML map that holds the event
+     * @return the apex event that we have converted the JSON object into
+     * @throws ApexEventException
+     *         thrown on unmarshaling exceptions
+     */
+    private ApexEvent yamlMap2ApexEvent(final String eventName, final Map<?, ?> yamlMap)
+                    throws ApexEventException {
+        // Process the mandatory Apex header
+        final ApexEvent apexEvent = processApexEventHeader(eventName, yamlMap);
+
+        // Get the event definition for the event from the model service
+        final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(apexEvent.getName(),
+                        apexEvent.getVersion());
+
+        // Iterate over the input fields in the event
+        for (final AxField eventField : eventDefinition.getFields()) {
+            final String fieldName = eventField.getKey().getLocalName();
+            if (!yamlMap.containsKey(fieldName)) {
+                if (!eventField.getOptional()) {
+                    final String errorMessage = "error parsing " + eventDefinition.getID() + " event from Json. "
+                                    + "Field \"" + fieldName + "\" is missing, but is mandatory.";
+                    LOGGER.debug(errorMessage);
+                    throw new ApexEventException(errorMessage);
+                }
+                continue;
+            }
+
+            final Object fieldValue = getYamlField(yamlMap, fieldName, null, !eventField.getOptional());
+
+            if (fieldValue != null) {
+                // Get the schema helper
+                final SchemaHelper fieldSchemaHelper = new SchemaHelperFactory().createSchemaHelper(eventField.getKey(),
+                                eventField.getSchema());
+                apexEvent.put(fieldName, fieldSchemaHelper.createNewInstance(fieldValue));
+            } else {
+                apexEvent.put(fieldName, null);
+            }
+        }
+        return apexEvent;
+
+    }
+
+    /**
+     * This method processes the event header of an Apex event.
+     *
+     * @param eventName the name of the event
+     * @param yamlMap the YAML map that holds the event
+     * @return an apex event constructed using the header fields of the event
+     * @throws ApexEventRuntimeException the apex event runtime exception
+     * @throws ApexEventException on invalid events with missing header fields
+     */
+    private ApexEvent processApexEventHeader(final String eventName,  final Map<?, ?> yamlMap)
+                    throws ApexEventException {
+        // Get the event header fields
+        // @formatter:off
+        String name      = getYamlStringField(yamlMap, ApexEvent.NAME_HEADER_FIELD,      yamlPars.getNameAlias(),      ApexEvent.NAME_REGEXP,      false);
+        String version   = getYamlStringField(yamlMap, ApexEvent.VERSION_HEADER_FIELD,   yamlPars.getVersionAlias(),   ApexEvent.VERSION_REGEXP,   false);
+        String namespace = getYamlStringField(yamlMap, ApexEvent.NAMESPACE_HEADER_FIELD, yamlPars.getNameSpaceAlias(), ApexEvent.NAMESPACE_REGEXP, false);
+        String source    = getYamlStringField(yamlMap, ApexEvent.SOURCE_HEADER_FIELD,    yamlPars.getSourceAlias(),    ApexEvent.SOURCE_REGEXP,    false);
+        String target    = getYamlStringField(yamlMap, ApexEvent.TARGET_HEADER_FIELD,    yamlPars.getTargetAlias(),    ApexEvent.TARGET_REGEXP,    false);
+        // @formatter:on
+
+        // Check that an event name has been specified
+        if (name == null && eventName == null) {
+            throw new ApexEventRuntimeException(
+                            "event received without mandatory parameter \"name\" on configuration or on event");
+        }
+
+        // Check if an event name was specified on the event parameters
+        if (eventName != null) {
+            if (name != null && !eventName.equals(name)) {
+                LOGGER.warn("The incoming event name \"{}\" does not match the configured event name \"{}\", using configured event name",
+                                name, eventName);
+            }
+            name = eventName;
+        }
+
+        // Now, find the event definition in the model service. If version is null, the newest event
+        // definition in the model service is used
+        final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(name, version);
+        if (eventDefinition == null) {
+            throw new ApexEventRuntimeException("an event definition for an event named \"" + name
+                            + "\" with version \"" + version + "\" not found in Apex model");
+        }
+
+        // Use the defined event version if no version is specified on the incoming fields
+        if (version == null) {
+            version = eventDefinition.getKey().getVersion();
+        }
+
+        // Check the name space is OK if it is defined, if not, use the name space from the model
+        if (namespace != null) {
+            if (!namespace.equals(eventDefinition.getNameSpace())) {
+                throw new ApexEventRuntimeException("namespace \"" + namespace + "\" on event \"" + name
+                                + "\" does not match namespace \"" + eventDefinition.getNameSpace()
+                                + "\" for that event in the Apex model");
+            }
+        } else {
+            namespace = eventDefinition.getNameSpace();
+        }
+
+        // For source, use the defined source only if the source is not found on the incoming event
+        if (source == null) {
+            source = eventDefinition.getSource();
+        }
+
+        // For target, use the defined source only if the source is not found on the incoming event
+        if (target == null) {
+            target = eventDefinition.getTarget();
+        }
+
+        return new ApexEvent(name, version, namespace, source, target);
+    }
+
+    /**
+     * This method gets an event string field from a JSON object.
+     *
+     * @param yamlMap
+     *        the YAML containing the YAML representation of the incoming event
+     * @param fieldName
+     *        the field name to find in the event
+     * @param fieldAlias
+     *        the alias for the field to find in the event, overrides the field name if it is not null
+     * @param fieldRE
+     *        the regular expression to check the field against for validity
+     * @param mandatory
+     *        true if the field is mandatory
+     * @return the value of the field in the JSON object or null if the field is optional
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
+     */
+    private String getYamlStringField(final Map<?, ?> yamlMap, final String fieldName, final String fieldAlias,
+                    final String fieldRE, final boolean mandatory) {
+        // Get the YAML field for the string field
+        final Object yamlField = getYamlField(yamlMap, fieldName, fieldAlias, mandatory);
+
+        // Null strings are allowed
+        if (yamlField == null) {
+            return null;
+        }
+
+        if (!(yamlField instanceof String)) {
+            // The element is not a string so throw an error
+            throw new ApexEventRuntimeException("field \"" + fieldName + "\" with type \""
+                            + yamlField.getClass().getCanonicalName() + "\" is not a string value");
+        }
+
+        final String fieldValueString = (String) yamlField;
+
+        // Is regular expression checking required
+        if (fieldRE == null) {
+            return fieldValueString;
+        }
+
+        // Check the event field against its regular expression
+        if (!fieldValueString.matches(fieldRE)) {
+            throw new ApexEventRuntimeException(
+                            "field \"" + fieldName + "\" with value \"" + fieldValueString + "\" is invalid");
+        }
+
+        return fieldValueString;
+    }
+
+    /**
+     * This method gets an event field from a YAML object.
+     *
+     * @param yamlMap
+     *        the YAML containing the YAML representation of the incoming event
+     * @param fieldName
+     *        the field name to find in the event
+     * @param fieldAlias
+     *        the alias for the field to find in the event, overrides the field name if it is not null
+     * @param mandatory
+     *        true if the field is mandatory
+     * @return the value of the field in the YAML object or null if the field is optional
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
+     */
+    private Object getYamlField(final Map<?, ?> yamlMap, final String fieldName, final String fieldAlias,
+                    final boolean mandatory) {
+
+        // Check if we should use the alias for this field
+        String fieldToFind = fieldName;
+        if (fieldAlias != null) {
+            fieldToFind = fieldAlias;
+        }
+
+        // Get the event field
+        final Object eventElement = yamlMap.get(fieldToFind);
+        if (eventElement == null) {
+            if (!mandatory) {
+                return null;
+            } else {
+                throw new ApexEventRuntimeException("mandatory field \"" + fieldToFind + "\" is missing");
+            }
+        }
+
+        return eventElement;
+    }
+}
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/YamlEventProtocolParameters.java b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/YamlEventProtocolParameters.java
new file mode 100644 (file)
index 0000000..861e9cd
--- /dev/null
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.plugins.event.protocol.yaml;
+
+import org.onap.policy.apex.service.parameters.eventprotocol.EventProtocolTextTokenDelimitedParameters;
+
+/**
+ * Event protocol parameters for YAML as an event protocol.
+ *
+ * The parameters for this plugin are:
+ * <ol>
+ * <li>nameAlias: The field in a YAML event to use as an alias for the event name. This parameter is
+ * optional.
+ * <li>versionAlias: The field in a YAML event to use as an alias for the event version. This
+ * parameter is optional.
+ * <li>nameSpaceAlias: The field in a YAML event to use as an alias for the event name space. This
+ * parameter is optional.
+ * <li>sourceAlias: The field in a YAML event to use as an alias for the event source. This
+ * parameter is optional.
+ * <li>targetAlias: The field in a YAML event to use as an alias for the event target. This
+ * parameter is optional.
+ * <li>yamlFieldName: The name of the field in the APEX event that will contain the unmarshaled YAML object. The
+ * parameter is optional and defaults to the value "yaml_field".
+ * </ol>
+ * 
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+public class YamlEventProtocolParameters extends EventProtocolTextTokenDelimitedParameters {
+    /** The label of this event protocol. */
+    public static final String YAML_EVENT_PROTOCOL_LABEL = "YAML";
+
+    // Constants for text block delimiters
+    private static final String YAML_START_TEXT_DELIMITER_TOKEN = "---";
+    private static final String YAML_END_TEXT_DELIMITER_TOKEN = "...";
+
+    // Default parameter values
+    private static final String DEFAULT_YAML_FIELD_NAME = "yaml_field";
+
+    // Aliases for Apex event header fields
+    // @formatter:off
+    private String nameAlias      = null;
+    private String versionAlias   = null;
+    private String nameSpaceAlias = null;
+    private String sourceAlias    = null;
+    private String targetAlias    = null;
+    private String yamlFieldName  = DEFAULT_YAML_FIELD_NAME;
+    // @formatter:on
+
+    /**
+     * Constructor to create a YAML event protocol parameter instance and register the instance with
+     * the parameter service.
+     */
+    public YamlEventProtocolParameters() {
+        this(YamlEventProtocolParameters.class.getCanonicalName(), YAML_EVENT_PROTOCOL_LABEL);
+    }
+
+    /**
+     * Constructor to create an event protocol parameters instance with the name of a sub class of
+     * this class.
+     *
+     * @param parameterClassName the class name of a sub class of this class
+     * @param eventProtocolLabel the name of the event protocol for this plugin
+     */
+    public YamlEventProtocolParameters(final String parameterClassName, final String eventProtocolLabel) {
+        super(parameterClassName);
+
+        // Set the event protocol properties for the YAML event protocol
+        this.setLabel(eventProtocolLabel);
+
+        // Set the delimiter token for text blocks of YAML events
+        this.setStartDelimiterToken(YAML_START_TEXT_DELIMITER_TOKEN);
+        this.setEndDelimiterToken(YAML_END_TEXT_DELIMITER_TOKEN);
+
+        // Set the event protocol plugin class
+        this.setEventProtocolPluginClass(Apex2YamlEventConverter.class.getCanonicalName());
+    }
+
+    /**
+     * Gets the name alias.
+     *
+     * @return the name alias
+     */
+    public String getNameAlias() {
+        return nameAlias;
+    }
+
+    /**
+     * Gets the version alias.
+     *
+     * @return the version alias
+     */
+    public String getVersionAlias() {
+        return versionAlias;
+    }
+
+    /**
+     * Gets the name space alias.
+     *
+     * @return the name space alias
+     */
+    public String getNameSpaceAlias() {
+        return nameSpaceAlias;
+    }
+
+    /**
+     * Gets the source alias.
+     *
+     * @return the source alias
+     */
+    public String getSourceAlias() {
+        return sourceAlias;
+    }
+
+    /**
+     * Gets the target alias.
+     *
+     * @return the target alias
+     */
+    public String getTargetAlias() {
+        return targetAlias;
+    }
+    
+    /**
+     * Gets the YAML field name.
+     *
+     * @return the YAML field name
+     */
+    public String getYamlFieldName() {
+        return yamlFieldName;
+    }
+
+    /**
+     * Sets the name alias.
+     *
+     * @param nameAlias the new name alias
+     */
+    public void setNameAlias(String nameAlias) {
+        this.nameAlias = nameAlias;
+    }
+
+    /**
+     * Sets the version alias.
+     *
+     * @param versionAlias the new version alias
+     */
+    public void setVersionAlias(String versionAlias) {
+        this.versionAlias = versionAlias;
+    }
+
+    /**
+     * Sets the name space alias.
+     *
+     * @param nameSpaceAlias the new name space alias
+     */
+    public void setNameSpaceAlias(String nameSpaceAlias) {
+        this.nameSpaceAlias = nameSpaceAlias;
+    }
+
+    /**
+     * Sets the source alias.
+     *
+     * @param sourceAlias the new source alias
+     */
+    public void setSourceAlias(String sourceAlias) {
+        this.sourceAlias = sourceAlias;
+    }
+
+    /**
+     * Sets the target alias.
+     *
+     * @param targetAlias the new target alias
+     */
+    public void setTargetAlias(String targetAlias) {
+        this.targetAlias = targetAlias;
+    }
+
+    /**
+     * Sets the encapsulating object name.
+     *
+     * @param yamlFieldName
+     *        the new YAML field name
+     */
+    public void setYamlFieldName(String yamlFieldName) {
+        this.yamlFieldName = yamlFieldName;
+    }
+}
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/package-info.java b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/main/java/org/onap/policy/apex/plugins/event/protocol/yaml/package-info.java
new file mode 100644 (file)
index 0000000..ce11d33
--- /dev/null
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * Contains implementations of Apex event protocol converter plugins for events in YAML format.
+ *
+ * @author Liam Fallon (liam.fallon@ericsson.com)
+ */
+
+package org.onap.policy.apex.plugins.event.protocol.yaml;
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlEventProtocol.java b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlEventProtocol.java
new file mode 100644 (file)
index 0000000..40196eb
--- /dev/null
@@ -0,0 +1,263 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.plugins.event.protocol.yaml;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
+import org.onap.policy.apex.context.parameters.SchemaParameters;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.basicmodel.service.ParameterService;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchemas;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
+import org.onap.policy.apex.model.eventmodel.concepts.AxField;
+import org.onap.policy.apex.model.utilities.TextFileUtils;
+import org.onap.policy.apex.service.engine.event.ApexEvent;
+import org.onap.policy.apex.service.engine.event.ApexEventException;
+import org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.HeaderDelimitedTextBlockReader;
+import org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.TextBlock;
+
+public class TestYamlEventProtocol {
+    @BeforeClass
+    public static void registerTestEventsAndSchemas() throws IOException {
+        SchemaParameters schemaParameters = new SchemaParameters();
+        schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
+        ParameterService.registerParameters(SchemaParameters.class, schemaParameters);
+
+        AxContextSchemas schemas = new AxContextSchemas();
+
+        AxContextSchema simpleIntSchema = new AxContextSchema(new AxArtifactKey("SimpleIntSchema", "0.0.1"), "JAVA",
+                        "java.lang.Integer");
+        schemas.getSchemasMap().put(simpleIntSchema.getKey(), simpleIntSchema);
+
+        AxContextSchema simpleDoubleSchema = new AxContextSchema(new AxArtifactKey("SimpleDoubleSchema", "0.0.1"), "JAVA",
+                        "java.lang.Double");
+        schemas.getSchemasMap().put(simpleDoubleSchema.getKey(), simpleDoubleSchema);
+
+        AxContextSchema simpleStringSchema = new AxContextSchema(new AxArtifactKey("SimpleStringSchema", "0.0.1"), "JAVA",
+                        "java.lang.String");
+        schemas.getSchemasMap().put(simpleStringSchema.getKey(), simpleStringSchema);
+
+        AxContextSchema arrayListSchema = new AxContextSchema(new AxArtifactKey("ArrayListSchema", "0.0.1"), "JAVA",
+                        "java.util.ArrayList");
+        schemas.getSchemasMap().put(arrayListSchema.getKey(), arrayListSchema);
+
+        AxContextSchema linkedHashMapSchema = new AxContextSchema(new AxArtifactKey("LinkedHashMapSchema", "0.0.1"), "JAVA",
+                        "java.util.LinkedHashMap");
+        schemas.getSchemasMap().put(linkedHashMapSchema.getKey(), linkedHashMapSchema);
+
+        ModelService.registerModel(AxContextSchemas.class, schemas);
+
+        AxEvents events = new AxEvents();
+
+        AxEvent testEvent0 = new AxEvent(new AxArtifactKey("TestEvent0", "0.0.1"));
+        testEvent0.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        events.getEventMap().put(testEvent0.getKey(), testEvent0);
+
+        AxEvent testEvent1 = new AxEvent(new AxArtifactKey("TestEvent1", "0.0.1"));
+        testEvent1.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te1Field0 = new AxField(new AxReferenceKey(testEvent1.getKey(), "yaml_field"),
+                        arrayListSchema.getKey());
+        testEvent1.getParameterMap().put("yaml_field", te1Field0);
+        events.getEventMap().put(testEvent1.getKey(), testEvent1);
+
+        AxEvent testEvent2 = new AxEvent(new AxArtifactKey("TestEvent2", "0.0.1"));
+        testEvent2.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te2Field0 = new AxField(new AxReferenceKey(testEvent2.getKey(), "hr"), simpleIntSchema.getKey());
+        testEvent2.getParameterMap().put("hr", te2Field0);
+        AxField te2Field1 = new AxField(new AxReferenceKey(testEvent2.getKey(), "avg"), simpleDoubleSchema.getKey());
+        testEvent2.getParameterMap().put("avg", te2Field1);
+        AxField te2Field2 = new AxField(new AxReferenceKey(testEvent2.getKey(), "rbi"), simpleIntSchema.getKey());
+        testEvent2.getParameterMap().put("rbi", te2Field2);
+        events.getEventMap().put(testEvent2.getKey(), testEvent2);
+
+        AxEvent testEvent3 = new AxEvent(new AxArtifactKey("TestEvent3", "0.0.1"));
+        testEvent3.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te3Field0 = new AxField(new AxReferenceKey(testEvent3.getKey(), "american"),
+                        arrayListSchema.getKey());
+        testEvent3.getParameterMap().put("american", te3Field0);
+        AxField te3Field1 = new AxField(new AxReferenceKey(testEvent3.getKey(), "national"),
+                        arrayListSchema.getKey());
+        testEvent3.getParameterMap().put("national", te3Field1);
+        events.getEventMap().put(testEvent3.getKey(), testEvent3);
+
+        AxEvent testEvent4 = new AxEvent(new AxArtifactKey("TestEvent4", "0.0.1"));
+        testEvent4.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te4Field0 = new AxField(new AxReferenceKey(testEvent4.getKey(), "yaml_field"),
+                        arrayListSchema.getKey());
+        testEvent4.getParameterMap().put("yaml_field", te4Field0);
+        events.getEventMap().put(testEvent4.getKey(), testEvent4);
+
+        AxEvent testEvent5 = new AxEvent(new AxArtifactKey("TestEvent5", "0.0.1"));
+        testEvent5.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te5Field0 = new AxField(new AxReferenceKey(testEvent5.getKey(), "yaml_field"),
+                        arrayListSchema.getKey());
+        testEvent5.getParameterMap().put("yaml_field", te5Field0);
+        events.getEventMap().put(testEvent5.getKey(), testEvent5);
+
+        AxEvent testEvent6 = new AxEvent(new AxArtifactKey("TestEvent6", "0.0.1"));
+        testEvent6.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te6Field0 = new AxField(new AxReferenceKey(testEvent6.getKey(), "MarkMcGwire"),
+                        linkedHashMapSchema.getKey());
+        testEvent6.getParameterMap().put("Mark McGwire", te6Field0);
+        AxField te6Field1 = new AxField(new AxReferenceKey(testEvent6.getKey(), "SammySosa"),
+                        linkedHashMapSchema.getKey());
+        testEvent6.getParameterMap().put("Sammy Sosa", te6Field1);
+        events.getEventMap().put(testEvent6.getKey(), testEvent6);
+
+        AxEvent testEvent7 = new AxEvent(new AxArtifactKey("TestEvent7", "0.0.1"));
+        testEvent7.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te7Field0 = new AxField(new AxReferenceKey(testEvent7.getKey(), "time"),
+                        simpleIntSchema.getKey());
+        testEvent7.getParameterMap().put("time", te7Field0);
+        AxField te7Field1 = new AxField(new AxReferenceKey(testEvent7.getKey(), "player"),
+                        simpleStringSchema.getKey());
+        testEvent7.getParameterMap().put("player", te7Field1);
+        AxField te7Field2 = new AxField(new AxReferenceKey(testEvent7.getKey(), "action"),
+                        simpleStringSchema.getKey());
+        testEvent7.getParameterMap().put("action", te7Field2);
+        events.getEventMap().put(testEvent7.getKey(), testEvent7);
+
+        AxEvent testEvent8 = new AxEvent(new AxArtifactKey("TestEvent8", "0.0.1"));
+        testEvent8.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te8Field0 = new AxField(new AxReferenceKey(testEvent8.getKey(), "hr"),
+                        arrayListSchema.getKey());
+        testEvent8.getParameterMap().put("hr", te8Field0);
+        AxField te8Field1 = new AxField(new AxReferenceKey(testEvent8.getKey(), "rbi"),
+                        arrayListSchema.getKey());
+        testEvent8.getParameterMap().put("rbi", te8Field1);
+        events.getEventMap().put(testEvent8.getKey(), testEvent8);
+
+        AxEvent testEvent9 = new AxEvent(new AxArtifactKey("TestEvent9", "0.0.1"));
+        testEvent9.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te9Field0 = new AxField(new AxReferenceKey(testEvent9.getKey(), "ChicagoCubs"),
+                        arrayListSchema.getKey());
+        testEvent9.getParameterMap().put("ChicagoCubs", te9Field0);
+        AxField te9Field1 = new AxField(new AxReferenceKey(testEvent9.getKey(), "AtlantaBraves"),
+                        arrayListSchema.getKey());
+        testEvent9.getParameterMap().put("AtlantaBraves", te9Field1);
+        events.getEventMap().put(testEvent9.getKey(), testEvent9);
+
+        AxEvent testEvent10 = new AxEvent(new AxArtifactKey("TestEvent10", "0.0.1"));
+        testEvent10.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te10Field0 = new AxField(new AxReferenceKey(testEvent10.getKey(), "yaml_field"),
+                        arrayListSchema.getKey());
+        testEvent10.getParameterMap().put("yaml_field", te10Field0);
+        events.getEventMap().put(testEvent10.getKey(), testEvent10);
+
+        AxEvent testEvent11 = new AxEvent(new AxArtifactKey("TestEvent11", "0.0.1"));
+        testEvent11.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField te11Field0 = new AxField(new AxReferenceKey(testEvent11.getKey(), "tosca_definitions_version"),
+                        simpleStringSchema.getKey());
+        testEvent11.getParameterMap().put("tosca_definitions_version", te11Field0);
+        AxField te11Field1 = new AxField(new AxReferenceKey(testEvent11.getKey(), "description"),
+                        simpleStringSchema.getKey(), true);
+        testEvent11.getParameterMap().put("description", te11Field1);
+        AxField te11Field2 = new AxField(new AxReferenceKey(testEvent11.getKey(), "node_types"),
+                        linkedHashMapSchema.getKey(), true);
+        testEvent11.getParameterMap().put("node_types", te11Field2);
+        AxField te11Field3 = new AxField(new AxReferenceKey(testEvent11.getKey(), "topology_template"),
+                        linkedHashMapSchema.getKey());
+        testEvent11.getParameterMap().put("topology_template", te11Field3);
+        events.getEventMap().put(testEvent11.getKey(), testEvent11);
+
+        ModelService.registerModel(AxEvents.class, events);
+    }
+
+    @AfterClass
+    public static void unregisterTestEventsAndSchemas() {
+        ModelService.clear();
+    }
+
+    @Test
+    public void testYamlProcessing() throws ApexEventException, IOException {
+        try {
+            testYamlDecodeEncode("TestEvent0", 1, 0, "Empty0");
+            fail("test should fail here");
+        } catch (ApexEventException e) {
+            assertEquals("event processing failed, event is null", e.getMessage());
+        }
+
+        testYamlDecodeEncode("TestEvent0", 1, 0, "Empty1");
+        testYamlDecodeEncode("TestEvent1", 1, 1, "Collection0");
+        testYamlDecodeEncode("TestEvent2", 1, 3, "Collection1");
+        testYamlDecodeEncode("TestEvent3", 1, 2, "Collection2");
+        testYamlDecodeEncode("TestEvent4", 1, 1, "Collection3");
+        testYamlDecodeEncode("TestEvent5", 1, 1, "Collection4");
+        testYamlDecodeEncode("TestEvent6", 1, 2, "Collection5");
+        testYamlDecodeEncode("TestEvent1", 2, 1, "Structure0");
+        testYamlDecodeEncode("TestEvent7", 2, 3, "Structure1");
+        testYamlDecodeEncode("TestEvent8", 1, 2, "Structure2");
+        testYamlDecodeEncode("TestEvent8", 1, 2, "Structure3");
+        testYamlDecodeEncode("TestEvent9", 1, 2, "Structure4");
+        testYamlDecodeEncode("TestEvent10", 1, 1, "Structure5");
+        testYamlDecodeEncode("TestEvent11", 1, 4, "TOSCA0");
+    }
+
+    private void testYamlDecodeEncode(final String eventName, final int eventCount, final int parCount, final String fileName)
+                    throws ApexEventException, IOException {
+        YamlEventProtocolParameters parameters = new YamlEventProtocolParameters();
+        parameters.setDelimiterAtStart(false);
+
+        Apex2YamlEventConverter converter = new Apex2YamlEventConverter();
+        converter.init(parameters);
+
+        String filePath = "src/test/resources/yaml_in/" + fileName + ".yaml";
+        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
+        HeaderDelimitedTextBlockReader reader = new HeaderDelimitedTextBlockReader(parameters);
+        reader.init(fileInputStream);
+       
+        List<ApexEvent> eventList = new ArrayList<>();
+        
+        TextBlock textBlock;
+        do {
+             textBlock = reader.readTextBlock();
+             
+             eventList.addAll(converter.toApexEvent(eventName, textBlock.getText()));
+        } while (!textBlock.isEndOfText());
+        
+        fileInputStream.close();
+
+        assertEquals(eventCount, eventList.size());
+
+        for (int eventNo = 0; eventNo < eventCount; eventNo++) {
+            assertEquals(parCount, eventList.get(0).size());
+
+            String eventYaml = (String) converter.fromApexEvent(eventList.get(eventNo));
+            String expectedYaml = TextFileUtils.getTextFileAsString("src/test/resources/yaml_out/" + fileName + '_' + eventNo + ".yaml");
+            assertEquals(expectedYaml.replaceAll("\\s*", ""), eventYaml.replaceAll("\\s*", ""));
+        }
+    }
+}
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlPluginStability.java b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/java/org/onap/policy/apex/plugins/event/protocol/yaml/TestYamlPluginStability.java
new file mode 100644 (file)
index 0000000..126a01d
--- /dev/null
@@ -0,0 +1,259 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.apex.plugins.event.protocol.yaml;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
+import org.onap.policy.apex.context.parameters.SchemaParameters;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
+import org.onap.policy.apex.model.basicmodel.service.ModelService;
+import org.onap.policy.apex.model.basicmodel.service.ParameterService;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
+import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchemas;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
+import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
+import org.onap.policy.apex.model.eventmodel.concepts.AxField;
+import org.onap.policy.apex.service.engine.event.ApexEvent;
+import org.onap.policy.apex.service.engine.event.ApexEventException;
+import org.onap.policy.apex.service.engine.event.ApexEventRuntimeException;
+
+public class TestYamlPluginStability {
+    static AxEvent testEvent;
+
+    @BeforeClass
+    public static void registerTestEventsAndSchemas() throws IOException {
+        SchemaParameters schemaParameters = new SchemaParameters();
+        schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
+        ParameterService.registerParameters(SchemaParameters.class, schemaParameters);
+
+        AxContextSchemas schemas = new AxContextSchemas();
+
+        AxContextSchema simpleIntSchema = new AxContextSchema(new AxArtifactKey("SimpleIntSchema", "0.0.1"), "JAVA",
+                        "java.lang.Integer");
+        schemas.getSchemasMap().put(simpleIntSchema.getKey(), simpleIntSchema);
+
+        AxContextSchema simpleDoubleSchema = new AxContextSchema(new AxArtifactKey("SimpleDoubleSchema", "0.0.1"),
+                        "JAVA", "java.lang.Double");
+        schemas.getSchemasMap().put(simpleDoubleSchema.getKey(), simpleDoubleSchema);
+
+        AxContextSchema simpleStringSchema = new AxContextSchema(new AxArtifactKey("SimpleStringSchema", "0.0.1"),
+                        "JAVA", "java.lang.String");
+        schemas.getSchemasMap().put(simpleStringSchema.getKey(), simpleStringSchema);
+
+        ModelService.registerModel(AxContextSchemas.class, schemas);
+
+        AxEvents events = new AxEvents();
+
+        testEvent = new AxEvent(new AxArtifactKey("TestEvent", "0.0.1"));
+        testEvent.setNameSpace("org.onap.policy.apex.plugins.event.protocol.yaml");
+        AxField teField0 = new AxField(new AxReferenceKey(testEvent.getKey(), "intValue"), simpleIntSchema.getKey());
+        testEvent.getParameterMap().put("intValue", teField0);
+        AxField teField1 = new AxField(new AxReferenceKey(testEvent.getKey(), "doubleValue"),
+                        simpleDoubleSchema.getKey());
+        testEvent.getParameterMap().put("doubleValue", teField1);
+        AxField teField2 = new AxField(new AxReferenceKey(testEvent.getKey(), "stringValue"),
+                        simpleStringSchema.getKey(), true);
+        testEvent.getParameterMap().put("stringValue", teField2);
+        events.getEventMap().put(testEvent.getKey(), testEvent);
+
+        ModelService.registerModel(AxEvents.class, events);
+    }
+
+    @AfterClass
+    public static void unregisterTestEventsAndSchemas() {
+        ModelService.clear();
+    }
+
+    @Test
+    public void testStability() throws ApexEventException {
+        Apex2YamlEventConverter converter = new Apex2YamlEventConverter();
+
+        try {
+            converter.init(null);
+            fail("this test should throw an exception");
+        } catch (ApexEventRuntimeException e) {
+            assertEquals("specified consumer properties are not applicable to the YAML event protocol", e.getMessage());
+        }
+
+        YamlEventProtocolParameters pars = new YamlEventProtocolParameters();
+        converter.init(pars);
+
+        try {
+            converter.toApexEvent("NonExistantEvent", "");
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("Failed to unmarshal YAML event: an event definition for an event named \"NonExistantEvent\"",
+                            e.getMessage().substring(0, 89));
+        }
+
+        try {
+            converter.toApexEvent("TestEvent", null);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("event processing failed, event is null", e.getMessage());
+        }
+
+        try {
+            converter.toApexEvent("TestEvent", 1);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("error converting event \"1\" to a string", e.getMessage());
+        }
+
+        try {
+            converter.toApexEvent("TestEvent", "");
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertTrue(e.getMessage().contains("Field \"doubleValue\" is missing"));
+        }
+
+        try {
+            converter.fromApexEvent(null);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("event processing failed, Apex event is null", e.getMessage());
+        }
+
+        ApexEvent apexEvent = new ApexEvent(testEvent.getKey().getName(), testEvent.getKey().getVersion(),
+                        testEvent.getNameSpace(), testEvent.getSource(), testEvent.getTarget());
+        apexEvent.put("doubleValue", 123.45);
+        apexEvent.put("intValue", 123);
+        apexEvent.put("stringValue", "123.45");
+
+        apexEvent.setExceptionMessage("my wonderful exception message");
+        String yamlString = (String) converter.fromApexEvent(apexEvent);
+        assertTrue(yamlString.contains("my wonderful exception message"));
+
+        apexEvent.remove("intValue");
+        try {
+            yamlString = (String) converter.fromApexEvent(apexEvent);
+            fail("this test should throw an exception");
+        } catch (ApexEventRuntimeException e) {
+            assertEquals("error parsing TestEvent:0.0.1 event to Json. Field \"intValue\" is missing",
+                            e.getMessage().substring(0, 72));
+        }
+
+        try {
+            converter.toApexEvent(null, "");
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("Failed to unmarshal YAML event: event received without mandatory parameter \"name\"",
+                            e.getMessage().substring(0, 81));
+        }
+
+        pars.setNameAlias("TheNameField");
+        try {
+            converter.toApexEvent(null, "");
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("Failed to unmarshal YAML event: event received without mandatory parameter \"name\"",
+                            e.getMessage().substring(0, 81));
+        }
+
+        apexEvent.put("intValue", 123);
+
+        apexEvent.remove("stringValue");
+        yamlString = (String) converter.fromApexEvent(apexEvent);
+        apexEvent.put("stringValue", "123.45");
+
+        String yamlInputString = "doubleValue: 123.45\n" + "intValue: 123";
+
+        List<ApexEvent> eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals(123.45, eventList.get(0).get("doubleValue"));
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: null";
+
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals(null, eventList.get(0).get("stringValue"));
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: TestEvent";
+        pars.setNameAlias("stringValue");
+        eventList = converter.toApexEvent(null, yamlInputString);
+        assertEquals("TestEvent", eventList.get(0).get("stringValue"));
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: SomeOtherEvent";
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals("SomeOtherEvent", eventList.get(0).get("stringValue"));
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: 0.0.1";
+        pars.setNameAlias(null);
+        pars.setVersionAlias("stringValue");
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals("0.0.1", eventList.get(0).get("stringValue"));
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: org.some.other.namespace";
+        pars.setVersionAlias(null);
+        pars.setNameSpaceAlias("stringValue");
+        try {
+            converter.toApexEvent("TestEvent", yamlInputString);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("Failed to unmarshal YAML event: namespace \"org.some.other.namespace\" on event",
+                            e.getMessage().substring(0, 77));
+        }
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: org.onap.policy.apex.plugins.event.protocol.yaml";
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals("org.onap.policy.apex.plugins.event.protocol.yaml", eventList.get(0).getNameSpace());
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MySource";
+        pars.setNameSpaceAlias(null);
+        pars.setSourceAlias("stringValue");
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals("MySource", eventList.get(0).getSource());
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MyTarget";
+        pars.setSourceAlias(null);
+        pars.setTargetAlias("stringValue");
+        eventList = converter.toApexEvent("TestEvent", yamlInputString);
+        assertEquals("MyTarget", eventList.get(0).getTarget());
+        pars.setTargetAlias(null);
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: 123\n" + "stringValue: MyString";
+        pars.setSourceAlias(null);
+        pars.setTargetAlias("intValue");
+        try {
+            converter.toApexEvent("TestEvent", yamlInputString);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertEquals("Failed to unmarshal YAML event: field \"target\" with type \"java.lang.Integer\"",
+                            e.getMessage().substring(0, 76));
+        }
+        pars.setTargetAlias(null);
+
+        yamlInputString = "doubleValue: 123.45\n" + "intValue: ~\n"+ "stringValue: MyString";
+        try {
+            converter.toApexEvent("TestEvent", yamlInputString);
+            fail("this test should throw an exception");
+        } catch (ApexEventException e) {
+            assertTrue(e.getMessage().contains("mandatory field \"intValue\" is missing"));
+        }
+    }
+}
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection0.yaml
new file mode 100644 (file)
index 0000000..12519fb
--- /dev/null
@@ -0,0 +1,3 @@
+- Mark McGwire
+- Sammy Sosa
+- Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection1.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection1.yaml
new file mode 100644 (file)
index 0000000..7b7ec94
--- /dev/null
@@ -0,0 +1,3 @@
+hr:  65    # Home runs
+avg: 0.278 # Batting average
+rbi: 147   # Runs Batted In
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection2.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection2.yaml
new file mode 100644 (file)
index 0000000..656d628
--- /dev/null
@@ -0,0 +1,8 @@
+american:
+  - Boston Red Sox
+  - Detroit Tigers
+  - New York Yankees
+national:
+  - New York Mets
+  - Chicago Cubs
+  - Atlanta Braves
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection3.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection3.yaml
new file mode 100644 (file)
index 0000000..e60d8a9
--- /dev/null
@@ -0,0 +1,8 @@
+-
+  name: Mark McGwire
+  hr:   65
+  avg:  0.278
+-
+  name: Sammy Sosa
+  hr:   63
+  avg:  0.288
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection4.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection4.yaml
new file mode 100644 (file)
index 0000000..65da53d
--- /dev/null
@@ -0,0 +1,3 @@
+- [name        , hr, avg  ]
+- [Mark McGwire, "65", "0.278"]
+- [Sammy Sosa  , "63", "0.288"]
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection5.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Collection5.yaml
new file mode 100644 (file)
index 0000000..dfc534f
--- /dev/null
@@ -0,0 +1,5 @@
+MarkMcGwire: {hr: 65, avg: 0.278}
+SammySosa: {
+    hr: 63,
+    avg: 0.288
+  }
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty0.yaml
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty1.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Empty1.yaml
new file mode 100644 (file)
index 0000000..8946d48
--- /dev/null
@@ -0,0 +1,4 @@
+# Comments line
+
+
+# Comment line
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure0.yaml
new file mode 100644 (file)
index 0000000..0a47b89
--- /dev/null
@@ -0,0 +1,10 @@
+---
+# Ranking of 1998 home runs
+- Mark McGwire
+- Sammy Sosa
+- Ken Griffey
+
+---
+# Team ranking
+- Chicago Cubs
+- St Louis Cardinals
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure1.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure1.yaml
new file mode 100644 (file)
index 0000000..05e102d
--- /dev/null
@@ -0,0 +1,10 @@
+---
+time: 20:03:20
+player: Sammy Sosa
+action: strike (miss)
+...
+---
+time: 20:03:47
+player: Sammy Sosa
+action: grand slam
+...
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure2.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure2.yaml
new file mode 100644 (file)
index 0000000..a3ef726
--- /dev/null
@@ -0,0 +1,8 @@
+---
+hr: # 1998 hr ranking
+  - Mark McGwire
+  - Sammy Sosa
+rbi:
+  # 1998 rbi ranking
+  - Sammy Sosa
+  - Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure3.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure3.yaml
new file mode 100644 (file)
index 0000000..bf46f75
--- /dev/null
@@ -0,0 +1,8 @@
+---
+hr:
+  - Mark McGwire
+  # Following node labeled SS
+  - &SS Sammy Sosa
+rbi:
+  - *SS # Subsequent occurrence
+  - Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure4.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure4.yaml
new file mode 100644 (file)
index 0000000..eb3fd72
--- /dev/null
@@ -0,0 +1,7 @@
+? ChicagoCubs
+:
+  - 2001-07-23
+
+? AtlantaBraves
+: [ 2001-07-02, 2001-08-12,
+    2001-08-14 ]
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure5.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/Structure5.yaml
new file mode 100644 (file)
index 0000000..8a26671
--- /dev/null
@@ -0,0 +1,8 @@
+---
+# Products purchased
+- item    : Super Hoop
+  quantity: 1
+- item    : Basketball
+  quantity: 4
+- item    : Big Shoes
+  quantity: 1
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/TOSCA0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_in/TOSCA0.yaml
new file mode 100644 (file)
index 0000000..27977f4
--- /dev/null
@@ -0,0 +1,180 @@
+# https://wiki.onap.org/display/DW/VNFD+example
+tosca_definitions_version: tosca_simple_profile_yaml_1_1
+description: the VNFD of MyVnf
+node_types:
+  MyCompany.MyVnf.1_0.1_0:  # node type of MyVnf
+    derived_from: tosca.nodes.nfv.VNF
+    properties:
+      descriptor_id:
+        type: string
+        constraints: [ valid_values: [ b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 ] ]
+        default: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
+        required: true
+      provider:
+        type: string
+        constraints: [ valid_values: [ MyCompany ] ]
+        default: MyCompany
+        required: true
+      product_name:
+        type: string
+        constraints: [ valid_values: [ MyVnf ] ]
+        default: Myvnf
+        required: true
+      software_version:
+        type: string
+        constraints: [ valid_values: [ '1.0' ] ]
+        default: '1.0'
+        required: true
+      descriptor_version:
+        type: string
+        constraints: [ valid_values: [ '1.0' ] ]
+        default: '1.0'
+        required: true
+      flavour_id:
+        type: string
+        constraints: [ valid_values: [ simple ] ]  #only one and only allowed one DF in this example
+        default: simple
+        required: true
+      flavour_description:
+        type: string
+        constraints: []
+        default: ""
+        required: true
+      vnfm_info:
+        type: list       
+        constraints: []
+        default: ""
+        required: true
+      interfaces:
+        Nfv:
+         instantiate:
+          inputs:
+            parameter_1:
+               type: string
+               required: false
+               default: value_1
+               constraints: []
+            parameter_2:
+               type: string
+               required: false
+               default: value_2
+               constraints: []
+         terminate:
+          implementation: terminate.workbook.mistral.yaml
+topology_template: 
+  substitution_mappings:
+    node_type: MyCompany.MyVnf.1_0.1_0
+    requirements:
+      - virtual_link: [ Cp_2,   external_virtual_link ] # expose as external CP
+      - virtual_link: [ Cp_4,   external_virtual_link ] # expose as external CP 
+   
+  node_templates:
+    VDU_compute_1:
+      type: tosca.nodes.nfv.Vdu.Compute
+      properties:
+        name: ..
+        description: ..
+        boot_order: ..
+        nfvi_constraints: ..
+        configurable_properties:
+          additional_vnfc_configurable_properties: {}
+        vdu_profile:
+          min_number_of_instances: 1
+          max_number_of_instances: 4
+      capabilities:
+        virtual_compute:
+          properties:
+            virtual_memory:
+              virtual_mem_size: 8096 MB
+            virtual_cpu:
+              cpu_architecture: x86
+              num_virtual_cpu: 2
+              virtual_cpu_clock: 1800 MHz
+      requirements:
+        - virtual_storage: Storage_1  
+  
+    Storage_1:
+      type: tosca.nodes.nfv.Vdu.VirtualStorage
+      properties:
+        type_of_storage: ..
+        size_of_storage: 100MB
+        rdma_enabled:  ..     
+    
+    Cp_1:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: Internal connection point on an VL
+      requirements:
+        - virtual_binding: Vdu_1
+        - virtual_link: internalVl_1   
+    internalVl_1:
+      type: tosca.nodes.nfv.VirtualLink
+      properties:
+        connectivity_type:
+          layer_protocol: ipv4
+          flow_pattern: mesh
+        test_access: []
+        description: ..
+        vl_profile:
+          qos:
+          maxBitRateRequirements:
+          minBitRateRequirements:   
+    Cp_2:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: External connection point to access exteranlVl_1
+      requirements:
+        - external_virtual_link:
+        - virtual_binding: Vdu_1   
+    VDU_compute_2:
+      type: tosca.nodes.nfv.Vdu.Compute
+      properties:
+        name: ..
+        description: ..
+        boot_order: ..
+        nfvi_constraints: ..
+        configurable_properties:
+          additional_vnfc_configurable_properties: {}
+        vdu_profile:
+          min_number_of_instances: 2
+          max_number_of_instances: 6
+      capabilities:
+        virtual_compute:
+          properties:
+            virtual_memory:
+              virtual_mem_size: 8096 MB
+            virtual_cpu:
+              cpu_architecture: x86
+              num_virtual_cpu: 4
+              virtual_cpu_clock: 1800 MHz
+    Cp_3:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: Internal connection point on an VL
+      requirements:
+        - virtual_binding: Vdu_2
+        - virtual_link: internalVl_1  
+    Cp_4:
+      type: tosca.nodes.nfv.VduCpd
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: External connection point to access exteranlVl_2
+      requirements:
+        - external_virtual_link:
+        - virtual_binding: Vdu_2
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection0_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection0_0.yaml
new file mode 100644 (file)
index 0000000..a40e426
--- /dev/null
@@ -0,0 +1,9 @@
+name: TestEvent1
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- Mark McGwire
+- Sammy Sosa
+- Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection1_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection1_0.yaml
new file mode 100644 (file)
index 0000000..6d95032
--- /dev/null
@@ -0,0 +1,8 @@
+name: TestEvent2
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+avg: 0.278
+hr: 65
+rbi: 147
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection2_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection2_0.yaml
new file mode 100644 (file)
index 0000000..b33b14e
--- /dev/null
@@ -0,0 +1,13 @@
+name: TestEvent3
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+american:
+- Boston Red Sox
+- Detroit Tigers
+- New York Yankees
+national:
+- New York Mets
+- Chicago Cubs
+- Atlanta Braves
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection3_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection3_0.yaml
new file mode 100644 (file)
index 0000000..bc99359
--- /dev/null
@@ -0,0 +1,12 @@
+name: TestEvent4
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- name: Mark McGwire
+  hr: 65
+  avg: 0.278
+- name: Sammy Sosa
+  hr: 63
+  avg: 0.288
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection4_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection4_0.yaml
new file mode 100644 (file)
index 0000000..2d924ff
--- /dev/null
@@ -0,0 +1,15 @@
+name: TestEvent5
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- - name
+  - hr
+  - avg
+- - Mark McGwire
+  - '65'
+  - '0.278'
+- - Sammy Sosa
+  - '63'
+  - '0.288'
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection5_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Collection5_0.yaml
new file mode 100644 (file)
index 0000000..e9e586a
--- /dev/null
@@ -0,0 +1,11 @@
+name: TestEvent6
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+Mark McGwire:
+  hr: 65
+  avg: 0.278
+Sammy Sosa:
+  hr: 63
+  avg: 0.288
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Empty1_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Empty1_0.yaml
new file mode 100644 (file)
index 0000000..d254675
--- /dev/null
@@ -0,0 +1,5 @@
+name: TestEvent0
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_0.yaml
new file mode 100644 (file)
index 0000000..fa98c2d
--- /dev/null
@@ -0,0 +1,9 @@
+name: TestEvent1
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- Mark McGwire
+- Sammy Sosa
+- Ken Griffey
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_1.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure0_1.yaml
new file mode 100644 (file)
index 0000000..b8be6e5
--- /dev/null
@@ -0,0 +1,8 @@
+name: TestEvent1
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- Chicago Cubs
+- St Louis Cardinals
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_0.yaml
new file mode 100644 (file)
index 0000000..e81ba58
--- /dev/null
@@ -0,0 +1,8 @@
+name: TestEvent7
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+action: strike (miss)
+player: Sammy Sosa
+time: 72200
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_1.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure1_1.yaml
new file mode 100644 (file)
index 0000000..4e0537e
--- /dev/null
@@ -0,0 +1,8 @@
+name: TestEvent7
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+action: grand slam
+player: Sammy Sosa
+time: 72227
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure2_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure2_0.yaml
new file mode 100644 (file)
index 0000000..44b7975
--- /dev/null
@@ -0,0 +1,11 @@
+name: TestEvent8
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+hr:
+- Mark McGwire
+- Sammy Sosa
+rbi:
+- Sammy Sosa
+- Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure3_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure3_0.yaml
new file mode 100644 (file)
index 0000000..44b7975
--- /dev/null
@@ -0,0 +1,11 @@
+name: TestEvent8
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+hr:
+- Mark McGwire
+- Sammy Sosa
+rbi:
+- Sammy Sosa
+- Ken Griffey
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure4_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure4_0.yaml
new file mode 100644 (file)
index 0000000..084ab99
--- /dev/null
@@ -0,0 +1,11 @@
+name: TestEvent9
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+AtlantaBraves:
+- 2001-07-02T00:00:00Z
+- 2001-08-12T00:00:00Z
+- 2001-08-14T00:00:00Z
+ChicagoCubs:
+- 2001-07-23T00:00:00Z
\ No newline at end of file
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure5_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/Structure5_0.yaml
new file mode 100644 (file)
index 0000000..6ba5143
--- /dev/null
@@ -0,0 +1,12 @@
+name: TestEvent10
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+yaml_field:
+- item: Super Hoop
+  quantity: 1
+- item: Basketball
+  quantity: 4
+- item: Big Shoes
+  quantity: 1
diff --git a/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/TOSCA0_0.yaml b/plugins/plugins-event/plugins-event-protocol/plugins-event-protocol-yaml/src/test/resources/yaml_out/TOSCA0_0.yaml
new file mode 100644 (file)
index 0000000..910811f
--- /dev/null
@@ -0,0 +1,188 @@
+name: TestEvent11
+version: 0.0.1
+nameSpace: org.onap.policy.apex.plugins.event.protocol.yaml
+source: ''
+target: ''
+description: the VNFD of MyVnf
+node_types:
+  MyCompany.MyVnf.1_0.1_0:
+    derived_from: tosca.nodes.nfv.VNF
+    properties:
+      descriptor_id:
+        type: string
+        constraints:
+        - valid_values:
+          - b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
+        default: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
+        required: true
+      provider:
+        type: string
+        constraints:
+        - valid_values:
+          - MyCompany
+        default: MyCompany
+        required: true
+      product_name:
+        type: string
+        constraints:
+        - valid_values:
+          - MyVnf
+        default: Myvnf
+        required: true
+      software_version:
+        type: string
+        constraints:
+        - valid_values:
+          - '1.0'
+        default: '1.0'
+        required: true
+      descriptor_version:
+        type: string
+        constraints:
+        - valid_values:
+          - '1.0'
+        default: '1.0'
+        required: true
+      flavour_id:
+        type: string
+        constraints:
+        - valid_values:
+          - simple
+        default: simple
+        required: true
+      flavour_description:
+        type: string
+        constraints: []
+        default: ''
+        required: true
+      vnfm_info:
+        type: list
+        constraints: []
+        default: ''
+        required: true
+      interfaces:
+        Nfv:
+          instantiate:
+            inputs:
+              parameter_1:
+                type: string
+                required: false
+                default: value_1
+                constraints: []
+              parameter_2:
+                type: string
+                required: false
+                default: value_2
+                constraints: []
+          terminate:
+            implementation: terminate.workbook.mistral.yaml
+topology_template:
+  substitution_mappings:
+    node_type: MyCompany.MyVnf.1_0.1_0
+    requirements:
+    - virtual_link:
+      - Cp_2
+      - external_virtual_link
+    - virtual_link:
+      - Cp_4
+      - external_virtual_link
+  node_templates:
+    VDU_compute_1:
+      type: tosca.nodes.nfv.Vdu.Compute
+      properties:
+        name: ..
+        description: ..
+        boot_order: ..
+        nfvi_constraints: ..
+        configurable_properties:
+          additional_vnfc_configurable_properties: {}
+        vdu_profile:
+          min_number_of_instances: 1
+          max_number_of_instances: 4
+      capabilities:
+        virtual_compute:
+          properties:
+            virtual_memory:
+              virtual_mem_size: 8096 MB
+            virtual_cpu:
+              cpu_architecture: x86
+              num_virtual_cpu: 2
+              virtual_cpu_clock: 1800 MHz
+      requirements:
+      - virtual_storage: Storage_1
+    Storage_1:
+      type: tosca.nodes.nfv.Vdu.VirtualStorage
+      properties:
+        type_of_storage: ..
+        size_of_storage: 100MB
+        rdma_enabled: ..
+    Cp_1:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: Internal connection point on an VL
+      requirements:
+      - virtual_binding: Vdu_1
+      - virtual_link: internalVl_1
+    internalVl_1:
+      type: tosca.nodes.nfv.VirtualLink
+      properties:
+        connectivity_type:
+          layer_protocol: ipv4
+          flow_pattern: mesh
+        test_access: []
+        description: ..
+        vl_profile:
+          qos: null
+          maxBitRateRequirements: null
+          minBitRateRequirements: null
+    Cp_2:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: External connection point to access exteranlVl_1
+      requirements:
+      - external_virtual_link: null
+      - virtual_binding: Vdu_1
+    VDU_compute_2:
+      type: tosca.nodes.nfv.Vdu.Compute
+      properties:
+        name: ..
+        description: ..
+        boot_order: ..
+        nfvi_constraints: ..
+        configurable_properties:
+          additional_vnfc_configurable_properties: {}
+        vdu_profile:
+          min_number_of_instances: 2
+          max_number_of_instances: 6
+      capabilities:
+        virtual_compute:
+          properties:
+            virtual_memory:
+              virtual_mem_size: 8096 MB
+            virtual_cpu:
+              cpu_architecture: x86
+              num_virtual_cpu: 4
+              virtual_cpu_clock: 1800 MHz
+    Cp_3:
+      type: tosca.nodes.nfv.VduCp
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: Internal connection point on an VL
+      requirements:
+      - virtual_binding: Vdu_2
+      - virtual_link: internalVl_1
+    Cp_4:
+      type: tosca.nodes.nfv.VduCpd
+      properties:
+        layer_protocol: ipv4
+        role: leaf
+        description: External connection point to access exteranlVl_2
+      requirements:
+      - external_virtual_link: null
+      - virtual_binding: Vdu_2
+tosca_definitions_version: tosca_simple_profile_yaml_1_1
\ No newline at end of file
index 552f949..99728c0 100644 (file)
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -160,7 +161,7 @@ public class ApexEvent extends HashMap<String, Object> implements Serializable {
      * @throws ApexEventException the apex event exception
      */
     private String validKey(final String key) throws ApexEventException {
-        if (key.matches(NAME_REGEXP)) {
+        if (key.matches(AxReferenceKey.LOCAL_NAME_REGEXP)) {
             return key;
         }
         else {
index e40bc75..07185c0 100644 (file)
@@ -45,8 +45,16 @@ public class HeaderDelimitedTextBlockReader implements TextBlockReader, Runnable
     // The amount of time to wait for input on the text block reader
     private static final long TEXT_BLOCK_DELAY = 250;
 
-    // Tag for the start of a text block
+    // Tag for the start and end of text blocks
     private final String blockStartToken;
+    private final String blockEndToken;
+
+    // Indicates that text block processing starts at the first block of text
+    private final boolean delimiterAtStart;
+    private boolean blockEndTokenUsed = false;
+
+    // The thread used to read the text from the stream
+    Thread textConsumputionThread;
 
     // The input stream for text
     private InputStream inputStream;
@@ -54,37 +62,49 @@ public class HeaderDelimitedTextBlockReader implements TextBlockReader, Runnable
     // The lines of input read from the input stream
     private final Queue<String> textLineQueue = new LinkedBlockingQueue<>();
 
-    // The thread used to read text from the input stream
-    private Thread textConsumputionThread;
-
     // True while EOF has not been seen on input
     private boolean eofOnInputStream = false;
 
     /**
-     * Constructor, initialize the text block reader.
+     * Constructor, initialize the text block reader using token delimited event protocol parameters.
      *
-     * @param blockStartToken the block start token for the start of a text block
+     * @param tokenDelimitedParameters
+     *        the token delimited event protocol parameters
      */
-    public HeaderDelimitedTextBlockReader(final String blockStartToken) {
-        this.blockStartToken = blockStartToken;
+    public HeaderDelimitedTextBlockReader(final EventProtocolTextTokenDelimitedParameters tokenDelimitedParameters) {
+        this(tokenDelimitedParameters.getStartDelimiterToken(), tokenDelimitedParameters.getEndDelimiterToken(),
+                        tokenDelimitedParameters.isDelimiterAtStart());
     }
 
     /**
-     * Constructor, initialize the text block reader using token delimited event protocol
-     * parameters.
+     * Constructor, initialize the text block reader.
      *
-     * @param tokenDelimitedParameters the token delimited event protocol parameters
+     * @param blockStartToken
+     *        the block start token for the start of a text block
+     * @param blockEndToken
+     *        the block end token for the end of a text block
+     * @param delimiterAtStart
+     *        indicates that text block processing starts at the first block of text
      */
-    public HeaderDelimitedTextBlockReader(final EventProtocolTextTokenDelimitedParameters tokenDelimitedParameters) {
-        this.blockStartToken = tokenDelimitedParameters.getDelimiterToken();
+    public HeaderDelimitedTextBlockReader(final String blockStartToken, final String blockEndToken,
+                    final boolean delimiterAtStart) {
+        this.blockStartToken = blockStartToken;
+        this.delimiterAtStart = delimiterAtStart;
+
+        if (blockEndToken == null) {
+            this.blockEndToken = blockStartToken;
+            this.blockEndTokenUsed = false;
+        } else {
+            this.blockEndToken = blockEndToken;
+            this.blockEndTokenUsed = true;
+        }
     }
 
     /*
      * (non-Javadoc)
      * 
-     * @see
-     * org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.TextBlockReader#
-     * init( java.io.InputStream)
+     * @see org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.TextBlockReader# init(
+     * java.io.InputStream)
      */
     @Override
     public void init(final InputStream incomingInputStream) {
@@ -99,9 +119,7 @@ public class HeaderDelimitedTextBlockReader implements TextBlockReader, Runnable
     /*
      * (non-Javadoc)
      * 
-     * @see
-     * org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.TextBlockReader#
-     * readTextBlock()
+     * @see org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.TextBlockReader# readTextBlock()
      */
     @Override
     public TextBlock readTextBlock() throws IOException {
@@ -109,32 +127,42 @@ public class HeaderDelimitedTextBlockReader implements TextBlockReader, Runnable
         final StringBuilder textBlockBuilder = new StringBuilder();
 
         // Wait for the timeout period if there is no input
-        if (!eofOnInputStream && textLineQueue.size() == 0) {
+        if (!eofOnInputStream && textLineQueue.isEmpty()) {
             ThreadUtilities.sleep(TEXT_BLOCK_DELAY);
         }
 
         // Scan the lines in the queue
-        while (textLineQueue.size() > 0) {
+        while (!textLineQueue.isEmpty()) {
             // Scroll down in the available lines looking for the start of the text block
-            if (textLineQueue.peek().startsWith(blockStartToken)) {
+            if (!delimiterAtStart || textLineQueue.peek().startsWith(blockStartToken)) {
                 // Process the input line header
                 textBlockBuilder.append(textLineQueue.remove());
                 textBlockBuilder.append('\n');
                 break;
             } else {
-                LOGGER.warn("invalid input on consumer: " + textLineQueue.remove());
+                String consumer = textLineQueue.remove();
+                LOGGER.warn("invalid input on consumer: {}", consumer);
             }
         }
 
         // Get the rest of the text document
-        while (textLineQueue.size() > 0 && !textLineQueue.peek().startsWith(blockStartToken)) {
+        while (!textLineQueue.isEmpty() && !textLineQueue.peek().startsWith(blockEndToken)
+                        && !textLineQueue.peek().startsWith(blockStartToken)) {
+            // We just strip out block end tokens because we use block start tokens to delimit the blocks of text
+            textBlockBuilder.append(textLineQueue.remove());
+            textBlockBuilder.append('\n');
+        }
+
+        // Check if we should add the block end token to the end of the text block
+        if (!textLineQueue.isEmpty() && blockEndTokenUsed && textLineQueue.peek().startsWith(blockEndToken)) {
+            // Process the input line header
             textBlockBuilder.append(textLineQueue.remove());
             textBlockBuilder.append('\n');
         }
 
         // Condition the text block and return it
         final String textBlock = textBlockBuilder.toString().trim();
-        final boolean endOfText = (eofOnInputStream && textLineQueue.size() == 0 ? true : false);
+        final boolean endOfText = (eofOnInputStream && textLineQueue.isEmpty() ? true : false);
 
         if (textBlock.length() > 0) {
             return new TextBlock(endOfText, textBlock);
index 3b21a29..2238436 100644 (file)
@@ -43,8 +43,8 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 
 /**
- * The Class Apex2JSONEventConverter converts {@link ApexEvent} instances to and from JSON string
- * representations of Apex events.
+ * The Class Apex2JSONEventConverter converts {@link ApexEvent} instances to and from JSON string representations of
+ * Apex events.
  *
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
@@ -57,8 +57,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /*
      * (non-Javadoc)
      * 
-     * @see
-     * org.onap.policy.apex.service.engine.event.ApexEventProtocolConverter#init(org.onap.policy.
+     * @see org.onap.policy.apex.service.engine.event.ApexEventProtocolConverter#init(org.onap.policy.
      * apex.service.parameters.eventprotocol.EventProtocolParameters)
      */
     @Override
@@ -76,9 +75,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /*
      * (non-Javadoc)
      *
-     * @see
-     * org.onap.policy.apex.service.engine.event.ApexEventConverter#toApexEvent(java.lang.String,
-     * java.lang.Object)
+     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#toApexEvent(java.lang.String, java.lang.Object)
      */
     @Override
     public List<ApexEvent> toApexEvent(final String eventName, final Object eventObject) throws ApexEventException {
@@ -100,12 +97,12 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
         }
 
         // The list of events we will return
-        final List<ApexEvent> eventList = new ArrayList<ApexEvent>();
+        final List<ApexEvent> eventList = new ArrayList<>();
 
         try {
             // We may have a single JSON object with a single event or an array of JSON objects
-            final Object decodedJsonObject =
-                    new GsonBuilder().serializeNulls().create().fromJson(jsonEventString, Object.class);
+            final Object decodedJsonObject = new GsonBuilder().serializeNulls().create().fromJson(jsonEventString,
+                            Object.class);
 
             // Check if we have a list of objects
             if (decodedJsonObject instanceof List) {
@@ -121,15 +118,15 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
                         eventList.add(jsonObject2ApexEvent(eventName, (JsonObject) jsonListObject));
                     } else {
                         throw new ApexEventException("incoming event (" + jsonEventString
-                                + ") is a JSON object array containing an invalid object " + jsonListObject);
+                                        + ") is a JSON object array containing an invalid object " + jsonListObject);
                     }
                 }
             } else {
                 eventList.add(jsonStringApexEvent(eventName, jsonEventString));
             }
         } catch (final Exception e) {
-            final String errorString =
-                    "Failed to unmarshal JSON event: " + e.getMessage() + ", event=" + jsonEventString;
+            final String errorString = "Failed to unmarshal JSON event: " + e.getMessage() + ", event="
+                            + jsonEventString;
             LOGGER.warn(errorString, e);
             throw new ApexEventException(errorString, e);
         }
@@ -141,8 +138,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /*
      * (non-Javadoc)
      *
-     * @see
-     * org.onap.policy.apex.service.engine.event.ApexEventConverter#fromApexEvent(org.onap.policy.
+     * @see org.onap.policy.apex.service.engine.event.ApexEventConverter#fromApexEvent(org.onap.policy.
      * apex.service.engine.event.ApexEvent)
      */
     @Override
@@ -154,8 +150,8 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
         }
 
         // Get the event definition for the event from the model service
-        final AxEvent eventDefinition =
-                ModelService.getModel(AxEvents.class).get(apexEvent.getName(), apexEvent.getVersion());
+        final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(apexEvent.getName(),
+                        apexEvent.getVersion());
 
         // Use a GSON Json object to marshal the Apex event to JSON
         final Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
@@ -177,7 +173,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
             if (!apexEvent.containsKey(fieldName)) {
                 if (!eventField.getOptional()) {
                     final String errorMessage = "error parsing " + eventDefinition.getID() + " event to Json. "
-                            + "Field \"" + fieldName + "\" is missing, but is mandatory. Fields: " + apexEvent;
+                                    + "Field \"" + fieldName + "\" is missing, but is mandatory. Fields: " + apexEvent;
                     LOGGER.debug(errorMessage);
                     throw new ApexEventRuntimeException(errorMessage);
                 }
@@ -187,9 +183,9 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
             final Object fieldValue = apexEvent.get(fieldName);
 
             // Get the schema helper
-            final SchemaHelper fieldSchemaHelper =
-                    new SchemaHelperFactory().createSchemaHelper(eventField.getKey(), eventField.getSchema());
-            jsonObject.add(fieldName, fieldSchemaHelper.marshal2JsonElement(fieldValue));
+            final SchemaHelper fieldSchemaHelper = new SchemaHelperFactory().createSchemaHelper(eventField.getKey(),
+                            eventField.getSchema());
+            jsonObject.add(fieldName, (JsonElement)fieldSchemaHelper.marshal2Object(fieldValue));
         }
 
         // Output JSON string in a pretty format
@@ -199,20 +195,23 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method converts a JSON object into an Apex event.
      *
-     * @param eventName the name of the event
-     * @param jsonEventString the JSON string that holds the event
+     * @param eventName
+     *        the name of the event
+     * @param jsonEventString
+     *        the JSON string that holds the event
      * @return the apex event that we have converted the JSON object into
-     * @throws ApexEventException thrown on unmarshaling exceptions
+     * @throws ApexEventException
+     *         thrown on unmarshaling exceptions
      */
     private ApexEvent jsonStringApexEvent(final String eventName, final String jsonEventString)
-            throws ApexEventException {
+                    throws ApexEventException {
         // Use GSON to read the event string
-        final JsonObject jsonObject =
-                new GsonBuilder().serializeNulls().create().fromJson(jsonEventString, JsonObject.class);
+        final JsonObject jsonObject = new GsonBuilder().serializeNulls().create().fromJson(jsonEventString,
+                        JsonObject.class);
 
         if (jsonObject == null || !jsonObject.isJsonObject()) {
             throw new ApexEventException(
-                    "incoming event (" + jsonEventString + ") is not a JSON object or an JSON object array");
+                            "incoming event (" + jsonEventString + ") is not a JSON object or an JSON object array");
         }
 
         return jsonObject2ApexEvent(eventName, jsonObject);
@@ -221,19 +220,22 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method converts a JSON object into an Apex event.
      *
-     * @param eventName the name of the event
-     * @param jsonObject the JSON object that holds the event
+     * @param eventName
+     *        the name of the event
+     * @param jsonObject
+     *        the JSON object that holds the event
      * @return the apex event that we have converted the JSON object into
-     * @throws ApexEventException thrown on unmarshaling exceptions
+     * @throws ApexEventException
+     *         thrown on unmarshaling exceptions
      */
     private ApexEvent jsonObject2ApexEvent(final String eventName, final JsonObject jsonObject)
-            throws ApexEventException {
+                    throws ApexEventException {
         // Process the mandatory Apex header
         final ApexEvent apexEvent = processApexEventHeader(eventName, jsonObject);
 
         // Get the event definition for the event from the model service
-        final AxEvent eventDefinition =
-                ModelService.getModel(AxEvents.class).get(apexEvent.getName(), apexEvent.getVersion());
+        final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(apexEvent.getName(),
+                        apexEvent.getVersion());
 
         // Iterate over the input fields in the event
         for (final AxField eventField : eventDefinition.getFields()) {
@@ -241,7 +243,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
             if (!hasJSONField(jsonObject, fieldName)) {
                 if (!eventField.getOptional()) {
                     final String errorMessage = "error parsing " + eventDefinition.getID() + " event from Json. "
-                            + "Field \"" + fieldName + "\" is missing, but is mandatory.";
+                                    + "Field \"" + fieldName + "\" is missing, but is mandatory.";
                     LOGGER.debug(errorMessage);
                     throw new ApexEventException(errorMessage);
                 }
@@ -252,8 +254,8 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
 
             if (fieldValue != null && !fieldValue.isJsonNull()) {
                 // Get the schema helper
-                final SchemaHelper fieldSchemaHelper =
-                        new SchemaHelperFactory().createSchemaHelper(eventField.getKey(), eventField.getSchema());
+                final SchemaHelper fieldSchemaHelper = new SchemaHelperFactory().createSchemaHelper(eventField.getKey(),
+                                eventField.getSchema());
                 apexEvent.put(fieldName, fieldSchemaHelper.createNewInstance(fieldValue));
             } else {
                 apexEvent.put(fieldName, null);
@@ -266,48 +268,48 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method processes the event header of an Apex event.
      *
-     * @param eventName the name of the event
-     * @param jsonObject the JSON object containing the JSON representation of the incoming event
+     * @param eventName
+     *        the name of the event
+     * @param jsonObject
+     *        the JSON object containing the JSON representation of the incoming event
      * @return an apex event constructed using the header fields of the event
-     * @throws ApexEventRuntimeException the apex event runtime exception
-     * @throws ApexEventException on invalid events with missing header fields
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
+     * @throws ApexEventException
+     *         on invalid events with missing header fields
      */
     private ApexEvent processApexEventHeader(final String eventName, final JsonObject jsonObject)
-            throws ApexEventRuntimeException, ApexEventException {
+                    throws ApexEventException {
         // Get the event header fields
-  // @formatter:off
-               String name      = getJSONStringField(jsonObject, ApexEvent.NAME_HEADER_FIELD,      jsonPars.getNameAlias(),      ApexEvent.NAME_REGEXP,      false);
-               String version   = getJSONStringField(jsonObject, ApexEvent.VERSION_HEADER_FIELD,   jsonPars.getVersionAlias(),   ApexEvent.VERSION_REGEXP,   false);
-               String namespace = getJSONStringField(jsonObject, ApexEvent.NAMESPACE_HEADER_FIELD, jsonPars.getNameSpaceAlias(), ApexEvent.NAMESPACE_REGEXP, false);
-               String source    = getJSONStringField(jsonObject, ApexEvent.SOURCE_HEADER_FIELD,    jsonPars.getSourceAlias(),    ApexEvent.SOURCE_REGEXP,    false);
-               String target    = getJSONStringField(jsonObject, ApexEvent.TARGET_HEADER_FIELD,    jsonPars.getTargetAlias(),    ApexEvent.TARGET_REGEXP,    false);
-               // @formatter:on
+        // @formatter:off
+        String name      = getJSONStringField(jsonObject, ApexEvent.NAME_HEADER_FIELD,      jsonPars.getNameAlias(),      ApexEvent.NAME_REGEXP,      false);
+        String version   = getJSONStringField(jsonObject, ApexEvent.VERSION_HEADER_FIELD,   jsonPars.getVersionAlias(),   ApexEvent.VERSION_REGEXP,   false);
+        String namespace = getJSONStringField(jsonObject, ApexEvent.NAMESPACE_HEADER_FIELD, jsonPars.getNameSpaceAlias(), ApexEvent.NAMESPACE_REGEXP, false);
+        String source    = getJSONStringField(jsonObject, ApexEvent.SOURCE_HEADER_FIELD,    jsonPars.getSourceAlias(),    ApexEvent.SOURCE_REGEXP,    false);
+        String target    = getJSONStringField(jsonObject, ApexEvent.TARGET_HEADER_FIELD,    jsonPars.getTargetAlias(),    ApexEvent.TARGET_REGEXP,    false);
+        // @formatter:on
+
+        // Check that an event name has been specified
+        if (name == null && eventName == null) {
+            throw new ApexEventRuntimeException(
+                            "event received without mandatory parameter \"name\" on configuration or on event");
+        }
 
         // Check if an event name was specified on the event parameters
         if (eventName != null) {
             if (name != null && !eventName.equals(name)) {
-                LOGGER.warn("The incoming event name \"" + name + "\" does not match the configured event name \""
-                        + eventName + "\", using configured event name");
+                LOGGER.warn("The incoming event name \"{}\" does not match the configured event name \"{}\", using configured event name",
+                                name, eventName);
             }
             name = eventName;
-        } else {
-            if (name == null) {
-                throw new ApexEventRuntimeException(
-                        "event received without mandatory parameter \"name\" on configuration or on event");
-            }
         }
 
         // Now, find the event definition in the model service. If version is null, the newest event
         // definition in the model service is used
         final AxEvent eventDefinition = ModelService.getModel(AxEvents.class).get(name, version);
         if (eventDefinition == null) {
-            if (version == null) {
-                throw new ApexEventRuntimeException(
-                        "an event definition for an event named \"" + name + "\" not found in Apex model");
-            } else {
-                throw new ApexEventRuntimeException("an event definition for an event named \"" + name
-                        + "\" with version \"" + version + "\" not found in Apex model");
-            }
+            throw new ApexEventRuntimeException("an event definition for an event named \"" + name
+                            + "\" with version \"" + version + "\" not found in Apex model");
         }
 
         // Use the defined event version if no version is specified on the incoming fields
@@ -318,9 +320,9 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
         // Check the name space is OK if it is defined, if not, use the name space from the model
         if (namespace != null) {
             if (!namespace.equals(eventDefinition.getNameSpace())) {
-                throw new ApexEventRuntimeException(
-                        "namespace \"" + namespace + "\" on event \"" + name + "\" does not match namespace \""
-                                + eventDefinition.getNameSpace() + "\" for that event in the Apex model");
+                throw new ApexEventRuntimeException("namespace \"" + namespace + "\" on event \"" + name
+                                + "\" does not match namespace \"" + eventDefinition.getNameSpace()
+                                + "\" for that event in the Apex model");
             }
         } else {
             namespace = eventDefinition.getNameSpace();
@@ -342,17 +344,22 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method gets an event string field from a JSON object.
      *
-     * @param jsonObject the JSON object containing the JSON representation of the incoming event
-     * @param fieldName the field name to find in the event
-     * @param fieldAlias the alias for the field to find in the event, overrides the field name if
-     *        it is not null
-     * @param fieldRE the regular expression to check the field against for validity
-     * @param mandatory true if the field is mandatory
+     * @param jsonObject
+     *        the JSON object containing the JSON representation of the incoming event
+     * @param fieldName
+     *        the field name to find in the event
+     * @param fieldAlias
+     *        the alias for the field to find in the event, overrides the field name if it is not null
+     * @param fieldRE
+     *        the regular expression to check the field against for validity
+     * @param mandatory
+     *        true if the field is mandatory
      * @return the value of the field in the JSON object or null if the field is optional
-     * @throws ApexEventRuntimeException the apex event runtime exception
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
      */
     private String getJSONStringField(final JsonObject jsonObject, final String fieldName, final String fieldAlias,
-            final String fieldRE, final boolean mandatory) throws ApexEventRuntimeException {
+                    final String fieldRE, final boolean mandatory) {
         // Get the JSON field for the string field
         final JsonElement jsonField = getJSONField(jsonObject, fieldName, fieldAlias, mandatory);
 
@@ -368,7 +375,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
         } catch (final Exception e) {
             // The element is not a string so throw an error
             throw new ApexEventRuntimeException("field \"" + fieldName + "\" with type \""
-                    + jsonField.getClass().getCanonicalName() + "\" is not a string value");
+                            + jsonField.getClass().getCanonicalName() + "\" is not a string value");
         }
 
         // Is regular expression checking required
@@ -379,7 +386,7 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
         // Check the event field against its regular expression
         if (!fieldValueString.matches(fieldRE)) {
             throw new ApexEventRuntimeException(
-                    "field \"" + fieldName + "\" with value \"" + fieldValueString + "\" is invalid");
+                            "field \"" + fieldName + "\" with value \"" + fieldValueString + "\" is invalid");
         }
 
         return fieldValueString;
@@ -388,16 +395,20 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method gets an event field from a JSON object.
      *
-     * @param jsonObject the JSON object containing the JSON representation of the incoming event
-     * @param fieldName the field name to find in the event
-     * @param fieldAlias the alias for the field to find in the event, overrides the field name if
-     *        it is not null
-     * @param mandatory true if the field is mandatory
+     * @param jsonObject
+     *        the JSON object containing the JSON representation of the incoming event
+     * @param fieldName
+     *        the field name to find in the event
+     * @param fieldAlias
+     *        the alias for the field to find in the event, overrides the field name if it is not null
+     * @param mandatory
+     *        true if the field is mandatory
      * @return the value of the field in the JSON object or null if the field is optional
-     * @throws ApexEventRuntimeException the apex event runtime exception
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
      */
     private JsonElement getJSONField(final JsonObject jsonObject, final String fieldName, final String fieldAlias,
-            final boolean mandatory) throws ApexEventRuntimeException {
+                    final boolean mandatory) {
 
         // Check if we should use the alias for this field
         String fieldToFind = fieldName;
@@ -421,12 +432,15 @@ public class Apex2JSONEventConverter implements ApexEventProtocolConverter {
     /**
      * This method if a JSON object has a named field.
      *
-     * @param jsonObject the JSON object containing the JSON representation of the incoming event
-     * @param fieldName the field name to find in the event
+     * @param jsonObject
+     *        the JSON object containing the JSON representation of the incoming event
+     * @param fieldName
+     *        the field name to find in the event
      * @return true if the field is present
-     * @throws ApexEventRuntimeException the apex event runtime exception
+     * @throws ApexEventRuntimeException
+     *         the apex event runtime exception
      */
-    private boolean hasJSONField(final JsonObject jsonObject, final String fieldName) throws ApexEventRuntimeException {
+    private boolean hasJSONField(final JsonObject jsonObject, final String fieldName) {
         // check for the field
         return jsonObject.has(fieldName);
     }
index b4a4055..5f2b742 100644 (file)
@@ -51,11 +51,11 @@ public class JSONEventProtocolParameters extends EventProtocolTextCharDelimitedP
 
     // Aliases for Apex event header fields
     // @formatter:off
-    private final String nameAlias      = null;
-    private final String versionAlias   = null;
-    private final String nameSpaceAlias = null;
-    private final String sourceAlias    = null;
-    private final String targetAlias    = null;
+    private String nameAlias      = null;
+    private String versionAlias   = null;
+    private String nameSpaceAlias = null;
+    private String sourceAlias    = null;
+    private String targetAlias    = null;
     // @formatter:on
 
     /**
@@ -131,5 +131,49 @@ public class JSONEventProtocolParameters extends EventProtocolTextCharDelimitedP
     public String getTargetAlias() {
         return targetAlias;
     }
+    
+    /**
+     * Sets the name alias.
+     *
+     * @param nameAlias the new name alias
+     */
+    public void setNameAlias(String nameAlias) {
+        this.nameAlias = nameAlias;
+    }
+
+    /**
+     * Sets the version alias.
+     *
+     * @param versionAlias the new version alias
+     */
+    public void setVersionAlias(String versionAlias) {
+        this.versionAlias = versionAlias;
+    }
 
+    /**
+     * Sets the name space alias.
+     *
+     * @param nameSpaceAlias the new name space alias
+     */
+    public void setNameSpaceAlias(String nameSpaceAlias) {
+        this.nameSpaceAlias = nameSpaceAlias;
+    }
+
+    /**
+     * Sets the source alias.
+     *
+     * @param sourceAlias the new source alias
+     */
+    public void setSourceAlias(String sourceAlias) {
+        this.sourceAlias = sourceAlias;
+    }
+
+    /**
+     * Sets the target alias.
+     *
+     * @param targetAlias the new target alias
+     */
+    public void setTargetAlias(String targetAlias) {
+        this.targetAlias = targetAlias;
+    }
 }
index f74c0f4..9a98886 100644 (file)
@@ -589,7 +589,7 @@ final class EngineWorker implements EngineService {
                 runtimeJsonStringBuilder.append("{\"EntryName\":");
                 runtimeJsonStringBuilder.append(gson.toJson(contextEntry.getKey()));
                 runtimeJsonStringBuilder.append(",\"EntryContent\":");
-                runtimeJsonStringBuilder.append(gson.toJson(schemaHelper.marshal2Json(contextEntry.getValue())));
+                runtimeJsonStringBuilder.append(gson.toJson(schemaHelper.marshal2String(contextEntry.getValue())));
 
                 // End of context entry
                 runtimeJsonStringBuilder.append("}");
index 37fbd32..91a6403 100644 (file)
@@ -23,56 +23,100 @@ package org.onap.policy.apex.service.parameters.eventprotocol;
 import org.onap.policy.apex.service.parameters.ApexParameterValidator;
 
 /**
- * An event protocol parameter class for token delimited textual event protocols that may be
- * specialized by event protocol plugins that require plugin specific parameters.
+ * An event protocol parameter class for token delimited textual event protocols that may be specialized by event
+ * protocol plugins that require plugin specific parameters.
  *
  * <p>
  * The following parameters are defined:
  * <ol>
- * <li>delimiterToken: the token string that delimits text blocks that contain events.
+ * <li>startDelimiterToken: the token string that delimits the start of text blocks that contain events.
+ * <li>endDelimiterToken: the token string that delimits the end of text blocks that contain events, this parameter is
+ * optional and defaults to null.
+ * <li>delimiterAtStart: indicates if the first text block should have a delimiter at the start (true), or whether
+ * processing of the first block should begin at the start of the text (false). The parameter is optional and defaults
+ * to true.
  * </ol>
  *
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
 public abstract class EventProtocolTextTokenDelimitedParameters extends EventProtocolParameters
-        implements ApexParameterValidator {
+                implements ApexParameterValidator {
     // The delimiter token for text blocks
-    private String delimiterToken = null;
+    private String startDelimiterToken = null;
+    private String endDelimiterToken = null;
+    private boolean delimiterAtStart = true;
 
     /**
-     * Constructor to create an event protocol parameters instance with the name of a sub class of
-     * this class.
+     * Constructor to create an event protocol parameters instance with the name of a sub class of this class.
      *
-     * @param parameterClassName the class name of a sub class of this class
+     * @param parameterClassName
+     *        the class name of a sub class of this class
      */
     public EventProtocolTextTokenDelimitedParameters(final String parameterClassName) {
         super(parameterClassName);
     }
 
     /**
-     * Gets the delimiter token that delimits events in the text.
+     * Gets the start delimiter token that delimits events in the text.
      *
-     * @return the delimiter token
+     * @return the start delimiter token
      */
-    public String getDelimiterToken() {
-        return delimiterToken;
+    public String getStartDelimiterToken() {
+        return startDelimiterToken;
     }
 
+    /**
+     * Sets the start delimiter token that delimits events in the text.
+     *
+     * @param startDelimiterToken
+     *        delimiterToken the delimiter token
+     */
+    public void setStartDelimiterToken(final String startDelimiterToken) {
+        this.startDelimiterToken = startDelimiterToken;
+    }
+
+    /**
+     * Gets the end delimiter token that delimits events in the text.
+     *
+     * @return the end delimiter token
+     */
+    public String getEndDelimiterToken() {
+        return endDelimiterToken;
+    }
 
     /**
-     * Sets the delimiter token that delimits events in the text.
+     * Sets the end delimiter token that delimits events in the text.
      *
-     * @param delimiterToken the delimiter token
+     * @param endDelimiterToken
+     *        delimiterToken the delimiter token
+     */
+    public void setEndDelimiterToken(final String endDelimiterToken) {
+        this.endDelimiterToken = endDelimiterToken;
+    }
+
+    /**
+     * Does there have to be a delimiter at the start of the first text block?
+     * 
+     * @return true if there must be a delimiter at the start of the text block
      */
-    public void setDelimiterToken(final String delimiterToken) {
-        this.delimiterToken = delimiterToken;
+    public boolean isDelimiterAtStart() {
+        return delimiterAtStart;
     }
 
+    /**
+     * Sets if there has to be a delimiter at the start of the first text block?
+     * 
+     * @param delimiterAtStart
+     *        true if there must be a delimiter at the start of the text block
+     */
+    public void setDelimiterAtStart(boolean delimiterAtStart) {
+        this.delimiterAtStart = delimiterAtStart;
+    }
 
     @Override
     public String toString() {
-        return "EventProtocolTextCharDelimitedParameters {" + super.toString() + "} [delimiterToken=" + delimiterToken
-                + "]";
+        return "EventProtocolTextTokenDelimitedParameters [startDelimiterToken=" + startDelimiterToken
+                        + ", endDelimiterToken=" + endDelimiterToken + ", delimiterAtStart=" + delimiterAtStart + "]";
     }
 
     /*
@@ -86,8 +130,8 @@ public abstract class EventProtocolTextTokenDelimitedParameters extends EventPro
 
         errorMessageBuilder.append(super.validate());
 
-        if (delimiterToken == null || delimiterToken.length() == 0) {
-            errorMessageBuilder.append("  text delimiter token not specified or is blank\n");
+        if (startDelimiterToken == null || startDelimiterToken.length() == 0) {
+            errorMessageBuilder.append("  text start delimiter token not specified or is blank\n");
         }
 
         return errorMessageBuilder.toString();
index 99f938e..bac2713 100644 (file)
@@ -46,7 +46,7 @@ public class SuperTokenDelimitedEventProtocolParameters extends EventProtocolTex
         this.setLabel(SUPER_TOKEN_EVENT_PROTOCOL_LABEL);
 
         // Set the starting and ending delimiters for text blocks of JSON events
-        this.setDelimiterToken(SUPER_TOKEN_DELIMITER);
+        this.setStartDelimiterToken(SUPER_TOKEN_DELIMITER);
 
         // Set the event protocol plugin class
         this.setEventProtocolPluginClass(SuperTokenDelimitedEventConverter.class.getCanonicalName());