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