// Path: excel/src/main/java/com/bing/excel/converter/FieldValueConverter.java
// public interface FieldValueConverter extends ConverterMatcher {
// 	  OutValue toObject(Object source,ConverterHandler converterHandler);
// 	  Object fromString(String cell,ConverterHandler converterHandler,Type targetType);
// }
// 
// Path: excel/src/main/java/com/bing/excel/core/handler/ConverterHandler.java
// public interface ConverterHandler {
// 
// 	
// 	/**
// 	 * Get default FieldConverter which is difined by <code>BaseGlobalConverterMapper</code> or user. 
// 	 * @param keyFieldType
// 	 * @return defaultConvetter or null
// 	 */
// 	FieldValueConverter getLocalConverter(Class<?> keyFieldType);
// 
// 	/**
// 	 * Registe converter for this {@code Class} clazz.
// 	 * @param clazz
// 	 * @param converter
// 	 */
// 	void registerConverter(Class<?> clazz, FieldValueConverter converter);
// 	
// 	
// }
// 
// Path: excel/src/main/java/com/bing/excel/exception/ConversionException.java
// public class ConversionException extends RuntimeException {
// 
// 	public ConversionException() {
// 		super();
// 	}
// 
// 	public ConversionException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public ConversionException(String message) {
// 		super(message);
// 	}
// 
// 	public ConversionException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: excel/src/main/java/com/bing/excel/converter/AbstractFieldConvertor.java
// public class AbstractFieldConvertor implements FieldValueConverter {
// 
// 	@Override
// 	public boolean canConvert(Class<?> clz) {
// 
// 		return false;
// 	}
// 
// 	@Override
// 	public OutValue toObject(Object source, ConverterHandler converterHandler) {
// 		if(source==null){
// 			return null;
// 		}
// 		return new OutValue(OutValue.OutType.STRING, source.toString());
// 	}
// 
// 	@Override
// 	public Object fromString(String cell, ConverterHandler converterHandler,
// 			Type targetType) {
// 		if (cell == null) {
// 			return null;
// 		}
// 		return cell;
// 	}
// 
// }
// 
// Path: excel/src/main/java/com/bing/excel/vo/OutValue.java
// public class OutValue {
// 	public enum OutType {
// 		INTEGER, LONG, DOUBLE, STRING, DATE, UNDEFINED
// 	}
// 	
// 	private OutType outType;
// 	private Object value;
// 	
// 	
// 	
// 	public OutValue(OutType outType, Object value) {
// 		super();
// 		this.outType = outType;
// 		this.value = value;
// 	}
// 	public static OutValue intValue(Object obj){
// 		return new OutValue(OutType.INTEGER,obj);
// 	}
// 	public static OutValue doubleValue(Object obj){
// 		return new OutValue(OutType.DOUBLE,obj);
// 	}
// 	public static OutValue longValue(Object obj){
// 		return new OutValue(OutType.LONG,obj);
// 	}
// 	public static OutValue stringValue(Object obj){
// 		return new OutValue(OutType.STRING,obj);
// 	}
// 	public static OutValue dateValue(Object obj){
// 		return new OutValue(OutType.DATE,obj);
// 	}
// 	public OutType getOutType() {
// 		return outType;
// 	}
// 	public void setOutType(OutType outType) {
// 		this.outType = outType;
// 	}
// 	public Object getValue() {
// 		return value;
// 	}
// 	public void setValue(Object value) {
// 		this.value = value;
// 	}
// 	
// }


import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.bing.excel.converter.FieldValueConverter;
import com.bing.excel.core.handler.ConverterHandler;
import com.bing.excel.exception.ConversionException;
import com.bing.excel.converter.AbstractFieldConvertor;
import com.bing.excel.vo.OutValue;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

	@Override
	public boolean canConvert(Class type) {
		return type.equals(ArrayList.class) ||type.equals(List.class)|| type.equals(HashSet.class)||type.equals(Set.class)
				|| type.equals(LinkedList.class);
	}

	@Override
	public OutValue toObject(Object source, ConverterHandler converterHandler) {
		if(source==null){
			return null;
		}
		Collection collection = (Collection)source;
		StringBuilder bd=new StringBuilder();
		for (Object obj : collection) {
			Class  class1 = obj.getClass();
			FieldValueConverter converter = converterHandler.getLocalConverter(class1);
			if(converter==null){
				throw new ConversionException("can find the converter for type ["
								+ class1 + "]");
			}
			OutValue outValue = converter.toObject(obj, converterHandler);
			bd.append(outValue.getValue());
			bd.append(splitCharacter);
		}
		StringBuilder builder = bd.replace(bd.length()-1, bd.length(), "");
		return OutValue.stringValue(builder.toString());
	}

	@Override
