package org.itscool.commons.document;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Iterator;

/**
 * POJOをDocumentBeanクラスに変換するためのクラスです<BR>
 * POJO以外のインスタンスの変換は動作保障外です
 * @author kanou
 *
 */
public class DocumentBeanParser {
    /**
     * 指定されたオブジェクトをParseBeanインスタンスに変換します
     * @param bean ParaseBeanに変換するオブジェクト
     * @return 変換結果
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public static DocumentBean parseBean(Object bean)
    throws IllegalAccessException, InvocationTargetException{
        DocumentBean pBean = new DocumentBean();
        Object obj = bean;
        
        Object property;
        Class clazz = obj.getClass();
        String clazzName = clazz.getName();
        int index = clazzName.lastIndexOf(".");
        clazzName = clazzName.substring(index+1, clazzName.length());
        pBean.setName(clazzName);
//		System.out.println(clazzName);
        
        Method[] methods = clazz.getMethods();
        for(int i=0; i<methods.length; i++){
            Method method = methods[i];
            String getterName = method.getName();
            if( ( getterName.indexOf("get") == 0 || getterName.indexOf("is") == 0 )
            && getterName.indexOf("getClass") != 0 ){
                
                //メソッドの戻り値が配列の場合
                if( method.getReturnType().isArray() ){
                    Object[] collection = (Object[])method.invoke(obj,null);
                    Iterator iterator = Arrays.asList(collection).iterator();
                    property = iterator;
                }else{
                    // メソッドを実行
                    property = method.invoke(obj,null);
                }
//	            System.out.print(mName+"=");
//	            System.out.println(property.toString());
                int firstMemberIndex = 3;
                if(getterName.indexOf("is") == 0){
                    firstMemberIndex = 2;
                }
                String memberName = getterName.substring(firstMemberIndex, getterName.length());
                memberName = memberName.substring(0, 1).toLowerCase() +
                    memberName.substring(1, memberName.length());
                if( property == null ){
                    continue;
                }
                Class propertyType = property.getClass();
                
                if( propertyType != null &&
                    propertyType.getName().indexOf("java.") < 0 &&
                    propertyType.getName().indexOf("javax.") < 0){
                    //プロパティタイプがプリミティブ型のラッパーで無い場合
                    pBean.put(memberName, parseBean(property));
                }else{
                    //プロパティタイプがプリミティブ型のラッパーの場合
                    pBean.put(memberName, property.toString());
                }
            }
        }
        return pBean;
    }
}
