2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.openecomp.appc.requesthandler.conv;
24 import com.att.eelf.configuration.EELFLogger;
25 import com.att.eelf.configuration.EELFManager;
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;
49 import java.text.ParseException;
50 import java.text.SimpleDateFormat;
51 import java.util.Date;
52 import java.util.TimeZone;
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);
64 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
67 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
68 Builder<?> outObj = null;
70 throw new IllegalArgumentException("empty asyncResponse");
72 if(vnfOperation == null){
73 throw new IllegalArgumentException("empty asyncResponse.action");
75 Action action = Action.valueOf(vnfOperation.name());
76 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
77 Status status = convAsyncResponseTorev160108Status(response);
78 Payload payload = convAsyncResponseTorev160108Payload(response);
81 outObj = new RollbackOutputBuilder();
82 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
83 ((RollbackOutputBuilder)outObj).setStatus(status);
86 outObj = new SnapshotOutputBuilder();
87 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
88 ((SnapshotOutputBuilder)outObj).setStatus(status);
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
96 outObj = new AuditOutputBuilder();
97 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
98 ((AuditOutputBuilder)outObj).setStatus(status);
99 ((AuditOutputBuilder)outObj).setPayload(payload);
102 outObj = new HealthCheckOutputBuilder();
103 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
104 ((HealthCheckOutputBuilder)outObj).setStatus(status);
107 outObj = new LiveUpgradeOutputBuilder();
108 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
109 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
112 outObj = new LockOutputBuilder();
113 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
114 ((LockOutputBuilder)outObj).setStatus(status);
117 outObj = new ConfigureOutputBuilder();
118 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
119 ((ConfigureOutputBuilder)outObj).setStatus(status);
120 ((ConfigureOutputBuilder)outObj).setPayload(payload);
123 outObj = new ConfigModifyOutputBuilder();
124 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
125 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
126 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
129 outObj = new ConfigScaleoutOutputBuilder();
130 ((ConfigScaleoutOutputBuilder)outObj).setCommonHeader(commonHeader);
131 ((ConfigScaleoutOutputBuilder)outObj).setStatus(status);
132 ((ConfigScaleoutOutputBuilder)outObj).setPayload(payload);
135 outObj = new ConfigRestoreOutputBuilder();
136 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
137 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
138 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
141 outObj = new SoftwareUploadOutputBuilder();
142 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
143 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
146 outObj = new StopOutputBuilder();
147 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
148 ((StopOutputBuilder)outObj).setStatus(status);
151 outObj = new SyncOutputBuilder();
152 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
153 ((SyncOutputBuilder)outObj).setStatus(status);
154 ((SyncOutputBuilder)outObj).setPayload(payload);
157 outObj = new TerminateOutputBuilder();
158 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
159 ((TerminateOutputBuilder)outObj).setStatus(status);
162 outObj = new TestOutputBuilder();
163 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
164 ((TestOutputBuilder)outObj).setStatus(status);
167 outObj = new UnlockOutputBuilder();
168 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
169 ((UnlockOutputBuilder)outObj).setStatus(status);
172 outObj = new RestartOutputBuilder();
173 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
174 ((RestartOutputBuilder)outObj).setStatus(status);
177 outObj = new RebuildOutputBuilder();
178 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
179 ((RebuildOutputBuilder)outObj).setStatus(status);
182 outObj = new MigrateOutputBuilder();
183 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
184 ((MigrateOutputBuilder)outObj).setStatus(status);
187 outObj = new EvacuateOutputBuilder();
188 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
189 ((EvacuateOutputBuilder)outObj).setStatus(status);
192 outObj = new ConfigBackupOutputBuilder();
193 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
194 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
195 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
197 case ConfigBackupDelete:
198 outObj = new ConfigBackupDeleteOutputBuilder();
199 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
200 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
201 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
204 outObj = new ConfigExportOutputBuilder();
205 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
206 ((ConfigExportOutputBuilder)outObj).setStatus(status);
209 outObj = new StartOutputBuilder();
210 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
211 ((StartOutputBuilder)outObj).setStatus(status);
214 throw new IllegalArgumentException(action+" action is not supported");
218 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
219 Payload payload = null;
220 if(inObj.getPayload() != null) {
221 payload = new Payload(inObj.getPayload());
226 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
227 String payloadAsString = null;
230 if(inObj instanceof String){
231 payloadAsString = (String)inObj;
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);
243 return payloadAsString;
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();
253 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
254 CommonHeader outObj = null;
256 throw new IllegalArgumentException("empty asyncResponse");
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);
267 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
268 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
269 if(inObj.getCommonHeader().getSubRequestId() != null){
270 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
273 if(inObj.getCommonHeader().getOriginatorId() != null){
274 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
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);
282 outObj = commonHeaderBuilder.build();
287 public static String convDateToZuluString(Date timeStamp) {
288 return isoFormatter.format(timeStamp);
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();
297 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
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);
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);
312 if(flags.containsKey(TTL_FLAG)){
313 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
317 rev160108flags = flagsBuilder.build();
321 rev160108flags = flagsBuilder.build();
322 return rev160108flags;
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);
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);
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);
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);
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);
370 private static String getCorrelationID(ResponseContext context) {
371 return context.getCommonHeader().getRequestId()
372 + (context.getCommonHeader().getSubRequestId() == null ?
373 "":"-" + context.getCommonHeader().getSubRequestId());
376 abstract class MixIn {
378 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
381 abstract java.lang.String getValue();
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();
394 abstract class MixInFlagsMessage extends MixIn {
395 @JsonProperty("common-header")
396 abstract CommonHeader getCommonHeader();