diff options
Diffstat (limited to 'services/services-engine')
7 files changed, 271 insertions, 140 deletions
diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/ApexEvent.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/ApexEvent.java index 552f949a2..99728c02e 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/ApexEvent.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/ApexEvent.java @@ -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 { diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/filecarrierplugin/consumer/HeaderDelimitedTextBlockReader.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/filecarrierplugin/consumer/HeaderDelimitedTextBlockReader.java index e40bc756c..07185c024 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/filecarrierplugin/consumer/HeaderDelimitedTextBlockReader.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/filecarrierplugin/consumer/HeaderDelimitedTextBlockReader.java @@ -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); diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/Apex2JSONEventConverter.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/Apex2JSONEventConverter.java index 3b21a29ca..223843631 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/Apex2JSONEventConverter.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/Apex2JSONEventConverter.java @@ -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); } diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/JSONEventProtocolParameters.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/JSONEventProtocolParameters.java index b4a4055d7..5f2b74204 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/JSONEventProtocolParameters.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/event/impl/jsonprotocolplugin/JSONEventProtocolParameters.java @@ -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; + } } diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java index f74c0f47b..9a9888652 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/runtime/impl/EngineWorker.java @@ -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("}"); diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/eventprotocol/EventProtocolTextTokenDelimitedParameters.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/eventprotocol/EventProtocolTextTokenDelimitedParameters.java index 37fbd32bf..91a6403df 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/eventprotocol/EventProtocolTextTokenDelimitedParameters.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/eventprotocol/EventProtocolTextTokenDelimitedParameters.java @@ -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(); diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/SuperTokenDelimitedEventProtocolParameters.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/SuperTokenDelimitedEventProtocolParameters.java index 99f938e10..bac271319 100644 --- a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/SuperTokenDelimitedEventProtocolParameters.java +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/SuperTokenDelimitedEventProtocolParameters.java @@ -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()); |