// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/config/DefaultConfig.java
// public enum DefaultConfig implements Config {
// 
//     INSTANCE;
// 
//     /**
//      * 配置类解析实例
//      */
//     private Map<Class, ConfigBeanParser> configInstances = new ConcurrentHashMap<>();
// 
//     private volatile ZooKeeper zooKeeper;
// 
// 
// 
//     @Override
//     public ConfigBeanParser configBeanParser(Class cls) {
//         ConfigBeanParser configBeanParser = configInstances.get(cls);
//         if (configBeanParser == null) {
//             configBeanParser = new ConfigBeanParser();
//             configBeanParser.parser(cls);
//             add(configBeanParser);
//         }
//         return configBeanParser;
// 
//     }
// 
//     @Override
//     public void add(ConfigBeanParser parser) {
//         configInstances.put(parser.getConfigBean().getClass(), parser);
//     }
// 
//     @Override
//     public synchronized void export() {
//         if (zooKeeper != null) {
//             return;
//         }
//         Thread thread = new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 RegisterConfig registerConfig = (RegisterConfig) configInstances.get(RegisterConfig.class).getConfigBean();
//                 try {
//                     zooKeeper = new ZooKeeper(registerConfig.getUrl(), registerConfig.getTimeout(), new Watcher() {
//                         @Override
//                         public void process(WatchedEvent watchedEvent) {
// 
//                         }
//                     });
//                     String ip = InetAddressUtil.getHostIp();
//                     AceServerConfig aceServerConfig = (AceServerConfig) configBeanParser(AceServerConfig.class).getConfigBean();
//                     String tmp = ip + ":" + aceServerConfig.getPort();
//                     for (ConfigBeanParser parser : configInstances.values()) {
//                         ConfigBean configBean = parser.getConfigBean().getClass().getAnnotation(ConfigBean.class);
//                         String path = configBean.value();
//                         path = ROOT_PATH  + path;
//                         createNode(path);
//                         ObjectMapper om = new ObjectMapper();
//                         byte[] data = om.writer().writeValueAsBytes(parser.getConfigBean());
//                         zooKeeper.create(path + "/" + tmp, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
//                     }
// 
// 
//                 } catch (IOException e) {
//                     e.printStackTrace();
//                 } catch (InterruptedException e) {
//                     e.printStackTrace();
//                 } catch (KeeperException e) {
//                     e.printStackTrace();
//                 }
//             }
//         });
//         thread.setName("ace-config");
//         thread.setDaemon(true);
//         thread.start();
//     }
// 
// 
//     private void createNode(String path) throws KeeperException, InterruptedException {
//         String[] arr = path.split("/");
//         StringBuilder stringBuffer = new StringBuilder();
//         for (int i = 0; i < arr.length; i++) {
//             if (arr[i] != null && arr[i].trim().length() > 0) {
//                 stringBuffer.append("/");
//                 stringBuffer.append(arr[i]);
//                 String node = stringBuffer.toString();
//                 Stat state = zooKeeper.exists(node, true);
//                 if (state == null) {
//                     zooKeeper.create(node, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//                 }
//             }
// 
//         }
// 
// 
//     }
// 
//     public void clean(){
//         try {
//             zooKeeper.close();
//         } catch (InterruptedException e) {
//             e.printStackTrace();
//         }
//     };
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/register/Register.java
// @Spi("zookeeper")
// public interface Register extends ConfigBeanAware<RegisterConfig> {
// 
//     String ROOT="/ace";
// 
//     void register();
// 
//     void unregister();
// 
// 
// 
// 
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/remote/Server.java
// @Spi("netty")
// public interface Server extends ConfigBeanAware<AceServerConfig> {
// 
// 
// 
//     /**
//      * 开启服务
//      *
//      * @throws Exception 异常基类
//      */
//     void start() throws Exception;
// 
//     void close();
// 
// 
// }


import wiki.chenxun.ace.core.base.annotations.AceHttpMethod;
import wiki.chenxun.ace.core.base.annotations.AceService;
import wiki.chenxun.ace.core.base.config.Config;
import wiki.chenxun.ace.core.base.config.ConfigBeanAware;
import wiki.chenxun.ace.core.base.config.DefaultConfig;
import wiki.chenxun.ace.core.base.container.Container;
import wiki.chenxun.ace.core.base.register.Register;
import wiki.chenxun.ace.core.base.register.RegisterConfig;
import wiki.chenxun.ace.core.base.remote.Server;
import wiki.chenxun.ace.core.base.support.ScanUtil;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Observable;
import java.util.Set;
package wiki.chenxun.ace.core.base.common;



/**
 * @Description: Created by chenxun on 2017/4/21.
 */
public class AceApplication implements ConfigBeanAware<AceApplicationConfig> {

    private String basePage = "wiki.chenxun.ace.core";

    private AceApplicationConfig aceApplicationConfig;

    private volatile int state = 0;

    private Config config;

