/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.dubbo.config;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.AbstractConfig;


/**
 * @author haomin.liuhm
 *
 */
public class RpcConfigGetSetProxy {

    private static final String RPC_CONFIG_BASECLASS = AbstractConfig.class.getName();
    private static final Logger log = LoggerFactory.getLogger(RpcConfigGetSetProxy.class);
    
    
    private Object proxiee           = null;
    private Class<?> proxieeClass   = null;
    private Boolean isOk        = false;
    
    public RpcConfigGetSetProxy(Object p){
        
        if(p == null){
            return;
        }
        
        if (!isKindOf(p.getClass(), RPC_CONFIG_BASECLASS)){
            return;
        }
        
        proxiee = p;
        //proxieeClass = c;
        proxieeClass = p.getClass();
        isOk = true;
        
    }
    
    public boolean isOk(){
        return isOk;
    }
    
    public Object setValue(String key, Object value){
        
        if (!isOk()){
            return null;
        }
        
        Method m = findSetMethod(key, value, proxieeClass);
        return invoke(m, value);
    }

    public Object getValue(String key){
        
        if (!isOk()){
            return null;
        }
        
        Method m = findGetMethod(key, proxieeClass);
        return invoke(m, null);
    }

    public static boolean isKindOf(Class<?> c, String type){

        // get the class def for obj and type
      
        Class<?> tClass;
        try {
            tClass = Class.forName(type);
        } catch (ClassNotFoundException e) {
            return false;
        }
        
        // check against type and superclasses
        while ( c != null ) {
            if ( c == tClass ) return true;
            c = c.getSuperclass();
        }
        
        return false;
    }
    
    private Object invoke(Method m, Object value) {
        
        if (m == null){
            return null;
        }
        
        try {
            if(value == null){
                return m.invoke(proxiee, (Object[])null);
            }else{
                return m.invoke(proxiee, value);
            }
        } catch (IllegalArgumentException e) {
            log.error("IllegalArgumentException", e);
            return null;
        } catch (IllegalAccessException e) {
            log.error("IllegalAccessException", e);
            return null;
        } catch (InvocationTargetException e) {
            log.error("InvocationTargetException", e);
            return null;
        }
    }
    
    private Method findGetMethod(String key, Class<?> clazz){
        
        Method m = findMethod(key, null, "get", clazz);
        if (m != null){
            return m;
        }
        
        return findMethod(key, null, "is", clazz);
    }
    
    private Method findSetMethod(String key, Object value, Class<?> clazz){
        
        return findMethod(key, value, "set", clazz);
    }
    
    private Method getMethod(String methodName, Object value, Class<?> clazz){
        
        try{
            if (value == null){
                return clazz.getMethod(methodName, (Class<?>[])null);
            }else{
                return clazz.getMethod(methodName, value.getClass());
            }
        }catch (SecurityException e) {
            log.error("SecurityException: " + e.getMessage());
            return null;
        } catch (NoSuchMethodException e) {
            log.error("NoSuchMethodException: " + e.getMessage());
            return null;
        }
    }

    private Method findMethod(String key, Object value, String prefix, Class<?> clazz){
        
        if(key.length() < 2){
            return null;
        }
        
        key = key.substring(0,1).toUpperCase() + key.substring(1);
        String methodName = prefix + key;
        
        return getMethod(methodName, value, clazz);
    }

}