// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/config/Config.java
// public interface Config {
// 
//     String ROOT_PATH = "/ace/config/";
// 
//     /**
//      * DEFAULT_PATH
//      */
//     String DEFAULT_PATH = "application";
// 
//     /**
//      *
//      * @param cls
//      * @return
//      */
//     ConfigBeanParser configBeanParser(Class cls);
// 
//     /**
//      * @param parser
//      */
//     void add(ConfigBeanParser parser);
// 
//     void export();
// 
//     void clean();
// 
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/logger/Logger.java
// public interface Logger {
// 
//     String getName();
// 
//     void trace(String var1);
// 
//     void trace(String var1, Object[] objects);
// 
//     boolean isTraceEnabled();
// 
//     void debug(String var1);
// 
//     void debug(String var1, Object[] objects);
// 
//     boolean isDebugEnabled();
// 
//     void info(String var1);
// 
//     void info(String var1, Object[] objects);
// 
//     boolean isInfoEnabled();
// 
//     void warn(String var1);
// 
//     void warn(String var1, Object[] objects);
// 
//     boolean isWarnEnabled();
// 
//     void error(String var1);
// 
//     void error(String var1, Object[] objects);
// 
//     boolean isErrorEnabled();
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/logger/LoggerFactory.java
// public class LoggerFactory {
// 
//     private static LoggerAdapter loggerAdapter;
// 
//     public static Logger getLogger(String name){
//         if(loggerAdapter == null){
//             synchronized (LoggerFactory.class) {
//                 if(loggerAdapter == null) {
//                     loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension("");
//                     if (loggerAdapter == null) {
//                         Set<String> extensionKeySet = getLoggerAdapterCandidateKey();
//                         for (String extensionName : extensionKeySet) {
//                             try {
//                                 loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension(extensionName);
//                                 Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//                                 logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//                                 break;
//                             } catch (Throwable e) {
//                             }
//                         }
//                     }else{
//                         Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//                         logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//                     }
//                 }
//             }
//         }
//         return loggerAdapter.getLogger(name);
//     }
// 
//     public static void setLoggerAdapter(String adapter){
//         loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension(adapter);
//         Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//         logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//     }
// 
// 
//     public static Logger getLogger(Class clz){
//         return getLogger(clz.getName());
//     }
// 
//     public static Set<String> getLoggerAdapterCandidateKey(){
//         ExtendLoader<LoggerAdapter> extendLoader = ExtendLoader.getExtendLoader(LoggerAdapter.class);
//         try {
//             Field candidateField = extendLoader.getClass().getDeclaredField("extendClasses");
//             candidateField.setAccessible(true);
//             ConcurrentHashMap<String, Class> candidateMap = (ConcurrentHashMap<String, Class>) candidateField.get(extendLoader);
//             return candidateMap.keySet();
//         } catch (NoSuchFieldException e) {
//             return Collections.emptySet();
//         } catch (IllegalAccessException e) {
//             return Collections.emptySet();
//         }
//     }
// }


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import wiki.chenxun.ace.core.base.annotations.ConfigBean;
import wiki.chenxun.ace.core.base.config.Config;
import wiki.chenxun.ace.core.base.logger.Logger;
import wiki.chenxun.ace.core.base.logger.LoggerFactory;
import java.lang.reflect.Field;
import java.util.Iterator;
package wiki.chenxun.ace.core.base.container.spring;



/**
 * @Description: Created by chenxun on 2017/4/18.
 */
