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