    private Container container;

// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/config/DefaultConfig.java
// public enum DefaultConfig implements Config {
// 
//     INSTANCE;
// 
//     /**
//      * 配置类解析实例
//      */
//     private Map<Class, ConfigBeanParser> configInstances = new ConcurrentHashMap<>();
// 
//     private volatile ZooKeeper zooKeeper;
// 
// 
// 
//     @Override
//     public ConfigBeanParser configBeanParser(Class cls) {
//         ConfigBeanParser configBeanParser = configInstances.get(cls);
//         if (configBeanParser == null) {
//             configBeanParser = new ConfigBeanParser();
//             configBeanParser.parser(cls);
//             add(configBeanParser);
//         }
//         return configBeanParser;
// 
//     }
// 
//     @Override
//     public void add(ConfigBeanParser parser) {
//         configInstances.put(parser.getConfigBean().getClass(), parser);
//     }
// 
//     @Override
//     public synchronized void export() {
//         if (zooKeeper != null) {
//             return;
//         }
//         Thread thread = new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 RegisterConfig registerConfig = (RegisterConfig) configInstances.get(RegisterConfig.class).getConfigBean();
//                 try {
//                     zooKeeper = new ZooKeeper(registerConfig.getUrl(), registerConfig.getTimeout(), new Watcher() {
//                         @Override
//                         public void process(WatchedEvent watchedEvent) {
// 
//                         }
//                     });
//                     String ip = InetAddressUtil.getHostIp();
//                     AceServerConfig aceServerConfig = (AceServerConfig) configBeanParser(AceServerConfig.class).getConfigBean();
//                     String tmp = ip + ":" + aceServerConfig.getPort();
//                     for (ConfigBeanParser parser : configInstances.values()) {
//                         ConfigBean configBean = parser.getConfigBean().getClass().getAnnotation(ConfigBean.class);
//                         String path = configBean.value();
//                         path = ROOT_PATH  + path;
//                         createNode(path);
//                         ObjectMapper om = new ObjectMapper();
//                         byte[] data = om.writer().writeValueAsBytes(parser.getConfigBean());
//                         zooKeeper.create(path + "/" + tmp, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
//                     }
// 
// 
//                 } catch (IOException e) {
//                     e.printStackTrace();
//                 } catch (InterruptedException e) {
//                     e.printStackTrace();
//                 } catch (KeeperException e) {
//                     e.printStackTrace();
//                 }
//             }
//         });
//         thread.setName("ace-config");
//         thread.setDaemon(true);
//         thread.start();
//     }
// 
// 
//     private void createNode(String path) throws KeeperException, InterruptedException {
//         String[] arr = path.split("/");
//         StringBuilder stringBuffer = new StringBuilder();
//         for (int i = 0; i < arr.length; i++) {
//             if (arr[i] != null && arr[i].trim().length() > 0) {
//                 stringBuffer.append("/");
//                 stringBuffer.append(arr[i]);
//                 String node = stringBuffer.toString();
//                 Stat state = zooKeeper.exists(node, true);
//                 if (state == null) {
//                     zooKeeper.create(node, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//                 }
//             }
// 
//         }
// 
// 
//     }
// 
//     public void clean(){
//         try {
//             zooKeeper.close();
//         } catch (InterruptedException e) {
//             e.printStackTrace();
//         }
//     };
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/register/Register.java
// @Spi("zookeeper")
// public interface Register extends ConfigBeanAware<RegisterConfig> {
// 
//     String ROOT="/ace";
// 
//     void register();
// 
//     void unregister();
// 
// 
// 
// 
// 
// }
// 
// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/remote/Server.java
// @Spi("netty")
// public interface Server extends ConfigBeanAware<AceServerConfig> {
// 
// 
// 
//     /**
//      * 开启服务
//      *
//      * @throws Exception 异常基类
//      */
//     void start() throws Exception;
// 
//     void close();
// 
// 
// }


// Path: ace-core/src/main/java/wiki/chenxun/ace/core/base/common/AceApplication.java
import wiki.chenxun.ace.core.base.annotations.AceHttpMethod;
import wiki.chenxun.ace.core.base.annotations.AceService;
import wiki.chenxun.ace.core.base.config.Config;
import wiki.chenxun.ace.core.base.config.ConfigBeanAware;
import wiki.chenxun.ace.core.base.config.DefaultConfig;
import wiki.chenxun.ace.core.base.container.Container;
import wiki.chenxun.ace.core.base.register.Register;
import wiki.chenxun.ace.core.base.register.RegisterConfig;
import wiki.chenxun.ace.core.base.remote.Server;
import wiki.chenxun.ace.core.base.support.ScanUtil;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Observable;
import java.util.Set;

package wiki.chenxun.ace.core.base.common;



/**
 * @Description: Created by chenxun on 2017/4/21.
 */
public class AceApplication implements ConfigBeanAware<AceApplicationConfig> {

    private String basePage = "wiki.chenxun.ace.core";

    private AceApplicationConfig aceApplicationConfig;

    private volatile int state = 0;

    private Config config;

    private Container container;

    private Server server;