public class ConfigBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    private final Config config;

    private final Logger logger= LoggerFactory.getLogger(ConfigBeanFactoryPostProcessor.class);

    public ConfigBeanFactoryPostProcessor(Config config) {
        this.config = config;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

        Iterator<String> iterator = configurableListableBeanFactory.getBeanNamesIterator();

        while (iterator.hasNext()) {
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/config/Config.java
// public interface Config {
// 
//     String ROOT_PATH = "/ace/config/";
// 
//     /**
//      * DEFAULT_PATH
//      */
//     String DEFAULT_PATH = "application";
// 
//     /**
//      *
//      * @param cls
//      * @return
//      */
//     ConfigBeanParser configBeanParser(Class cls);
// 
//     /**
//      * @param parser
//      */
//     void add(ConfigBeanParser parser);
// 
//     void export();
// 
//     void clean();
// 
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/logger/Logger.java
// public interface Logger {
// 
//     String getName();
// 
//     void trace(String var1);
// 
//     void trace(String var1, Object[] objects);
// 
//     boolean isTraceEnabled();
// 
//     void debug(String var1);
// 
//     void debug(String var1, Object[] objects);
// 
//     boolean isDebugEnabled();
// 
//     void info(String var1);
// 
//     void info(String var1, Object[] objects);
// 
//     boolean isInfoEnabled();
// 
//     void warn(String var1);
// 
//     void warn(String var1, Object[] objects);
// 
//     boolean isWarnEnabled();
// 
//     void error(String var1);
// 
//     void error(String var1, Object[] objects);
// 
//     boolean isErrorEnabled();
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/logger/LoggerFactory.java
// public class LoggerFactory {
// 
//     private static LoggerAdapter loggerAdapter;
// 
//     public static Logger getLogger(String name){
//         if(loggerAdapter == null){
//             synchronized (LoggerFactory.class) {
//                 if(loggerAdapter == null) {
//                     loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension("");
//                     if (loggerAdapter == null) {
//                         Set<String> extensionKeySet = getLoggerAdapterCandidateKey();
//                         for (String extensionName : extensionKeySet) {
//                             try {
//                                 loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension(extensionName);
//                                 Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//                                 logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//                                 break;
//                             } catch (Throwable e) {
//                             }
//                         }
//                     }else{
//                         Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//                         logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//                     }
//                 }
//             }
//         }
//         return loggerAdapter.getLogger(name);
//     }
// 
//     public static void setLoggerAdapter(String adapter){
//         loggerAdapter = ExtendLoader.getExtendLoader(LoggerAdapter.class).getExtension(adapter);
//         Logger logger = loggerAdapter.getLogger(LoggerFactory.class);
//         logger.info("using ace loggerAdapter "+loggerAdapter.getClass().toString());
//     }
// 
// 
//     public static Logger getLogger(Class clz){
//         return getLogger(clz.getName());
//     }
// 
//     public static Set<String> getLoggerAdapterCandidateKey(){
//         ExtendLoader<LoggerAdapter> extendLoader = ExtendLoader.getExtendLoader(LoggerAdapter.class);
//         try {
//             Field candidateField = extendLoader.getClass().getDeclaredField("extendClasses");
//             candidateField.setAccessible(true);
//             ConcurrentHashMap<String, Class> candidateMap = (ConcurrentHashMap<String, Class>) candidateField.get(extendLoader);
//             return candidateMap.keySet();
//         } catch (NoSuchFieldException e) {
//             return Collections.emptySet();
//         } catch (IllegalAccessException e) {
//             return Collections.emptySet();
//         }
//     }
// }


// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/container/spring/ConfigBeanFactoryPostProcessor.java
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import wiki.chenxun.ace.core.base.annotations.ConfigBean;
import wiki.chenxun.ace.core.base.config.Config;
import wiki.chenxun.ace.core.base.logger.Logger;
import wiki.chenxun.ace.core.base.logger.LoggerFactory;
import java.lang.reflect.Field;
import java.util.Iterator;

package wiki.chenxun.ace.core.base.container.spring;



/**
 * @Description: Created by chenxun on 2017/4/18.
 */
public class ConfigBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    private final Config config;

    private final Logger logger= LoggerFactory.getLogger(ConfigBeanFactoryPostProcessor.class);

    public ConfigBeanFactoryPostProcessor(Config config) {
        this.config = config;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

        Iterator<String> iterator = configurableListableBeanFactory.getBeanNamesIterator();

        while (iterator.hasNext()) {
            Object obj = configurableListableBeanFactory.getBean(iterator.next());