package com.dongdongxia.myfastjson.serializer;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.IdentityHashMap;
import java.util.Locale;
import java.util.TimeZone;

import com.dongdongxia.myfastjson.JSON;

/**
 * 
 * <P>Description: JSON序列化控制器</P>
 * @ClassName: JSONSerializer
 * @author java_liudong@163.com  2017年4月28日 下午2:14:19
 */
public class JSONSerializer extends SerializerFilterable{

	/** 两个主要对象, 用来控制配置和输出, 在构造方法中初始化*/
	protected final SerializeConfig config;
	public final SerializeWriter out;

	private String dateFormatPattern; // 日式格式化模板
	private DateFormat dateFormat; // 日期格式化对象
	
	/**
	 * 多个引用
	 */
	protected IdentityHashMap<Object, SerialContext> references = null;
	protected SerialContext context;
	
	/**
	 * 获取默认时区
	 */
	protected TimeZone timeZone = JSON.defaultTimeZone;
	/**
	 * 获取默认的环境
	 */
	protected Locale locale = JSON.defaultLocale;
	
	/**
	 * 
	 * <p>Title: Constructor</p>
	 * <p>Description: 初始化默认的 写入 和 全局配置的对象</p>
	 */
	public JSONSerializer() {
		this(new SerializeWriter(), SerializeConfig.getGlobalConfig());
	}
	
	/**
	 * 
	 * <p>Title: Constructor</p>
	 * <p>Description: 指定输出构造方法</p>
	 * @param out 序列输出
	 */
	public JSONSerializer(SerializeWriter out) {
		this(out, SerializeConfig.getGlobalConfig());
	}
	
	/**
	 * 
	 * <p>Title: Constructor</p>
	 * <p>Description: 指定全局配置的构造方法</p>
	 * @param config 全局配置
	 */
	public JSONSerializer(SerializeConfig config) {
		this(new SerializeWriter(), config);
	}
	
	
	
	public JSONSerializer(SerializeWriter out, SerializeConfig config) {
		this.out = out;
		this.config = config;
	}
	
	/**
	 * 
	 * <p>Title: getDateFormatPattern</p>
	 * <p>Description: 获取日期格式化的模式</p>
	 * @return
	 * @author java_liudong@163.com  2017年5月27日 上午10:19:26
	 */
	public String getDateFormatPattern() {
		if (dateFormat instanceof SimpleDateFormat) {
			return ((SimpleDateFormat) dateFormat).toPattern(); // 返回类似: yyyy-MM-dd HH:mm:ss  如果指定勒的话
		}
		return dateFormatPattern; // 没有的话, 就返回指定的 格式化模式
	}
	
	/**
	 * 
	 * <p>Title: getDateFormat</p>
	 * <p>Description: 获取日期格式化对象, 没有的话, 就初始化</p>
	 * @return
	 * @author java_liudong@163.com  2017年5月27日 上午10:27:45
	 */
	public DateFormat getDateFormat() {
		if (dateFormat == null) {
			if (dateFormatPattern != null) {
				dateFormat = new SimpleDateFormat(dateFormatPattern, locale);
				dateFormat.setTimeZone(timeZone);
			}
		}
		return dateFormat;
	}
	
	/**
	 * 
	 * <p>Title: setDateFormat</p>
	 * <p>Description: 设置日期格式化对象</p>
	 * @param dateFormat
	 * @author java_liudong@163.com  2017年5月27日 上午10:36:48
	 */
	public void setDateFormat(DateFormat dateFormat) {
		this.dateFormat = dateFormat;
		if (dateFormatPattern != null) {
			dateFormatPattern = null;
		}
	}
	
	/**
	 * 
	 * <p>Title: setDateFormat</p>
	 * <p>Description: 设置日期格式模式</p>
	 * @param dateFormat
	 * @author java_liudong@163.com  2017年5月27日 上午10:42:03
	 */
	public void setDateFormat(String dateFormat) {
		this.dateFormatPattern = dateFormat;
		if (this.dateFormat != null) {
			this.dateFormat = null;
		}
	}
	
	public SerialContext getContext() {
		return context;
	}

	public void setContext(SerialContext context) {
		this.context = context;
	}
	
	/**
	 * 
	 * <p>Title: setContext</p>
	 * <p>Description: 设置SerialContext 初始化的方法</p>
	 * @param parent
	 * @param object
	 * @param fieldName
	 * @param features
	 * @author java_liudong@163.com  2017年5月27日 上午10:47:52
	 */
	public void setContext(SerialContext parent, Object object, Object fieldName, int features) {
		this.setContext(parent, object, fieldName, features, 0);
	}
	
	public void setContext(SerialContext parent, Object object, Object fieldName, int features, int fieldFeatures) {
		if (out.disableCircularReferenceDetect) {
			return ;
		}
		
		this.context = new SerialContext(parent, object, fieldName, features, fieldFeatures); // 初始化 SerialContext对象
		
		if (references == null) { // 为空,就初始化, 不然, 就开始装对象吧
			references = new IdentityHashMap<Object, SerialContext>();
		}
		this.references.put(object, context); // object 就是当前序列化的对象
	}
	
	
	protected final void writeKeyValue(char seperator, String key, Object value){
		
	}
	
}

@@ -4024,16 +4024,317 @@
 %0A%09%7D%0A%09%0A%09%0A
+%09/**%0A%09 * %0A%09 * %3Cp%3ETitle: setContext%3C/p%3E%0A%09 * %3Cp%3EDescription: %E8%AE%BE%E7%BD%AESerialContext %E5%B9%B6%E8%AE%BE%E7%BD%AE%E7%9A%84%E6%98%AF%E7%88%B6%E7%B1%BB%3C/p%3E%0A%09 * @param object%0A%09 * @param fieldName%0A%09 * @author java_liudong@163.com  2017%E5%B9%B45%E6%9C%8827%E6%97%A5 %E4%B8%8A%E5%8D%8810:56:11%0A%09 */%0A%09public void setContext(Object object, Object fieldName) %7B%0A%09%09this.setContext(context, object, fieldName, 0);%0A%09%7D%0A%09%0A
 %09protect

设置SerialContext 父类的方法