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