// Path: zing-common/src/main/java/org/zxc/zing/common/entity/RemoteRequest.java
// public class RemoteRequest implements Serializable{
// 
//     private String requestId;
//     private String serviceName;
//     private String methodName;
//     private Class<?>[] parameterTypes;
//     private Object[] arguments;
// 
//     public String getRequestId() {
//         return requestId;
//     }
// 
//     public void setRequestId(String requestId) {
//         this.requestId = requestId;
//     }
// 
//     public String getServiceName() {
//         return serviceName;
//     }
// 
//     public void setServiceName(String serviceName) {
//         this.serviceName = serviceName;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     public Class<?>[] getParameterTypes() {
//         return parameterTypes;
//     }
// 
//     public void setParameterTypes(Class<?>[] parameterTypes) {
//         this.parameterTypes = parameterTypes;
//     }
// 
//     public Object[] getArguments() {
//         return arguments;
//     }
// 
//     public void setArguments(Object[] arguments) {
//         this.arguments = arguments;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder("RemoteRequest{");
//         sb.append("requestId='").append(requestId).append('\'');
//         sb.append(", serviceName='").append(serviceName).append('\'');
//         sb.append(", methodName='").append(methodName).append('\'');
//         sb.append(", parameterTypes=").append(Arrays.toString(parameterTypes));
//         sb.append(", arguments=").append(Arrays.toString(arguments));
//         sb.append('}');
//         return sb.toString();
//     }
// }
// 
// Path: zing-common/src/main/java/org/zxc/zing/common/entity/RemoteResponse.java
// public class RemoteResponse implements Serializable{
// 
//     private String requestId;
//     private int responseCode;
//     private Object responseValue;
// 
//     public String getRequestId() {
//         return requestId;
//     }
// 
//     public void setRequestId(String requestId) {
//         this.requestId = requestId;
//     }
// 
//     public int getResponseCode() {
//         return responseCode;
//     }
// 
//     public void setResponseCode(int responseCode) {
//         this.responseCode = responseCode;
//     }
// 
//     public Object getResponseValue() {
//         return responseValue;
//     }
// 
//     public void setResponseValue(Object responseValue) {
//         this.responseValue = responseValue;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder("RemoteResponse{");
//         sb.append("requestId='").append(requestId).append('\'');
//         sb.append(", responseCode=").append(responseCode);
//         sb.append(", responseValue=").append(responseValue);
//         sb.append('}');
//         return sb.toString();
//     }
// }
// 
// Path: zing-server/src/main/java/org/zxc/zing/server/RemoteServiceServer.java
// public class RemoteServiceServer {
// 
//     private static final Logger log = LoggerFactory.getLogger(RemoteServiceServer.class);
// 
//     private static volatile boolean started = false;
// 
//     private static String ipAddress = ConfigManager.getInstance().getProperty(Constants.SERVER_IP_ADDRESS_CONFIG_KEY);
// 
//     private static int port = Strings.isNullOrEmpty(ConfigManager.getInstance().getProperty(Constants.SERVER_PORT_CONFIG_KEY)) ?
//                                 Constants.SERVER_DEFAULT_PORT :
//                                     Integer.valueOf(ConfigManager.getInstance().getProperty(Constants.SERVER_PORT_CONFIG_KEY));
// 
// 
//     private static ConcurrentHashMap<String, Object> serviceImplMap = new ConcurrentHashMap<String, Object>();
// 
//     static {
//         try {
//             bootstrap();
//         } catch (Exception e) {
//             log.error("Server start error:"+e.getMessage(), e);
//             System.exit(1);
//         }
//     }
// 
//     public static void addService(String serviceName, Object serviceImpl) {
//         serviceImplMap.putIfAbsent(serviceName, serviceImpl);
//         RegistryManager.publishService(serviceName, ipAddress, port);
//     }
// 
//     public static void bootstrap() throws Exception {
//         log.info("try bootstrap state:"+started);
//         if (!started) {
//             synchronized (RemoteServiceServer.class) {
//                 if (!started) {
//                     doStart();
//                 }
//             }
//         }
//         log.info("started");
//     }
// 
//     private static void doStart() throws Exception {
//         log.info("do start server");
//         NettyServer.start(port);
//         RegistryManager.start();
//     }
// 
//     public static Object getActualServiceImpl(String serviceName) {
//         return serviceImplMap.get(serviceName);
//     }
// 
// }


import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zxc.zing.common.entity.RemoteRequest;
import org.zxc.zing.common.entity.RemoteResponse;
import org.zxc.zing.server.RemoteServiceServer;
import java.lang.reflect.Method;
package org.zxc.zing.server.remote;



/**
 * Created by xuanchen.zhao on 15-12-16.
 */
public class NettyServerHandler extends SimpleChannelInboundHandler<RemoteRequest> {

    private static final Logger log = LoggerFactory.getLogger(NettyServerHandler.class);