// Path: excel/src/main/java/com/bing/excel/converter/FieldValueConverter.java
// public interface FieldValueConverter extends ConverterMatcher {
// 	  OutValue toObject(Object source,ConverterHandler converterHandler);
// 	  Object fromString(String cell,ConverterHandler converterHandler,Type targetType);
// }
// 
// Path: excel/src/main/java/com/bing/excel/core/handler/ConverterHandler.java
// public interface ConverterHandler {
// 
// 	
// 	/**
// 	 * Get default FieldConverter which is difined by <code>BaseGlobalConverterMapper</code> or user. 
// 	 * @param keyFieldType
// 	 * @return defaultConvetter or null
// 	 */
// 	FieldValueConverter getLocalConverter(Class<?> keyFieldType);
// 
// 	/**
// 	 * Registe converter for this {@code Class} clazz.
// 	 * @param clazz
// 	 * @param converter
// 	 */
// 	void registerConverter(Class<?> clazz, FieldValueConverter converter);
// 	
// 	
// }
// 
// Path: excel/src/main/java/com/bing/excel/exception/ConversionException.java
// public class ConversionException extends RuntimeException {
// 
// 	public ConversionException() {
// 		super();
// 	}
// 
// 	public ConversionException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// 	public ConversionException(String message) {
// 		super(message);
// 	}
// 
// 	public ConversionException(Throwable cause) {
// 		super(cause);
// 	}
// 
// }
// 
// Path: excel/src/main/java/com/bing/excel/converter/AbstractFieldConvertor.java
// public class AbstractFieldConvertor implements FieldValueConverter {
// 
// 	@Override
// 	public boolean canConvert(Class<?> clz) {
// 
// 		return false;
// 	}
// 
// 	@Override
// 	public OutValue toObject(Object source, ConverterHandler converterHandler) {
// 		if(source==null){
// 			return null;
// 		}
// 		return new OutValue(OutValue.OutType.STRING, source.toString());
// 	}
// 
// 	@Override
// 	public Object fromString(String cell, ConverterHandler converterHandler,
// 			Type targetType) {
// 		if (cell == null) {
// 			return null;
// 		}
// 		return cell;
// 	}
// 
// }
// 
// Path: excel/src/main/java/com/bing/excel/vo/OutValue.java
// public class OutValue {
// 	public enum OutType {
// 		INTEGER, LONG, DOUBLE, STRING, DATE, UNDEFINED
// 	}
// 	
// 	private OutType outType;
// 	private Object value;
// 	
// 	
// 	
// 	public OutValue(OutType outType, Object value) {
// 		super();
// 		this.outType = outType;
// 		this.value = value;
// 	}
// 	public static OutValue intValue(Object obj){
// 		return new OutValue(OutType.INTEGER,obj);
// 	}
// 	public static OutValue doubleValue(Object obj){
// 		return new OutValue(OutType.DOUBLE,obj);
// 	}
// 	public static OutValue longValue(Object obj){
// 		return new OutValue(OutType.LONG,obj);
// 	}
// 	public static OutValue stringValue(Object obj){
// 		return new OutValue(OutType.STRING,obj);
// 	}
// 	public static OutValue dateValue(Object obj){
// 		return new OutValue(OutType.DATE,obj);
// 	}
// 	public OutType getOutType() {
// 		return outType;
// 	}
// 	public void setOutType(OutType outType) {
// 		this.outType = outType;
// 	}
// 	public Object getValue() {
// 		return value;
// 	}
// 	public void setValue(Object value) {
// 		this.value = value;
// 	}
// 	
// }


// Path: excel/src/main/java/com/bing/excel/converter/collections/CollectionConverter.java
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.bing.excel.converter.FieldValueConverter;
import com.bing.excel.core.handler.ConverterHandler;
import com.bing.excel.exception.ConversionException;
import com.bing.excel.converter.AbstractFieldConvertor;
import com.bing.excel.vo.OutValue;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;


	@Override
	public boolean canConvert(Class type) {
		return type.equals(ArrayList.class) ||type.equals(List.class)|| type.equals(HashSet.class)||type.equals(Set.class)
				|| type.equals(LinkedList.class);
	}

	@Override
	public OutValue toObject(Object source, ConverterHandler converterHandler) {
		if(source==null){
			return null;
		}
		Collection collection = (Collection)source;
		StringBuilder bd=new StringBuilder();
		for (Object obj : collection) {
			Class  class1 = obj.getClass();
			FieldValueConverter converter = converterHandler.getLocalConverter(class1);
			if(converter==null){
				throw new ConversionException("can find the converter for type ["
								+ class1 + "]");
			}
			OutValue outValue = converter.toObject(obj, converterHandler);
			bd.append(outValue.getValue());
			bd.append(splitCharacter);
		}
		StringBuilder builder = bd.replace(bd.length()-1, bd.length(), "");
		return OutValue.stringValue(builder.toString());
	}

	@Override
	public Object fromString(String cell, ConverterHandler converterHandler,