2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.adapters.appc.orchestrator.client;
23 import java.beans.BeanInfo;
24 import java.beans.IntrospectionException;
25 import java.beans.Introspector;
26 import java.beans.PropertyDescriptor;
27 import java.lang.reflect.InvocationTargetException;
28 import java.lang.reflect.Method;
29 import org.onap.appc.client.lcm.api.LifeCycleManagerStateful;
30 import org.onap.appc.client.lcm.api.ResponseHandler;
31 import org.onap.appc.client.lcm.exceptions.AppcClientException;
32 import org.onap.appc.client.lcm.model.Status;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.stereotype.Component;
36 import com.fasterxml.jackson.annotation.JsonInclude.Include;
37 import com.fasterxml.jackson.core.JsonProcessingException;
38 import com.fasterxml.jackson.databind.ObjectMapper;
39 import com.fasterxml.jackson.databind.ObjectWriter;
40 import com.fasterxml.jackson.databind.SerializationFeature;
44 public class ApplicationControllerSupport {
46 private static final int ACCEPT_SERIES = 100;
47 private static final int ERROR_SERIES = 200;
48 private static final int REJECT_SERIES = 300;
49 private static final int SUCCESS_SERIES = 400;
50 private static final int SUCCESS_STATUS = SUCCESS_SERIES;
51 private static final int PARTIAL_SERIES = 500;
52 private static final int PARTIAL_SUCCESS_STATUS = PARTIAL_SERIES;
53 private static final int PARTIAL_FAILURE_STATUS = PARTIAL_SERIES + 1;
55 private static Logger logger = LoggerFactory.getLogger(ApplicationControllerSupport.class);
56 private static final ObjectMapper objectMapper;
57 private static final ObjectWriter writer;
58 private String lcmModelPackage = "org.onap.appc.client.lcm.model";
61 objectMapper = new ObjectMapper();
62 objectMapper.setSerializationInclusion(Include.NON_NULL);
63 writer = objectMapper.writerWithDefaultPrettyPrinter();
69 * @throws ClassNotFoundException
70 * @throws InstantiationException
71 * @throws IllegalAccessException
73 public Object getInput(String action) {
75 return getInputClass(action).newInstance();
76 } catch (IllegalAccessException | InstantiationException e) {
77 throw new RuntimeException(
78 String.format("%s : %s", "Unable to instantiate viable LCM Kit input class for action", action), e);
85 * @throws ClassNotFoundException
87 public Method getAPIMethod(String action, LifeCycleManagerStateful lcmStateful, boolean async) {
88 Method[] methods = lcmStateful.getClass().getMethods();
89 for (Method method : methods) {
90 if (method.getName().equalsIgnoreCase(action)) {
91 Class<?>[] methodParameterTypes = method.getParameterTypes();
92 if (methodParameterTypes.length > 0) {
93 if (getInputClass(action).equals(methodParameterTypes[0])) {
95 if (methodParameterTypes.length == 2
96 && ResponseHandler.class.isAssignableFrom(methodParameterTypes[1])) {
99 } else if (methodParameterTypes.length == 1) {
106 throw new RuntimeException(String.format("%s : %s, async=%b",
107 "Unable to derive viable LCM Kit API method for action", action, async));
110 public Status getStatusFromGenericResponse(Object response) {
111 Method statusReader = getBeanPropertyMethodFor(response.getClass(), "status", false);
112 if (statusReader != null) {
114 return (Status) statusReader.invoke(response);
115 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
116 logger.error("Unable to obtain status from LCM Kit response", e);
122 public StatusCategory getCategoryOf(Status status) {
123 int codeSeries = status.getCode() - (status.getCode() % 100);
124 switch (codeSeries) {
126 return StatusCategory.NORMAL;
129 return StatusCategory.ERROR;
131 return status.getCode() == SUCCESS_STATUS ? StatusCategory.NORMAL : StatusCategory.ERROR;
133 switch (status.getCode()) {
134 case PARTIAL_SUCCESS_STATUS:
135 return StatusCategory.NORMAL;
136 case PARTIAL_FAILURE_STATUS:
137 return StatusCategory.ERROR;
139 return StatusCategory.WARNING;
142 return StatusCategory.WARNING;
146 public boolean getFinalityOf(Status status) {
147 int codeSeries = status.getCode() - (status.getCode() % 100);
148 switch (codeSeries) {
161 private Method getBeanPropertyMethodFor(Class<?> clazz, String propertyName, boolean isWriter) {
164 beanInfo = Introspector.getBeanInfo(clazz, Object.class);
165 } catch (IntrospectionException e) {
166 throw new RuntimeException(
167 String.format("Unable to produce bean property method for class : %s, property : %s, writer=%b",
168 clazz.getName(), propertyName, isWriter),
171 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
172 for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
173 if (propertyDescriptor.getName().equals(propertyName)) {
174 return isWriter ? propertyDescriptor.getWriteMethod() : propertyDescriptor.getReadMethod();
177 throw new RuntimeException(
178 String.format("Unable to produce bean property method for class : %s, property : %s, writer=%b",
179 clazz.getName(), propertyName, isWriter));
185 * @throws ClassNotFoundException
187 private Class<?> getInputClass(String action) {
189 return Class.forName(lcmModelPackage + '.' + action + "Input");
190 } catch (ClassNotFoundException e) {
191 throw new RuntimeException(String.format("%s : %s using package : %s",
192 "Unable to identify viable LCM Kit input class for action", action, lcmModelPackage), e);
197 public void logLCMMessage(Object message) {
200 inputAsJSON = writer.writeValueAsString(message);
201 logger.info("LCM Kit input message follows: {}", inputAsJSON);
202 } catch (JsonProcessingException e) {
203 logger.error("Error in logging LCM Message", e);
207 public Status buildStatusFromAppcException(AppcClientException exception) {
208 Status exceptionStatus = new Status();
209 exceptionStatus.setCode(200);
210 exceptionStatus.setMessage("Exception on APPC request: " + exception.getMessage());
211 return exceptionStatus;