/*
* Copyright 2016-2017 Huawei Technologies Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onap.vfc.nfvo.multivimproxy.common.util;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.onap.vfc.nfvo.multivimproxy.common.util.ResourceUtil;
import org.onap.vfc.nfvo.multivimproxy.common.constant.Constant;
import org.onap.vfc.nfvo.multivimproxy.common.constant.ParamConstant;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.Restful;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.RestfulAsyncCallback;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.RestfulFactory;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.RestfulOptions;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.RestfulParametes;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.RestfulResponse;
import org.onap.vfc.nfvo.multivimproxy.common.util.restclient.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
/**
* Restful Utility Class.
*
*
*
* @author
* @version VFC 1.0 Sep 10, 2016
*/
public class RestfulUtil {
public static final String TYPE_GET = "get";
public static final String TYPE_PUT = "put";
public static final String TYPE_POST = "post";
public static final String TYPE_DEL = "delete";
public static final String CONTENT_TYPE = "Content-type";
public static final String APPLICATION = "application/json";
public static final String NO_RESULT_EXCEPTION =
"org.openo.nfvo.resmanage.service.group.resoperate.add.res.no.result";
private static final Logger LOGGER = LoggerFactory.getLogger(RestfulUtil.class);
private static final Restful REST_CLIENT_HTTP = RestfulFactory.getRestInstance(RestfulFactory.PROTO_HTTP);
private static final Restful REST_CLIENT_HTTPS = RestfulFactory.getRestInstance(RestfulFactory.PROTO_HTTPS);
private RestfulUtil() {
}
/**
* Get response object.
*
* @param url
* @param type
* @return
* @since VFC 1.0
*/
public static JSONObject getResponseObj(String url, String type) {
return getResponseObj(url, new RestfulParametes(), type);
}
/**
* Get response object.
*
* @param url
* @param parametes
* @param type
* @return
* @since VFC 1.0
*/
public static JSONObject getResponseObj(String url, RestfulParametes parametes, String type) {
try {
String content = RestfulUtil.getResponseContent(url, parametes, null, type);
LOGGER.error("function=getResponseObj, content : {}", content);
if(StringUtils.isEmpty(content)) {
return null;
}
return JSONObject.fromObject(content);
} catch(JSONException e) {
LOGGER.error("function=getResponseObj, exception : {}", e);
return null;
}
}
/**
* Get response content.
*
* @param url
* @param restParametes
* @param type
* @return
* @since VFC 1.0
*/
public static String getResponseContent(String url, RestfulParametes restParametes, String type) {
return getResponseContent(url, restParametes, null, type);
}
/**
* Get response map.
*
* @param url
* @param restParametes
* @param opt
* @param type
* @return
* @since VFC 1.0
*/
public static Map getResponseMap(String url, RestfulParametes restParametes, RestfulOptions opt,
String type) {
RestfulResponse response = restfulResponse(url, restParametes, opt, type);
return getResponseMap(response);
}
/**
* Get response content map.
*
* @param url
* @param type
* @return
* @since VFC 1.0
*/
public static Map getResponseContentMap(String url, String type) {
RestfulResponse response = restfulResponse(url, new RestfulParametes(), null, type);
return getResponseMap(response);
}
private static Map getResponseMap(RestfulResponse response) {
Map resMap = new HashMap<>(10);
if(null != response) {
resMap.put(Constant.RESPONSE_CONTENT, response.getResponseContent());
resMap.put(Constant.STATUS_CODE, response.getStatus());
}
return resMap;
}
/**
* Get response content.
*
* @param url
* @param restParametes
* @param opt
* @param type
* @return
* @since VFC 1.0
*/
public static String getResponseContent(String url, RestfulParametes restParametes, RestfulOptions opt,
String type) {
String responseContent = null;
RestfulResponse rsp = restfulResponse(url, restParametes, opt, type);
if(rsp != null) {
int httpStatus = rsp.getStatus();
LOGGER.warn("function=getResponseContent, get response httpStatusCode : {} ", httpStatus);
if(httpStatus < HttpServletResponse.SC_BAD_REQUEST && httpStatus > 0) {
responseContent = rsp.getResponseContent();
LOGGER.warn("function=getResponseContent, get response data success!responseContent={}",
responseContent);
}
}
return responseContent;
}
public static RestfulResponse getResponse(String url, RestfulParametes restParametes, RestfulOptions opt,
String type) {
String responseContent = null;
RestfulResponse rsp = restfulResponse(url, restParametes, opt, type);
if(rsp != null) {
int httpStatus = rsp.getStatus();
LOGGER.warn("function=getResponseContent, get response httpStatusCode : {} ", httpStatus);
if(httpStatus < HttpServletResponse.SC_BAD_REQUEST && httpStatus > 0) {
responseContent = rsp.getResponseContent();
LOGGER.warn("function=getResponseContent, get response data success!responseContent={}",
responseContent);
}
}
return rsp;
}
/**
* Get restful response.
*
* @param url
* @param restParametes
* @param type
* @return
* @since VFC 1.0
*/
public static RestfulResponse getRestfulResponse(String url, RestfulParametes restParametes, String type) {
return restfulResponse(url, restParametes, null, type);
}
private static RestfulResponse restfulResponse(String url, RestfulParametes restParametes, RestfulOptions opt,
String type) {
RestfulResponse rsp = new RestfulResponse();
try {
Restful restClient = url.startsWith("https") ? REST_CLIENT_HTTPS : REST_CLIENT_HTTP;
if(restClient != null) {
if(TYPE_GET.equals(type)) {
rsp = restClient.get(url, restParametes, opt);
} else if(TYPE_POST.equals(type)) {
rsp = restClient.post(url, restParametes, opt);
} else if(TYPE_PUT.equals(type)) {
rsp = restClient.put(url, restParametes, opt);
} else if(TYPE_DEL.equals(type)) {
rsp = restClient.delete(url, restParametes, opt);
}
}
} catch(ServiceException e) {
LOGGER.error("function=restfulResponse, get restful response catch exception {} ", e);
}
LOGGER.warn("function=restfulResponse, response status is {}, context is {} ", rsp.getStatus(),
rsp.getResponseContent());
return rsp;
}
/**
* encapsulate the java reflect exception.
*
* @param methodName, Restful's method.
* @param objects, method param array.
* @return
* @since VFC 1.0
*/
public static RestfulResponse getRestRes(String methodName, Object... objects) {
try {
if(objects == null || REST_CLIENT_HTTP == null) {
return null;
}
Class>[] classes = new Class[objects.length];
for(int i = 0; i < objects.length; i++) {
classes[i] = objects[i].getClass();
}
if(methodName.startsWith("async")) {
classes[classes.length - 1] = RestfulAsyncCallback.class;
}
Class> rtType = methodName.startsWith("async") ? void.class : RestfulResponse.class;
MethodType mt = MethodType.methodType(rtType, classes);
Object result = MethodHandles.lookup().findVirtual(REST_CLIENT_HTTP.getClass(), methodName, mt)
.bindTo(REST_CLIENT_HTTP).invokeWithArguments(objects);
if(result != null) {
return (RestfulResponse)result;
}
LOGGER.warn("function=getRestRes, msg: invoke Restful async {} method which return type is Void.",
methodName);
return null;
} catch(ReflectiveOperationException e) {
LOGGER.error("function=getRestRes, msg=error occurs, e={}.", e);
} catch(Throwable e) {// NOSONAR
LOGGER.error("function=getRestRes, msg=Throwable, e={}.", e);
try {
throw (ServiceException)new ServiceException().initCause(e.getCause());
} catch(ServiceException se) {
LOGGER.error("function=getRestRes, msg=ServiceException occurs, e={}.", se);
}
}
return null;
}
/**
* Get response.
*
* @param restParametes
* @param url
* @return
* @throws ServiceException
* @since VFC 1.0
*/
public static JSONArray getResponseRes(RestfulParametes restParametes, String url) throws ServiceException {
String result = getResponseContent(url, restParametes, RestfulUtil.TYPE_GET);
if(null == result || result.isEmpty()) {
LOGGER.error("result from url:" + url + " result:" + result);
throw new ServiceException(ResourceUtil.getMessage(NO_RESULT_EXCEPTION));
}
JSONArray rsArray = null;
try {
JSONObject rsJson = JSONObject.fromObject(result);
rsArray = rsJson.getJSONArray(ParamConstant.PARAM_DATA);
} catch(JSONException e) {
LOGGER.error("getResources error:" + e);
throw new ServiceException(ResourceUtil.getMessage(NO_RESULT_EXCEPTION));
}
return rsArray;
}
/**
* Get response.
*
* @param restParametes
* @param url
* @param iResName
* @return
* @throws ServiceException
* @since VFC 1.0
*/
public static JSONArray getResponseRes(RestfulParametes restParametes, String url, String iResName)
throws ServiceException {
String result = getResponseContent(url, restParametes, RestfulUtil.TYPE_GET);
if(null == result || result.isEmpty()) {
LOGGER.error("result from url:" + url + " result:" + result);
throw new ServiceException(ResourceUtil.getMessage(NO_RESULT_EXCEPTION));
}
JSONArray rsArray = null;
try {
JSONObject rsJson = JSONObject.fromObject(result);
rsArray = rsJson.getJSONArray(iResName);
String vimId = rsJson.getString(ParamConstant.PARAM_VIMID);
String vimName = rsJson.getString(ParamConstant.PARAM_VIMNAME);
for(int i = 0; i < rsArray.size(); i++) {
JSONObject jsonObj = rsArray.getJSONObject(i);
jsonObj.put(ParamConstant.PARAM_VIMID, vimId);
jsonObj.put(ParamConstant.PARAM_VIMNAME, vimName);
}
} catch(JSONException e) {
LOGGER.error("getResources error:" + e);
throw new ServiceException(ResourceUtil.getMessage(NO_RESULT_EXCEPTION));
}
return rsArray;
}
/**
*
*
* @param paramsMap
* @param params
* @return
* @since VFC 1.0
*/
public static RestfulResponse getRemoteResponse(Map paramsMap, String params) {
String url = paramsMap.get("url");
String methodType = paramsMap.get("methodType");
RestfulResponse rsp = null;
Restful rest = RestfulFactory.getRestInstance(RestfulFactory.PROTO_HTTP);
try {
RestfulParametes restfulParametes = new RestfulParametes();
Map headerMap = new HashMap<>(3);
headerMap.put(CONTENT_TYPE, APPLICATION);
restfulParametes.setHeaderMap(headerMap);
restfulParametes.setRawData(params);
if(rest != null) {
if(TYPE_GET.equalsIgnoreCase(methodType)) {
rsp = rest.get(url, restfulParametes);
} else if(TYPE_POST.equalsIgnoreCase(methodType)) {
rsp = rest.post(url, restfulParametes);
} else if(TYPE_PUT.equalsIgnoreCase(methodType)) {
rsp = rest.put(url, restfulParametes);
} else if(TYPE_DEL.equalsIgnoreCase(methodType)) {
rsp = rest.delete(url, restfulParametes);
}
}
} catch(ServiceException e) {
LOGGER.error("function=getRemoteResponse, get restful response catch exception {}", e);
}
return rsp;
}
}