Cleanup of dmaap adapter
[appc.git] / appc-dispatcher / appc-request-handler / appc-request-handler-core / src / main / java / org / onap / appc / requesthandler / conv / Converter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs
8  * ================================================================================
9  * Modifications Copyright (C) 2018-2019 Orange
10  * =============================================================================
11  * Licensed under the Apache License, Version 2.0 (the "License");
12  * you may not use this file except in compliance with the License.
13  * You may obtain a copy of the License at
14  * 
15  *      http://www.apache.org/licenses/LICENSE-2.0
16  * 
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  * See the License for the specific language governing permissions and
21  * limitations under the License.
22  * 
23  * ============LICENSE_END=========================================================
24  */
25
26 package org.onap.appc.requesthandler.conv;
27
28 import org.apache.commons.lang3.StringUtils;
29 import com.att.eelf.configuration.EELFLogger;
30 import com.att.eelf.configuration.EELFManager;
31
32 import com.fasterxml.jackson.annotation.JsonIgnore;
33 import com.fasterxml.jackson.annotation.JsonInclude;
34 import com.fasterxml.jackson.annotation.JsonProperty;
35 import com.fasterxml.jackson.annotation.JsonValue;
36 import com.fasterxml.jackson.core.JsonProcessingException;
37 import com.fasterxml.jackson.databind.MapperFeature;
38 import com.fasterxml.jackson.databind.ObjectMapper;
39 import com.fasterxml.jackson.databind.ObjectWriter;
40 import com.fasterxml.jackson.databind.SerializationFeature;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
46 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
47 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
48 import org.opendaylight.yangtools.concepts.Builder;
49 import org.opendaylight.yangtools.yang.binding.DataContainer;
50 import org.onap.appc.domainmodel.lcm.ResponseContext;
51 import org.onap.appc.domainmodel.lcm.VNFOperation;
52 import org.onap.appc.requesthandler.impl.AbstractRequestHandlerImpl;
53 import org.onap.appc.requesthandler.impl.DmaapOutgoingMessage;
54
55 import java.text.ParseException;
56 import java.text.SimpleDateFormat;
57 import java.util.Date;
58 import java.util.TimeZone;
59
60
61 public class Converter {
62     private static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
63     private final static String DMaaP_ROOT_VALUE = "output";
64     private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
65     private final static EELFLogger logger = EELFManager.getInstance().getLogger(Converter.class);
66     static {
67         isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
68     }
69
70     public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
71         Builder<?> outObj = null;
72         if(response == null){
73             throw new IllegalArgumentException("empty asyncResponse");
74         }
75         if(vnfOperation == null){
76             throw new IllegalArgumentException("empty asyncResponse.action");
77         }
78         logger.debug("Entered Converter.convAsyncResponseToBuilder() : Operation Name "+ vnfOperation.name());
79         org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action action = org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action.valueOf(vnfOperation.name());
80         logger.debug("After resolving action");
81         CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
82         Status status = convAsyncResponseTorev160108Status(response);
83         Payload payload = convAsyncResponseTorev160108Payload(response);
84         logger.debug("Extracted action, status, payload ");
85         switch (action){
86             case Rollback:
87                 outObj = new RollbackOutputBuilder();
88                 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
89                 ((RollbackOutputBuilder)outObj).setStatus(status);
90                 return outObj;
91             case Snapshot:
92                 outObj = new SnapshotOutputBuilder();
93                 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
94                 ((SnapshotOutputBuilder)outObj).setStatus(status);
95                 try {
96                     ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
97                 } catch (NullPointerException ignored) {
98                     // in case of negative response, snapshotID does not populated, so just ignore NPL
99                 }
100                 return outObj;
101             case Audit:
102                 outObj = new AuditOutputBuilder();
103                 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
104                 ((AuditOutputBuilder)outObj).setStatus(status);
105                 ((AuditOutputBuilder)outObj).setPayload(payload);
106                 return outObj;
107             case HealthCheck:
108                 outObj = new HealthCheckOutputBuilder();
109                 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
110                 ((HealthCheckOutputBuilder)outObj).setStatus(status);
111                 ((HealthCheckOutputBuilder)outObj).setPayload(payload);
112                 logger.debug("In HealthCheck case- created outObj, returning");
113                 return outObj;
114             case LiveUpgrade:
115                 outObj = new LiveUpgradeOutputBuilder();
116                 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
117                 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
118                 return outObj;
119             case Lock:
120                 outObj = new LockOutputBuilder();
121                 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
122                 ((LockOutputBuilder)outObj).setStatus(status);
123                 return outObj;
124             case Configure:
125                 outObj = new ConfigureOutputBuilder();
126                 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
127                 ((ConfigureOutputBuilder)outObj).setStatus(status);
128                 ((ConfigureOutputBuilder)outObj).setPayload(payload);
129                 return outObj;
130             case ConfigModify:
131                 outObj = new ConfigModifyOutputBuilder();
132                 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
133                 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
134                 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
135                 return outObj;
136             case ConfigScaleOut:
137                 outObj = new ConfigScaleOutOutputBuilder();
138                 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
139                 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
140                 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
141                 return outObj;
142             case ConfigRestore:
143                 outObj = new ConfigRestoreOutputBuilder();
144                 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
145                 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
146                 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
147                 return outObj;
148             case SoftwareUpload:
149                 outObj = new SoftwareUploadOutputBuilder();
150                 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
151                 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
152                 return outObj;
153             case Stop:
154                 outObj = new StopOutputBuilder();
155                 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
156                 ((StopOutputBuilder)outObj).setStatus(status);
157                 return outObj;
158             case Sync:
159                 outObj = new SyncOutputBuilder();
160                 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
161                 ((SyncOutputBuilder)outObj).setStatus(status);
162                 ((SyncOutputBuilder)outObj).setPayload(payload);
163                 return outObj;
164             case Terminate:
165                 outObj = new TerminateOutputBuilder();
166                 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
167                 ((TerminateOutputBuilder)outObj).setStatus(status);
168                 return outObj;
169             case Test:
170                 outObj = new TestOutputBuilder();
171                 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
172                 ((TestOutputBuilder)outObj).setStatus(status);
173                 return outObj;
174             case Unlock:
175                 outObj = new UnlockOutputBuilder();
176                 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
177                 ((UnlockOutputBuilder)outObj).setStatus(status);
178                 return outObj;
179             case Restart:
180                 outObj = new RestartOutputBuilder();
181                 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
182                 ((RestartOutputBuilder)outObj).setStatus(status);
183                 return outObj;
184             case Rebuild:
185                 outObj = new RebuildOutputBuilder();
186                 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
187                 ((RebuildOutputBuilder)outObj).setStatus(status);
188                 return outObj;
189             case Reboot:
190                 outObj = new RebootOutputBuilder();
191                 ((RebootOutputBuilder)outObj).setCommonHeader(commonHeader);
192                 ((RebootOutputBuilder)outObj).setStatus(status);
193                 return outObj;
194             case Migrate:
195                 outObj = new MigrateOutputBuilder();
196                 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
197                 ((MigrateOutputBuilder)outObj).setStatus(status);
198                 return outObj;
199             case Evacuate:
200                 outObj = new EvacuateOutputBuilder();
201                 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
202                 ((EvacuateOutputBuilder)outObj).setStatus(status);
203                 return outObj;
204             case ConfigBackup:
205                 outObj = new ConfigBackupOutputBuilder();
206                 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
207                 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
208                 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
209                 return outObj;
210             case ConfigBackupDelete:
211                 outObj = new ConfigBackupDeleteOutputBuilder();
212                 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
213                 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
214                 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
215                 return outObj;
216             case ConfigExport:
217                 outObj = new ConfigExportOutputBuilder();
218                 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
219                 ((ConfigExportOutputBuilder)outObj).setStatus(status);
220                 return outObj;
221             case Start:
222                 outObj = new StartOutputBuilder();
223                 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
224                 ((StartOutputBuilder)outObj).setStatus(status);
225                 return outObj;
226             case StopApplication:
227                 outObj = new StopApplicationOutputBuilder();
228                 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
229                 ((StopApplicationOutputBuilder)outObj).setStatus(status);
230                 return outObj;
231             case StartApplication:
232                 outObj = new StartApplicationOutputBuilder();
233                 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
234                 ((StartApplicationOutputBuilder)outObj).setStatus(status);
235                 return outObj;
236     case QuiesceTraffic:
237                 outObj = new QuiesceTrafficOutputBuilder();
238                 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
239                 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
240                 return outObj;
241             case ResumeTraffic:
242                 outObj = new ResumeTrafficOutputBuilder();
243                 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
244                 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
245                 return outObj;
246             case UpgradeSoftware:
247                 outObj = new UpgradeSoftwareOutputBuilder();
248                 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
249                 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
250                 return outObj;
251             case UpgradePostCheck:
252                 outObj = new UpgradePostCheckOutputBuilder();
253                 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
254                 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
255                 ((UpgradePostCheckOutputBuilder)outObj).setPayload(payload);
256                 return outObj;
257             case UpgradeBackup:
258                 outObj = new UpgradeBackupOutputBuilder();
259                 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
260                 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
261                 return outObj;
262             case UpgradeBackout:
263                 outObj = new UpgradeBackoutOutputBuilder();
264                 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
265                 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
266                 return outObj;
267             case UpgradePreCheck:
268                 outObj = new UpgradePreCheckOutputBuilder();
269                 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
270                 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
271                 ((UpgradePreCheckOutputBuilder)outObj).setPayload(payload);
272                 return outObj;
273             case AttachVolume:
274                 outObj = new AttachVolumeOutputBuilder();
275                 ((AttachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
276                 ((AttachVolumeOutputBuilder)outObj).setStatus(status);
277                 return outObj;  
278             case DetachVolume:
279                 outObj = new DetachVolumeOutputBuilder();
280                 ((DetachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
281                 ((DetachVolumeOutputBuilder)outObj).setStatus(status);
282                 return outObj;
283             case DistributeTraffic:
284                 outObj = new DistributeTrafficOutputBuilder();
285                 ((DistributeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
286                 ((DistributeTrafficOutputBuilder)outObj).setStatus(status);
287                 return outObj;
288             case DistributeTrafficCheck:
289                 outObj = new DistributeTrafficCheckOutputBuilder();
290                 ((DistributeTrafficCheckOutputBuilder) outObj).setCommonHeader(commonHeader);
291                 ((DistributeTrafficCheckOutputBuilder)outObj).setStatus(status);
292                 return outObj;
293             default:
294                 throw new IllegalArgumentException(action+" action is not supported");
295         }
296     }
297
298     public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj)  {
299         logger.debug("Entering convAsyncResponseTorev160108Payload" );
300         Payload payload = null;
301         if(inObj.getPayload() != null) {
302             payload = new Payload(inObj.getPayload());
303         }
304         logger.debug("Exiting convAsyncResponseTorev160108Payload" );
305         return payload;
306     }
307
308     public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
309         String payloadAsString = null;
310         if(inObj != null) {
311
312                 if(inObj instanceof String){
313                     payloadAsString = (String)inObj;
314                 }else {
315                     try {
316                         ObjectMapper objectMapper = new ObjectMapper();
317                         payloadAsString = objectMapper.writeValueAsString(inObj);
318                     } catch (JsonProcessingException e) {
319                         String errMsg = "Error serialize payload json to string";
320                         throw new ParseException(errMsg + "-" + e.toString(), 0);
321                     }
322                 }
323         }
324         return payloadAsString;
325     }
326
327     public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
328         logger.debug("Entering convAsyncResponseTorev160108Status");
329         StatusBuilder statusBuilder = new StatusBuilder();
330         statusBuilder.setCode(inObj.getStatus().getCode());
331         statusBuilder.setMessage(inObj.getStatus().getMessage());
332         logger.debug("Exiting convAsyncResponseTorev160108Status");
333         return statusBuilder.build();
334     }
335
336     public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
337         logger.debug("Entered into convAsyncResponseTorev160108CommonHeader");
338         CommonHeader outObj = null;
339         if(inObj == null){
340             throw new IllegalArgumentException("empty asyncResponse");
341         }
342
343         CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
344         org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
345         if(inObj.getCommonHeader().getFlags() != null){
346             commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
347             commonHeaderBuilder.setFlags(commonHeaderFlags);
348         }
349
350         logger.debug("Before setApiVer");
351         commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
352         commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
353         if(inObj.getCommonHeader().getSubRequestId() != null){
354             commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
355         }
356         logger.debug("Before getOriginatorId");
357         if(inObj.getCommonHeader().getOriginatorId() != null){
358             commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
359         }
360         logger.debug("Before getTimeStamp");
361         if(inObj.getCommonHeader().getTimeStamp() != null){
362             String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
363             logger.debug("After invoking convDateToZuluString()");
364             ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
365             logger.debug("After ZULU()");
366             commonHeaderBuilder.setTimestamp(zuluTimestamp);
367         }
368         outObj = commonHeaderBuilder.build();
369         logger.debug("Exiting from convAsyncResponseTorev160108CommonHeader: Returning outObj::"+outObj.toString());
370         return outObj;
371
372     }
373
374     public static String convDateToZuluString(Date timeStamp) {
375         return isoFormatter.format(timeStamp);
376     }
377
378     public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
379     convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
380         Flags rev160108flags;
381         boolean anyFlag = false;
382         FlagsBuilder flagsBuilder = new FlagsBuilder();
383         /*
384          * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
385          */
386         /*
387         if(flags.containsKey(FORCE_FLAG)){
388             org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
389                     org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
390             flagsBuilder.setForce(force);
391             anyFlag = true;
392         }
393         if(flags.containsKey(MODE_FLAG)){
394             org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
395                     org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
396             flagsBuilder.setMode(mode);
397             anyFlag = true;
398         }
399         if(flags.containsKey(TTL_FLAG)){
400             flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
401             anyFlag = true;
402         }
403         if(anyFlag){
404             rev160108flags = flagsBuilder.build();
405         }
406          */
407
408         rev160108flags = flagsBuilder.build();
409         return rev160108flags;
410     }
411
412     public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
413         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
414         Object message = builder.build();
415         ObjectMapper objectMapper = new ObjectMapper();
416         objectMapper.addMixIn(message.getClass(), MixInFlagsMessage.class);
417         objectMapper.addMixIn(CommonHeader.class, MixInCommonHeader.class);
418         objectMapper.addMixIn(Flags.class, MixIn.class);
419         objectMapper.addMixIn(Status.class, MixIn.class);
420         objectMapper.addMixIn(Payload.class, MixIn.class);
421         objectMapper.addMixIn(ZULU.class, MixIn.class);
422
423 //                .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
424         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
425                 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
426         return writer.writeValueAsString(message);
427     }
428
429     public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
430         logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
431         DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
432         ObjectMapper objectMapper = new ObjectMapper();
433         objectMapper.addMixIn(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
434         objectMapper.addMixIn(CommonHeader.class, MixInCommonHeader.class);
435         objectMapper.addMixIn(Flags.class, MixIn.class);
436         objectMapper.addMixIn(Status.class, MixIn.class);
437         objectMapper.addMixIn(Payload.class, MixIn.class);
438         objectMapper.addMixIn(ZULU.class, MixIn.class);
439
440 //                .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
441         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
442         logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
443         return writer.writeValueAsString(dmaapOutgoingMessage);
444     }
445
446     public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
447         logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessage()");
448         DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
449         String correlationID = getCorrelationID(asyncResponse);
450         outObj.setCorrelationID(correlationID);
451         outObj.setType("response");
452         outObj.setRpcName(rpcName);
453         logger.debug("In onverter.convAsyncResponseToDmaapOutgoingMessage() before invoking convAsyncResponseToBuilder");
454         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
455         Object messageBody = builder.build();
456         DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
457         outObj.setBody(body);
458         logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessage():messageBody is :::"+body.toString());
459         return outObj;
460     }
461
462     private static String getCorrelationID(ResponseContext context) {
463         return context.getCommonHeader().getRequestId()
464                 + (context.getCommonHeader().getSubRequestId() == null ?
465                     "":"-" + context.getCommonHeader().getSubRequestId());
466     }
467
468     abstract class MixIn {
469         @JsonIgnore
470         abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
471
472         @JsonValue
473         abstract java.lang.String getValue();
474     }
475     abstract class MixInCommonHeader extends MixIn {
476         @JsonProperty("api-ver")
477         abstract java.lang.String getApiVer();
478         @JsonProperty("originator-id")
479         abstract java.lang.String getOriginatorId();
480         @JsonProperty("request-id")
481         abstract java.lang.String getRequestId();
482         @JsonProperty("sub-request-id")
483         abstract java.lang.String getSubRequestId();
484
485     }
486     abstract class MixInFlagsMessage extends MixIn {
487         @JsonProperty("common-header")
488         abstract  CommonHeader getCommonHeader();
489     }
490 }