2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.openecomp.appc.requesthandler.conv;
 
  24 import java.text.ParseException;
 
  25 import java.text.SimpleDateFormat;
 
  26 import java.util.Date;
 
  27 import java.util.TimeZone;
 
  29 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.Action;
 
  30 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.AuditOutputBuilder;
 
  31 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.HealthCheckOutputBuilder;
 
  32 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LiveUpgradeOutputBuilder;
 
  33 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.LockOutputBuilder;
 
  34 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.ModifyConfigOutputBuilder;
 
  35 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.Payload;
 
  36 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.RollbackOutputBuilder;
 
  37 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SnapshotOutputBuilder;
 
  38 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SoftwareUploadOutputBuilder;
 
  39 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.StopOutputBuilder;
 
  40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.SyncOutputBuilder;
 
  41 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TerminateOutputBuilder;
 
  42 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.TestOutputBuilder;
 
  43 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.UnlockOutputBuilder;
 
  44 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.ZULU;
 
  45 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.CommonHeader;
 
  46 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.CommonHeaderBuilder;
 
  47 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags;
 
  48 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.FlagsBuilder;
 
  49 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.status.Status;
 
  50 import org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.status.StatusBuilder;
 
  51 import org.opendaylight.yangtools.concepts.Builder;
 
  52 import org.opendaylight.yangtools.yang.binding.DataContainer;
 
  53 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
 
  54 import org.openecomp.appc.domainmodel.lcm.VNFOperation;
 
  55 import org.openecomp.appc.requesthandler.impl.DmaapOutgoingMessage;
 
  56 import com.att.eelf.configuration.EELFLogger;
 
  57 import com.att.eelf.configuration.EELFManager;
 
  59 import com.fasterxml.jackson.annotation.JsonIgnore;
 
  60 import com.fasterxml.jackson.annotation.JsonInclude;
 
  61 import com.fasterxml.jackson.annotation.JsonProperty;
 
  62 import com.fasterxml.jackson.annotation.JsonValue;
 
  63 import com.fasterxml.jackson.core.JsonProcessingException;
 
  64 import com.fasterxml.jackson.databind.MapperFeature;
 
  65 import com.fasterxml.jackson.databind.ObjectMapper;
 
  66 import com.fasterxml.jackson.databind.ObjectWriter;
 
  67 import com.fasterxml.jackson.databind.SerializationFeature;
 
  70 public class Converter {
 
  71     public static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
 
  72     public static final String MODE_FLAG = "MODE";
 
  73     public static final String FORCE_FLAG = "FORCE";
 
  74     public static final String TTL_FLAG = "TTL";
 
  75     public final static String DMaaP_ROOT_VALUE = "output";
 
  76     private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
 
  77     private static final EELFLogger logger = EELFManager.getInstance().getLogger(Converter.class);
 
  79         isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
 
  82     public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
 
  83         Builder<?> outObj = null;
 
  85             throw new IllegalArgumentException("empty asyncResponse");
 
  87         if(vnfOperation == null){
 
  88             throw new IllegalArgumentException("empty asyncResponse.action");
 
  90         Action action = Action.valueOf(vnfOperation.name());
 
  91         CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
 
  92         Status status = convAsyncResponseTorev160108Status(response);
 
  93 //        Payload payload = convAsyncResponseTorev160108Payload(inObj);
 
  96                 outObj = new RollbackOutputBuilder();
 
  97                 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
 
  98                 ((RollbackOutputBuilder)outObj).setStatus(status);
 
 101                 outObj = new SnapshotOutputBuilder();
 
 102                 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 103                 ((SnapshotOutputBuilder)outObj).setStatus(status);
 
 105                     ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
 
 106                 } catch (NullPointerException ignored) {
 
 107                     // in case of negative response, snapshotID does not populated, so just ignore NPL
 
 111                 outObj = new AuditOutputBuilder();
 
 112                 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 113                 ((AuditOutputBuilder)outObj).setStatus(status);
 
 116                 outObj = new HealthCheckOutputBuilder();
 
 117                 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 118                 ((HealthCheckOutputBuilder)outObj).setStatus(status);
 
 121                 outObj = new LiveUpgradeOutputBuilder();
 
 122                 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 123                 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
 
 126                 outObj = new LockOutputBuilder();
 
 127                 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 128                 ((LockOutputBuilder)outObj).setStatus(status);
 
 131                 outObj = new ModifyConfigOutputBuilder();
 
 132                 ((ModifyConfigOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 133                 ((ModifyConfigOutputBuilder)outObj).setStatus(status);
 
 136                 outObj = new SoftwareUploadOutputBuilder();
 
 137                 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 138                 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
 
 141                 outObj = new StopOutputBuilder();
 
 142                 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 143                 ((StopOutputBuilder)outObj).setStatus(status);
 
 146                 outObj = new SyncOutputBuilder();
 
 147                 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 148                 ((SyncOutputBuilder)outObj).setStatus(status);
 
 151                 outObj = new TerminateOutputBuilder();
 
 152                 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 153                 ((TerminateOutputBuilder)outObj).setStatus(status);
 
 156                 outObj = new TestOutputBuilder();
 
 157                 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 158                 ((TestOutputBuilder)outObj).setStatus(status);
 
 161                 outObj = new UnlockOutputBuilder();
 
 162                 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
 
 163                 ((UnlockOutputBuilder)outObj).setStatus(status);
 
 166                 throw new IllegalArgumentException(action+" action is not supported");
 
 170     public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) throws ParseException {
 
 171         Payload payload = null;
 
 172         if(inObj.getPayload() != null) {
 
 173             payload = new Payload(inObj.getPayload());
 
 178     public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
 
 179         String payloadAsString = null;
 
 182                 if(inObj instanceof String){
 
 183                     payloadAsString = (String)inObj;
 
 186                         ObjectMapper objectMapper = new ObjectMapper();
 
 187                         payloadAsString = objectMapper.writeValueAsString(inObj);
 
 188 //                        payloadAsString = objectMapper.writeValueAsString(payloadAsString);
 
 189                     } catch (JsonProcessingException e) {
 
 190                         String errMsg = "Error serialize payload json to string";
 
 191                         throw new ParseException(errMsg + "-" + e.toString(), 0);
 
 195         return payloadAsString;
 
 198     public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
 
 199         StatusBuilder statusBuilder = new StatusBuilder();
 
 200         statusBuilder.setCode(inObj.getStatus().getCode());
 
 201         statusBuilder.setMessage(inObj.getStatus().getMessage());
 
 202         return statusBuilder.build();
 
 205     public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
 
 206         CommonHeader outObj = null;
 
 208             throw new IllegalArgumentException("empty asyncResponse");
 
 211         CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
 
 212         org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags commonHeaderFlags = null;
 
 213         if(inObj.getCommonHeader().getFlags() != null){
 
 214             commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
 
 215             commonHeaderBuilder.setFlags(commonHeaderFlags);
 
 219         commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
 
 220         commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
 
 221         if(inObj.getCommonHeader().getSubRequestId() != null){
 
 222             commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
 
 225         if(inObj.getCommonHeader().getOriginatorId() != null){
 
 226             commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
 
 229         if(inObj.getCommonHeader().getTimeStamp() != null){
 
 230             String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
 
 231             ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
 
 232             commonHeaderBuilder.setTimestamp(zuluTimestamp);
 
 234         outObj = commonHeaderBuilder.build();
 
 239     public static String convDateToZuluString(Date timeStamp) {
 
 240         return isoFormatter.format(timeStamp);
 
 243     public static org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags
 
 244     convFlagsMapTorev160108Flags(org.openecomp.appc.domainmodel.lcm.Flags flags) {
 
 245         Flags rev160108flags = null;
 
 246         boolean anyFlag = false;
 
 247         FlagsBuilder flagsBuilder = new FlagsBuilder();
 
 249          * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
 
 252         if(flags.containsKey(FORCE_FLAG)){
 
 253             org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags.Force force =
 
 254                     org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
 
 255             flagsBuilder.setForce(force);
 
 258         if(flags.containsKey(MODE_FLAG)){
 
 259             org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags.Mode mode =
 
 260                     org.opendaylight.yang.gen.v1.org.openecomp.appc.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
 
 261             flagsBuilder.setMode(mode);
 
 264         if(flags.containsKey(TTL_FLAG)){
 
 265             flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
 
 269             rev160108flags = flagsBuilder.build();
 
 273         rev160108flags = flagsBuilder.build();
 
 274         return rev160108flags;
 
 277     public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
 
 278         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
 
 279         Object message = builder.build();
 
 280         ObjectMapper objectMapper = new ObjectMapper();
 
 281         objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
 
 282         objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
 
 283         objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
 
 284         objectMapper.addMixInAnnotations(Status.class, MixIn.class);
 
 285         objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
 
 286         objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
 
 288 //                              .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
 
 289         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
 
 290                 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
 
 291         return writer.writeValueAsString(message);
 
 294     public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
 
 295         DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
 
 296         ObjectMapper objectMapper = new ObjectMapper();
 
 297         objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
 
 298         objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
 
 299         objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
 
 300         objectMapper.addMixInAnnotations(Status.class, MixIn.class);
 
 301         objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
 
 302         objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
 
 304 //                              .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
 
 305         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
 
 306         return writer.writeValueAsString(dmaapOutgoingMessage);
 
 309     public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
 
 310         DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
 
 311         outObj.setRpcName(rpcName);
 
 312         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
 
 313         Object messageBody = builder.build();
 
 314         DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
 
 315         outObj.setBody(body);
 
 319     abstract class MixIn {
 
 321         abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
 
 324         abstract java.lang.String getValue();
 
 326     abstract class MixInCommonHeader extends MixIn {
 
 327         @JsonProperty("api-ver")
 
 328         abstract java.lang.String getApiVer();
 
 329         @JsonProperty("originator-id")
 
 330         abstract java.lang.String getOriginatorId();
 
 331         @JsonProperty("request-id")
 
 332         abstract java.lang.String getRequestId();
 
 333         @JsonProperty("sub-request-id")
 
 334         abstract java.lang.String getSubRequestId();
 
 337     abstract class MixInFlagsMessage extends MixIn {
 
 338         @JsonProperty("common-header")
 
 339         abstract  CommonHeader getCommonHeader();