// Path: brent-pusher-core/src/main/java/cn/brent/pusher/config/PusherConfig.java
// public abstract class PusherConfig {
// 
// 	/**
// 	 * Config constant
// 	 */
// 	public abstract void configConstant(Constants me);
// 	
// 	/**
// 	 * Config IVerifier
// 	 */
// 	public abstract void configVerifier(Verifiers me);
// 	
// 	/**
// 	 * Config Plugin
// 	 */
// 	public abstract void configPlugin(Plugins me);
// 
// 	/**
// 	 * Call back after start
// 	 */
// 	public void afterStart(){};
// 	
// 	/**
// 	 * Call back before stop
// 	 */
// 	public void beforeStop(){};
// 	
// 	/**
// 	 * Call back after Connect Success
// 	 */
// 	public void afterConnectSuccess(IPusherClient socket){};
// }
// 
// Path: brent-pusher-core/src/main/java/cn/brent/pusher/core/PusherServer.java
// public abstract class PusherServer {
// 	
// 	protected static Logger logger = LoggerFactory.getLogger(PusherServer.class);
// 
// 	/** 个性化配置 */
// 	protected PusherConfig pushConfig;
// 	
// 	/** 会话管理 */
// 	protected ISessionManager sessionManager;
// 	
// 	/** 认证器 */
// 	protected IVerifier[] verifiers;
// 	
// 	/** 插件 */
// 	protected IPlugin[] plugins;
// 	
// 	/** 端口 */
// 	protected int port;
// 	
// 	public PusherServer(PusherConfig pushConfig) {
// 		this.pushConfig=pushConfig;
// 		Config.configPusher(pushConfig);
// 		port=Config.getConstants().getPort();
// 		sessionManager=Config.getConstants().getSessionManager();
// 		verifiers=Config.getVerifiers().getAll();
// 		plugins=Config.getPlugins().getAll();
// 	}
// 	
// 	protected void onOpen(IPusherClient conn, String uri) {
// 		PathDesc path;
// 		try {
// 			try {
// 				path = PathDesc.parse(uri);
// 			} catch (Exception e) {
// 				throw new RuntimeException("Unsupported msg format");
// 			}
// 			
// 			Session session=sessionManager.getSession(path.getTopic(), path.getKey());
// 			
// 			for(IVerifier verifier:verifiers){
// 				if(!verifier.verify(path,session)){
// 					throw new RuntimeException(verifier.failMsg(path));
// 				}
// 			}
// 			
// 			conn.setTopic(path.getTopic());
// 			conn.setKey(path.getKey());
// 			conn.setTimeOut(path.getTimeOut());
// 			
// 			//保存会话信息
// 			sessionManager.saveConnect(conn);
// 			
// 			//连接成功后的回调
// 			pushConfig.afterConnectSuccess(conn);
// 			
// 			logger.debug("new connection: " + uri + "," + conn + " connected!");
// 			
// 		} catch (Exception e) {
// 			conn.close(IPusherClient.REFUSE, "rejected connection, "+e.getMessage());
// 		}
// 	}
// 	
// 	protected void onClose(IPusherClient conn, int code, String reason){
// 		if (code == IPusherClient.REFUSE) {// 被服务器拒绝
// 			// do nothing
// 		} else {
// 			logger.debug("connect disconnect...");
// 			sessionManager.removeConnect(conn);
// 		}
// 	}
// 	
// 	public void start() {
// 		startServer();
// 		for(IPlugin p:plugins){
// 			p.start();
// 		}
// 		pushConfig.afterStart();
// 		logger.info("PushServer started on port:" + this.getPort());
// 	}
// 	
// 	public void stop() {
// 		pushConfig.beforeStop();
// 		for(IPlugin p:plugins){
// 			p.stop();
// 		}
// 		this.stopServer();
// 	}
// 	
// 	public int getPort() {
// 		return port;
// 	}
// 	
// 	/**
// 	 * 停止服务
// 	 */
// 	protected abstract void stopServer();
// 
// 	/**
// 	 * 开启服务
// 	 */
// 	protected abstract void startServer();
// 
// 	
// 	
// }


import java.io.IOException;
import java.util.Properties;
import cn.brent.pusher.config.PusherConfig;
import cn.brent.pusher.core.PusherServer;

package cn.brent.pusher;



public class ServerRunner {
	
	public static final String configName="/pusher.conf";

