/**JsonBinder.java*/
package org.howsun.json;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.codehaus.jackson.type.TypeReference;
import org.howsun.util.Strings;



/**
 * Json:Jackson简单封装
 *
 * @author howsun([email protected])
 * @Date 2010-10-20
 * @version v0.1
 */
public class JacksonSupportJson implements Json {

	private static final org.howsun.log.Log log = org.howsun.log.LogFactory.getLog(JacksonSupportJson.class);

	private ObjectMapper objectMapper;

	public JacksonSupportJson(Inclusion inclusion) {
		objectMapper = new ObjectMapper();
		//设置输出包含的属性
		objectMapper.getSerializationConfig().setSerializationInclusion(inclusion);
		//设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
		objectMapper.getDeserializationConfig().set(
				org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		setDateFormat(null);
	}
	/**
	 * 创建输出全部属性到Json字符串的Binder.
	 * @return Json
	 */
	public static Json buildNormalBinder() {
		return new JacksonSupportJson(Inclusion.ALWAYS);
	}

	/**
	 * 创建只输出非空属性到Json字符串的Binder.
	 * @return Json
	 */
	public static Json buildNonNullBinder() {
		return new JacksonSupportJson(Inclusion.NON_NULL);
	}

	/**
	 * 创建只输出初始值被改变的属性到Json字符串的Binder.
	 * @return Json
	 */
	public static Json buildNonDefaultBinder() {
		return new JacksonSupportJson(Inclusion.NON_DEFAULT);
	}

	/* (non-Javadoc)
	 * @see com.bj58.wf.json.Json#fromJson(java.lang.String, java.lang.Class)
	 */
	public <T> T fromJson(String jsonString, Class<T> clazz) {
		try {
			if (Strings.hasLengthAfterTrimWhiteSpace(jsonString))
				return objectMapper.readValue(jsonString, clazz);
		} catch (IOException e) {
			log.warn("parse json string error:" + jsonString, e);
		}
		return null;
	}


	@Override
	public <T> T fromJson(String jsonString, TypeReference<T> typeReference) throws JsonParseException, JsonMappingException, IOException {
		return objectMapper.readValue(jsonString, typeReference);
	}


	/* (non-Javadoc)
	 * @see com.bj58.wf.json.Json#toJson(java.lang.Object)
	 */
	public String toJson(Object object) {
		try {
			return objectMapper.writeValueAsString(object);
		} catch (IOException e) {
			log.warn("write to json string error:" + object, e);
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see com.bj58.wf.json.Json#setDateFormat(java.lang.String)
	 */
	public void setDateFormat(String pattern) {
		if (!Strings.hasLengthAfterTrimWhiteSpace(pattern)) {
			pattern = "yyyy-MM-dd HH:mm:ss";
		}
		DateFormat df = new SimpleDateFormat(pattern);
		objectMapper.getSerializationConfig().setDateFormat(df);
		objectMapper.getDeserializationConfig().setDateFormat(df);
	}

	/* (non-Javadoc)
	 * @see com.bj58.wf.json.Json#getMapper()
	 */
	public ObjectMapper getMapper() {
		return objectMapper;
	}
}