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