2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 * ============LICENSE_END=========================================================
25 package org.openecomp.appc.requesthandler.conv;
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
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.openecomp.appc.lcm.rev160108.*;
40 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.CommonHeader;
41 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags;
43 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
44 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.Status;
45 import org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.status.StatusBuilder;
46 import org.opendaylight.yangtools.concepts.Builder;
47 import org.opendaylight.yangtools.yang.binding.DataContainer;
48 import org.openecomp.appc.domainmodel.lcm.ResponseContext;
49 import org.openecomp.appc.domainmodel.lcm.VNFOperation;
50 import org.openecomp.appc.requesthandler.impl.DmaapOutgoingMessage;
52 import java.text.ParseException;
53 import java.text.SimpleDateFormat;
54 import java.util.Date;
55 import java.util.TimeZone;
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);
67 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
70 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
71 Builder<?> outObj = null;
73 throw new IllegalArgumentException("empty asyncResponse");
75 if(vnfOperation == null){
76 throw new IllegalArgumentException("empty asyncResponse.action");
78 Action action = Action.valueOf(vnfOperation.name());
79 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
80 Status status = convAsyncResponseTorev160108Status(response);
81 Payload payload = convAsyncResponseTorev160108Payload(response);
84 outObj = new RollbackOutputBuilder();
85 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
86 ((RollbackOutputBuilder)outObj).setStatus(status);
89 outObj = new SnapshotOutputBuilder();
90 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
91 ((SnapshotOutputBuilder)outObj).setStatus(status);
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
99 outObj = new AuditOutputBuilder();
100 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
101 ((AuditOutputBuilder)outObj).setStatus(status);
102 ((AuditOutputBuilder)outObj).setPayload(payload);
105 outObj = new HealthCheckOutputBuilder();
106 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
107 ((HealthCheckOutputBuilder)outObj).setStatus(status);
110 outObj = new LiveUpgradeOutputBuilder();
111 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
112 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
115 outObj = new LockOutputBuilder();
116 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
117 ((LockOutputBuilder)outObj).setStatus(status);
120 outObj = new ConfigureOutputBuilder();
121 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
122 ((ConfigureOutputBuilder)outObj).setStatus(status);
123 ((ConfigureOutputBuilder)outObj).setPayload(payload);
126 outObj = new ConfigModifyOutputBuilder();
127 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
128 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
129 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
132 outObj = new ConfigScaleoutOutputBuilder();
133 ((ConfigScaleoutOutputBuilder)outObj).setCommonHeader(commonHeader);
134 ((ConfigScaleoutOutputBuilder)outObj).setStatus(status);
135 ((ConfigScaleoutOutputBuilder)outObj).setPayload(payload);
138 outObj = new ConfigRestoreOutputBuilder();
139 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
140 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
141 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
144 outObj = new SoftwareUploadOutputBuilder();
145 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
146 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
149 outObj = new StopOutputBuilder();
150 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
151 ((StopOutputBuilder)outObj).setStatus(status);
154 outObj = new SyncOutputBuilder();
155 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
156 ((SyncOutputBuilder)outObj).setStatus(status);
157 ((SyncOutputBuilder)outObj).setPayload(payload);
160 outObj = new TerminateOutputBuilder();
161 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
162 ((TerminateOutputBuilder)outObj).setStatus(status);
165 outObj = new TestOutputBuilder();
166 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
167 ((TestOutputBuilder)outObj).setStatus(status);
170 outObj = new UnlockOutputBuilder();
171 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
172 ((UnlockOutputBuilder)outObj).setStatus(status);
175 outObj = new RestartOutputBuilder();
176 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
177 ((RestartOutputBuilder)outObj).setStatus(status);
180 outObj = new RebuildOutputBuilder();
181 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
182 ((RebuildOutputBuilder)outObj).setStatus(status);
185 outObj = new MigrateOutputBuilder();
186 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
187 ((MigrateOutputBuilder)outObj).setStatus(status);
190 outObj = new EvacuateOutputBuilder();
191 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
192 ((EvacuateOutputBuilder)outObj).setStatus(status);
195 outObj = new ConfigBackupOutputBuilder();
196 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
197 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
198 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
200 case ConfigBackupDelete:
201 outObj = new ConfigBackupDeleteOutputBuilder();
202 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
203 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
204 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
207 outObj = new ConfigExportOutputBuilder();
208 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
209 ((ConfigExportOutputBuilder)outObj).setStatus(status);
212 outObj = new StartOutputBuilder();
213 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
214 ((StartOutputBuilder)outObj).setStatus(status);
216 case StopApplication:
217 outObj = new StopApplicationOutputBuilder();
218 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
219 ((StopApplicationOutputBuilder)outObj).setStatus(status);
221 case StartApplication:
222 outObj = new StartApplicationOutputBuilder();
223 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
224 ((StartApplicationOutputBuilder)outObj).setStatus(status);
227 throw new IllegalArgumentException(action+" action is not supported");
231 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
232 Payload payload = null;
233 if(inObj.getPayload() != null) {
234 payload = new Payload(inObj.getPayload());
239 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
240 String payloadAsString = null;
243 if(inObj instanceof String){
244 payloadAsString = (String)inObj;
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);
256 return payloadAsString;
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();
266 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
267 CommonHeader outObj = null;
269 throw new IllegalArgumentException("empty asyncResponse");
272 CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
273 org.opendaylight.yang.gen.v1.org.openecomp.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);
280 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
281 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
282 if(inObj.getCommonHeader().getSubRequestId() != null){
283 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
286 if(inObj.getCommonHeader().getOriginatorId() != null){
287 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
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);
295 outObj = commonHeaderBuilder.build();
300 public static String convDateToZuluString(Date timeStamp) {
301 return isoFormatter.format(timeStamp);
304 public static org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags
305 convFlagsMapTorev160108Flags(org.openecomp.appc.domainmodel.lcm.Flags flags) {
306 Flags rev160108flags = null;
307 boolean anyFlag = false;
308 FlagsBuilder flagsBuilder = new FlagsBuilder();
310 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
313 if(flags.containsKey(FORCE_FLAG)){
314 org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
315 org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
316 flagsBuilder.setForce(force);
319 if(flags.containsKey(MODE_FLAG)){
320 org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
321 org.opendaylight.yang.gen.v1.org.openecomp.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
322 flagsBuilder.setMode(mode);
325 if(flags.containsKey(TTL_FLAG)){
326 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
330 rev160108flags = flagsBuilder.build();
334 rev160108flags = flagsBuilder.build();
335 return rev160108flags;
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);
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);
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);
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);
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);
383 private static String getCorrelationID(ResponseContext context) {
384 return context.getCommonHeader().getRequestId()
385 + (context.getCommonHeader().getSubRequestId() == null ?
386 "":"-" + context.getCommonHeader().getSubRequestId());
389 abstract class MixIn {
391 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
394 abstract java.lang.String getValue();
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();
407 abstract class MixInFlagsMessage extends MixIn {
408 @JsonProperty("common-header")
409 abstract CommonHeader getCommonHeader();