diff options
author | Michael Arrastia <MArrasti@amdocs.com> | 2018-06-25 15:55:54 +0100 |
---|---|---|
committer | Michael Arrastia <MArrasti@amdocs.com> | 2018-06-25 15:55:54 +0100 |
commit | 4aec102f14f7cb837733c4d2b217e7fdc7088f86 (patch) | |
tree | 6167d6b45a135f51db3dceb49deadf0d5bdc05e3 /champ-service/src/main | |
parent | 0edaac90429d84075ee01404166f29c666b3d107 (diff) |
Fix serialization of the "key" property
The introduction of a payload envelope to the update notification event
issued by champ-core caused the incorrect serialization of the "key"
property as a JSON object instead of a String.
This caused Spike to fail when parsing the notification event from
Champ as it expects "key" to be a String.
A previous fix attempt incorrectly addressed this problem. As the issue
originated from the inconsistent use of both Jackson and Gson JSON
libraries with the envelope using Gson but the contained objects
using Jackson annotations. This fix primarily involves updates to
champ-core to ensure that the envelope generation uses Jackson
instead of Gson and respects the original Jackson serialization of
the "key" property as a String.
Change-Id: I2a12732c9ff3970c3db9de5f0039304e68cb3556
Issue-ID: AAI-1243
Signed-off-by: Michael Arrastia <MArrasti@amdocs.com>
Diffstat (limited to 'champ-service/src/main')
3 files changed, 235 insertions, 9 deletions
diff --git a/champ-service/src/main/java/org/onap/champ/async/ChampAsyncRequestProcessor.java b/champ-service/src/main/java/org/onap/champ/async/ChampAsyncRequestProcessor.java index 3b13a42..4966287 100644 --- a/champ-service/src/main/java/org/onap/champ/async/ChampAsyncRequestProcessor.java +++ b/champ-service/src/main/java/org/onap/champ/async/ChampAsyncRequestProcessor.java @@ -29,7 +29,6 @@ import java.util.concurrent.ThreadPoolExecutor; import javax.naming.OperationNotSupportedException; import javax.ws.rs.core.Response.Status; import org.onap.aai.champcore.ChampTransaction; -import org.onap.aai.champcore.event.envelope.ChampEventHeader; import org.onap.aai.cl.api.Logger; import org.onap.aai.cl.eelf.LoggerFactory; import org.onap.aai.event.api.EventConsumer; @@ -39,6 +38,7 @@ import org.onap.champ.event.GraphEvent.GraphEventResult; import org.onap.champ.event.GraphEventEdge; import org.onap.champ.event.GraphEventVertex; import org.onap.champ.event.envelope.GraphEventEnvelope; +import org.onap.champ.event.envelope.GraphEventHeader; import org.onap.champ.exception.ChampServiceException; import org.onap.champ.service.ChampDataService; import org.onap.champ.service.ChampThreadFactory; @@ -159,7 +159,7 @@ public class ChampAsyncRequestProcessor extends TimerTask { } // Apply Champ Event header - eventEnvelope.setHeader(new ChampEventHeader.Builder(ChampEventHeader.EventType.UPDATE_RESULT).requestId(event.getTransactionId()).build()); + eventEnvelope.setHeader(new GraphEventHeader.Builder().requestId(event.getTransactionId()).build()); // Parse the event and call champ Dao to process , Create the // response event and put it on response queue diff --git a/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventEnvelope.java b/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventEnvelope.java index 13e0f7a..7958a3a 100644 --- a/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventEnvelope.java +++ b/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventEnvelope.java @@ -22,7 +22,6 @@ package org.onap.champ.event.envelope; import javax.ws.rs.core.Response.Status; -import org.onap.aai.champcore.event.envelope.ChampEventHeader; import org.onap.champ.event.GraphEvent; import org.onap.champ.exception.ChampServiceException; import com.google.gson.Gson; @@ -30,7 +29,7 @@ import com.google.gson.GsonBuilder; public class GraphEventEnvelope { - private ChampEventHeader header; + private GraphEventHeader header; private GraphEvent body; /** @@ -39,21 +38,20 @@ public class GraphEventEnvelope { private static final Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); public GraphEventEnvelope(GraphEvent event) { - this.header = new ChampEventHeader.Builder(ChampEventHeader.EventType.UPDATE_RESULT) - .requestId(event.getTransactionId()).build(); + this.header = new GraphEventHeader.Builder().requestId(event.getTransactionId()).build(); this.body = event; } - public GraphEventEnvelope(ChampEventHeader header, GraphEvent body) { + public GraphEventEnvelope(GraphEventHeader header, GraphEvent body) { this.header = header; this.body = body; } - public ChampEventHeader getHeader() { + public GraphEventHeader getHeader() { return header; } - public void setHeader(ChampEventHeader header) { + public void setHeader(GraphEventHeader header) { this.header = header; } diff --git a/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventHeader.java b/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventHeader.java new file mode 100644 index 0000000..ae9fe53 --- /dev/null +++ b/champ-service/src/main/java/org/onap/champ/event/envelope/GraphEventHeader.java @@ -0,0 +1,228 @@ +/** + * ============LICENSE_START========================================== + * org.onap.aai + * =================================================================== + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017 Amdocs + * =================================================================== + * 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. + * ============LICENSE_END============================================ + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.champ.event.envelope; + +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.Objects; +import java.util.UUID; +import org.apache.commons.lang3.builder.EqualsBuilder; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.SerializedName; + +public class GraphEventHeader { + + private static final String SOURCE_NAME = "CHAMP"; + + private static final String EVENT_TYPE = "update-result"; + + @SerializedName("request-id") + private String requestId; + + private String timestamp; + + @SerializedName("source-name") + private String sourceName; + + @SerializedName("event-type") + private String eventType; + + @SerializedName("validation-entity-type") + private String validationEntityType; + + @SerializedName("validation-top-entity-type") + private String validationTopEntityType; + + @SerializedName("entity-link") + private String entityLink; + + private static final Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private String requestId; + private String validationEntityType; + private String validationTopEntityType; + private String entityLink; + + public Builder requestId(String val) { + requestId = val; + return this; + } + + public Builder validationEntityType(String val) { + validationEntityType = val; + return this; + } + + public Builder validationTopEntityType(String val) { + validationTopEntityType = val; + return this; + } + + public Builder entityLink(String val) { + entityLink = val; + return this; + } + + public GraphEventHeader build() { + return new GraphEventHeader(this); + } + } + + private GraphEventHeader(Builder builder) { + requestId = builder.requestId != null ? builder.requestId : UUID.randomUUID().toString(); + timestamp = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmssX").withZone(ZoneOffset.UTC).format(Instant.now()); + sourceName = SOURCE_NAME; + eventType = EVENT_TYPE; + + validationEntityType = builder.validationEntityType; + validationTopEntityType = builder.validationTopEntityType; + entityLink = builder.entityLink; + } + + /** + * Serializes this object into a JSON string representation. + * + * @return a JSON format string representation of this object. + */ + public String toJson() { + return gson.toJson(this); + } + + /////////////////////////////////////////////////////////////////////////// + // GETTERS AND SETTERS + /////////////////////////////////////////////////////////////////////////// + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getSourceName() { + return sourceName; + } + + public void setSourceName(String sourceName) { + this.sourceName = sourceName; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getValidationEntityType() { + return validationEntityType; + } + + public void setValidationEntityType(String validationEntityType) { + this.validationEntityType = validationEntityType; + } + + public String getValidationTopEntityType() { + return validationTopEntityType; + } + + public void setValidationTopEntityType(String validationTopEntityType) { + this.validationTopEntityType = validationTopEntityType; + } + + public String getEntityLink() { + return entityLink; + } + + public void setEntityLink(String entityLink) { + this.entityLink = entityLink; + } + + /////////////////////////////////////////////////////////////////////////// + // OVERRIDES + /////////////////////////////////////////////////////////////////////////// + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return Objects.hash(this.requestId, this.timestamp, this.sourceName, this.eventType, this.validationEntityType, + this.validationTopEntityType, this.entityLink); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof GraphEventHeader)) { + return false; + } else if (obj == this) { + return true; + } + GraphEventHeader rhs = (GraphEventHeader) obj; + // @formatter:off + return new EqualsBuilder() + .append(requestId, rhs.requestId) + .append(timestamp, rhs.timestamp) + .append(sourceName, rhs.sourceName) + .append(eventType, rhs.eventType) + .append(validationEntityType, rhs.validationEntityType) + .append(validationTopEntityType, rhs.validationTopEntityType) + .append(entityLink, rhs.entityLink) + .isEquals(); + // @formatter:on + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return this.toJson(); + } +} |