2  * Copyright 2016 Huawei Technologies Co., Ltd.
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *     http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  17 package org.openo.nfvo.jujuvnfmadapter.common;
 
  19 import java.io.IOException;
 
  20 import java.io.InputStream;
 
  21 import java.text.SimpleDateFormat;
 
  22 import java.util.ArrayList;
 
  23 import java.util.Date;
 
  24 import java.util.List;
 
  26 import javax.servlet.http.HttpServletRequest;
 
  28 import org.apache.commons.io.IOUtils;
 
  29 import org.codehaus.jackson.map.ObjectMapper;
 
  30 import org.codehaus.jackson.type.TypeReference;
 
  31 import org.slf4j.Logger;
 
  32 import org.slf4j.LoggerFactory;
 
  34 import net.sf.ezmorph.object.DateMorpher;
 
  35 import net.sf.json.JSON;
 
  36 import net.sf.json.JSONArray;
 
  37 import net.sf.json.JSONException;
 
  38 import net.sf.json.JSONObject;
 
  39 import net.sf.json.JsonConfig;
 
  40 import net.sf.json.processors.JsonValueProcessor;
 
  41 import net.sf.json.util.CycleDetectionStrategy;
 
  42 import net.sf.json.util.JSONTokener;
 
  43 import net.sf.json.util.JSONUtils;
 
  47  * Virtual Network Function Json Utility class.<br>
 
  52  * @version     NFVO 0.5  Sep 10, 2016
 
  54 public final class VNFJsonUtil {
 
  56     private static final Logger LOG = LoggerFactory.getLogger(VNFJsonUtil.class);
 
  58     private static final ObjectMapper VNFMAPPER = new ObjectMapper();
 
  60     private static final String ERROR = "error";
 
  62         VNFMAPPER.setDeserializationConfig(VNFMAPPER.getDeserializationConfig()
 
  63                 .without(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES));
 
  66     private VNFJsonUtil() {
 
  71      * UnMarshal method.<br>
 
  79     public static <T> T unMarshal(String vnfJsonstr, Class<T> type) throws IOException {
 
  80         return VNFMAPPER.readValue(vnfJsonstr, type);
 
  85      * UnMarshal method.<br>
 
  93     public static <T> T unMarshal(String vnfJsonstr, TypeReference<T> type) throws IOException {
 
  94         return VNFMAPPER.readValue(vnfJsonstr, type);
 
 103      * @throws IOException
 
 106     public static String marshal(Object srcObj) throws IOException {
 
 107         if(srcObj instanceof JSON) {
 
 108             return srcObj.toString();
 
 110         return VNFMAPPER.writeValueAsString(srcObj);
 
 113     public static ObjectMapper getMapper() {
 
 119      * Get Json field string.<br>
 
 126     public static String getJsonFieldStr(JSONObject vnfJsonObj, String fieldName) {
 
 127         if(null == vnfJsonObj || null == vnfJsonObj.get(fieldName) || "null".equals(vnfJsonObj.getString(fieldName))) {
 
 128             LOG.warn("getJsonFieldStr: VNFJson object field(" + fieldName + ") is null.");
 
 132         return vnfJsonObj.getString(fieldName);
 
 137      * Get Json field integer.<br>
 
 144     public static Integer getJsonFieldInt(JSONObject vnfJsonObj, String fieldName) {
 
 145         if(null == vnfJsonObj || null == vnfJsonObj.get(fieldName)) {
 
 146             LOG.warn("getJsonFieldInt: VNFJson object field(" + fieldName + ") is Null");
 
 149         return vnfJsonObj.getInt(fieldName);
 
 154      * Get Json field long.<br>
 
 161     public static Long getJsonFieldLong(JSONObject vnfJsonObj, String fieldName) {
 
 162         if(null == vnfJsonObj || null == vnfJsonObj.get(fieldName)) {
 
 163             LOG.warn("getJsonFieldLong: VNFJson object field(" + fieldName + ") is null");
 
 166         return vnfJsonObj.getLong(fieldName);
 
 171      * Parse error information.<br>
 
 177     public static String parseErrorInfo(String errorInfo) {
 
 178         if((errorInfo != null) && (!errorInfo.isEmpty())) {
 
 179             JSONObject errorInfoJst = JSONObject.fromObject(errorInfo);
 
 180             if(errorInfoJst.has(ERROR) && errorInfoJst.getJSONObject(ERROR).has("message")) {
 
 181                 return errorInfoJst.getJSONObject(ERROR).getString("message");
 
 184         return "System Error!";
 
 188         VNFMAPPER.setDeserializationConfig(VNFMAPPER.getDeserializationConfig()
 
 189                 .without(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES));
 
 194      * Convert VNF Json to objects.<br>
 
 196      * @param vnfJsonString
 
 201     @SuppressWarnings("unchecked")
 
 202     public static <T> T vnfJsonToObjects(String vnfJsonString, Class<T> pojoCalss) {
 
 203         JSONObject vnfJsonObject = JSONObject.fromObject(vnfJsonString);
 
 204         return (T)JSONObject.toBean(vnfJsonObject, pojoCalss);
 
 209      * Convert VNF Json to objects.<br>
 
 211      * @param vnfJsonString
 
 212      * @param vnfJsonConfig
 
 216     @SuppressWarnings("unchecked")
 
 217     public static <T> T vnfJsonToObjects(String vnfJsonString, JsonConfig vnfJsonConfig) {
 
 218         JSONObject vnfJsonObject = JSONObject.fromObject(vnfJsonString);
 
 219         return (T)JSONObject.toBean(vnfJsonObject, vnfJsonConfig);
 
 224      * Convert VNF Json to lists.<br>
 
 226      * @param vnfJsonString
 
 231     @SuppressWarnings("unchecked")
 
 232     public static <T> List<T> vnfJsonToLists(String vnfJsonString, Class<T> pojoClass) {
 
 233         JSONArray vnfJsonVNFArray = JSONArray.fromObject(vnfJsonString);
 
 234         JSONObject vnfJsonObject;
 
 235         List<T> list = new ArrayList<>(20);
 
 236         for(int i = 0; i < vnfJsonVNFArray.size(); i++) {
 
 237             vnfJsonObject = vnfJsonVNFArray.getJSONObject(i);
 
 238             list.add((T)JSONObject.toBean(vnfJsonObject, pojoClass));
 
 245      * Convert VNF Json to list.<br>
 
 247      * @param vnfJsonString
 
 253     @SuppressWarnings("unchecked")
 
 254     public static <T> List<T> vnfJsonToList(String vnfJsonString, Class<T> pojoClass, String dataFormat) {
 
 255         JsonConfig vnfJsonConfig = configJson(dataFormat);
 
 256         JSONArray vnfJsonVNFArray = JSONArray.fromObject(vnfJsonString, vnfJsonConfig);
 
 257         JSONObject vnfJsonObject;
 
 258         List<T> list = new ArrayList<>(20);
 
 259         for(int i = 0; i < vnfJsonVNFArray.size(); i++) {
 
 260             vnfJsonObject = vnfJsonVNFArray.getJSONObject(i);
 
 261             list.add((T)JSONObject.toBean(vnfJsonObject, pojoClass));
 
 268      * Object to json string.<br>
 
 274     public static String objectToJsonStr(Object javaObj) {
 
 275         JSONObject vnfJson = JSONObject.fromObject(javaObj);
 
 276         return vnfJson.toString();
 
 281      * object to json.<br>
 
 287     public static JSONObject objectToJson(Object javaObj) {
 
 288         return JSONObject.fromObject(javaObj);
 
 293      * Object to json.<br>
 
 296      * @param vnfJsonConfig
 
 300     public static String objectToJson(Object javaObj, JsonConfig vnfJsonConfig) {
 
 301         JSONObject vnfJson = JSONObject.fromObject(javaObj, vnfJsonConfig);
 
 302         return vnfJson.toString();
 
 307      * Object to json.<br>
 
 314     public static String objectToJson(Object javaObj, String dataFormat) {
 
 315         JsonConfig vnfJsonConfig = configJson(dataFormat);
 
 316         JSONObject vnfJson = JSONObject.fromObject(javaObj, vnfJsonConfig);
 
 317         return vnfJson.toString();
 
 329     public static <T> String listToJson(List<T> list) {
 
 330         JSONArray vnfJson = JSONArray.fromObject(list);
 
 331         return vnfJson.toString();
 
 343     public static <T> String listToJson(List<T> list, String dataFormat) {
 
 344         JsonConfig vnfJsonConfig = configJson(dataFormat);
 
 345         JSONArray vnfJson = JSONArray.fromObject(list, vnfJsonConfig);
 
 346         return vnfJson.toString();
 
 357     public static JsonConfig configJson(final String datePattern) {
 
 359         JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {datePattern}));
 
 361         JsonConfig vnfJsonConfig = new JsonConfig();
 
 362         vnfJsonConfig.setIgnoreDefaultExcludes(false);
 
 363         vnfJsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
 
 364         vnfJsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
 
 366             public Object processObjectValue(String key, Object value, JsonConfig vnfJsonConfig) {
 
 367                 if(value instanceof Date) {
 
 368                     return new SimpleDateFormat(datePattern).format((Date)value);
 
 370                 return value == null ? null : value.toString();
 
 373             public Object processArrayValue(Object value, JsonConfig vnfJsonConfig) {
 
 374                 String[] vnfObj = {};
 
 375                 SimpleDateFormat vnfSf = new SimpleDateFormat(datePattern);
 
 376                 if(value instanceof Date[]) {
 
 377                     Date[] dates = (Date[])value;
 
 378                     vnfObj = new String[dates.length];
 
 379                     for(int i = 0; i < dates.length; i++) {
 
 380                         vnfObj[i] = vnfSf.format(dates[i]);
 
 386         return vnfJsonConfig;
 
 390      * @param context the HttpContext
 
 391      * @param <T> JSONObject or JSONArray
 
 394     @SuppressWarnings("unchecked")
 
 395     public static <T> T getJsonFromContext(HttpServletRequest context) {
 
 397             InputStream input = context.getInputStream();
 
 398             String vnfJsonStr = IOUtils.toString(input);
 
 399             JSONTokener vnfVnfJsonTokener = new JSONTokener(vnfJsonStr);
 
 402             if(vnfVnfJsonTokener.nextClean() == Character.codePointAt("{", 0)) {
 
 403                 return (T)JSONObject.fromObject(vnfJsonStr);
 
 406             vnfVnfJsonTokener.back();
 
 409             if(vnfVnfJsonTokener.nextClean() == Character.codePointAt("[", 0)) {
 
 410                 return (T)JSONArray.fromObject(vnfJsonStr);
 
 412         } catch(IOException e) {
 
 413             LOG.error("function=getJsonFromContext,msg= IOException occurs. exception=" + e);
 
 414         } catch(JSONException e) {
 
 415             LOG.error("function=getJsonFromContext,msg= JSONException occurs, exception=" + e);