	public static void main(String[] args) {

		Properties p=new Properties();
		try {
			p.load(ServerRunner.class.getResourceAsStream(configName));
		} catch (IOException e1) {
			System.out.println("can't find config file "+configName);
			return;
		}
		
		String serverClass=p.getProperty("serverClass", "cn.brent.pusher.config.BlankPusherConfig");
		String configClass=p.getProperty("configClass", "cn.brent.pusher.config.BlankPusherConfig");
		
		Object obj;
		try {
			obj = Class.forName(configClass).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		
		if(obj instanceof PusherConfig){
			PusherConfig config=(PusherConfig)obj;
			
			Object server;
			try {
				server = Class.forName(serverClass).getConstructor(PusherConfig.class).newInstance(config);
			} catch (Exception e) {
				e.printStackTrace();
				return;
			} 

// Path: brent-pusher-core/src/main/java/cn/brent/pusher/config/PusherConfig.java
// public abstract class PusherConfig {
// 
// 	/**
// 	 * Config constant
// 	 */
// 	public abstract void configConstant(Constants me);
// 	
// 	/**
// 	 * Config IVerifier
// 	 */
// 	public abstract void configVerifier(Verifiers me);
// 	
// 	/**
// 	 * Config Plugin
// 	 */
// 	public abstract void configPlugin(Plugins me);
// 
// 	/**
// 	 * Call back after start
// 	 */
// 	public void afterStart(){};
// 	
// 	/**
// 	 * Call back before stop
// 	 */
// 	public void beforeStop(){};
// 	
// 	/**
// 	 * Call back after Connect Success
// 	 */
// 	public void afterConnectSuccess(IPusherClient socket){};
// }
// 
// Path: brent-pusher-core/src/main/java/cn/brent/pusher/core/PusherServer.java
// public abstract class PusherServer {
// 	
// 	protected static Logger logger = LoggerFactory.getLogger(PusherServer.class);
// 
// 	/** 个性化配置 */
// 	protected PusherConfig pushConfig;
// 	
// 	/** 会话管理 */
// 	protected ISessionManager sessionManager;
// 	
// 	/** 认证器 */
// 	protected IVerifier[] verifiers;
// 	
// 	/** 插件 */
// 	protected IPlugin[] plugins;
// 	
// 	/** 端口 */
// 	protected int port;
// 	
// 	public PusherServer(PusherConfig pushConfig) {
// 		this.pushConfig=pushConfig;
// 		Config.configPusher(pushConfig);
// 		port=Config.getConstants().getPort();
// 		sessionManager=Config.getConstants().getSessionManager();
// 		verifiers=Config.getVerifiers().getAll();
// 		plugins=Config.getPlugins().getAll();
// 	}
// 	
// 	protected void onOpen(IPusherClient conn, String uri) {
// 		PathDesc path;
// 		try {
// 			try {
// 				path = PathDesc.parse(uri);
// 			} catch (Exception e) {
// 				throw new RuntimeException("Unsupported msg format");
// 			}
// 			
// 			Session session=sessionManager.getSession(path.getTopic(), path.getKey());
// 			
// 			for(IVerifier verifier:verifiers){
// 				if(!verifier.verify(path,session)){
// 					throw new RuntimeException(verifier.failMsg(path));
// 				}
// 			}
// 			
// 			conn.setTopic(path.getTopic());
// 			conn.setKey(path.getKey());
// 			conn.setTimeOut(path.getTimeOut());
// 			
// 			//保存会话信息
// 			sessionManager.saveConnect(conn);
// 			
// 			//连接成功后的回调
// 			pushConfig.afterConnectSuccess(conn);
// 			
// 			logger.debug("new connection: " + uri + "," + conn + " connected!");
// 			
// 		} catch (Exception e) {
// 			conn.close(IPusherClient.REFUSE, "rejected connection, "+e.getMessage());
// 		}
// 	}
// 	
// 	protected void onClose(IPusherClient conn, int code, String reason){
// 		if (code == IPusherClient.REFUSE) {// 被服务器拒绝
// 			// do nothing
// 		} else {
// 			logger.debug("connect disconnect...");
// 			sessionManager.removeConnect(conn);
// 		}
// 	}
// 	
// 	public void start() {
// 		startServer();
// 		for(IPlugin p:plugins){
// 			p.start();
// 		}
// 		pushConfig.afterStart();
// 		logger.info("PushServer started on port:" + this.getPort());
// 	}
// 	
// 	public void stop() {
// 		pushConfig.beforeStop();
// 		for(IPlugin p:plugins){
// 			p.stop();
// 		}
// 		this.stopServer();
// 	}
// 	
// 	public int getPort() {
// 		return port;
// 	}
// 	
// 	/**
// 	 * 停止服务
// 	 */
// 	protected abstract void stopServer();
// 
// 	/**
// 	 * 开启服务
// 	 */
// 	protected abstract void startServer();
// 
// 	
// 	
// }


// Path: brent-pusher-core/src/main/java/cn/brent/pusher/ServerRunner.java
import java.io.IOException;
import java.util.Properties;
import cn.brent.pusher.config.PusherConfig;
import cn.brent.pusher.core.PusherServer;

package cn.brent.pusher;



public class ServerRunner {
	
	public static final String configName="/pusher.conf";

	public static void main(String[] args) {

		Properties p=new Properties();
		try {
			p.load(ServerRunner.class.getResourceAsStream(configName));
		} catch (IOException e1) {
			System.out.println("can't find config file "+configName);
			return;
		}
		
		String serverClass=p.getProperty("serverClass", "cn.brent.pusher.config.BlankPusherConfig");
		String configClass=p.getProperty("configClass", "cn.brent.pusher.config.BlankPusherConfig");
		
		Object obj;
		try {
			obj = Class.forName(configClass).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		
		if(obj instanceof PusherConfig){
			PusherConfig config=(PusherConfig)obj;
			
			Object server;
			try {
				server = Class.forName(serverClass).getConstructor(PusherConfig.class).newInstance(config);
			} catch (Exception e) {
				e.printStackTrace();
				return;
			} 

			PusherServer sv=(PusherServer)server;