    @Override
    protected void channelRead0(ChannelHandlerContext ctx, RemoteRequest request) throws Exception {


        Object actualServiceImpl = RemoteServiceServer.getActualServiceImpl(request.getServiceName());

        if (actualServiceImpl != null) {
// Path: zing-common/src/main/java/org/zxc/zing/common/entity/RemoteRequest.java
// public class RemoteRequest implements Serializable{
// 
//     private String requestId;
//     private String serviceName;
//     private String methodName;
//     private Class<?>[] parameterTypes;
//     private Object[] arguments;
// 
//     public String getRequestId() {
//         return requestId;
//     }
// 
//     public void setRequestId(String requestId) {
//         this.requestId = requestId;
//     }
// 
//     public String getServiceName() {
//         return serviceName;
//     }
// 
//     public void setServiceName(String serviceName) {
//         this.serviceName = serviceName;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     public Class<?>[] getParameterTypes() {
//         return parameterTypes;
//     }
// 
//     public void setParameterTypes(Class<?>[] parameterTypes) {
//         this.parameterTypes = parameterTypes;
//     }
// 
//     public Object[] getArguments() {
//         return arguments;
//     }
// 
//     public void setArguments(Object[] arguments) {
//         this.arguments = arguments;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder("RemoteRequest{");
//         sb.append("requestId='").append(requestId).append('\'');
//         sb.append(", serviceName='").append(serviceName).append('\'');
//         sb.append(", methodName='").append(methodName).append('\'');
//         sb.append(", parameterTypes=").append(Arrays.toString(parameterTypes));
//         sb.append(", arguments=").append(Arrays.toString(arguments));
//         sb.append('}');
//         return sb.toString();
//     }
// }
// 
// Path: zing-common/src/main/java/org/zxc/zing/common/entity/RemoteResponse.java
// public class RemoteResponse implements Serializable{
// 
//     private String requestId;
//     private int responseCode;
//     private Object responseValue;
// 
//     public String getRequestId() {
//         return requestId;
//     }
// 
//     public void setRequestId(String requestId) {
//         this.requestId = requestId;
//     }
// 
//     public int getResponseCode() {
//         return responseCode;
//     }
// 
//     public void setResponseCode(int responseCode) {
//         this.responseCode = responseCode;
//     }
// 
//     public Object getResponseValue() {
//         return responseValue;
//     }
// 
//     public void setResponseValue(Object responseValue) {
//         this.responseValue = responseValue;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder("RemoteResponse{");
//         sb.append("requestId='").append(requestId).append('\'');
//         sb.append(", responseCode=").append(responseCode);
//         sb.append(", responseValue=").append(responseValue);
//         sb.append('}');
//         return sb.toString();
//     }
// }
// 
// Path: zing-server/src/main/java/org/zxc/zing/server/RemoteServiceServer.java
// public class RemoteServiceServer {
// 
//     private static final Logger log = LoggerFactory.getLogger(RemoteServiceServer.class);
// 
//     private static volatile boolean started = false;
// 
//     private static String ipAddress = ConfigManager.getInstance().getProperty(Constants.SERVER_IP_ADDRESS_CONFIG_KEY);
// 
//     private static int port = Strings.isNullOrEmpty(ConfigManager.getInstance().getProperty(Constants.SERVER_PORT_CONFIG_KEY)) ?
//                                 Constants.SERVER_DEFAULT_PORT :
//                                     Integer.valueOf(ConfigManager.getInstance().getProperty(Constants.SERVER_PORT_CONFIG_KEY));
// 
// 
//     private static ConcurrentHashMap<String, Object> serviceImplMap = new ConcurrentHashMap<String, Object>();
// 
//     static {
//         try {
//             bootstrap();
//         } catch (Exception e) {
//             log.error("Server start error:"+e.getMessage(), e);
//             System.exit(1);
//         }
//     }
// 
//     public static void addService(String serviceName, Object serviceImpl) {
//         serviceImplMap.putIfAbsent(serviceName, serviceImpl);
//         RegistryManager.publishService(serviceName, ipAddress, port);
//     }
// 
//     public static void bootstrap() throws Exception {
//         log.info("try bootstrap state:"+started);
//         if (!started) {
//             synchronized (RemoteServiceServer.class) {
//                 if (!started) {
//                     doStart();
//                 }
//             }
//         }
//         log.info("started");
//     }
// 
//     private static void doStart() throws Exception {
//         log.info("do start server");
//         NettyServer.start(port);
//         RegistryManager.start();
//     }
// 
//     public static Object getActualServiceImpl(String serviceName) {
//         return serviceImplMap.get(serviceName);
//     }
// 
// }


// Path: zing-server/src/main/java/org/zxc/zing/server/remote/NettyServerHandler.java
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zxc.zing.common.entity.RemoteRequest;
import org.zxc.zing.common.entity.RemoteResponse;
import org.zxc.zing.server.RemoteServiceServer;
import java.lang.reflect.Method;

package org.zxc.zing.server.remote;



/**
 * Created by xuanchen.zhao on 15-12-16.
 */
public class NettyServerHandler extends SimpleChannelInboundHandler<RemoteRequest> {

    private static final Logger log = LoggerFactory.getLogger(NettyServerHandler.class);


    @Override
    protected void channelRead0(ChannelHandlerContext ctx, RemoteRequest request) throws Exception {


        Object actualServiceImpl = RemoteServiceServer.getActualServiceImpl(request.getServiceName());

        if (actualServiceImpl != null) {
            RemoteResponse response = new RemoteResponse();