/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
/**
*
*/
package com.impetus.ankush.common.utils;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.codehaus.jackson.map.ObjectMapper;
import com.impetus.ankush2.logger.AnkushLogger;
/**
* The Class JsonMapperUtil.
*
* @author hokam chauhan Utility class to convert json string into the object
* and vice versa.
*/
public class JsonMapperUtil {
/** The log. */
private static final AnkushLogger LOG = new AnkushLogger(
FileNameUtils.class);
/** The mapper. */
private static ObjectMapper mapper = new ObjectMapper();
/**
* Method to convert a object into JSON string.
*
* @param object
* the object
* @return the string
*/
public static String jsonFromObject(Object object) {
try {
/* Generating the JSON string for the object. */
return mapper.writeValueAsString(object);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
return null;
}
/**
* Method to Convert the given json string into the specified class object.
*
* @param <S>
* the generic type
* @param jsonString
* the json string
* @param targetClass
* the target class
* @return Object of the class formed using the JSON string.
*/
public static <S> S objectFromString(String jsonString, Class<S> targetClass) {
S object = null;
try {
/* Creating the target class object */
object = targetClass.newInstance();
} catch (InstantiationException e) {
LOG.error(e.getMessage(), e);
} catch (IllegalAccessException e) {
LOG.error(e.getMessage(), e);
}
try {
/* Populating the object with json string values. */
object = mapper.readValue(jsonString, targetClass);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
return object;
}
/**
* Object from json file.
*
* @param <S>
* the generic type
* @param filePath
* the file path
* @param targetClass
* the target class
* @return the s
*/
public static <S> S objectFromJsonFile(String filePath, Class<S> targetClass) {
S object = null;
try {
File jsonFile = new File(filePath);
object = objectFromString(FileUtils.readFileToString(jsonFile),
targetClass);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
return object;
}
/**
* Object from map.
*
* @param <S>
* the generic type
* @param values
* the values
* @param targetClass
* the target class
* @return the s
* @throws IllegalArgumentException
* the illegal argument exception
* @throws IllegalAccessException
* the illegal access exception
* @throws InstantiationException
* the instantiation exception
* @throws InvocationTargetException
* the invocation target exception
* @throws Exception
* the exception
*/
public static <S> S objectFromMap(Map<String, Object> values,
Class<S> targetClass) throws IllegalArgumentException,
IllegalAccessException, InstantiationException,
InvocationTargetException, Exception {
// Creating target class object.
S mainObject = targetClass.newInstance();
// Getting fields of the class.
Field[] fields = targetClass.getDeclaredFields();
Map<String, Field> fieldMap = new HashMap<String, Field>();
for (Field field : fields) {
// Putting fields in fieldMap
fieldMap.put(field.getName(), field);
}
// Iterating over the key set in value map.
for (String mainKey : values.keySet()) {
if (values.get(mainKey) instanceof LinkedHashMap) {
// Creating target object type.
if (fieldMap.get(mainKey) == null) {
continue;
}
Object subObject = fieldMap.get(mainKey).getType()
.newInstance();
// Casting to map.
Map subValues = (Map) values.get(mainKey);
// Iterating over the map keys.
for (Object subKey : subValues.keySet()) {
BeanUtils.setProperty(subObject, (String) subKey,
subValues.get(subKey));
}
// setting the sub object in bean main object.
BeanUtils.setProperty(mainObject, mainKey, subObject);
} else {
// setting the value in bean main object.
BeanUtils.setProperty(mainObject, mainKey, values.get(mainKey));
}
}
return mainObject;
}
/**
* Method to get Map from the object.
*
* @param obj
* the obj
* @return the map
* @throws Exception
* the exception
*/
public static Map<String, Object> mapFromObject(Object obj)
throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(obj, HashMap.class);
}
/**
* Map from object.
*
* @param <S>
* the generic type
* @param obj
* the obj
* @param className
* the class name
* @return the s
* @throws Exception
* the exception
*/
public static <S> S objectFromObject(Object obj, Class<S> className)
throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(obj, className);
}
/**
* Gets the node info list.
*
* @param <S>
* the generic type
* @param dataMap
* the monitoring info
* @param key
* the key
* @param targetClass
* the target class
* @return the node info list
* @throws Exception
* the exception
*/
public static <S> List<S> getListObject(List<Map> listMapData,
Class<S> targetClass) throws Exception {
// checking if map is null.
if (listMapData == null) {
return null;
}
// Creating the resultant list object.
List<S> result = new ArrayList<S>(listMapData.size());
// populating values in the list object from map.
for (Map<String, Object> info : listMapData) {
// creating target class object.
S status = targetClass.newInstance();
// populating object with map values.
BeanUtils.populate(status, info);
// adding object in result list.
result.add(status);
}
return result;
}
}