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 java.text.ParseException;
25 import java.text.SimpleDateFormat;
26 import java.util.Date;
27 import java.util.TimeZone;
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;
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;
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);
79 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
82 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
83 Builder<?> outObj = null;
85 throw new IllegalArgumentException("empty asyncResponse");
87 if(vnfOperation == null){
88 throw new IllegalArgumentException("empty asyncResponse.action");
90 Action action = Action.valueOf(vnfOperation.name());
91 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
92 Status status = convAsyncResponseTorev160108Status(response);
93 // Payload payload = convAsyncResponseTorev160108Payload(inObj);
96 outObj = new RollbackOutputBuilder();
97 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
98 ((RollbackOutputBuilder)outObj).setStatus(status);
101 outObj = new SnapshotOutputBuilder();
102 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
103 ((SnapshotOutputBuilder)outObj).setStatus(status);
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
111 outObj = new AuditOutputBuilder();
112 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
113 ((AuditOutputBuilder)outObj).setStatus(status);
116 outObj = new HealthCheckOutputBuilder();
117 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
118 ((HealthCheckOutputBuilder)outObj).setStatus(status);
121 outObj = new LiveUpgradeOutputBuilder();
122 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
123 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
126 outObj = new LockOutputBuilder();
127 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
128 ((LockOutputBuilder)outObj).setStatus(status);
131 outObj = new ModifyConfigOutputBuilder();
132 ((ModifyConfigOutputBuilder)outObj).setCommonHeader(commonHeader);
133 ((ModifyConfigOutputBuilder)outObj).setStatus(status);
136 outObj = new SoftwareUploadOutputBuilder();
137 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
138 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
141 outObj = new StopOutputBuilder();
142 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
143 ((StopOutputBuilder)outObj).setStatus(status);
146 outObj = new SyncOutputBuilder();
147 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
148 ((SyncOutputBuilder)outObj).setStatus(status);
151 outObj = new TerminateOutputBuilder();
152 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
153 ((TerminateOutputBuilder)outObj).setStatus(status);
156 outObj = new TestOutputBuilder();
157 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
158 ((TestOutputBuilder)outObj).setStatus(status);
161 outObj = new UnlockOutputBuilder();
162 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
163 ((UnlockOutputBuilder)outObj).setStatus(status);
166 throw new IllegalArgumentException(action+" action is not supported");
170 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) throws ParseException {
171 Payload payload = null;
172 if(inObj.getPayload() != null) {
173 payload = new Payload(inObj.getPayload());
178 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
179 String payloadAsString = null;
182 if(inObj instanceof String){
183 payloadAsString = (String)inObj;
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);
195 return payloadAsString;
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();
205 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
206 CommonHeader outObj = null;
208 throw new IllegalArgumentException("empty asyncResponse");
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);
219 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
220 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
221 if(inObj.getCommonHeader().getSubRequestId() != null){
222 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
225 if(inObj.getCommonHeader().getOriginatorId() != null){
226 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
229 if(inObj.getCommonHeader().getTimeStamp() != null){
230 String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
231 ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
232 commonHeaderBuilder.setTimestamp(zuluTimestamp);
234 outObj = commonHeaderBuilder.build();
239 public static String convDateToZuluString(Date timeStamp) {
240 return isoFormatter.format(timeStamp);
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();
249 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
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);
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);
264 if(flags.containsKey(TTL_FLAG)){
265 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
269 rev160108flags = flagsBuilder.build();
273 rev160108flags = flagsBuilder.build();
274 return rev160108flags;
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);
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);
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);
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);
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);
319 abstract class MixIn {
321 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
324 abstract java.lang.String getValue();
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();
337 abstract class MixInFlagsMessage extends MixIn {
338 @JsonProperty("common-header")
339 abstract CommonHeader getCommonHeader();