[
  {
    "path": ".gitignore",
    "content": ".idea/*\n.DS_Store\n*/target/*\n*.iml\nMETA-INF/*\n*.rdb\n*.MF\n*.class"
  },
  {
    "path": ".travis.yml",
    "content": "language: java"
  },
  {
    "path": "README.md",
    "content": "#overview\n\n[![Build Status](https://travis-ci.org/yanghua/banyan.svg?branch=messagebus-ng)](https://travis-ci.org/yanghua/banyan)\n\n![img 15][15]\n\n\n```\nbanyan is a tree has thick branches which grows in the East Asia. \n```\nThanks for [@ok95](https://github.com/ok95) & [@Joy-Zhang](https://github.com/Joy-Zhang) given the good idea & guidance.\n\n![img 14][14]\n\nbanyan used to communicate and integrate over multi-app. It depends on [RabbitMQ](http://www.rabbitmq.com/) as backend broker(message exchanger). Most scenario:\n\n* enterprise information Integration\n* oriented-component & oriented-module distributed developer\n* infrastructure for esb or soa\n* json-rpc / IDL-RPC(thrift)\n* configured compress/uncompress\n* http-bridge for all platform\n* web-console UI\n\nthe necessity of encapsulating with RabbitMQ:\n\n* provide router pattern\n* embed permission into client-jar\n* removed create & delete & update operation from client, replaced with central-register mode\n\nmore information please see : [banyan-category](http://blog.csdn.net/column/details/banyan.html)\n\n##tree topology structure\nthe message bus's implementation is based on Rabbitmq. It can takes advantage of multiple message exchange-types rabbitmq provided and builds many kinds of router pattern. The message bus's router topology lists below:\n\n\n![img 3][3]\n\nthe advantages of the tree topology:\n\n* hide the router topology from client-caller (just need to know the `proxy` node)\n* multiple message communication pattern (p2p, pub/sub, broadcast)\n* implement the message log without interrupting the message channel\n* communication-policy configure once , push everywhere\n\n##web-console\nbanyan has its' own web console that built as a Apache-ofbiz's component. The web console provide a dashboard about rabbitmq : \n\n![img 16][16]\n\nand some core model's maintenance such as queue : \n\n![img 17][17]\n\n##Restful API\n\n* [apis](https://github.com/yanghua/banyan/tree/master/httpbridge)\n\n##scenario & usage\n\n###produce & consume\n\n* [produce](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsume.java#L34) / [pull consume](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsume.java#L46)\n* [produce](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsume.java#L34) / [push consume](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsume.java#L64)\n* [produce](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsume.java#L34) / [async consume with another thread](https://github.com/yanghua/banyan/blob/master/scenario%2Fsrc%2Fmain%2Fjava%2Fcom%2Fmessagebus%2Fscenario%2Fclient%2FProduceConsume.java#L91)\n* [produce-loopback](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsumeLoopback.java#L15) / [consume-loopback](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FProduceConsumeLoopback.java#L15)\n\n\n###request & response\n\n* [request](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FRequestResponse.java#L35) / [response](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FRequestResponse.java#L35) \n\n###publish & subscirbe\n\n* [publish](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FPublishSubscribe.java#L31) / [subscribe](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FPublishSubscribe.java#L31)\n\n###broadcast & notification-handler\n\n* [broadcast](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FBroadcast.java#L31) / [notification-handler](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FBroadcast.java#L31)\n\n###json-rpc(wrapped-offical-java-client)\n\n* [rpc-request](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FRpcRequestResponse.java#L28) / [rpc-response](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Fapi%2FRpcRequestResponse.java#L28)\n\n###thrift-rpc(thrid-party-rpc-integrated)\n\n* [rpc-request](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Ffeature%2FThriftWithAMQPRpc.java#L36) / [rpc-response](https://github.com/yanghua/banyan/blob/master/client%2Fsrc%2Ftest%2Fjava%2Fcom%2Fmessagebus%2Fclient%2Ffeature%2FThriftWithAMQPRpc.java#L59)\n\n\n###http-restful\n\n* [http-apis](https://github.com/yanghua/banyan/tree/master/scenario/src/main/java/com/messagebus/scenario/httpBridge)\n\n##benchmark\nit shows the  `client` performance:\n\n###hardware\nclient : \n\n```\nOS : Mac os x Yosemite (version 10.10)\nProcessor : 2.5GHz Intel Core i5\nMemory : 8GB 1600 MHz DDR3\nJDK Version : 1.7.0_45\n```\n\nserver :\n\n```\nOS : Ubuntu Server 14.04.1 (GNU/Linux 3.13.0-37-generic x86_64)\nProcessor : Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz (8核)\nMemory : 8GB\nJDK Version : 1.7.0_72\n```\n\n###produce\n* single thread，multiple message size ，cycle send，compare：\n\n![img 10][10]\n\n* single thread，same message size，use client channel pool or not，compare：\n\n![img 11][11]\n\n###consume\n* single thread，multiple message size，async receive，compare：\n\n![img 12][12]\n\n* single thread，same message size，use client channel pool or not，compare：\n\n![img 13][13]\n\n##licence\nCopyright (c) 2014-2015 yanghua. All rights reserved.\n\nLicensed 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\n\n```\nhttp://www.apache.org/licenses/LICENSE-2.0\n```\nUnless 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.\n\n\n\n[1]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/overview/architecture.png\n[2]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/overview/module-dependency.png\n[3]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/overview/router-topology.png\n[4]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/client/carry-inherits.png\n[5]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/client/handle-chain.png\n[6]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/client/handler-chain-config.png\n[7]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/client/node.png\n[8]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/client/node-db-info.png\n[9]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/common/message-design.png\n[10]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/produce/singleThreadClientVSOriginal.png\n[11]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/produce/singleThreadOptionPool.png\n[12]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/consume/singleThreadClientVSOriginal.png\n[13]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/consume/singleThreadOptionPool.png\n[14]:https://raw.githubusercontent.com/yanghua/banyan/master/screenshots/overview/rabbitmq-offical-screenshot.png\n[15]:https://raw.githubusercontent.com/yanghua/banyan/master/screenshots/overview/banyan.jpg\n[16]:https://raw.githubusercontent.com/yanghua/banyan/master/screenshots/overview/webconsole-dashboard.png\n[17]:https://raw.githubusercontent.com/yanghua/banyan/master/screenshots/overview/webconsole-queueManage.png"
  },
  {
    "path": "benchmark/README-CN.md",
    "content": "#overview\n\n本项目用于对消息总线的 `client` 进行测试，以展示不同场景下 `client` 的性能表现。\n\n##测试说明\n\n配置说明：\n\nclient : \n\n```\nOS : Mac os x Yosemite (version 10.10)\nProcessor : 2.5GHz Intel Core i5\nMemory : 8GB 1600 MHz DDR3\nJDK Version : 1.7.0_45\n```\n\nserver :\n\n```\nOS : Ubuntu Server 14.04.1 (GNU/Linux 3.13.0-37-generic x86_64)\nProcessor : Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz (8核)\nMemory : 8GB\nJDK Version : 1.7.0_72\n```\n\n> 每次测试之前，rabbitmq都会重新初始化，也就是说，每次测试之前总线中没有消息！\n\n##实现说明\n测试模块的相关类图：\n\n![img 1][1]\n\n\n测试逻辑由一个个测试用例构成，测试用例都是形如XXXTestCase的Java文件，所有的TestCase都继承自 `Benchmark` 类，它提供了一个 `test` 方法：\n\n```\npublic void test(Runnable testTask, int holdTime, int fetchNum, String fileName);\n```\n它需要的几个参数：\n\n* testTask - 具体的测试逻辑所属类，上面的 `BasicProduce`的实例\n* holdTime - 测试维持的毫秒数\n* fetchNum - 采样次数\n* fileName - 采集数据要存储的文件名\n\n`test` 方法提供了一个实现，并完成了一些 `Aspect`，它们有：\n\n* 日志记录\n* testTask的多线程启动\n* 测试数据的采集\n* testTask的关闭\n* 采集数据写入文件\n\n\n每个继承自 `Benchmark` 的 testcase 都包含有若干个 testTask (它们都是静态内部类，都实现了 `Runnable`接口，如上图的 `BasicProduce`)，每个testcase都包含有一个 `main` 入口方法，该方法用于运行测试。\n对于每一个testTask，它们通常都会实现两个接口：\n\n* ITerminater : 终止testTask的接口\n* IFetcher : 提取/采集测试数据的接口\n\n这两个接口在 `Benchmark` 的 `test` 方法中使用。\n\n除此之外，还有几个辅助类：\n\n- TestMessageFactory : 用于安装给定的size来生成测试消息\n- TestConfigConstant : 用于统一配置一些测试常量\n- TestUtility : 帮助类，测试数据写文件等\n\n\n##scenario\n###produce\n\n> orignal : native-java-client 发送，但也走server的topology route，测试时共享一个channel\n> client : 如无特殊说明，client发送时都基于pool-channel模式\n\n* 单线程，不同大小的消息体，循环发送，对比：\n\n![img 2][2]\n\n* 单线程，相同大小的消息体，是否使用client channel pool，对比：\n\n![img 3][3]\n\n###consume\n\n>所有消息以接收后拆包封装为 `Message` 对象，为接收完成，所有的测试都基于rabbitmq server中预先生成 **50W** 条消息为基础\n\n* 单线程，不同大小的消息体，异步接收，对比：\n\n![img 4][4]\n\n* 单线程，相同大小的消息体，是否使用client channel pool，对比：\n\n![img 5][5]\n\n>由于在异步消费的时候，本身就是使用单个channel的长连接事件循环，所以此处基本没有体现出差异。\n\n###其他通信方式\n\n由于其他两种消息通信方式都是由produce/consume演变而来，因此其他场景下的 **单方面** 的性能跟以上相当！\n\n\n[1]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/benchmark-class-diagram.png\n[2]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/produce/singleThreadClientVSOriginal.png\n[3]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/produce/singleThreadOptionPool.png\n[4]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/consume/singleThreadClientVSOriginal.png\n[5]:https://raw.githubusercontent.com/yanghua/messagebus/master/screenshots/benchmark/consume/singleThreadOptionPool.png"
  },
  {
    "path": "benchmark/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>benchmark</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>client</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n        <!-- thrift -->\n        <dependency>\n            <groupId>org.apache.thrift</groupId>\n            <artifactId>libthrift</artifactId>\n            <version>0.9.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <version>1.7.12</version>\n        </dependency>\n\n    </dependencies>\n\n\n</project>"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/Benchmark.java",
    "content": "package com.messagebus.benchmark.client;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\npublic abstract class Benchmark {\n\n    private static final Log logger = LogFactory.getLog(Benchmark.class);\n\n    public void test(Runnable testTask, int holdTime, int fetchNum, String fileName) {\n        logger.info(\"test begin\");\n\n        int fetchInterval = holdTime / fetchNum;\n        long[] xArr = new long[fetchNum];\n        long[] yArr = new long[fetchNum];\n\n        //initialize value\n        xArr[0] = 0;\n        yArr[0] = 0;\n\n        ILifeCycle testCase = (ILifeCycle) testTask;\n        testCase.start();\n\n        try {\n            for (int i = 1; i < fetchNum; i++) {\n                TimeUnit.MILLISECONDS.sleep(fetchInterval);\n\n                xArr[i] = i * fetchInterval;\n                yArr[i] = ((IFetcher) testTask).fetch();\n            }\n\n            ((ILifeCycle) testTask).terminate();\n\n            //write to report file\n            TestUtility.writeFile(fileName, xArr, yArr);\n        } catch (InterruptedException e) {\n\n        }\n\n        logger.info(\"test end\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/IFetcher.java",
    "content": "package com.messagebus.benchmark.client;\n\npublic interface IFetcher {\n\n    long fetch();\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/ILifeCycle.java",
    "content": "package com.messagebus.benchmark.client;\n\npublic interface ILifeCycle {\n\n    void start();\n\n    void terminate();\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/TestConfigConstant.java",
    "content": "package com.messagebus.benchmark.client;\n\npublic class TestConfigConstant {\n\n    public static final String ORIGINAL_PRODUCE_ROUTING_KEY           = \"routingkey.proxy.message.procon.erpDemoConsume\";\n    public static final String DEFAULT_EXCHANGE_NAME_WITHOUT_TOPOLOGY = \"amq.fanout\";\n\n    public static final String PRODUCER_SECRET     = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n    public static final String PRODUCER_TOKEN      = \"hlkasjdhfkqlwhlfalksjdhgssssas\";\n    public static final String CONSUMER_QUEUE_NAME = \"emapDemoConsume\";\n    public static final String CONSUMER_SECRET     = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n\n    public static final String OUTPUT_FILE_PATH_FORMAT = \"/tmp/%s.data\";\n\n    public static final int MSG_BODY_SIZE_OF_BYTE = 3000;                  //B\n    public static final int HOLD_TIME_OF_MILLIS   = 60000;             //one minute\n    public static final int FETCH_NUM             = 6;\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/TestMessageFactory.java",
    "content": "package com.messagebus.benchmark.client;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.model.MessageType;\n\npublic class TestMessageFactory {\n\n    public static Message create(MessageType type, int sizeOfByte) {\n        Message msg = MessageFactory.createMessage(type);\n\n        byte[] content = generate(sizeOfByte);\n\n        msg.setContent(content);\n\n        return msg;\n    }\n\n    public static Message[] create(MessageType type, int sizeOfByte, int num) {\n        Message[] msgs = new Message[num];\n        Message msg = create(type, sizeOfByte);\n        for (int i = 0; i < num; i++) {\n            msgs[i] = msg;\n        }\n\n        return msgs;\n    }\n\n    private static byte[] generate(int sizeOfByte) {\n        byte[] result = new byte[sizeOfByte];\n        for (int i = 0; i < sizeOfByte; i++) {\n            result[i] = (byte) 1;\n        }\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/TestUtility.java",
    "content": "package com.messagebus.benchmark.client;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.*;\n\npublic class TestUtility {\n\n    private final static Log logger = LogFactory.getLog(TestUtility.class);\n\n    public static void writeFile(String fileName, long[] xArr, long[] yArr) {\n        String filePath = String.format(TestConfigConstant.OUTPUT_FILE_PATH_FORMAT, fileName);\n\n        File dataFile = new File(filePath);\n        try {\n            if (!dataFile.exists() && (!dataFile.createNewFile())) {\n                throw new RuntimeException(\"create new file at : \" + filePath + \" , failure.\");\n            }\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"writeFile\");\n            throw new RuntimeException(e);\n        }\n\n        FileWriter fileWriter = null;\n        PrintWriter out = null;\n        try {\n            fileWriter = new FileWriter(filePath);\n            out = new PrintWriter(fileWriter);\n            out.println(\"#x y\");\n\n            for (int i = 0; i < xArr.length; i++) {\n                out.println(xArr[i] + \" \" + yArr[i]);\n            }\n\n            out.flush();\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"writeFile\");\n            throw new RuntimeException(e);\n        } finally {\n            try {\n                if (fileWriter != null) fileWriter.close();\n                if (out != null) out.close();\n            } catch (IOException e) {\n\n            }\n        }\n    }\n\n    public static void exec(String[] cmds, boolean hasOutput) {\n        if (cmds == null || cmds.length == 0) {\n            return;\n        }\n\n        if (hasOutput) {\n            Process process = null;\n            try {\n                process = Runtime.getRuntime().exec(cmds);\n            } catch (IOException e) {\n                ExceptionHelper.logException(logger, e, \"exec\");\n                throw new RuntimeException(e.toString());\n            }\n\n            InputStreamReader ir = null;\n            LineNumberReader input = null;\n            try {\n                ir = new InputStreamReader(process.getInputStream());\n                input = new LineNumberReader(ir);\n                String line;\n                while ((line = input.readLine()) != null)\n                    System.out.println(line);\n            } catch (IOException e) {\n                ExceptionHelper.logException(logger, e, \"exec\");\n                throw new RuntimeException(e.toString());\n            } finally {\n                try {\n                    if (ir != null) ir.close();\n                    if (input != null) input.close();\n                } catch (IOException e) {\n\n                }\n            }\n        }\n    }\n\n    public static void produce(long total) {\n        Message msg = TestMessageFactory.create(MessageType.QueueMessage, TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST,\n                                                                   TestVariableInfo.PUBSUBER_PORT);\n        Messagebus client = singlePool.getResource();\n\n        try {\n            for (int i = 0; i < total; i++) {\n                client.produce(TestConfigConstant.PRODUCER_SECRET, TestConfigConstant.CONSUMER_QUEUE_NAME, msg, TestConfigConstant.PRODUCER_TOKEN);\n            }\n        } catch (MessagebusUnOpenException e) {\n            e.printStackTrace();\n        } finally {\n            singlePool.returnResource(client);\n            singlePool.destroy();\n        }\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/CalcService.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.9.2)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage com.messagebus.benchmark.client.testCase;\n\nimport org.apache.thrift.EncodingUtils;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.async.AsyncMethodCallback;\nimport org.apache.thrift.protocol.TTupleProtocol;\nimport org.apache.thrift.scheme.IScheme;\nimport org.apache.thrift.scheme.SchemeFactory;\nimport org.apache.thrift.scheme.StandardScheme;\nimport org.apache.thrift.scheme.TupleScheme;\nimport org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.annotation.Generated;\nimport java.util.*;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\"})\n@Generated(value = \"Autogenerated by Thrift Compiler (0.9.2)\", date = \"2015-4-17\")\npublic class CalcService {\n\n    public interface Iface {\n\n        public int calcSum() throws TException;\n\n    }\n\n    public interface AsyncIface {\n\n        public void calcSum(AsyncMethodCallback resultHandler) throws TException;\n\n    }\n\n    public static class Client extends org.apache.thrift.TServiceClient implements Iface {\n        public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {\n            public Factory() {\n            }\n\n            public Client getClient(org.apache.thrift.protocol.TProtocol prot) {\n                return new Client(prot);\n            }\n\n            public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n                return new Client(iprot, oprot);\n            }\n        }\n\n        public Client(org.apache.thrift.protocol.TProtocol prot) {\n            super(prot, prot);\n        }\n\n        public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n            super(iprot, oprot);\n        }\n\n        public int calcSum() throws TException {\n            send_calcSum();\n            return recv_calcSum();\n        }\n\n        public void send_calcSum() throws TException {\n            calcSum_args args = new calcSum_args();\n            sendBase(\"calcSum\", args);\n        }\n\n        public int recv_calcSum() throws TException {\n            calcSum_result result = new calcSum_result();\n            receiveBase(result, \"calcSum\");\n            if (result.isSetSuccess()) {\n                return result.success;\n            }\n            throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"calcSum failed: unknown result\");\n        }\n\n    }\n\n    public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {\n        public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {\n            private org.apache.thrift.async.TAsyncClientManager clientManager;\n            private org.apache.thrift.protocol.TProtocolFactory protocolFactory;\n\n            public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {\n                this.clientManager = clientManager;\n                this.protocolFactory = protocolFactory;\n            }\n\n            public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {\n                return new AsyncClient(protocolFactory, clientManager, transport);\n            }\n        }\n\n        public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {\n            super(protocolFactory, clientManager, transport);\n        }\n\n        public void calcSum(AsyncMethodCallback resultHandler) throws TException {\n            checkReady();\n            calcSum_call method_call = new calcSum_call(resultHandler, this, ___protocolFactory, ___transport);\n            this.___currentMethod = method_call;\n            ___manager.call(method_call);\n        }\n\n        public static class calcSum_call extends org.apache.thrift.async.TAsyncMethodCall {\n            public calcSum_call(AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws TException {\n                super(client, protocolFactory, transport, resultHandler, false);\n            }\n\n            public void write_args(org.apache.thrift.protocol.TProtocol prot) throws TException {\n                prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"calcSum\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n                calcSum_args args = new calcSum_args();\n                args.write(prot);\n                prot.writeMessageEnd();\n            }\n\n            public int getResult() throws TException {\n                if (getState() != State.RESPONSE_READ) {\n                    throw new IllegalStateException(\"Method call not finished!\");\n                }\n                org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n                org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n                return (new Client(prot)).recv_calcSum();\n            }\n        }\n\n    }\n\n    public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {\n        private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class.getName());\n\n        public Processor(I iface) {\n            super(iface, getProcessMap(new HashMap<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));\n        }\n\n        protected Processor(I iface, Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n            super(iface, getProcessMap(processMap));\n        }\n\n        private static <I extends Iface> Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n            processMap.put(\"calcSum\", new calcSum());\n            return processMap;\n        }\n\n        public static class calcSum<I extends Iface> extends org.apache.thrift.ProcessFunction<I, calcSum_args> {\n            public calcSum() {\n                super(\"calcSum\");\n            }\n\n            public calcSum_args getEmptyArgsInstance() {\n                return new calcSum_args();\n            }\n\n            protected boolean isOneway() {\n                return false;\n            }\n\n            public calcSum_result getResult(I iface, calcSum_args args) throws TException {\n                calcSum_result result = new calcSum_result();\n                result.success = iface.calcSum();\n                result.setSuccessIsSet(true);\n                return result;\n            }\n        }\n\n    }\n\n    public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {\n        private static final Logger LOGGER = LoggerFactory.getLogger(AsyncProcessor.class.getName());\n\n        public AsyncProcessor(I iface) {\n            super(iface, getProcessMap(new HashMap<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));\n        }\n\n        protected AsyncProcessor(I iface, Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> processMap) {\n            super(iface, getProcessMap(processMap));\n        }\n\n        private static <I extends AsyncIface> Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> getProcessMap(Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> processMap) {\n            processMap.put(\"calcSum\", new calcSum());\n            return processMap;\n        }\n\n        public static class calcSum<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, calcSum_args, Integer> {\n            public calcSum() {\n                super(\"calcSum\");\n            }\n\n            public calcSum_args getEmptyArgsInstance() {\n                return new calcSum_args();\n            }\n\n            public AsyncMethodCallback<Integer> getResultHandler(final AsyncFrameBuffer fb, final int seqid) {\n                final org.apache.thrift.AsyncProcessFunction fcall = this;\n                return new AsyncMethodCallback<Integer>() {\n                    public void onComplete(Integer o) {\n                        calcSum_result result = new calcSum_result();\n                        result.success = o;\n                        result.setSuccessIsSet(true);\n                        try {\n                            fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY, seqid);\n                            return;\n                        } catch (Exception e) {\n                            LOGGER.error(\"Exception writing to internal frame buffer\", e);\n                        }\n                        fb.close();\n                    }\n\n                    public void onError(Exception e) {\n                        byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n                        org.apache.thrift.TBase msg;\n                        calcSum_result result = new calcSum_result();\n                        {\n                            msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n                            msg = (org.apache.thrift.TBase) new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n                        }\n                        try {\n                            fcall.sendResponse(fb, msg, msgType, seqid);\n                            return;\n                        } catch (Exception ex) {\n                            LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n                        }\n                        fb.close();\n                    }\n                };\n            }\n\n            protected boolean isOneway() {\n                return false;\n            }\n\n            public void start(I iface, calcSum_args args, AsyncMethodCallback<Integer> resultHandler) throws TException {\n                iface.calcSum(resultHandler);\n            }\n        }\n\n    }\n\n    public static class calcSum_args implements org.apache.thrift.TBase<calcSum_args, calcSum_args._Fields>, java.io.Serializable, Cloneable, Comparable<calcSum_args> {\n        private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"calcSum_args\");\n\n\n        private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n\n        static {\n            schemes.put(StandardScheme.class, new calcSum_argsStandardSchemeFactory());\n            schemes.put(TupleScheme.class, new calcSum_argsTupleSchemeFactory());\n        }\n\n\n        /**\n         * The set of fields this struct contains, along with convenience methods for finding and manipulating them.\n         */\n        public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n            ;\n\n            private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n            static {\n                for (_Fields field : EnumSet.allOf(_Fields.class)) {\n                    byName.put(field.getFieldName(), field);\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, or null if its not found.\n             */\n            public static _Fields findByThriftId(int fieldId) {\n                switch (fieldId) {\n                    default:\n                        return null;\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, throwing an exception\n             * if it is not found.\n             */\n            public static _Fields findByThriftIdOrThrow(int fieldId) {\n                _Fields fields = findByThriftId(fieldId);\n                if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n                return fields;\n            }\n\n            /**\n             * Find the _Fields constant that matches name, or null if its not found.\n             */\n            public static _Fields findByName(String name) {\n                return byName.get(name);\n            }\n\n            private final short  _thriftId;\n            private final String _fieldName;\n\n            _Fields(short thriftId, String fieldName) {\n                _thriftId = thriftId;\n                _fieldName = fieldName;\n            }\n\n            public short getThriftFieldId() {\n                return _thriftId;\n            }\n\n            public String getFieldName() {\n                return _fieldName;\n            }\n        }\n\n        public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n\n        static {\n            Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n            metaDataMap = Collections.unmodifiableMap(tmpMap);\n            org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(calcSum_args.class, metaDataMap);\n        }\n\n        public calcSum_args() {\n        }\n\n        /**\n         * Performs a deep copy on <i>other</i>.\n         */\n        public calcSum_args(calcSum_args other) {\n        }\n\n        public calcSum_args deepCopy() {\n            return new calcSum_args(this);\n        }\n\n        @Override\n        public void clear() {\n        }\n\n        public void setFieldValue(_Fields field, Object value) {\n            switch (field) {\n            }\n        }\n\n        public Object getFieldValue(_Fields field) {\n            switch (field) {\n            }\n            throw new IllegalStateException();\n        }\n\n        /**\n         * Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSet(_Fields field) {\n            if (field == null) {\n                throw new IllegalArgumentException();\n            }\n\n            switch (field) {\n            }\n            throw new IllegalStateException();\n        }\n\n        @Override\n        public boolean equals(Object that) {\n            if (that == null)\n                return false;\n            if (that instanceof calcSum_args)\n                return this.equals((calcSum_args) that);\n            return false;\n        }\n\n        public boolean equals(calcSum_args that) {\n            if (that == null)\n                return false;\n\n            return true;\n        }\n\n        @Override\n        public int hashCode() {\n            List<Object> list = new ArrayList<Object>();\n\n            return list.hashCode();\n        }\n\n        @Override\n        public int compareTo(calcSum_args other) {\n            if (!getClass().equals(other.getClass())) {\n                return getClass().getName().compareTo(other.getClass().getName());\n            }\n\n            int lastComparison = 0;\n\n            return 0;\n        }\n\n        public _Fields fieldForId(int fieldId) {\n            return _Fields.findByThriftId(fieldId);\n        }\n\n        public void read(org.apache.thrift.protocol.TProtocol iprot) throws TException {\n            schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n        }\n\n        public void write(org.apache.thrift.protocol.TProtocol oprot) throws TException {\n            schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n        }\n\n        @Override\n        public String toString() {\n            StringBuilder sb = new StringBuilder(\"calcSum_args(\");\n            boolean first = true;\n\n            sb.append(\")\");\n            return sb.toString();\n        }\n\n        public void validate() throws TException {\n            // check for required fields\n            // check for sub-struct validity\n        }\n\n        private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n            try {\n                write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n            try {\n                read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private static class calcSum_argsStandardSchemeFactory implements SchemeFactory {\n            public calcSum_argsStandardScheme getScheme() {\n                return new calcSum_argsStandardScheme();\n            }\n        }\n\n        private static class calcSum_argsStandardScheme extends StandardScheme<calcSum_args> {\n\n            public void read(org.apache.thrift.protocol.TProtocol iprot, calcSum_args struct) throws TException {\n                org.apache.thrift.protocol.TField schemeField;\n                iprot.readStructBegin();\n                while (true) {\n                    schemeField = iprot.readFieldBegin();\n                    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {\n                        break;\n                    }\n                    switch (schemeField.id) {\n                        default:\n                            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                    }\n                    iprot.readFieldEnd();\n                }\n                iprot.readStructEnd();\n\n                // check for required fields of primitive type, which can't be checked in the validate method\n                struct.validate();\n            }\n\n            public void write(org.apache.thrift.protocol.TProtocol oprot, calcSum_args struct) throws TException {\n                struct.validate();\n\n                oprot.writeStructBegin(STRUCT_DESC);\n                oprot.writeFieldStop();\n                oprot.writeStructEnd();\n            }\n\n        }\n\n        private static class calcSum_argsTupleSchemeFactory implements SchemeFactory {\n            public calcSum_argsTupleScheme getScheme() {\n                return new calcSum_argsTupleScheme();\n            }\n        }\n\n        private static class calcSum_argsTupleScheme extends TupleScheme<calcSum_args> {\n\n            @Override\n            public void write(org.apache.thrift.protocol.TProtocol prot, calcSum_args struct) throws TException {\n                TTupleProtocol oprot = (TTupleProtocol) prot;\n            }\n\n            @Override\n            public void read(org.apache.thrift.protocol.TProtocol prot, calcSum_args struct) throws TException {\n                TTupleProtocol iprot = (TTupleProtocol) prot;\n            }\n        }\n\n    }\n\n    public static class calcSum_result implements org.apache.thrift.TBase<calcSum_result, calcSum_result._Fields>, java.io.Serializable, Cloneable, Comparable<calcSum_result> {\n        private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"calcSum_result\");\n\n        private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.I32, (short) 0);\n\n        private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n\n        static {\n            schemes.put(StandardScheme.class, new calcSum_resultStandardSchemeFactory());\n            schemes.put(TupleScheme.class, new calcSum_resultTupleSchemeFactory());\n        }\n\n        public int success; // required\n\n        /**\n         * The set of fields this struct contains, along with convenience methods for finding and manipulating them.\n         */\n        public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n            SUCCESS((short) 0, \"success\");\n\n            private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n            static {\n                for (_Fields field : EnumSet.allOf(_Fields.class)) {\n                    byName.put(field.getFieldName(), field);\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, or null if its not found.\n             */\n            public static _Fields findByThriftId(int fieldId) {\n                switch (fieldId) {\n                    case 0: // SUCCESS\n                        return SUCCESS;\n                    default:\n                        return null;\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, throwing an exception\n             * if it is not found.\n             */\n            public static _Fields findByThriftIdOrThrow(int fieldId) {\n                _Fields fields = findByThriftId(fieldId);\n                if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n                return fields;\n            }\n\n            /**\n             * Find the _Fields constant that matches name, or null if its not found.\n             */\n            public static _Fields findByName(String name) {\n                return byName.get(name);\n            }\n\n            private final short  _thriftId;\n            private final String _fieldName;\n\n            _Fields(short thriftId, String fieldName) {\n                _thriftId = thriftId;\n                _fieldName = fieldName;\n            }\n\n            public short getThriftFieldId() {\n                return _thriftId;\n            }\n\n            public String getFieldName() {\n                return _fieldName;\n            }\n        }\n\n        // isset id assignments\n        private static final int  __SUCCESS_ISSET_ID = 0;\n        private              byte __isset_bitfield   = 0;\n        public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n\n        static {\n            Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n            tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT,\n                                                                                      new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n            metaDataMap = Collections.unmodifiableMap(tmpMap);\n            org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(calcSum_result.class, metaDataMap);\n        }\n\n        public calcSum_result() {\n        }\n\n        public calcSum_result(\n            int success) {\n            this();\n            this.success = success;\n            setSuccessIsSet(true);\n        }\n\n        /**\n         * Performs a deep copy on <i>other</i>.\n         */\n        public calcSum_result(calcSum_result other) {\n            __isset_bitfield = other.__isset_bitfield;\n            this.success = other.success;\n        }\n\n        public calcSum_result deepCopy() {\n            return new calcSum_result(this);\n        }\n\n        @Override\n        public void clear() {\n            setSuccessIsSet(false);\n            this.success = 0;\n        }\n\n        public int getSuccess() {\n            return this.success;\n        }\n\n        public calcSum_result setSuccess(int success) {\n            this.success = success;\n            setSuccessIsSet(true);\n            return this;\n        }\n\n        public void unsetSuccess() {\n            __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n        }\n\n        /**\n         * Returns true if field success is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSetSuccess() {\n            return EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n        }\n\n        public void setSuccessIsSet(boolean value) {\n            __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n        }\n\n        public void setFieldValue(_Fields field, Object value) {\n            switch (field) {\n                case SUCCESS:\n                    if (value == null) {\n                        unsetSuccess();\n                    } else {\n                        setSuccess((Integer) value);\n                    }\n                    break;\n\n            }\n        }\n\n        public Object getFieldValue(_Fields field) {\n            switch (field) {\n                case SUCCESS:\n                    return Integer.valueOf(getSuccess());\n\n            }\n            throw new IllegalStateException();\n        }\n\n        /**\n         * Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSet(_Fields field) {\n            if (field == null) {\n                throw new IllegalArgumentException();\n            }\n\n            switch (field) {\n                case SUCCESS:\n                    return isSetSuccess();\n            }\n            throw new IllegalStateException();\n        }\n\n        @Override\n        public boolean equals(Object that) {\n            if (that == null)\n                return false;\n            if (that instanceof calcSum_result)\n                return this.equals((calcSum_result) that);\n            return false;\n        }\n\n        public boolean equals(calcSum_result that) {\n            if (that == null)\n                return false;\n\n            boolean this_present_success = true;\n            boolean that_present_success = true;\n            if (this_present_success || that_present_success) {\n                if (!(this_present_success && that_present_success))\n                    return false;\n                if (this.success != that.success)\n                    return false;\n            }\n\n            return true;\n        }\n\n        @Override\n        public int hashCode() {\n            List<Object> list = new ArrayList<Object>();\n\n            boolean present_success = true;\n            list.add(present_success);\n            if (present_success)\n                list.add(success);\n\n            return list.hashCode();\n        }\n\n        @Override\n        public int compareTo(calcSum_result other) {\n            if (!getClass().equals(other.getClass())) {\n                return getClass().getName().compareTo(other.getClass().getName());\n            }\n\n            int lastComparison = 0;\n\n            lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n            if (lastComparison != 0) {\n                return lastComparison;\n            }\n            if (isSetSuccess()) {\n                lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n                if (lastComparison != 0) {\n                    return lastComparison;\n                }\n            }\n            return 0;\n        }\n\n        public _Fields fieldForId(int fieldId) {\n            return _Fields.findByThriftId(fieldId);\n        }\n\n        public void read(org.apache.thrift.protocol.TProtocol iprot) throws TException {\n            schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n        }\n\n        public void write(org.apache.thrift.protocol.TProtocol oprot) throws TException {\n            schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n        }\n\n        @Override\n        public String toString() {\n            StringBuilder sb = new StringBuilder(\"calcSum_result(\");\n            boolean first = true;\n\n            sb.append(\"success:\");\n            sb.append(this.success);\n            first = false;\n            sb.append(\")\");\n            return sb.toString();\n        }\n\n        public void validate() throws TException {\n            // check for required fields\n            // check for sub-struct validity\n        }\n\n        private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n            try {\n                write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n            try {\n                // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n                __isset_bitfield = 0;\n                read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private static class calcSum_resultStandardSchemeFactory implements SchemeFactory {\n            public calcSum_resultStandardScheme getScheme() {\n                return new calcSum_resultStandardScheme();\n            }\n        }\n\n        private static class calcSum_resultStandardScheme extends StandardScheme<calcSum_result> {\n\n            public void read(org.apache.thrift.protocol.TProtocol iprot, calcSum_result struct) throws TException {\n                org.apache.thrift.protocol.TField schemeField;\n                iprot.readStructBegin();\n                while (true) {\n                    schemeField = iprot.readFieldBegin();\n                    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {\n                        break;\n                    }\n                    switch (schemeField.id) {\n                        case 0: // SUCCESS\n                            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n                                struct.success = iprot.readI32();\n                                struct.setSuccessIsSet(true);\n                            } else {\n                                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                            }\n                            break;\n                        default:\n                            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                    }\n                    iprot.readFieldEnd();\n                }\n                iprot.readStructEnd();\n\n                // check for required fields of primitive type, which can't be checked in the validate method\n                struct.validate();\n            }\n\n            public void write(org.apache.thrift.protocol.TProtocol oprot, calcSum_result struct) throws TException {\n                struct.validate();\n\n                oprot.writeStructBegin(STRUCT_DESC);\n                if (struct.isSetSuccess()) {\n                    oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n                    oprot.writeI32(struct.success);\n                    oprot.writeFieldEnd();\n                }\n                oprot.writeFieldStop();\n                oprot.writeStructEnd();\n            }\n\n        }\n\n        private static class calcSum_resultTupleSchemeFactory implements SchemeFactory {\n            public calcSum_resultTupleScheme getScheme() {\n                return new calcSum_resultTupleScheme();\n            }\n        }\n\n        private static class calcSum_resultTupleScheme extends TupleScheme<calcSum_result> {\n\n            @Override\n            public void write(org.apache.thrift.protocol.TProtocol prot, calcSum_result struct) throws TException {\n                TTupleProtocol oprot = (TTupleProtocol) prot;\n                BitSet optionals = new BitSet();\n                if (struct.isSetSuccess()) {\n                    optionals.set(0);\n                }\n                oprot.writeBitSet(optionals, 1);\n                if (struct.isSetSuccess()) {\n                    oprot.writeI32(struct.success);\n                }\n            }\n\n            @Override\n            public void read(org.apache.thrift.protocol.TProtocol prot, calcSum_result struct) throws TException {\n                TTupleProtocol iprot = (TTupleProtocol) prot;\n                BitSet incoming = iprot.readBitSet(1);\n                if (incoming.get(0)) {\n                    struct.success = iprot.readI32();\n                    struct.setSuccessIsSet(true);\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/ConsumeTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class ConsumeTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(ConsumeTestCase.class);\n\n    private static class BasicConsume implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private long counter = 0;\n        private Thread currentThread;\n\n        private BasicConsume() {\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.currentThread.interrupt();\n        }\n\n        @Override\n        public void run() {\n            try {\n                client.consume(TestConfigConstant.CONSUMER_SECRET,\n                               Integer.MAX_VALUE, TimeUnit.SECONDS, new IMessageReceiveListener() {\n                        @Override\n                        public void onMessage(Message message) {\n                            ++counter;\n                        }\n                    });\n            } catch (MessagebusUnOpenException e) {\n                e.printStackTrace();\n            } finally {\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n    }\n\n    public static void main(String[] args) {\n//        produce some message for consuming\n        TestUtility.produce(500000);\n\n        try {\n            TimeUnit.SECONDS.sleep(30);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        ConsumeTestCase testCase = new ConsumeTestCase();\n\n        Runnable task = new BasicConsume();\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS, TestConfigConstant.FETCH_NUM,\n                      \"single_thread_consume_async_\" + TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_KB\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/MessagebusJSONRpcTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.Benchmark;\nimport com.messagebus.benchmark.client.IFetcher;\nimport com.messagebus.benchmark.client.ILifeCycle;\nimport com.messagebus.benchmark.client.TestConfigConstant;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.extension.thrift.TAMQPClientTransport;\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.protocol.TJSONProtocol;\nimport org.apache.thrift.protocol.TProtocol;\nimport org.apache.thrift.transport.TTransport;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic class MessagebusJSONRpcTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(MessagebusJSONRpcTestCase.class);\n\n    public static class OriginalJSONRpc implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"emapDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"calcSum\";\n\n        public OriginalJSONRpc() {\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void run() {\n            try {\n                while (flag) {\n                    Object responseObj = client.call(secret, targetQueue, methodName, new Object[0], token, 10000);\n                    if (Integer.parseInt(responseObj.toString()) == 5050) ++counter;\n                }\n            } catch (MessagebusUnOpenException e) {\n                ExceptionHelper.logException(logger, e, \"[JSONRpc#run]\");\n            } finally {\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n    }\n\n    public static class ThriftJSONRpc implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private Thread               currentThread;\n        private TTransport           transport;\n        private boolean flag    = true;\n        private long    counter = 0;\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"emapDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"calcSum\";\n\n        public ThriftJSONRpc() {\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            //client code\n            transport = new TAMQPClientTransport(this.client,\n                                                 \"kliwhiduhaiucvarkjajksdbfkjabw\",\n                                                 \"emapDemoRpcResponse\",\n                                                 \"klasehnfkljashdnflhkjahwlekdjf\",\n                                                 10000);\n            int result = 0;\n            try {\n                transport.open();\n                TProtocol protocol = new TJSONProtocol(transport);\n                CalcService.Client client = new CalcService.Client(protocol);\n                while (flag) {\n                    result = client.calcSum();\n                    if (result == 5050) ++counter;\n                }\n            } catch (TException e) {\n                e.printStackTrace();\n            } finally {\n                transport.close();\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n    }\n\n    public static void main(String[] args) {\n//        MessagebusJSONRpcTestCase testCase = new MessagebusJSONRpcTestCase();\n//        Runnable task = new OriginalJSONRpc();\n//\n//        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n//                      TestConfigConstant.FETCH_NUM, \"messagebus_original_json_rpc_noHA\");\n\n        MessagebusJSONRpcTestCase testCase = new MessagebusJSONRpcTestCase();\n        Runnable task = new ThriftJSONRpc();\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"messagebus_thrift_json_rpc_noHA\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/OriginalConsumeTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.Benchmark;\nimport com.messagebus.benchmark.client.IFetcher;\nimport com.messagebus.benchmark.client.ILifeCycle;\nimport com.messagebus.benchmark.client.TestConfigConstant;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.common.TestVariableInfo;\nimport com.messagebus.interactor.proxy.ProxyConsumer;\nimport com.messagebus.interactor.rabbitmq.AbstractInitializer;\nimport com.rabbitmq.client.AMQP;\nimport com.rabbitmq.client.QueueingConsumer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\npublic class OriginalConsumeTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(OriginalConsumeTestCase.class);\n\n    public static class BasicConsume extends AbstractInitializer implements Runnable, ILifeCycle, IFetcher {\n\n        private static final String  consumerTag   = \"tag.consumer.msgLog\";\n        private              boolean flag          = true;\n        private              long    counter       = 0;\n        private              String  realQueueName = \"\";\n        private Thread currentThread;\n\n        public BasicConsume(String host) {\n            super(host);\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            try {\n                super.init();\n                QueueingConsumer consumer = ProxyConsumer.consume(this.channel,\n                                                                  this.getRealQueueName(),\n                                                                  consumerTag);\n\n                while (flag) {\n                    QueueingConsumer.Delivery delivery = consumer.nextDelivery();\n\n                    AMQP.BasicProperties properties = delivery.getProperties();\n                    byte[] msgBody = delivery.getBody();\n\n                    this.channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);\n\n                    String msgTypeStr = properties.getType();\n                    if (msgTypeStr == null || msgTypeStr.isEmpty()) {\n                        logger.error(\"[run] message type is null or empty\");\n                    }\n\n                    MessageType msgType = null;\n                    try {\n                        msgType = MessageType.lookup(msgTypeStr);\n                    } catch (UnknownError unknownError) {\n                        throw new RuntimeException(\"unknown message type : \" + msgTypeStr);\n                    }\n\n                    Message msg = MessageFactory.createMessage(msgType);\n                    initMessage(msg, msgType, properties, msgBody);\n\n                    ++counter;\n                }\n            } catch (IOException e) {\n                e.printStackTrace();\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            } finally {\n                try {\n                    this.channel.basicCancel(consumerTag);\n                    super.close();\n                } catch (IOException e) {\n                    logger.error(\"[run] occurs a IOException : \" + e.getMessage());\n                }\n            }\n        }\n\n        private void initMessage(Message msg, MessageType msgType, AMQP.BasicProperties properties, byte[] bodyData) {\n            MessageHeaderTransfer.unbox(properties, msg);\n            msg.setContent(bodyData);\n        }\n\n        public String getRealQueueName() {\n            return realQueueName;\n        }\n\n        public void setRealQueueName(String realQueueName) {\n            this.realQueueName = realQueueName;\n        }\n    }\n\n    public static void main(String[] args) {\n        //produce some message for consuming\n//        TestUtility.produce(50_0000);\n//\n//        try {\n//            TimeUnit.SECONDS.sleep(30);\n//        } catch (InterruptedException e) {\n//            e.printStackTrace();\n//        }\n\n        OriginalConsumeTestCase testCase = new OriginalConsumeTestCase();\n        BasicConsume task = new BasicConsume(TestVariableInfo.RABBITMQ_SERVER_HOST);\n        task.setRealQueueName(\"queue.proxy.message.business.crm\");\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS, TestConfigConstant.FETCH_NUM,\n                      \"single_thread_original_consume_async_\" + TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_KB\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/OriginalProduceTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.common.Constants;\nimport com.messagebus.common.TestVariableInfo;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.messagebus.interactor.rabbitmq.AbstractInitializer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\npublic class OriginalProduceTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(OriginalProduceTestCase.class);\n\n    private static class BasicProduce extends AbstractInitializer implements Runnable, ILifeCycle, IFetcher {\n\n        private Message msg;\n        private String  routingkey;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        private BasicProduce(String host, int msgBodySize) {\n            super(host);\n            msg = TestMessageFactory.create(MessageType.QueueMessage, msgBodySize);\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            try {\n                this.init();\n                AMQP.BasicProperties header = MessageHeaderTransfer.box(msg);\n                while (flag) {\n                    ProxyProducer.produce(Constants.PROXY_EXCHANGE_NAME,\n                                          this.channel,\n                                          this.getRoutingkey(),\n                                          msg.getContent(),\n                                          header);\n                    ++counter;\n                }\n            } catch (IOException e) {\n                e.printStackTrace();\n            } finally {\n                try {\n                    this.close();\n                } catch (IOException e) {\n\n                }\n            }\n        }\n\n        @Override\n        public long fetch() {\n            return counter;\n        }\n\n        public String getRoutingkey() {\n            return routingkey;\n        }\n\n        public void setRoutingkey(String routingkey) {\n            this.routingkey = routingkey;\n        }\n    }\n\n    public static void main(String[] args) {\n        OriginalProduceTestCase testCase = new OriginalProduceTestCase();\n\n        BasicProduce task = new BasicProduce(TestVariableInfo.RABBITMQ_SERVER_HOST, TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n        task.setRoutingkey(TestConfigConstant.ORIGINAL_PRODUCE_ROUTING_KEY);\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"one_thread_original_produce_one_by_one_\" +\n                TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_Byte\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/OriginalProduceWithoutTopologyTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.common.TestVariableInfo;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.messagebus.interactor.rabbitmq.AbstractInitializer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 3/25/15.\n */\npublic class OriginalProduceWithoutTopologyTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(OriginalProduceWithoutTopologyTestCase.class);\n\n    private static class BasicProduce extends AbstractInitializer implements Runnable, ILifeCycle, IFetcher {\n\n        private Message msg;\n        private String  routingkey;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        private BasicProduce(String host, int msgBodySize) {\n            super(host);\n            msg = TestMessageFactory.create(MessageType.QueueMessage, msgBodySize);\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            try {\n                this.init();\n                AMQP.BasicProperties header = MessageHeaderTransfer.box(msg);\n                while (flag) {\n                    ProxyProducer.produce(TestConfigConstant.DEFAULT_EXCHANGE_NAME_WITHOUT_TOPOLOGY,\n                                          this.channel,\n                                          this.getRoutingkey(),\n                                          msg.getContent(),\n                                          header);\n                    ++counter;\n                }\n            } catch (IOException e) {\n                e.printStackTrace();\n            } finally {\n                try {\n                    this.close();\n                } catch (IOException e) {\n\n                }\n            }\n        }\n\n        @Override\n        public long fetch() {\n            return counter;\n        }\n\n        public String getRoutingkey() {\n            return routingkey;\n        }\n\n        public void setRoutingkey(String routingkey) {\n            this.routingkey = routingkey;\n        }\n    }\n\n    public static void main(String[] args) {\n        OriginalProduceTestCase testCase = new OriginalProduceTestCase();\n\n        BasicProduce task = new BasicProduce(TestVariableInfo.RABBITMQ_SERVER_HOST, TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n        task.setRoutingkey(\"\");\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"one_thread_original_produce_without_topology_one_by_one_\" +\n                TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_Byte\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/ProduceRemainLogTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * Created by yanghua on 3/25/15.\n */\npublic class ProduceRemainLogTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(ProduceRemainLogTestCase.class);\n\n    private static class BasicProduce implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private Message              msg;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        private BasicProduce(int msgBodySize) {\n            msg = TestMessageFactory.create(MessageType.QueueMessage, msgBodySize);\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void run() {\n            try {\n                while (flag) {\n                    client.produce(TestConfigConstant.PRODUCER_SECRET, TestConfigConstant.CONSUMER_QUEUE_NAME, msg, TestConfigConstant.PRODUCER_TOKEN);\n                    ++counter;\n                }\n            } catch (MessagebusUnOpenException e) {\n                ExceptionHelper.logException(logger, e, \"[BasicProduce#run]\");\n            } finally {\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n    }\n\n    public static void main(String[] args) {\n        ProduceTestCase testCase = new ProduceTestCase();\n\n        Runnable task = new BasicProduce(TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"one_thread_remain_log_produce_one_by_one_\" +\n                TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_Byte\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/ProduceTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\npublic class ProduceTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(ProduceTestCase.class);\n\n    private static class BasicProduce implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private Message              msg;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        private BasicProduce(int msgBodySize) {\n            msg = TestMessageFactory.create(MessageType.QueueMessage, msgBodySize);\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void run() {\n            try {\n                while (flag) {\n                    client.produce(TestConfigConstant.PRODUCER_SECRET, TestConfigConstant.CONSUMER_QUEUE_NAME, msg, TestConfigConstant.PRODUCER_TOKEN);\n                    ++counter;\n                }\n            } catch (MessagebusUnOpenException e) {\n                ExceptionHelper.logException(logger, e, \"[BasicProduce#run]\");\n            } finally {\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n    }\n\n    public static void main(String[] args) {\n        ProduceTestCase testCase = new ProduceTestCase();\n\n        Runnable task = new BasicProduce(TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"one_thread_produce_one_by_one_\" +\n                TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_Byte\");\n    }\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/ProduceWithoutLogTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.*;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.MessagebusUnOpenException;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageType;\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * Created by yanghua on 3/25/15.\n */\npublic class ProduceWithoutLogTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(ProduceWithoutLogTestCase.class);\n\n    private static class BasicProduce implements Runnable, ILifeCycle, IFetcher {\n\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n        private Message              msg;\n        private boolean flag    = true;\n        private long    counter = 0;\n        private Thread currentThread;\n\n        private BasicProduce(int msgBodySize) {\n            msg = TestMessageFactory.create(MessageType.QueueMessage, msgBodySize);\n            singlePool = new MessagebusSinglePool(TestVariableInfo.PUBSUBER_HOST, TestVariableInfo.PUBSUBER_PORT);\n            client = singlePool.getResource();\n            currentThread = new Thread(this);\n            currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void run() {\n            try {\n                while (flag) {\n                    client.produce(TestConfigConstant.PRODUCER_SECRET, TestConfigConstant.CONSUMER_QUEUE_NAME, msg, TestConfigConstant.PRODUCER_TOKEN);\n                    ++counter;\n                }\n            } catch (MessagebusUnOpenException e) {\n                ExceptionHelper.logException(logger, e, \"[BasicProduce#run]\");\n            } finally {\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n    }\n\n    public static void main(String[] args) {\n        ProduceTestCase testCase = new ProduceTestCase();\n\n        Runnable task = new BasicProduce(TestConfigConstant.MSG_BODY_SIZE_OF_BYTE);\n\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"one_thread_without_log_produce_one_by_one_\" +\n                TestConfigConstant.MSG_BODY_SIZE_OF_BYTE + \"_Byte\");\n    }\n\n}\n"
  },
  {
    "path": "benchmark/src/main/java/com/messagebus/benchmark/client/testCase/ThriftJSONRpcTestCase.java",
    "content": "package com.messagebus.benchmark.client.testCase;\n\nimport com.messagebus.benchmark.client.Benchmark;\nimport com.messagebus.benchmark.client.IFetcher;\nimport com.messagebus.benchmark.client.ILifeCycle;\nimport com.messagebus.benchmark.client.TestConfigConstant;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.protocol.TBinaryProtocol;\nimport org.apache.thrift.protocol.TJSONProtocol;\nimport org.apache.thrift.protocol.TProtocol;\nimport org.apache.thrift.transport.TSocket;\nimport org.apache.thrift.transport.TTransport;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic class ThriftJSONRpcTestCase extends Benchmark {\n\n    private static final Log logger = LogFactory.getLog(ThriftJSONRpcTestCase.class);\n\n    public static class JSONRpc implements Runnable, ILifeCycle, IFetcher {\n\n        private Thread currentThread;\n        private long    counter = 0;\n        private boolean flag    = true;\n\n        public JSONRpc() {\n            this.currentThread = new Thread(this);\n            this.currentThread.setDaemon(true);\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            TTransport transport = new TSocket(\"172.16.206.29\", 7911);\n            int result = 0;\n\n            try {\n                transport.open();\n                TProtocol protocol = new TJSONProtocol(transport);\n                CalcService.Client client = new CalcService.Client(protocol);\n                while (flag) {\n                    result = client.calcSum();\n                    if (result == 5050) ++counter;\n                }\n                logger.info(result);\n            } catch (TException e) {\n                e.printStackTrace();\n            } finally {\n                transport.close();\n            }\n        }\n    }\n\n    public static class BinaryRpc implements Runnable, ILifeCycle, IFetcher {\n\n        private Thread currentThread;\n        private long    counter = 0;\n        private boolean flag    = true;\n\n        public BinaryRpc() {\n            this.currentThread = new Thread(this);\n            this.currentThread.setDaemon(true);\n        }\n\n        @Override\n        public long fetch() {\n            return this.counter;\n        }\n\n        @Override\n        public void start() {\n            this.currentThread.start();\n        }\n\n        @Override\n        public void terminate() {\n            logger.info(\"closing test task ....\");\n            this.flag = false;\n        }\n\n        @Override\n        public void run() {\n            TTransport transport = new TSocket(\"172.16.206.29\", 7911);\n            int result = 0;\n            try {\n                transport.open();\n                TProtocol protocol = new TBinaryProtocol(transport);\n                CalcService.Client client = new CalcService.Client(protocol);\n\n                while (flag) {\n                    result = client.calcSum();\n                    if (result == 5050) ++counter;\n                }\n            } catch (TException e) {\n                e.printStackTrace();\n            } finally {\n                transport.close();\n            }\n        }\n    }\n\n    public static void main(String[] args) {\n//        ThriftJSONRpcTestCase testCase = new ThriftJSONRpcTestCase();\n//\n//        Runnable task = new JSONRpc();\n//        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n//                      TestConfigConstant.FETCH_NUM, \"thrift_original_json_rpc\");\n\n        ThriftJSONRpcTestCase testCase = new ThriftJSONRpcTestCase();\n\n        Runnable task = new BinaryRpc();\n        testCase.test(task, TestConfigConstant.HOLD_TIME_OF_MILLIS,\n                      TestConfigConstant.FETCH_NUM, \"thrift_original_binary_rpc\");\n    }\n}\n"
  },
  {
    "path": "benchmark/src/main/resources/clearEnv.sh",
    "content": "#! /bin/sh\n\nsudo service messagebus-server stop\nsudo rabbitmqctl stop_app\nsudo rabbitmqctl reset\nsudo rabbitmqctl start_app\nsudo service messagebus-server start"
  },
  {
    "path": "benchmark/src/main/resources/log4j.properties",
    "content": "# Configure logging for testing\nlog4j.rootLogger=INFO, stdout\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.encoding=utf-8\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=[%-5p] -%d{yyyy-MM-dd HH:mm:ss,SSS} method:%l - %m%n"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_consume.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/consume/singleThreadClientVSOriginal.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"single thread async consume performance test \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/single_thread_consume_async_1.0_KB.data\" using 1:2 title \"client 1KB\",\\\n\t \"/tmp/single_thread_original_consume_async_1.0_KB.data\" using 1:2 title \"original 1KB\",\\\n\t \"/tmp/single_thread_consume_async_3.0_KB.data\" using 1:2 title \"client 3KB\",\\\n\t \"/tmp/single_thread_original_consume_async_3.0_KB.data\" using 1:2 title \"original 3KB\",\\\n\t \"/tmp/single_thread_consume_async_5.0_KB.data\" using 1:2 title \"client 5KB\",\\\n\t \"/tmp/single_thread_original_consume_async_5.0_KB.data\" using 1:2 title \"original 5KB\";"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_messagebus_client_produce.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png size 800,600\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/produce/singleThreadMultipleMsgBodySizeMBClientProduce.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"single thread messagebus-client produce performance \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/one_thread_produce_one_by_one_500_Byte.data\" using 1:2 title \"messagebus 0.5KB\",\\\n\t \"/tmp/one_thread_produce_one_by_one_1000_Byte.data\" using 1:2 title \"messagebus 1KB\",\\\n\t \"/tmp/one_thread_produce_one_by_one_2000_Byte.data\" using 1:2 title \"messagebus 2KB\",\\\n\t \"/tmp/one_thread_produce_one_by_one_3000_Byte.data\" using 1:2 title \"messagebus 3KB\";"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_messagebus_client_remain_log_produce.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png size 800,600\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/produce/singleThreadMultipleMsgBodySizeMBClientRemainLogProduce.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"one thread mb-client remain log produce performance \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/one_thread_remain_log_produce_one_by_one_500_Byte.data\" using 1:2 title \"messagebus 0.5KB\",\\\n\t \"/tmp/one_thread_remain_log_produce_one_by_one_1000_Byte.data\" using 1:2 title \"messagebus 1KB\",\\\n\t \"/tmp/one_thread_remain_log_produce_one_by_one_2000_Byte.data\" using 1:2 title \"messagebus 2KB\",\\\n\t \"/tmp/one_thread_remain_log_produce_one_by_one_3000_Byte.data\" using 1:2 title \"messagebus 3KB\";"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_messagebus_client_without_realtime_log_produce.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png size 800,600\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/produce/singleThreadMultipleMsgBodySizeMBClientWithoutRealtimeLogProduce.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"one thread mb-client no realtime log produce performance \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/one_thread_without_log_produce_one_by_one_500_Byte.data\" using 1:2 title \"messagebus 0.5KB\",\\\n\t \"/tmp/one_thread_without_log_produce_one_by_one_1000_Byte.data\" using 1:2 title \"messagebus 1KB\",\\\n\t \"/tmp/one_thread_without_log_produce_one_by_one_2000_Byte.data\" using 1:2 title \"messagebus 2KB\",\\\n\t \"/tmp/one_thread_without_log_produce_one_by_one_3000_Byte.data\" using 1:2 title \"messagebus 3KB\";"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_official_client_produce.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png size 800,600\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/produce/singleThreadMultipleMsgBodySizeOfficialClientProduce.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"single thread official-client produce performance  \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/one_thread_original_produce_one_by_one_500_Byte.data\" using 1:2 title \"official 0.5KB\",\\\n\t \"/tmp/one_thread_original_produce_one_by_one_1000_Byte.data\" using 1:2 title \"official 1KB\",\\\n\t \"/tmp/one_thread_original_produce_one_by_one_2000_Byte.data\" using 1:2 title \"official 2KB\",\\\n\t \"/tmp/one_thread_original_produce_one_by_one_3000_Byte.data\" using 1:2 title \"official 3KB\";"
  },
  {
    "path": "benchmark/src/main/resources/plotscript_official_client_without_topology_produce.sh",
    "content": "#! /usr/bin/env gnuplot\nreset\nset terminal png size 800,600\n\n#write you image dir path\nset output \"/Users/yanghua/Documents/GitHub/messagebus/screenshots/benchmark/produce/singleThreadMultipleMsgBodySizeOfficialClientWithoutTopologyProduce.png\"\n\n#set logscale x\n#set logscale y\n\nset xlabel \"time (ms)\"\nset ylabel \"records num\"\n\nset title \"single thread official-client without topology produce performance  \"\n\nset key reverse Left outside\nset grid\nset autoscale\n\nset style data linespoints\n\nset yrange [0:500000]\nset xrange [0:60000]\n\nplot \"/tmp/one_thread_original_produce_without_topology_one_by_one_500_Byte.data\" using 1:2 title \"official 0.5KB\",\\\n\t \"/tmp/one_thread_original_produce_without_topology_one_by_one_1000_Byte.data\" using 1:2 title \"official 1KB\",\\\n\t \"/tmp/one_thread_original_produce_without_topology_one_by_one_2000_Byte.data\" using 1:2 title \"official 2KB\",\\\n\t \"/tmp/one_thread_original_produce_without_topology_one_by_one_3000_Byte.data\" using 1:2 title \"official 3KB\";"
  },
  {
    "path": "client/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>client</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>common</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>interactor-component</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.curator</groupId>\n            <artifactId>curator-framework</artifactId>\n            <version>2.6.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.curator</groupId>\n            <artifactId>curator-recipes</artifactId>\n            <version>2.6.0</version>\n        </dependency>\n\n        <!-- apache common pool -->\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-pool2</artifactId>\n            <version>2.2</version>\n            <type>jar</type>\n            <scope>compile</scope>\n        </dependency>\n\n        <!-- thrift -->\n        <dependency>\n            <groupId>org.apache.thrift</groupId>\n            <artifactId>libthrift</artifactId>\n            <version>0.9.2</version>\n        </dependency>\n\n        <!--<dependency>-->\n        <!--<groupId>org.slf4j</groupId>-->\n        <!--<artifactId>slf4j-api</artifactId>-->\n        <!--<version>1.7.12</version>-->\n        <!--</dependency>-->\n\n    </dependencies>\n\n    <build>\n        <finalName>messagebus-client</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <version>2.4</version>\n                <configuration>\n                    <archive>\n                        <index>true</index>\n                        <manifest>\n                            <addClasspath>true</addClasspath>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>2.3.2</version>\n                <inherited>true</inherited>\n                <configuration>\n                    <source>1.6</source>\n                    <target>1.6</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <skipTests>true</skipTests>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-dependency-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <id>copy</id>\n                        <phase>install</phase>\n                        <goals>\n                            <goal>copy-dependencies</goal>\n                        </goals>\n                        <configuration>\n                            <outputDirectory>\n                                ${project.build.directory}\n                            </outputDirectory>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <version>2.2-beta-5</version>\n                <configuration>\n                    <archive>\n                        <manifest>\n                        </manifest>\n                    </archive>\n                    <descriptorRefs>\n                        <descriptorRef>jar-with-dependencies</descriptorRef>\n                    </descriptorRefs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <distributionManagement>\n        <repository>\n            <id>release</id>\n            <name>release@172.16.1.104</name>\n            <url>http://172.16.1.104:8081/nexus/content/repositories/releases/</url>\n        </repository>\n    </distributionManagement>\n\n</project>"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/AbstractPool.java",
    "content": "package com.messagebus.client;\n\nimport com.messagebus.common.ExceptionHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.commons.pool2.PooledObjectFactory;\nimport org.apache.commons.pool2.impl.GenericObjectPool;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\n/**\n * the abstract pool\n *\n * @param <T> the Object that the pool want to cache\n */\nabstract class AbstractPool<T> {\n\n    private static final Log logger = LogFactory.getLog(AbstractPool.class);\n\n    protected GenericObjectPool<T> internalPool;\n\n    public AbstractPool(final GenericObjectPoolConfig poolConfig,\n                        PooledObjectFactory<T> factory) {\n        this.initPool(poolConfig, factory);\n    }\n\n    private void initPool(final GenericObjectPoolConfig poolConfig,\n                          PooledObjectFactory<T> factory) {\n        if (this.internalPool != null) {\n            closeInternalPool();\n        }\n\n        this.internalPool = new GenericObjectPool<T>(factory, poolConfig);\n    }\n\n    public T getResource() {\n        try {\n            return internalPool.borrowObject();\n        } catch (Exception e) {\n            ExceptionHelper.logException(logger, e, \"[getResource]\");\n            throw new RuntimeException(\"can not get a resource from the pool \", e);\n        }\n    }\n\n    public void returnResourceObject(final T resource) {\n        internalPool.returnObject(resource);\n    }\n\n    public void returnBrokenResource(final T resource) {\n        returnBrokenResourceObject(resource);\n    }\n\n    public void returnResource(final T resource) {\n        returnResourceObject(resource);\n    }\n\n    public void destroy() {\n        closeInternalPool();\n    }\n\n    protected void returnBrokenResourceObject(final T resource) {\n        try {\n            internalPool.invalidateObject(resource);\n        } catch (Exception e) {\n            throw new RuntimeException(\"Could not return the resource to the pool\", e);\n        }\n    }\n\n    protected void closeInternalPool() {\n        internalPool.close();\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/Address.java",
    "content": "package com.messagebus.client;\n\nimport java.io.Serializable;\n\n/**\n * Created by yanghua on 2/12/2015.\n */\npublic class Address implements Serializable {\n\n    private String host;\n    private int    port;\n\n    public Address() {\n    }\n\n    public String getHost() {\n        return host;\n    }\n\n    public void setHost(String host) {\n        this.host = host;\n    }\n\n    public int getPort() {\n        return port;\n    }\n\n    public void setPort(int port) {\n        this.port = port;\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/ConfigManager.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.base.Strings;\nimport com.google.common.eventbus.EventBus;\nimport com.google.gson.Gson;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.recipes.cache.PathChildrenCache;\nimport org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;\nimport org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * the config manager\n */\npublic class ConfigManager {\n\n    private static final Log    logger            = LogFactory.getLog(ConfigManager.class);\n    private static final Gson   GSON              = new Gson();\n    private static final String SOURCE_EVENT_TYPE = \"source\";\n    private static final String SINK_EVENT_TYPE   = \"sink\";\n    private static final String STREAM_EVENT_TYPE = \"stream\";\n\n    private static final String REVERSE_MESSAGE_ZK_PATH               = \"/reverse/message\";\n    private static final String REVERSE_MESSAGE_SOURCE_ZK_PATH        = REVERSE_MESSAGE_ZK_PATH + \"/source\";\n    private static final String REVERSE_MESSAGE_SINK_ZK_PATH          = REVERSE_MESSAGE_ZK_PATH + \"/sink\";\n    private static final String REVERSE_MESSAGE_STREAM_ZK_PATH        = REVERSE_MESSAGE_ZK_PATH + \"/stream\";\n    private static final String REVERSE_MESSAGE_SOURCE_SECRET_ZK_PATH = REVERSE_MESSAGE_SOURCE_ZK_PATH + \"/secret\";\n    private static final String REVERSE_MESSAGE_SOURCE_NAME_ZK_PATH   = REVERSE_MESSAGE_SOURCE_ZK_PATH + \"/name\";\n    private static final String REVERSE_MESSAGE_SINK_SECRET_ZK_PATH   = REVERSE_MESSAGE_SINK_ZK_PATH + \"/secret\";\n    private static final String REVERSE_MESSAGE_SINK_NAME_ZK_PATH     = REVERSE_MESSAGE_SINK_ZK_PATH + \"/name\";\n    private static final String REVERSE_MESSAGE_STREAM_TOKEN_ZK_PATH  = REVERSE_MESSAGE_STREAM_ZK_PATH + \"/token\";\n\n    private Map<String, Source> secretSourceMap = new HashMap<String, Source>();\n    private Map<String, Source> nameSourceMap   = new HashMap<String, Source>();\n    private Map<String, Sink>   secretSinkMap   = new HashMap<String, Sink>();\n    private Map<String, Sink>   nameSinkMap     = new HashMap<String, Sink>();\n    private Map<String, Stream> streamMap       = new HashMap<String, Stream>();\n\n    private CuratorFramework openedZookeeper;\n    private EventBus         componentEventBus;\n\n    public ConfigManager(CuratorFramework zookeeper) {\n        this.openedZookeeper = zookeeper;\n\n        //source -> secret\n        PathChildrenCache sourceSecretCache = new PathChildrenCache(zookeeper,\n                REVERSE_MESSAGE_SOURCE_SECRET_ZK_PATH, false);\n        sourceSecretCache.getListenable().addListener(new PathChildrenCacheListener() {\n            public void childEvent(CuratorFramework curatorFramework,\n                                   PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {\n                onPathChildrenChanged(REVERSE_MESSAGE_SOURCE_SECRET_ZK_PATH);\n            }\n        });\n\n        //source -> name\n        PathChildrenCache souceNameCache = new PathChildrenCache(zookeeper,\n                REVERSE_MESSAGE_SOURCE_NAME_ZK_PATH, false);\n        souceNameCache.getListenable().addListener(new PathChildrenCacheListener() {\n            public void childEvent(CuratorFramework curatorFramework,\n                                   PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {\n                onPathChildrenChanged(REVERSE_MESSAGE_SOURCE_NAME_ZK_PATH);\n            }\n        });\n\n        //sink -> secret\n        PathChildrenCache sinkSecretCache = new PathChildrenCache(zookeeper,\n                REVERSE_MESSAGE_SINK_SECRET_ZK_PATH, false);\n        sinkSecretCache.getListenable().addListener(new PathChildrenCacheListener() {\n            public void childEvent(CuratorFramework curatorFramework,\n                                   PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {\n                onPathChildrenChanged(REVERSE_MESSAGE_SINK_SECRET_ZK_PATH);\n            }\n        });\n\n        //sink -> name\n        PathChildrenCache sinkNameCache = new PathChildrenCache(zookeeper,\n                REVERSE_MESSAGE_SINK_NAME_ZK_PATH, false);\n        sinkNameCache.getListenable().addListener(new PathChildrenCacheListener() {\n            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {\n                onPathChildrenChanged(REVERSE_MESSAGE_SINK_NAME_ZK_PATH);\n            }\n        });\n\n        //stream -> token\n        PathChildrenCache streamTokenCache = new PathChildrenCache(zookeeper,\n                REVERSE_MESSAGE_STREAM_TOKEN_ZK_PATH, false);\n        streamTokenCache.getListenable().addListener(new PathChildrenCacheListener() {\n            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {\n                onPathChildrenChanged(REVERSE_MESSAGE_STREAM_TOKEN_ZK_PATH);\n            }\n        });\n    }\n\n    public EventBus getComponentEventBus() {\n        return componentEventBus;\n    }\n\n    public void setComponentEventBus(EventBus componentEventBus) {\n        this.componentEventBus = componentEventBus;\n    }\n\n    public Source getSourceBySecret(String secret) {\n        if (Strings.isNullOrEmpty(secret)) {\n            throw new NullPointerException(\"the secret can not be null or empty\");\n        }\n\n        if (this.secretSourceMap.containsKey(secret)) {     //local cache\n            return this.secretSourceMap.get(secret);\n        } else {                                            //remote data then save to local cache\n            String sourceStr = getDataFromZK(REVERSE_MESSAGE_SOURCE_SECRET_ZK_PATH + \"/\" + secret);\n            Source source    = GSON.fromJson(sourceStr, Source.class);\n            this.secretSourceMap.put(secret, source);\n            return source;\n        }\n    }\n\n    public Source getSourceByName(String name) {\n        if (Strings.isNullOrEmpty(name)) {\n            throw new NullPointerException(\"the name can not be null or empty\");\n        }\n\n        if (this.nameSourceMap.containsKey(name)) {         //local cache\n            return this.nameSourceMap.get(name);\n        } else {                                            //remote data then save to local cache\n            String sourceJson = getDataFromZK(REVERSE_MESSAGE_SOURCE_NAME_ZK_PATH + \"/\" + name);\n            Source source     = GSON.fromJson(sourceJson, Source.class);\n            this.nameSourceMap.put(name, source);\n            return source;\n        }\n    }\n\n    public Sink getSinkBySecret(String secret) {\n        if (Strings.isNullOrEmpty(secret)) {\n            throw new NullPointerException(\"the secret can not be null or empty\");\n        }\n\n        if (this.secretSinkMap.containsKey(secret)) {       //local cache\n            return this.secretSinkMap.get(secret);\n        } else {                                            //remote data then save to local cache\n            String sinkJson = getDataFromZK(REVERSE_MESSAGE_SINK_SECRET_ZK_PATH + \"/\" + secret);\n            Sink   sink     = GSON.fromJson(sinkJson, Sink.class);\n            this.secretSinkMap.put(secret, sink);\n            return sink;\n        }\n    }\n\n    public Sink getSinkByName(String name) {\n        if (Strings.isNullOrEmpty(name)) {\n            throw new NullPointerException(\"the name can not be null or empty\");\n        }\n\n        if (this.nameSinkMap.containsKey(name)) {           //local cache\n            return this.nameSinkMap.get(name);\n        } else {                                            //remote data then save to local cache\n            String sinkJson = getDataFromZK(REVERSE_MESSAGE_SINK_NAME_ZK_PATH + \"/\" + name);\n            Sink   sink     = GSON.fromJson(sinkJson, Sink.class);\n            this.nameSinkMap.put(name, sink);\n            return sink;\n        }\n    }\n\n    public Stream getStreamByToken(String token) {\n        if (Strings.isNullOrEmpty(token)) {\n            throw new NullPointerException(\"the token can not be null or empty\");\n        }\n\n        if (this.streamMap.containsKey(token)) {            //local cache\n            return this.streamMap.get(token);\n        } else {                                            //remote data then save to local cache\n            String streamJson = getDataFromZK(REVERSE_MESSAGE_STREAM_ZK_PATH + \"/\" + token);\n            Stream stream     = GSON.fromJson(streamJson, Stream.class);\n            this.streamMap.put(token, stream);\n            return stream;\n        }\n    }\n\n    private void refreshSourceCache(boolean bySecret) {\n        if (bySecret) {\n            for (String secret : this.secretSourceMap.keySet()) {\n                String sourceStr = getDataFromZK(REVERSE_MESSAGE_SOURCE_SECRET_ZK_PATH + \"/\" + secret);\n                Source source    = GSON.fromJson(sourceStr, Source.class);\n                this.secretSourceMap.put(secret, source);\n            }\n        } else {\n            for (String name : this.nameSourceMap.keySet()) {\n                String sourceJson = getDataFromZK(REVERSE_MESSAGE_SOURCE_NAME_ZK_PATH + \"/\" + name);\n                Source source     = GSON.fromJson(sourceJson, Source.class);\n                this.nameSourceMap.put(name, source);\n            }\n        }\n    }\n\n    private void refreshSinkCache(boolean bySecret) {\n        if (bySecret) {\n            for (String secret : this.secretSinkMap.keySet()) {\n                String sinkJson = getDataFromZK(REVERSE_MESSAGE_SINK_SECRET_ZK_PATH + \"/\" + secret);\n                Sink   sink     = GSON.fromJson(sinkJson, Sink.class);\n                this.secretSinkMap.put(secret, sink);\n            }\n        } else {\n            for (String name : this.nameSinkMap.keySet()) {\n                String sinkJson = getDataFromZK(REVERSE_MESSAGE_SINK_NAME_ZK_PATH + \"/\" + name);\n                Sink   sink     = GSON.fromJson(sinkJson, Sink.class);\n                this.nameSinkMap.put(name, sink);\n            }\n        }\n    }\n\n    private void refreshStreamCache() {\n        for (String token : this.streamMap.keySet()) {\n            String streamJson = getDataFromZK(REVERSE_MESSAGE_STREAM_ZK_PATH + \"/\" + token);\n            Stream stream     = GSON.fromJson(streamJson, Stream.class);\n            this.streamMap.put(token, stream);\n        }\n    }\n\n    public static class Source {\n\n        private String secret;\n        private String name;\n        private String type;\n        private String appId;\n        private String broadcastable;\n        private String routingKey;\n\n        public Source() {\n        }\n\n        public String getSecret() {\n            return secret;\n        }\n\n        public void setSecret(String secret) {\n            this.secret = secret;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public String getType() {\n            return type;\n        }\n\n        public void setType(String type) {\n            this.type = type;\n        }\n\n        public String getAppId() {\n            return appId;\n        }\n\n        public void setAppId(String appId) {\n            this.appId = appId;\n        }\n\n        public String getBroadcastable() {\n            return broadcastable;\n        }\n\n        public void setBroadcastable(String broadcastable) {\n            this.broadcastable = broadcastable;\n        }\n\n        public String getRoutingKey() {\n            return routingKey;\n        }\n\n        public void setRoutingKey(String routingKey) {\n            this.routingKey = routingKey;\n        }\n    }\n\n    public static class Sink {\n        private String secret;\n        private String name;\n        private String queueName;\n        private String routingKey;\n        private String type;\n        private String appId;\n        private String autoAck;\n        private String msgBodySize;\n\n        public Sink() {\n        }\n\n        public String getSecret() {\n            return secret;\n        }\n\n        public void setSecret(String secret) {\n            this.secret = secret;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public String getQueueName() {\n            return queueName;\n        }\n\n        public void setQueueName(String queueName) {\n            this.queueName = queueName;\n        }\n\n        public String getRoutingKey() {\n            return routingKey;\n        }\n\n        public void setRoutingKey(String routingKey) {\n            this.routingKey = routingKey;\n        }\n\n        public String getType() {\n            return type;\n        }\n\n        public void setType(String type) {\n            this.type = type;\n        }\n\n        public String getAppId() {\n            return appId;\n        }\n\n        public void setAppId(String appId) {\n            this.appId = appId;\n        }\n\n        public boolean isAutoAck() {\n            return autoAck == \"1\";\n        }\n\n        public void setAutoAck(String autoAck) {\n            this.autoAck = autoAck;\n        }\n\n        public String getMsgBodySize() {\n            return msgBodySize;\n        }\n\n        public void setMsgBodySize(String msgBodySize) {\n            this.msgBodySize = msgBodySize;\n        }\n    }\n\n    public static class Stream {\n        private String sourceSecret;\n        private String sourceName;\n        private String sinkSecret;\n        private String sinkName;\n        private String token;\n\n        public Stream() {\n        }\n\n        public String getSourceSecret() {\n            return sourceSecret;\n        }\n\n        public void setSourceSecret(String sourceSecret) {\n            this.sourceSecret = sourceSecret;\n        }\n\n        public String getSourceName() {\n            return sourceName;\n        }\n\n        public void setSourceName(String sourceName) {\n            this.sourceName = sourceName;\n        }\n\n        public String getSinkSecret() {\n            return sinkSecret;\n        }\n\n        public void setSinkSecret(String sinkSecret) {\n            this.sinkSecret = sinkSecret;\n        }\n\n        public String getSinkName() {\n            return sinkName;\n        }\n\n        public void setSinkName(String sinkName) {\n            this.sinkName = sinkName;\n        }\n\n        public String getToken() {\n            return token;\n        }\n\n        public void setToken(String token) {\n            this.token = token;\n        }\n    }\n\n    private String getDataFromZK(String path) {\n        try {\n            logger.debug(\"path : \" + path);\n            return new String(openedZookeeper.getData().forPath(path));\n        } catch (Exception e) {\n            logger.error(e);\n        }\n\n        return \"\";\n    }\n\n    private void onPathChildrenChanged(String path) {\n        logger.debug(\"received path change from zookeeper, key : \" + path);\n        String partPath = path.replace(REVERSE_MESSAGE_ZK_PATH + \"/\", \"\");\n\n        if (partPath.startsWith(SOURCE_EVENT_TYPE)) {\n            boolean refreshBySecret = partPath.endsWith(\"secret\");\n            refreshSourceCache(refreshBySecret);\n        } else if (partPath.startsWith(SINK_EVENT_TYPE)) {\n            boolean refreshBySecret = partPath.endsWith(\"secret\");\n            refreshSinkCache(refreshBySecret);\n        } else if (partPath.startsWith(STREAM_EVENT_TYPE)) {\n            refreshStreamCache();\n        } else {\n            logger.warn(\"received unknown event type : \" + partPath);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/GenericContext.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.eventbus.EventBus;\nimport com.rabbitmq.client.Channel;\nimport com.rabbitmq.client.Connection;\n\n/**\n * generic context. contains both general object\n * and those object that it owns resource that must be destroyed\n */\npublic class GenericContext {\n\n    private ConfigManager           configManager;\n    private Channel                 channel;\n    private Connection              connection;\n    private IMessageReceiveListener noticeListener;\n    private EventBus                carryEventBus;\n    private EventBus                componentEventBus;\n\n    public GenericContext() {\n    }\n\n    public ConfigManager getConfigManager() {\n        return configManager;\n    }\n\n    public void setConfigManager(ConfigManager configManager) {\n        this.configManager = configManager;\n    }\n\n    public Channel getChannel() {\n        return channel;\n    }\n\n    public void setChannel(Channel channel) {\n        this.channel = channel;\n    }\n\n    public Connection getConnection() {\n        return connection;\n    }\n\n    public void setConnection(Connection connection) {\n        this.connection = connection;\n    }\n\n    public EventBus getCarryEventBus() {\n        return carryEventBus;\n    }\n\n    public void setCarryEventBus(EventBus carryEventBus) {\n        this.carryEventBus = carryEventBus;\n    }\n\n    public EventBus getComponentEventBus() {\n        return componentEventBus;\n    }\n\n    public void setComponentEventBus(EventBus componentEventBus) {\n        this.componentEventBus = componentEventBus;\n    }\n\n    @Override\n    public String toString() {\n        return \"GeneralContext{}\";\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/IMessageReceiveListener.java",
    "content": "package com.messagebus.client;\n\nimport com.messagebus.client.message.model.Message;\n\n/**\n * message receive listener interface\n */\npublic interface IMessageReceiveListener {\n\n    public void onMessage(Message message);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/IRequestListener.java",
    "content": "package com.messagebus.client;\n\nimport com.messagebus.client.message.model.Message;\n\n/**\n * Created by yanghua on 3/16/15.\n */\npublic interface IRequestListener {\n\n    public Message onRequest(Message requestMsg);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/IRpcMessageProcessor.java",
    "content": "package com.messagebus.client;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic interface IRpcMessageProcessor {\n\n    public byte[] onRpcMessage(byte[] in);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/InnerClient.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.event.component.ClientDestroyEvent;\nimport com.messagebus.client.event.component.ClientInitedEvent;\nimport com.rabbitmq.client.Channel;\nimport com.rabbitmq.client.Connection;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeoutException;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/**\n * Created by yanghua on 3/1/15.\n */\nabstract class InnerClient {\n\n    private static final Log logger = LogFactory.getLog(Messagebus.class);\n\n    private   ConfigManager configManager;\n    private   Connection    connection;\n    protected EventBus      componentEventBus;\n    protected EventBus      carryEventBus;\n\n    private   Channel        channel;\n    protected GenericContext context;\n\n    private AtomicBoolean isOpen = new AtomicBoolean(false);\n\n    public InnerClient() {\n        context = new GenericContext();\n    }\n\n    private void open() {\n        if (this.isOpen())\n            return;\n\n        try {\n            this.channel = this.connection.createChannel();\n            context.setChannel(this.channel);\n        } catch (IOException e) {\n            logger.error(\"create channel error, connection host : \" + this.connection.getAddress().getHostAddress()\n                    + \" connection port : \" + this.connection.getPort(), e);\n            throw new RuntimeException(e);\n        }\n\n        carryEventBus = new EventBus(\"carryEventBus\");\n\n        context.setCarryEventBus(carryEventBus);\n        context.setConfigManager(this.configManager);\n        context.setConnection(this.connection);\n\n        this.isOpen.compareAndSet(false, true);\n\n        this.componentEventBus.post(new ClientInitedEvent());\n    }\n\n    private void close() {\n        //release all resource\n        synchronized (this.channel) {\n            try {\n                if (this.channel != null && this.channel.isOpen())\n                    this.channel.close();\n\n                this.carryEventBus = null;\n\n                this.isOpen.compareAndSet(true, false);\n\n                this.componentEventBus.post(new ClientDestroyEvent());\n            } catch (IOException e) {\n                logger.error(\"close inner client exception : \", e);\n                throw new RuntimeException(\"close inner client exception : \", e);\n            } catch (TimeoutException e) {\n                logger.error(\"close inner client exception : \", e);\n                throw new RuntimeException(\"close inner client exception : \", e);\n            } catch (Exception e) {\n                logger.error(\"close inner client exception : \", e);\n                throw new RuntimeException(\"close inner client exception : \", e);\n            }\n        }\n    }\n\n    public boolean isOpen() {\n        return this.isOpen.get();\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/InnerPool.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.eventbus.EventBus;\nimport com.rabbitmq.client.Connection;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\n/**\n * Created by yanghua on 3/5/15.\n */\nclass InnerPool extends AbstractPool<Messagebus> {\n\n    public InnerPool(GenericObjectPoolConfig poolConfig,\n                     ConfigManager configManager,\n                     Connection connection,\n                     EventBus componentEventBus) {\n        super(poolConfig, new MessagebusFactory(\n                configManager,\n                connection,\n                componentEventBus)\n        );\n    }\n\n    /**\n     * inner class : default messagebus pool\n     */\n    private static class DefaultMessagebusPool extends GenericObjectPoolConfig {\n\n        public DefaultMessagebusPool() {\n            setTestWhileIdle(false);\n            setMinEvictableIdleTimeMillis(60000);\n            setTimeBetweenEvictionRunsMillis(30000);\n            setNumTestsPerEvictionRun(-1);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessageContext.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.rabbitmq.client.Channel;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * the message context, mostly used in handler chain\n */\npublic class MessageContext {\n\n    private static final Log logger = LogFactory.getLog(MessageContext.class);\n\n    private String                  host;\n    private String                  secret;\n    private String                  token;\n    private boolean                 enableTransaction;\n    private Message[]               messages;\n    private String                  consumerTag;\n    private MessageCarryType        carryType;\n    private ConfigManager.Source    source;\n    private ConfigManager.Sink      sink;\n    private ConfigManager.Stream    stream;\n    private Channel                 channel;\n    private IMessageReceiveListener receiveListener;\n    private long                    timeout;\n    private TimeUnit                timeoutUnit;\n    private boolean                 hasTimeout;\n    private int                     consumeMsgNum;\n    private List<Message>           consumeMsgs;\n    private String                  tempQueueName;\n    private ConfigManager           configManager;\n    private IRequestListener        requestListener;\n    private EventBus                carryEventBus;\n\n    private Map<String, Object> otherParams = new HashMap<String, Object>();\n    private boolean             isSync      = false;\n\n    private Throwable throwable;\n\n    public MessageContext() {\n    }\n\n    public String getHost() {\n        return this.host;\n    }\n\n    public void setHost(String host) {\n        this.host = host;\n    }\n\n    public String getSecret() {\n        return secret;\n    }\n\n    public void setSecret(String secret) {\n        this.secret = secret;\n    }\n\n    public String getToken() {\n        return token;\n    }\n\n    public void setToken(String token) {\n        this.token = token;\n    }\n\n    public boolean isEnableTransaction() {\n        return enableTransaction;\n    }\n\n    public void setEnableTransaction(boolean enableTransaction) {\n        this.enableTransaction = enableTransaction;\n    }\n\n    public Message[] getMessages() {\n        return messages;\n    }\n\n    public void setMessages(Message[] messages) {\n        this.messages = messages;\n    }\n\n    public Channel getChannel() {\n        return channel;\n    }\n\n    public void setChannel(Channel channel) {\n        this.channel = channel;\n    }\n\n    public MessageCarryType getCarryType() {\n        return carryType;\n    }\n\n    public void setCarryType(MessageCarryType carryType) {\n        this.carryType = carryType;\n    }\n\n    public ConfigManager.Sink getSink() {\n        return sink;\n    }\n\n    public void setSink(ConfigManager.Sink sink) {\n        this.sink = sink;\n    }\n\n    public ConfigManager.Source getSource() {\n        return source;\n    }\n\n    public void setSource(ConfigManager.Source source) {\n        this.source = source;\n    }\n\n    public ConfigManager.Stream getStream() {\n        return stream;\n    }\n\n    public void setStream(ConfigManager.Stream stream) {\n        this.stream = stream;\n    }\n\n    public Map<String, Object> getOtherParams() {\n        return otherParams;\n    }\n\n    public IMessageReceiveListener getReceiveListener() {\n        return receiveListener;\n    }\n\n    public void setReceiveListener(IMessageReceiveListener receiveListener) {\n        this.receiveListener = receiveListener;\n    }\n\n    public long getTimeout() {\n        return timeout;\n    }\n\n    public void setTimeout(long timeout) {\n        this.timeout = timeout;\n    }\n\n    public TimeUnit getTimeoutUnit() {\n        return timeoutUnit;\n    }\n\n    public void setTimeoutUnit(TimeUnit timeoutUnit) {\n        this.timeoutUnit = timeoutUnit;\n    }\n\n    public boolean isTimeout() {\n        return hasTimeout;\n    }\n\n    public void setIsTimeout(boolean hasTimeout) {\n        this.hasTimeout = hasTimeout;\n    }\n\n    public String getTempQueueName() {\n        return tempQueueName;\n    }\n\n    public void setTempQueueName(String tempQueueName) {\n        this.tempQueueName = tempQueueName;\n    }\n\n    public int getConsumeMsgNum() {\n        return consumeMsgNum;\n    }\n\n    public void setConsumeMsgNum(int consumeMsgNum) {\n        this.consumeMsgNum = consumeMsgNum;\n    }\n\n    public List<Message> getConsumeMsgs() {\n        return consumeMsgs;\n    }\n\n    public void setConsumeMsgs(List<Message> consumeMsgs) {\n        this.consumeMsgs = consumeMsgs;\n    }\n\n    public boolean isSync() {\n        return isSync;\n    }\n\n    public void setSync(boolean isSync) {\n        this.isSync = isSync;\n    }\n\n    public String getConsumerTag() {\n        return consumerTag;\n    }\n\n    public void setConsumerTag(String consumerTag) {\n        this.consumerTag = consumerTag;\n    }\n\n    public ConfigManager getConfigManager() {\n        return configManager;\n    }\n\n    public void setConfigManager(ConfigManager configManager) {\n        this.configManager = configManager;\n    }\n\n    public IRequestListener getRequestListener() {\n        return requestListener;\n    }\n\n    public void setRequestListener(IRequestListener requestListener) {\n        this.requestListener = requestListener;\n    }\n\n    public EventBus getCarryEventBus() {\n        return carryEventBus;\n    }\n\n    public void setCarryEventBus(EventBus carryEventBus) {\n        this.carryEventBus = carryEventBus;\n    }\n\n    public Throwable getThrowable() {\n        return throwable;\n    }\n\n    public void setThrowable(Throwable throwable) {\n        this.throwable = throwable;\n    }\n\n    @Override\n    public String toString() {\n        return \"MessageContext\";\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessageResponseTimeoutException.java",
    "content": "package com.messagebus.client;\n\npublic class MessageResponseTimeoutException extends RuntimeException {\n\n    public MessageResponseTimeoutException() {\n        super();\n    }\n\n    public MessageResponseTimeoutException(String message) {\n        super(message);\n    }\n\n    public MessageResponseTimeoutException(String message, Throwable cause) {\n        super(message, cause);\n    }\n\n    public MessageResponseTimeoutException(Throwable cause) {\n        super(cause);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/Messagebus.java",
    "content": "package com.messagebus.client;\n\nimport com.messagebus.client.carry.*;\nimport com.messagebus.client.message.model.Message;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * the main operator of messagebus client\n */\npublic class Messagebus extends InnerClient implements IProducer, IConsumer,\n        IRequester, IResponser,\n        IRpcRequester, IRpcResponser,\n        IPublisher, ISubscriber,\n        IBroadcaster {\n\n    private static final Log logger = LogFactory.getLog(Messagebus.class);\n\n    private IProducer     producer;\n    private IConsumer     consumer;\n    private IPublisher    publisher;\n    private ISubscriber   subscriber;\n    private IRequester    requester;\n    private IResponser    responser;\n    private IRpcRequester rpcRequester;\n    private IRpcResponser rpcResponser;\n    private IBroadcaster  broadcaster;\n\n    private Messagebus() {\n        super();\n\n        producer = CarryFactory.createProducer(context);\n        consumer = CarryFactory.createConsumer(context);\n        publisher = CarryFactory.createPublisher(context);\n        subscriber = CarryFactory.createSubscriber(context);\n        requester = CarryFactory.createRequester(context);\n        responser = CarryFactory.createResponser(context);\n        rpcRequester = CarryFactory.createRpcRequester(context);\n        rpcResponser = CarryFactory.createRpcResponser(context);\n        broadcaster = CarryFactory.createBroadcaster(context);\n    }\n\n    /**\n     * 生产消息\n     *\n     * @param secret 通过管控台申请的自身队列标识\n     * @param to     目标队列名称（必须通过管控台申请与目标队列的通信权限，否则无法通信）\n     * @param msg    待发送的消息对象\n     * @param token  自身队列跟目标队列通信需要的token，用于校验单向通信是否被授权\n     */\n    @Override\n    public void produce(String secret, String to, Message msg, String token) {\n        producer.produce(secret, to, msg, token);\n    }\n\n    /**\n     * 批量生产消息\n     *\n     * @param secret 通过管控台申请的自身队列标识\n     * @param to     目标队列名称（必须通过管控台申请与目标队列的通信权限，否则无法通信）\n     * @param msgs   待发送的消息对象集合\n     * @param token  自身队列跟目标队列通信需要的token，用于校验单向通信是否被授权\n     */\n    @Override\n    public void batchProduce(String secret, String to, Message[] msgs, String token) {\n        producer.batchProduce(secret, to, msgs, token);\n    }\n\n    /**\n     * 实时消息消费(Push)，该消息消费API被设计为阻塞式的，具体的阻塞时间依赖<param>timeout</param>,\n     * 以及<param>TimeUnit</param>这两个参数确定。被阻塞期间，会产生一定时间内的消息消费的事件处理循环。\n     * 在这段时间内，只要总线的队列里有消息，都会被推送到客户端来。因此该API的实用场景为：实时消费。\n     * 需要注意的是，如果实时消费的时间较长，请将<param>timeout</param>的值设置为: Integer.MAX_VALUE。\n     * 并在一个独立的线程上进行异步消费，然后将该线程的控制权外放给主线程或其他控制线程。\n     * 另外如果实时消费处于web环境下，推荐将消费线程的启停通过继承<code>ServletContextListener</code>\n     * 类实现一个特定的Listener来加以控制。\n     *\n     * @param secret    通过管控台申请的自身队列标识\n     * @param timeout   阻塞超时时间值，该值必须与参数<param>unit</param>一起参考才有意义\n     * @param unit      阻塞超时时间的单位，该值必须与参数<param>timeout</param>一起参考才有意义\n     * @param onMessage 收到消息后触发的事件，用于实现自己的消息处理实现\n     */\n    @Override\n    public void consume(String secret, long timeout, TimeUnit unit, IMessageReceiveListener onMessage) {\n        consumer.consume(secret, timeout, unit, onMessage);\n    }\n\n    /**\n     * 同步获取式(Pull)消息消费API，该API提供同步获取<param>expectedNum</param>条消息的功能\n     * 需要注意的是，该参数<param>expectedNum</param>为单次调用能够获取到的最大值\n     *\n     * @param secret      通过管控台申请的自身队列标识\n     * @param expectedNum 希望获取到的消息条数\n     * @return 消费到的消息对象的集合\n     */\n    @Override\n    public List<Message> consume(String secret, int expectedNum) {\n        return consumer.consume(secret, expectedNum);\n    }\n\n    /**\n     * 请求消息API，该接口用于实现常用C/S或B/S架构的request/response的request方，\n     * 当消息发送后，它阻塞等待响应消息，直到：\n     * - 收到响应\n     * - 等待指定的时间后超时（抛出MessageResponseTimeoutException异常）\n     *\n     * @param secret  通过管控台申请的自身队列标识\n     * @param to      目标队列的队列名称\n     * @param msg     请求消息对象\n     * @param token   自身队列跟目标队列通信需要的token，用于校验单向通信是否被授权\n     * @param timeout 指定的超时时间，默认单位为秒\n     * @return 获取到的响应消息对象\n     * @throws MessageResponseTimeoutException 当超过指定的<param>timeout</param>时间后，\n     *                                         仍未收到响应，将抛出该异常\n     */\n    @Override\n    public Message request(String secret, String to, Message msg, String token, long timeout)\n            throws MessageResponseTimeoutException {\n        return requester.request(secret, to, msg, token, timeout);\n    }\n\n    /**\n     * 应答/响应API，该接口用于实现request/response的response方，因为response方通常需要一个事件处理循环，\n     * 所以该API也是阻塞式的，阻塞的时间依据参数<param>timeout</param>以及<param>timeUnit</param>联合确定。\n     * 如果阻塞的时间非常长，请将<param>timeout</param>设置为Integer.MAX_VALUE，\n     * 然后以一个独立的事件处理线程来控制它，并将该事件处理线程的控制权暴露给主控线程\n     *\n     * @param secret    通过管控台申请的自身队列标识\n     * @param onRequest 当前请求消息到来时触发的时间，用于获取请求消息，并已返回值的方式返回响应消息\n     * @param timeout   阻塞超时时间值，该值必须与参数<param>unit</param>一起参考才有意义\n     * @param timeUnit  阻塞超时时间的单位，该值必须与参数<param>timeout</param>一起参考才有意义\n     */\n    @Override\n    public void response(String secret, IRequestListener onRequest, long timeout, TimeUnit timeUnit) {\n        responser.response(secret, onRequest, timeout, timeUnit);\n    }\n\n    /**\n     * 发布消息API，该接口会将消息发布给所有通过管控台申请的所有订阅者\n     *\n     * @param secret 通过管控台申请的自身队列标识\n     * @param msgs   要发布的消息数组\n     */\n    @Override\n    public void publish(String secret, Message[] msgs) {\n        publisher.publish(secret, msgs);\n    }\n\n    /**\n     * 订阅消息API，这里假设订阅的场景具有较强的实时性，因此它以阻塞式的事件方式提供调用\n     * 阻塞的时间依据参数<param>timeout</param>以及<param>timeUnit</param>联合确定。\n     * 如果阻塞的时间非常长，请将<param>timeout</param>设置为Integer.MAX_VALUE，\n     * 然后以一个独立的处理线程来控制它，并将该处理线程的控制权暴露给主控线程\n     *\n     * @param secret    通过管控台申请的自身队列标识\n     * @param from\n     * @param token\n     * @param onMessage 订阅某个频道队列(Channel Queue)后，收到消息的事件处理器\n     * @param timeout   阻塞超时时间值，该值必须与参数<param>unit</param>一起参考才有意义\n     * @param unit      阻塞超时时间的单位，该值必须与参数<param>timeout</param>一起参考才有意义\n     */\n    @Override\n    public void subscribe(String secret, String from, String token, IMessageReceiveListener onMessage, long timeout, TimeUnit unit) {\n        subscriber.subscribe(secret, from, token, onMessage, timeout, unit);\n    }\n\n    /**\n     * 广播消息的接口，广播权限需要从管控台申请\n     *\n     * @param secret 通过管控台申请的自身队列标识\n     * @param msgs   待广播的消息对象数组\n     */\n    @Override\n    public void broadcast(String secret, Message[] msgs) {\n        broadcaster.broadcast(secret, msgs);\n    }\n\n    /**\n     * 广播消息接收API，注意：不是每个队列都能收到广播消息。通常情况下，\n     * 只有能获取消息的队列才能收到广播消息，广播消息不是必须要求消费的，但推荐在调用消息总线的所有API时，\n     * 设置广播消息处理器。如果不设置该处理器，在收到广播消息时，广播消息将被丢弃！\n     *\n     * @param notificationListener 广播消息接收处理器\n     */\n    @Deprecated\n    public void setNotificationListener(IMessageReceiveListener notificationListener) {\n        throw new UnsupportedOperationException(\"this interface has been deprecated! \");\n    }\n\n    /**\n     * 支持JSON协议的远程过程调用(JSON-RPC)的请求接口，用于请求一个远程方法，并指定一个获取响应的超时时间。\n     * 注意，RPC的请求方需要通过管控台授权，拿到token才能发起请求，另外参数顺序必须与目标方法的参数顺序一致。\n     *\n     * @param secret               通过管控台申请的自身队列标识\n     * @param target               目标队列\n     * @param methodName           目标方法名称\n     * @param params               目标方法的处理参数\n     * @param token                自身队列跟目标队列通信需要的token，用于校验单向通信是否被授权\n     * @param timeoutOfMilliSecond 超时的毫秒数\n     * @return 远程方法调用的返回值，通常只支持：String/Object/Map这些简单java原生对象格式\n     */\n    @Override\n    public Object call(String secret, String target, String methodName,\n                       Object[] params, String token, long timeoutOfMilliSecond) {\n        return rpcRequester.call(secret, target, methodName, params, token, timeoutOfMilliSecond);\n    }\n\n    /**\n     * 支持JSON协议的远程过程调用(JSON-RPC)的响应接口，用于作为一个远程方法的响应方，因此为阻塞式事件处理形式。\n     * 阻塞的时间依据参数<param>timeout</param>以及<param>timeUnit</param>联合确定。\n     * 如果阻塞的时间非常长，请将<param>timeout</param>设置为Integer.MAX_VALUE，\n     * 然后以一个独立的处理线程来控制它，并将该处理线程的控制权暴露给主控线程\n     *\n     * @param secret           通过管控台申请的自身队列标识\n     * @param clazzOfInterface 用于响应处理的接口的Class实例\n     * @param serviceProvider  用于响应处理的服务提供者对象，该对象必须实现<param>clazzOfInterface</param>对应的接口\n     * @param timeout          阻塞超时时间值，该值必须与参数<param>unit</param>一起参考才有意义\n     * @param timeUnit         阻塞超时时间的单位，该值必须与参数<param>timeout</param>一起参考才有意义\n     */\n    @Override\n    public void callback(String secret, Class<?> clazzOfInterface,\n                         Object serviceProvider, long timeout, TimeUnit timeUnit) {\n        rpcResponser.callback(secret, clazzOfInterface, serviceProvider, timeout, timeUnit);\n    }\n\n    /**\n     * 原始数据格式请求API，该API为request的原始形式，另一个作用是辅助实现以消息总线作为底层通信的\n     * 第三方RPC框架的接入。具体实现可参考package:\n     * com.messagebus.client.extension.thrift.TAMQPClientTransport\n     *\n     * @param secret               通过管控台申请的自身队列标识\n     * @param target               目标队列\n     * @param requestMsg           请求消息被序列化后的字节数组\n     * @param token                自身队列跟目标队列通信需要的token，用于校验单向通信是否被授权\n     * @param timeoutOfMilliSecond 等待响应的超时时间(毫秒数)\n     * @return 响应消息被序列化后的字节数组\n     */\n    @Override\n    public byte[] primitiveRequest(String secret, String target, byte[] requestMsg,\n                                   String token, long timeoutOfMilliSecond) {\n        return requester.primitiveRequest(secret, target, requestMsg, token, timeoutOfMilliSecond);\n    }\n\n    /**\n     * 用于构建RPC响应服务器的帮助方法，该方法用于辅助第三方RPC框架来构造用于消息总线的通信方式以及事件处理循环\n     *\n     * @param secret          通过管控台申请的自身队列标识\n     * @param rpcMsgProcessor 一个RPC消息处理器，当有RPC请求消息到来时触发\n     * @return 返回一个被包装过的RPCServer\n     */\n    @Override\n    public WrappedRpcServer buildRpcServer(String secret, IRpcMessageProcessor rpcMsgProcessor) {\n        return rpcResponser.buildRpcServer(secret, rpcMsgProcessor);\n    }\n\n    /**\n     * 注册消息总线支持的事件处理器；事件处理器对象遵循Guava的事件订阅模式（@Subscribe）\n     *\n     * @param eventProcessor 事件处理器对象的实例\n     */\n    public void registerEventProcessor(Object eventProcessor) {\n        componentEventBus.register(eventProcessor);\n    }\n\n\n    /**\n     * 注销消息总线支持的事件处理器；\n     *\n     * @param eventProcessor 事件处理器对象的实例\n     */\n    public void unregisterEventProcessor(Object eventProcessor) {\n        componentEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessagebusConnectedFailedException.java",
    "content": "package com.messagebus.client;\n\n/**\n * the exception about messagebus connect failed exception\n */\npublic class MessagebusConnectedFailedException extends Exception {\n\n    public MessagebusConnectedFailedException() {\n        super();\n    }\n\n    public MessagebusConnectedFailedException(String message) {\n        super(message);\n    }\n\n    public MessagebusConnectedFailedException(String message, Throwable cause) {\n        super(message, cause);\n    }\n\n    public MessagebusConnectedFailedException(Throwable cause) {\n        super(cause);\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessagebusFactory.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.common.ExceptionHelper;\nimport com.rabbitmq.client.Connection;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.commons.pool2.PooledObject;\nimport org.apache.commons.pool2.PooledObjectFactory;\nimport org.apache.commons.pool2.impl.DefaultPooledObject;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\n/**\n * Created by yanghua on 3/5/15.\n */\nclass MessagebusFactory implements PooledObjectFactory<Messagebus> {\n\n    private static final Log logger = LogFactory.getLog(MessagebusFactory.class.getName());\n\n    private ConfigManager configManager;\n    private Connection    connection;\n    private EventBus      componentEventBus;\n\n    private final Method openMethod;\n    private final Method closeMethod;\n\n    public MessagebusFactory(ConfigManager configManager,\n                             Connection connection,\n                             EventBus componentEventBus) {\n        this.configManager = configManager;\n        this.connection = connection;\n        this.componentEventBus = componentEventBus;\n\n        try {\n            openMethod = Messagebus.class.getSuperclass().getDeclaredMethod(\"open\");\n            openMethod.setAccessible(true);\n            closeMethod = Messagebus.class.getSuperclass().getDeclaredMethod(\"close\");\n            closeMethod.setAccessible(true);\n        } catch (NoSuchMethodException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public PooledObject<Messagebus> makeObject() throws Exception {\n        Constructor<Messagebus> privateCtor = Messagebus.class.getDeclaredConstructor();\n        privateCtor.setAccessible(true);\n        Messagebus client = privateCtor.newInstance();\n        privateCtor.setAccessible(false);\n\n        Class<?> superClient = Messagebus.class.getSuperclass();\n\n        //set private field\n        Field configManagerField = superClient.getDeclaredField(\"configManager\");\n        configManagerField.setAccessible(true);\n        configManagerField.set(client, this.configManager);\n        configManagerField.setAccessible(false);\n\n        Field connectionField = superClient.getDeclaredField(\"connection\");\n        connectionField.setAccessible(true);\n        connectionField.set(client, this.connection);\n        connectionField.setAccessible(false);\n\n        Field componentEventBus = superClient.getDeclaredField(\"componentEventBus\");\n        componentEventBus.setAccessible(true);\n        componentEventBus.set(client, this.componentEventBus);\n        componentEventBus.setAccessible(false);\n\n        openMethod.invoke(client);\n\n        return new DefaultPooledObject<Messagebus>(client);\n    }\n\n    @Override\n    public void destroyObject(PooledObject<Messagebus> pooledObject) throws Exception {\n        Messagebus client = pooledObject.getObject();\n        if (client != null) {\n            if (client.isOpen()) {\n                closeMethod.invoke(client);\n            }\n        }\n    }\n\n    @Override\n    public boolean validateObject(PooledObject<Messagebus> pooledObject) {\n        Messagebus client = pooledObject.getObject();\n        if (client != null && !client.isOpen()) {\n            try {\n                openMethod.invoke(client);\n            } catch (IllegalAccessException e) {\n                ExceptionHelper.logException(logger, e, \"validateObject\");\n            } catch (InvocationTargetException e) {\n                ExceptionHelper.logException(logger, e, \"validateObject\");\n            }\n        }\n\n        return client != null && client.isOpen();\n    }\n\n    @Override\n    public void activateObject(PooledObject<Messagebus> pooledObject) throws Exception {\n\n    }\n\n    @Override\n    public void passivateObject(PooledObject<Messagebus> pooledObject) throws Exception {\n\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessagebusPool.java",
    "content": "package com.messagebus.client;\n\nimport com.google.common.base.Strings;\nimport com.google.common.eventbus.AsyncEventBus;\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.event.component.ClientDestroyEventProcessor;\nimport com.messagebus.client.event.component.ClientInitedEventProcessor;\nimport com.messagebus.client.event.component.NoticeEvent;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.RandomHelper;\nimport com.messagebus.interactor.proxy.ProxyConsumer;\nimport com.rabbitmq.client.*;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\nimport org.apache.curator.RetryPolicy;\nimport org.apache.curator.framework.CuratorFramework;\nimport org.apache.curator.framework.CuratorFrameworkFactory;\nimport org.apache.curator.framework.imps.CuratorFrameworkState;\nimport org.apache.curator.retry.ExponentialBackoffRetry;\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeoutException;\n\n/**\n * Created by yanghua on 3/18/15.\n */\npublic class MessagebusPool {\n\n    private static final Log logger = LogFactory.getLog(MessagebusPool.class);\n\n    private static final String INNER_EXCHANGE_NAME        = \"exchange.proxy.message.inner\";\n    private static final String EVENT_ROUTING_KEY_NAME     = \"routingkey.proxy.message.inner.event\";\n    private static final String NOTICE_ROUTING_KEY_NAME    = \"routingkey.proxy.message.inner.notice\";\n    private static final String EVENT_QUEUE_NAME_PREFIX    = \"autodelete_exclusive.queue.proxy.message.inner.event.\";\n    private static final String NOTICE_QUEUE_NAME_PREFIX   = \"autodelete_exclusive.queue.proxy.message.inner.notice.\";\n    private static final String EVENT_CONSUMER_TAG_PREFIX  = \"tag.proxy.message.inner.event.\";\n    private static final String NOTICE_CONSUMER_TAG_PREFIX = \"tag.proxy.message.inner.notice.\";\n    private static final String MESSAGE_SERVER_ZK_PATH     = \"/component/message/server\";\n\n    private com.rabbitmq.client.Address[] innerAddresses;\n    private ConfigManager                 configManager;\n    private CuratorFramework              zookeeper;\n    private Connection                    connection;\n    private Channel                       innerChannel;\n    private EventBus                      componentEventBus;\n    private RemoteNoticeListener          remoteNoticeListener;\n\n    protected InnerPool innerPool;\n\n    public MessagebusPool(String zkConnectionStr,\n                          GenericObjectPoolConfig poolConfig) {\n        this.init(zkConnectionStr);\n        this.innerPool = new InnerPool(poolConfig,\n                configManager,\n                connection,\n                componentEventBus);\n    }\n\n    public void registerComponentEventListener(Object listener) {\n        this.componentEventBus.register(listener);\n    }\n\n    public Messagebus getResource() {\n        return this.innerPool.getResource();\n    }\n\n    public void returnResource(Messagebus client) {\n        this.innerPool.returnResource(client);\n    }\n\n    public void destroy() {\n        this.remoteNoticeListener.shutdown();\n\n        this.innerPool.destroy();\n\n        try {\n            if (this.innerChannel != null && this.innerChannel.isOpen()) {\n                this.innerChannel.close();\n            }\n\n            if (this.connection != null && this.connection.isOpen()) {\n                this.connection.close();\n            }\n\n            if (zookeeper != null\n                    && zookeeper.getState().equals(CuratorFrameworkState.STARTED)) {\n                this.zookeeper.close();\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (TimeoutException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (Exception e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    protected void init(String zkConnectionStr) {\n        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);\n        zookeeper = CuratorFrameworkFactory.newClient(\n                zkConnectionStr, retryPolicy);\n\n        try {\n            zookeeper.start();\n            String mqConnectionStr = new String(\n                    zookeeper.getData().forPath(MESSAGE_SERVER_ZK_PATH)\n            );\n\n            if (Strings.isNullOrEmpty(mqConnectionStr)) {\n                logger.info(\"can not get mq connection info\");\n                throw new RuntimeException(\"can not get mq connection info\");\n            }\n            String[] hostPortPairArr = mqConnectionStr.split(\",\");\n\n            this.innerAddresses = new com.rabbitmq.client.Address[hostPortPairArr.length];\n\n            for (int i = 0; i < hostPortPairArr.length; i++) {\n                String[] hostPortArr = hostPortPairArr[i].split(\":\");\n                com.rabbitmq.client.Address address = new com.rabbitmq.client.Address(\n                        hostPortArr[0], Integer.parseInt(hostPortArr[1])\n                );\n                this.innerAddresses[i] = address;\n            }\n\n            this.componentEventBus = new AsyncEventBus(\"componentEventBus\",\n                    Executors.newSingleThreadExecutor());\n\n            this.configManager = new ConfigManager(zookeeper);\n            this.configManager.setComponentEventBus(this.componentEventBus);\n\n            this.registerComponentEventProcessor();\n\n            ConnectionFactory connectionFactory = new ConnectionFactory();\n\n            connectionFactory.setAutomaticRecoveryEnabled(true);\n            connectionFactory.setTopologyRecoveryEnabled(true);\n            connectionFactory.setConnectionTimeout(60000);\n            connectionFactory.setRequestedHeartbeat(10);\n\n            this.connection = connectionFactory.newConnection(innerAddresses);\n            this.innerChannel = this.connection.createChannel();\n\n        } catch (IOException e) {\n            logger.error(\"init message pool exception \", e);\n            throw new RuntimeException(\"init message pool exception\", e);\n        } catch (TimeoutException e) {\n            logger.error(\"init message pool exception \", e);\n            throw new RuntimeException(\"init message pool exception \", e);\n        } catch (Exception e) {\n            logger.error(\"init message pool exception \", e);\n            throw new RuntimeException(\"init message pool exception \", e);\n        }\n\n        this.remoteNoticeListener = new RemoteNoticeListener();\n\n        //start listen remote notice\n        this.remoteNoticeListener.start();\n    }\n\n    private void registerComponentEventProcessor() {\n        this.componentEventBus.register(new ClientDestroyEventProcessor());\n        this.componentEventBus.register(new ClientInitedEventProcessor());\n    }\n\n    private class RemoteNoticeListener implements Runnable {\n\n        private Thread currentThread;\n\n        public RemoteNoticeListener() {\n            this.currentThread = new Thread(this);\n            this.currentThread.setDaemon(true);\n            this.currentThread.setName(\"remote notice listener\");\n        }\n\n        @Override\n        public void run() {\n            try {\n                String queueName = NOTICE_QUEUE_NAME_PREFIX + RandomHelper.randomNumberAndCharacter(5);\n                //declare a non-durable auto-delete & exclusive queue then consume\n                innerChannel.queueDeclare(queueName, false, true, true, null);\n\n                Map<String, Object> matchHeader = new HashMap<String, Object>(2);\n                matchHeader.put(\"x-match\", \"all\");\n                matchHeader.put(\"type\", \"notice\");\n                innerChannel.queueBind(queueName, INNER_EXCHANGE_NAME, NOTICE_ROUTING_KEY_NAME, matchHeader);\n\n                String randomTag = RandomHelper.randomNumberAndCharacter(6);\n                QueueingConsumer consumer = ProxyConsumer.consume(\n                        innerChannel,\n                        queueName,\n                        true,\n                        NOTICE_CONSUMER_TAG_PREFIX + randomTag);\n                while (true) {\n                    QueueingConsumer.Delivery delivery = consumer.nextDelivery();\n\n                    final Message msg = MessageFactory.createMessage(delivery);\n\n                    if (msg == null) continue;\n\n                    NoticeEvent noticeEvent = new NoticeEvent();\n                    noticeEvent.setMsg(msg);\n\n                    componentEventBus.post(noticeEvent);\n                }\n            } catch (InterruptedException e) {\n            } catch (ShutdownSignalException e) {\n                logger.error(e);\n            } catch (Exception e) {\n                logger.error(e);\n            }\n        }\n\n        public void start() {\n            this.currentThread.start();\n        }\n\n        public void shutdown() {\n            this.currentThread.interrupt();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessagebusSinglePool.java",
    "content": "package com.messagebus.client;\n\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\n/**\n * Created by yanghua on 3/18/15.\n */\npublic class MessagebusSinglePool extends MessagebusPool {\n\n    public MessagebusSinglePool(String zkConnectionStr) {\n        super(zkConnectionStr, new DefaultMessagebusPoolConfig());\n    }\n\n    /**\n     * inner class : single messagebus instance config\n     */\n    private static class DefaultMessagebusPoolConfig extends GenericObjectPoolConfig {\n\n        public DefaultMessagebusPoolConfig() {\n            setTestWhileIdle(false);\n            setMaxTotal(1);\n            setMinEvictableIdleTimeMillis(60000);\n            setTimeBetweenEvictionRunsMillis(30000);\n            setNumTestsPerEvictionRun(-1);\n        }\n\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/MessagebusUnOpenException.java",
    "content": "package com.messagebus.client;\n\n/**\n * the exception about messagebus unopened, mostly for semantic\n */\npublic class MessagebusUnOpenException extends RuntimeException {\n\n    public MessagebusUnOpenException() {\n        super();\n    }\n\n    public MessagebusUnOpenException(String message) {\n        super(message);\n    }\n\n    public MessagebusUnOpenException(String message, Throwable cause) {\n        super(message, cause);\n    }\n\n    public MessagebusUnOpenException(Throwable cause) {\n        super(cause);\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/WrappedRpcServer.java",
    "content": "package com.messagebus.client;\n\nimport com.messagebus.common.ExceptionHelper;\nimport com.rabbitmq.client.RpcServer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 4/16/15.\n */\npublic class WrappedRpcServer {\n\n    private static final Log logger = LogFactory.getLog(WrappedRpcServer.class);\n\n    private RpcServer innerRpcServer;\n\n    private WrappedRpcServer(RpcServer rpcServer) {\n        this.innerRpcServer = rpcServer;\n    }\n\n    public void mainLoop() {\n        try {\n            innerRpcServer.mainloop();\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"mainLoop\");\n            throw new RuntimeException(e);\n        }\n    }\n\n    public void terminateMainloop() {\n        innerRpcServer.terminateMainloop();\n    }\n\n    public void close() {\n        try {\n            innerRpcServer.close();\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"close\");\n            throw new RuntimeException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/AbstractMessageCarryer.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.GenericContext;\nimport com.messagebus.client.MessageContext;\n\n/**\n * abstract class of message carryer\n * in message bus, we treat producer and consumer as carryer\n */\nabstract class AbstractMessageCarryer {\n\n    private GenericContext context;\n\n    protected MessageContext initMessageContext() {\n        MessageContext msgCtx = new MessageContext();\n        msgCtx.setConfigManager(this.context.getConfigManager());\n        msgCtx.setChannel(this.context.getChannel());\n        msgCtx.setHost(this.context.getConnection().getAddress().getHostAddress());\n        msgCtx.setCarryEventBus(this.context.getCarryEventBus());\n\n        return msgCtx;\n    }\n\n    public GenericContext getContext() {\n        return context;\n    }\n\n    public void setContext(GenericContext context) {\n        this.context = context;\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/CarryFactory.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.GenericContext;\n\n/**\n * Created by yanghua on 4/2/15.\n */\npublic class CarryFactory {\n\n    public static IBroadcaster createBroadcaster(GenericContext context) {\n        GenericBroadcaster broadcaster = new GenericBroadcaster();\n        broadcaster.setContext(context);\n\n        return broadcaster;\n    }\n\n    public static IConsumer createConsumer(GenericContext context) {\n        GenericConsumer consumer = new GenericConsumer();\n        consumer.setContext(context);\n\n        return consumer;\n    }\n\n    public static IProducer createProducer(GenericContext context) {\n        GenericProducer producer = new GenericProducer();\n        producer.setContext(context);\n\n        return producer;\n    }\n\n    public static IPublisher createPublisher(GenericContext context) {\n        GenericPublisher publisher = new GenericPublisher();\n        publisher.setContext(context);\n\n        return publisher;\n    }\n\n    public static IRequester createRequester(GenericContext context) {\n        GenericRequester requester = new GenericRequester();\n        requester.setContext(context);\n\n        return requester;\n    }\n\n    public static IResponser createResponser(GenericContext context) {\n        GenericResponser responser = new GenericResponser();\n        responser.setContext(context);\n\n        return responser;\n    }\n\n    public static IRpcRequester createRpcRequester(GenericContext context) {\n        GenericRpcRequester rpcRequester = new GenericRpcRequester();\n        rpcRequester.setContext(context);\n\n        return rpcRequester;\n    }\n\n    public static IRpcResponser createRpcResponser(GenericContext context) {\n        GenericRpcResponser rpcResponser = new GenericRpcResponser();\n        rpcResponser.setContext(context);\n\n        return rpcResponser;\n    }\n\n    public static ISubscriber createSubscriber(GenericContext context) {\n        GenericSubscriber subscriber = new GenericSubscriber();\n        subscriber.setContext(context);\n\n        return subscriber;\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericBroadcaster.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.BroadcastEventProcessor;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nclass GenericBroadcaster extends AbstractMessageCarryer implements IBroadcaster {\n\n    private static final Log logger = LogFactory.getLog(GenericBroadcaster.class);\n\n    public GenericBroadcaster() {\n    }\n\n    @Override\n    public void broadcast(String secret, Message[] msgs) {\n        MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setCarryType(MessageCarryType.BROADCAST);\n        ctx.setSource(this.getContext().getConfigManager().getSourceBySecret(secret));\n        ctx.setMessages(msgs);\n\n        this.innerBroadcast(ctx);\n    }\n\n    private void innerBroadcast(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        BroadcastEventProcessor eventProcessor = new BroadcastEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        CommonEventProcessor.MsgIdGenerateEvent      msgIdGenerateEvent   = new CommonEventProcessor.MsgIdGenerateEvent();\n        BroadcastEventProcessor.ValidateEvent        validateEvent        = new BroadcastEventProcessor.ValidateEvent();\n        BroadcastEventProcessor.PermissionCheckEvent permissionCheckEvent = new BroadcastEventProcessor.PermissionCheckEvent();\n        BroadcastEventProcessor.BroadcastEvent       broadcastEvent       = new BroadcastEventProcessor.BroadcastEvent();\n\n        msgIdGenerateEvent.setMessageContext(ctx);\n        validateEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        broadcastEvent.setMessageContext(ctx);\n\n        carryEventBus.post(msgIdGenerateEvent);\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(broadcastEvent);\n\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericConsumer.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.event.carry.ConsumeEventProcessor;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 6/26/15.\n */\nclass GenericConsumer extends AbstractMessageCarryer implements IConsumer {\n\n    private static final Log logger = LogFactory.getLog(GenericConsumer.class);\n\n    @Override\n    public void consume(String secret, long timeout, TimeUnit unit, IMessageReceiveListener onMessage) {\n        logger.debug(\"current secret is : \" + secret);\n        final MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setCarryType(MessageCarryType.CONSUME);\n        ctx.setSink(this.getContext().getConfigManager().getSinkBySecret(secret));\n        ctx.setReceiveListener(onMessage);\n        ctx.setTimeout(timeout);\n        ctx.setTimeoutUnit(unit);\n        ctx.setSync(false);\n\n        this.innerConsume(ctx);\n    }\n\n    @Override\n    public List<Message> consume(String secret, int expectedNum) {\n        final MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setCarryType(MessageCarryType.CONSUME);\n        ctx.setSink(this.getContext().getConfigManager().getSinkBySecret(secret));\n        ctx.setConsumeMsgNum(expectedNum);\n        ctx.setSync(true);\n\n        this.innerConsume(ctx);\n\n        return ctx.getConsumeMsgs();\n    }\n\n    private void innerConsume(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        ConsumeEventProcessor eventProcessor = new ConsumeEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        //init events\n        ConsumeEventProcessor.ValidateEvent        validateEvent        = new ConsumeEventProcessor.ValidateEvent();\n        ConsumeEventProcessor.PermissionCheckEvent permissionCheckEvent = new ConsumeEventProcessor.PermissionCheckEvent();\n        ConsumeEventProcessor.TagGenerateEvent     tagGenerateEvent     = new ConsumeEventProcessor.TagGenerateEvent();\n        CommonEventProcessor.PreConsumeEvent       perConsumeEvent      = new CommonEventProcessor.PreConsumeEvent();\n\n        validateEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        tagGenerateEvent.setMessageContext(ctx);\n        perConsumeEvent.setMessageContext(ctx);\n\n        //arrange event order and emit\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(tagGenerateEvent);\n        carryEventBus.post(perConsumeEvent);\n\n        if (ctx.isSync()) {\n            ConsumeEventProcessor.SyncConsumeEvent syncConsumeEvent = new ConsumeEventProcessor.SyncConsumeEvent();\n            syncConsumeEvent.setMessageContext(ctx);\n            carryEventBus.post(syncConsumeEvent);\n        } else {\n            ConsumeEventProcessor.AsyncMessageLoopEvent asyncMessageLoopEvent = new ConsumeEventProcessor.AsyncMessageLoopEvent();\n            asyncMessageLoopEvent.setMessageContext(ctx);\n            carryEventBus.post(asyncMessageLoopEvent);\n        }\n\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericProducer.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.ProduceEventProcessor;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * a generic producer implements the IProducer interface\n */\nclass GenericProducer extends AbstractMessageCarryer implements IProducer {\n\n    private static final Log logger = LogFactory.getLog(GenericProducer.class);\n\n    /**\n     * simple producer just produces a message\n     *\n     * @param secret\n     * @param to     the message's destination\n     * @param msg    a general message\n     * @param token\n     */\n    @Override\n    public void produce(String secret, String to, Message msg, String token) {\n        MessageContext ctx = this.initMsgContext(secret, to, token);\n        ctx.setMessages(new Message[]{msg});\n        innerProduce(ctx);\n    }\n\n    /**\n     * a producer produces a set of messages\n     *\n     * @param secret\n     * @param to     the message's destination\n     * @param msgs   a general message's array\n     * @param token\n     */\n    @Override\n    public void batchProduce(String secret, String to, Message[] msgs, String token) {\n        MessageContext context = this.initMsgContext(secret, to, token);\n        context.setMessages(msgs);\n        innerProduce(context);\n    }\n\n    private MessageContext initMsgContext(String secret, String to, String token) {\n        MessageContext context = initMessageContext();\n        context.setSecret(secret);\n        context.setCarryType(MessageCarryType.PRODUCE);\n        context.setSource(this.getContext().getConfigManager().getSourceBySecret(secret));\n        ConfigManager.Sink sink = this.getContext().getConfigManager().getSinkByName(to);\n        context.setSink(sink);\n        context.setToken(token);\n        context.setStream(this.getContext().getConfigManager().getStreamByToken(token));\n\n        return context;\n    }\n\n    private void innerProduce(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        ProduceEventProcessor eventProcessor = new ProduceEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        //init events\n        ProduceEventProcessor.ValidateEvent         validateEvent         = new ProduceEventProcessor.ValidateEvent();\n        ProduceEventProcessor.MsgBodySizeCheckEvent msgBodySizeCheckEvent = new ProduceEventProcessor.MsgBodySizeCheckEvent();\n        ProduceEventProcessor.PermissionCheckEvent  permissionCheckEvent  = new ProduceEventProcessor.PermissionCheckEvent();\n        ProduceEventProcessor.MsgIdGenerateEvent    msgIdGenerateEvent    = new ProduceEventProcessor.MsgIdGenerateEvent();\n        ProduceEventProcessor.MsgBodyCompressEvent  msgBodyCompressEvent  = new ProduceEventProcessor.MsgBodyCompressEvent();\n        ProduceEventProcessor.ProduceEvent          produceEvent          = new ProduceEventProcessor.ProduceEvent();\n\n        validateEvent.setMessageContext(ctx);\n        msgBodySizeCheckEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        msgIdGenerateEvent.setMessageContext(ctx);\n        msgBodyCompressEvent.setMessageContext(ctx);\n        produceEvent.setMessageContext(ctx);\n\n        //arrange event order and emit!\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(msgBodySizeCheckEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(msgIdGenerateEvent);\n        carryEventBus.post(msgBodyCompressEvent);\n        carryEventBus.post(produceEvent);\n\n        //unregister event processor\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericPublisher.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.event.carry.PublishEventProcessor;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nclass GenericPublisher extends AbstractMessageCarryer implements IPublisher {\n\n    private static final Log logger = LogFactory.getLog(GenericPublisher.class);\n\n    public GenericPublisher() {\n    }\n\n    @Override\n    public void publish(String secret, Message[] msgs) {\n        MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setCarryType(MessageCarryType.PUBLISH);\n        ctx.setSource(this.getContext().getConfigManager().getSourceBySecret(secret));\n        ctx.setMessages(msgs);\n\n        this.innerPublish(ctx);\n    }\n\n    private void innerPublish(MessageContext context) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        PublishEventProcessor eventProcessor = new PublishEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        //init events\n        CommonEventProcessor.MsgIdGenerateEvent    msgIdGenerateEvent   = new CommonEventProcessor.MsgIdGenerateEvent();\n        PublishEventProcessor.ValidateEvent        validateEvent        = new PublishEventProcessor.ValidateEvent();\n        PublishEventProcessor.PermissionCheckEvent permissionCheckEvent = new PublishEventProcessor.PermissionCheckEvent();\n        PublishEventProcessor.PublishEvent         publishEvent         = new PublishEventProcessor.PublishEvent();\n\n        msgIdGenerateEvent.setMessageContext(context);\n        validateEvent.setMessageContext(context);\n        permissionCheckEvent.setMessageContext(context);\n        publishEvent.setMessageContext(context);\n\n        //arrange event order and emit\n        carryEventBus.post(msgIdGenerateEvent);\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(publishEvent);\n\n        //unregister\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericRequester.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.MessageResponseTimeoutException;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.event.carry.RequestEventProcessor;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.common.Constants;\nimport com.messagebus.common.ExceptionHelper;\nimport com.rabbitmq.client.RpcClient;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeoutException;\n\nclass GenericRequester extends AbstractMessageCarryer implements IRequester {\n\n    private static final Log logger = LogFactory.getLog(GenericRequester.class);\n\n    public GenericRequester() {\n    }\n\n    /**\n     * send a request and got a response\n     *\n     * @param secret\n     * @param to      send to destination\n     * @param msg     request message\n     * @param token\n     * @param timeout response wait timeout  @return Message the response\n     * @throws com.messagebus.client.MessageResponseTimeoutException\n     */\n    @Override\n    public Message request(String secret, String to, Message msg,\n                           String token, long timeout) throws MessageResponseTimeoutException {\n        MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setToken(token);\n        ctx.setCarryType(MessageCarryType.REQUEST);\n        ctx.setSource(this.getContext().getConfigManager().getSourceBySecret(secret));\n        ctx.setStream(this.getContext().getConfigManager().getStreamByToken(token));\n        ConfigManager.Sink sink = this.getContext().getConfigManager().getSinkByName(to);\n        ctx.setSink(sink);\n        ctx.setTimeout(timeout);\n        ctx.setMessages(new Message[]{msg});\n\n        this.innerRequest(ctx);\n\n        if (ctx.isTimeout() || ctx.getConsumeMsgs() == null || ctx.getConsumeMsgs().size() == 0)\n            throw new MessageResponseTimeoutException(\"message request time out.\");\n\n        return ctx.getConsumeMsgs().get(0);\n    }\n\n    @Override\n    public byte[] primitiveRequest(String secret,\n                                   String target,\n                                   byte[] requestMsg,\n                                   String token,\n                                   long timeoutOfMilliSecond) {\n        ConfigManager.Source source = this.getContext().getConfigManager().getSourceBySecret(secret);\n        ConfigManager.Sink   sink   = this.getContext().getConfigManager().getSinkByName(target);\n\n        RpcClient innerRpcClient = null;\n        try {\n            innerRpcClient = new RpcClient(this.getContext().getChannel(),\n                    Constants.PROXY_EXCHANGE_NAME,\n                    sink.getRoutingKey(),\n                    (int) timeoutOfMilliSecond);\n            return innerRpcClient.primitiveCall(requestMsg);\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"primitive request \");\n        } catch (TimeoutException e) {\n            logger.info(\"primitiveRequest timeout : \" + \"[secret] \" + secret + \" [target] \" + target);\n        } finally {\n            try {\n                if (innerRpcClient != null) innerRpcClient.close();\n            } catch (IOException e) {\n                ExceptionHelper.logException(logger, e, \"primitive request finally close inner rpc client\");\n            }\n        }\n\n        return new byte[0];\n    }\n\n\n    private void innerRequest(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        RequestEventProcessor eventProcessor = new RequestEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        RequestEventProcessor.ValidateEvent                validateEvent                = new RequestEventProcessor.ValidateEvent();\n        CommonEventProcessor.MsgBodySizeCheckEvent         msgBodySizeCheckEvent        = new CommonEventProcessor.MsgBodySizeCheckEvent();\n        RequestEventProcessor.PermissionCheckEvent         permissionCheckEvent         = new RequestEventProcessor.PermissionCheckEvent();\n        CommonEventProcessor.MsgIdGenerateEvent            msgIdGenerateEvent           = new CommonEventProcessor.MsgIdGenerateEvent();\n        RequestEventProcessor.TempQueueInitializeEvent     tempQueueInitializeEvent     = new RequestEventProcessor.TempQueueInitializeEvent();\n        CommonEventProcessor.MsgBodyCompressEvent          msgBodyCompressEvent         = new CommonEventProcessor.MsgBodyCompressEvent();\n        RequestEventProcessor.RequestEvent                 requestEvent                 = new RequestEventProcessor.RequestEvent();\n        CommonEventProcessor.TagGenerateEvent              tagGenerateEvent             = new CommonEventProcessor.TagGenerateEvent();\n        RequestEventProcessor.BlockAndTimeoutResponseEvent blockAndTimeoutResponseEvent = new RequestEventProcessor.BlockAndTimeoutResponseEvent();\n\n        validateEvent.setMessageContext(ctx);\n        msgBodySizeCheckEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        msgIdGenerateEvent.setMessageContext(ctx);\n        tempQueueInitializeEvent.setMessageContext(ctx);\n        msgBodyCompressEvent.setMessageContext(ctx);\n        requestEvent.setMessageContext(ctx);\n        tagGenerateEvent.setMessageContext(ctx);\n        blockAndTimeoutResponseEvent.setMessageContext(ctx);\n\n        //arrange event order and emit\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(msgBodySizeCheckEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(msgIdGenerateEvent);\n        carryEventBus.post(tempQueueInitializeEvent);\n        carryEventBus.post(msgBodyCompressEvent);\n        carryEventBus.post(requestEvent);\n        carryEventBus.post(tagGenerateEvent);\n        carryEventBus.post(blockAndTimeoutResponseEvent);\n\n        //unregister\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericResponser.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.IRequestListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.event.carry.ResponseEventProcessor;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\nclass GenericResponser extends AbstractMessageCarryer implements IResponser {\n\n    private static final Log logger = LogFactory.getLog(GenericResponser.class);\n\n    @Override\n    public void response(String secret, IRequestListener onRequest, long timeout, TimeUnit timeUnit) {\n        final MessageContext ctx = initMessageContext();\n        ctx.setCarryType(MessageCarryType.RESPONSE);\n        ctx.setSecret(secret);\n        ctx.setSink(this.getContext().getConfigManager().getSinkBySecret(secret));\n        ctx.setRequestListener(onRequest);\n        ctx.setTimeout(timeout);\n        ctx.setTimeoutUnit(timeUnit);\n\n        this.innerResponse(ctx);\n    }\n\n    private void innerResponse(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        ResponseEventProcessor eventProcessor = new ResponseEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        CommonEventProcessor.TagGenerateEvent       tagGenerateEvent      = new CommonEventProcessor.TagGenerateEvent();\n        ResponseEventProcessor.ValidateEvent        validateEvent         = new ResponseEventProcessor.ValidateEvent();\n        ResponseEventProcessor.PermissionCheckEvent permissionCheckEvent  = new ResponseEventProcessor.PermissionCheckEvent();\n        CommonEventProcessor.PreConsumeEvent        perConsumeEvent       = new CommonEventProcessor.PreConsumeEvent();\n        CommonEventProcessor.AsyncMessageLoopEvent  asyncMessageLoopEvent = new CommonEventProcessor.AsyncMessageLoopEvent();\n\n        tagGenerateEvent.setMessageContext(ctx);\n        validateEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        perConsumeEvent.setMessageContext(ctx);\n        asyncMessageLoopEvent.setMessageContext(ctx);\n\n        //arrange event order and emit\n        carryEventBus.post(tagGenerateEvent);\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(perConsumeEvent);\n        carryEventBus.post(asyncMessageLoopEvent);\n\n        //unregister\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericRpcRequester.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.RpcRequestEventProcessor;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.Map;\n\n/**\n * Created by yanghua on 4/8/15.\n */\npublic class GenericRpcRequester extends AbstractMessageCarryer implements IRpcRequester {\n\n    private static final Log logger = LogFactory.getLog(GenericRpcRequester.class);\n\n    public GenericRpcRequester() {\n    }\n\n    @Override\n    public Object call(String secret, String target, String methodName, Object[] params, String token, long timeoutOfMilliSecond) {\n        MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setToken(token);\n        ctx.setCarryType(MessageCarryType.RPCREQUEST);\n        ctx.setSource(this.getContext().getConfigManager().getSourceBySecret(secret));\n        ctx.setTimeout(timeoutOfMilliSecond);\n        ctx.setSink(this.getContext().getConfigManager().getSinkByName(target));\n        ctx.setStream(this.getContext().getConfigManager().getStreamByToken(token));\n        Map<String, Object> otherParams = ctx.getOtherParams();\n        otherParams.put(\"methodName\", methodName);\n        otherParams.put(\"params\", params);\n\n        this.innerRpcRequest(ctx);\n\n        return otherParams.get(\"result\");\n    }\n\n    private void innerRpcRequest(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        RpcRequestEventProcessor eventProcessor = new RpcRequestEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        RpcRequestEventProcessor.PermissionCheckEvent permissionCheckEvent = new RpcRequestEventProcessor.PermissionCheckEvent();\n        RpcRequestEventProcessor.RpcRequestEvent      rpcRequestEvent      = new RpcRequestEventProcessor.RpcRequestEvent();\n\n        permissionCheckEvent.setMessageContext(ctx);\n        rpcRequestEvent.setMessageContext(ctx);\n\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(rpcRequestEvent);\n\n        //unregister\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericRpcResponser.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.IRpcMessageProcessor;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.WrappedRpcServer;\nimport com.messagebus.client.event.carry.RpcResponseEventProcessor;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.rabbitmq.client.AMQP;\nimport com.rabbitmq.client.QueueingConsumer;\nimport com.rabbitmq.client.RpcServer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 4/8/15.\n */\npublic class GenericRpcResponser extends AbstractMessageCarryer implements IRpcResponser {\n\n    private static final Log logger = LogFactory.getLog(GenericRpcResponser.class);\n\n    public GenericRpcResponser() {\n    }\n\n    @Override\n    public void callback(String secret, Class<?> clazzOfInterface, Object serviceProvider, long timeout, TimeUnit timeUnit) {\n        MessageContext ctx = initMessageContext();\n        ctx.setSecret(secret);\n        ctx.setCarryType(MessageCarryType.RPCRESPONSE);\n        ctx.setSink(this.getContext().getConfigManager().getSinkBySecret(secret));\n        Map<String, Object> otherParams = ctx.getOtherParams();\n        otherParams.put(\"serviceProvider\", serviceProvider);\n        otherParams.put(\"clazzOfInterface\", clazzOfInterface);\n        ctx.setTimeout(timeout);\n        ctx.setTimeoutUnit(timeUnit);\n\n        this.innerRpcResponse(ctx);\n    }\n\n    @Override\n    public WrappedRpcServer buildRpcServer(String secret, final IRpcMessageProcessor rpcMsgProcessor) {\n        ConfigManager.Sink sink = this.getContext().getConfigManager().getSinkBySecret(secret);\n        try {\n            RpcServer aServer = new RpcServer(this.getContext().getChannel(), sink.getQueueName()) {\n\n                @Override\n                public byte[] handleCall(QueueingConsumer.Delivery request, AMQP.BasicProperties replyProperties) {\n                    return rpcMsgProcessor.onRpcMessage(request.getBody());\n                }\n\n            };\n\n            Constructor<WrappedRpcServer> rpcServerConstructor = WrappedRpcServer.class.getDeclaredConstructor(RpcServer.class);\n            rpcServerConstructor.setAccessible(true);\n            WrappedRpcServer wrappedRpcServer = rpcServerConstructor.newInstance(aServer);\n            rpcServerConstructor.setAccessible(false);\n\n            return wrappedRpcServer;\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (NoSuchMethodException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (InstantiationException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (IllegalAccessException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (InvocationTargetException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (Exception e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    private void innerRpcResponse(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        RpcResponseEventProcessor eventProcessor = new RpcResponseEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        RpcResponseEventProcessor.RpcResponseEvent rpcResponseEvent = new RpcResponseEventProcessor.RpcResponseEvent();\n\n        rpcResponseEvent.setMessageContext(ctx);\n        carryEventBus.post(rpcResponseEvent);\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/GenericSubscriber.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.google.common.eventbus.EventBus;\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.event.carry.CommonEventProcessor;\nimport com.messagebus.client.event.carry.SubscribeEventProcessor;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\nclass GenericSubscriber extends AbstractMessageCarryer implements ISubscriber {\n\n    private static final Log logger = LogFactory.getLog(GenericSubscriber.class);\n\n    public GenericSubscriber() {\n    }\n\n    @Override\n    public void subscribe(String secret,\n                          String from, String token,\n                          IMessageReceiveListener onMessage,\n                          long timeout, TimeUnit unit) {\n        final MessageContext ctx = initMessageContext();\n        ctx.setCarryType(MessageCarryType.SUBSCRIBE);\n        ctx.setSecret(secret);\n        ctx.setToken(token);\n        ctx.setSource(this.getContext().getConfigManager().getSourceByName(from));\n        ctx.setSink(this.getContext().getConfigManager().getSinkBySecret(secret));\n        ctx.setStream(this.getContext().getConfigManager().getStreamByToken(token));\n        ctx.setReceiveListener(onMessage);\n        ctx.setSync(false);\n        ctx.setTimeout(timeout);\n        ctx.setTimeoutUnit(unit);\n\n        this.innerSubscribe(ctx);\n    }\n\n    private void innerSubscribe(MessageContext ctx) {\n        EventBus carryEventBus = this.getContext().getCarryEventBus();\n\n        //register event processor\n        SubscribeEventProcessor eventProcessor = new SubscribeEventProcessor();\n        carryEventBus.register(eventProcessor);\n\n        //init events\n        CommonEventProcessor.TagGenerateEvent        tagGenerateEvent      = new CommonEventProcessor.TagGenerateEvent();\n        SubscribeEventProcessor.ValidateEvent        validateEvent         = new SubscribeEventProcessor.ValidateEvent();\n        SubscribeEventProcessor.PermissionCheckEvent permissionCheckEvent  = new SubscribeEventProcessor.PermissionCheckEvent();\n        CommonEventProcessor.PreConsumeEvent         perConsumeEvent       = new CommonEventProcessor.PreConsumeEvent();\n        CommonEventProcessor.AsyncMessageLoopEvent   asyncMessageLoopEvent = new CommonEventProcessor.AsyncMessageLoopEvent();\n\n        tagGenerateEvent.setMessageContext(ctx);\n        validateEvent.setMessageContext(ctx);\n        permissionCheckEvent.setMessageContext(ctx);\n        perConsumeEvent.setMessageContext(ctx);\n        asyncMessageLoopEvent.setMessageContext(ctx);\n\n        carryEventBus.post(tagGenerateEvent);\n        carryEventBus.post(validateEvent);\n        carryEventBus.post(permissionCheckEvent);\n        carryEventBus.post(perConsumeEvent);\n        carryEventBus.post(asyncMessageLoopEvent);\n\n        carryEventBus.unregister(eventProcessor);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IBroadcaster.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.message.model.Message;\n\npublic interface IBroadcaster {\n\n    public void broadcast(String secret, Message[] msgs);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IConsumer.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.message.model.Message;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/1/15.\n */\npublic interface IConsumer {\n\n    public void consume(String secret, long timeout, TimeUnit unit, IMessageReceiveListener onMessage);\n\n    public List<Message> consume(String secret, int expectedNum);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IProducer.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.message.model.Message;\n\n/**\n * the interface of producer\n */\npublic interface IProducer {\n\n    public void produce(String secret, String to, Message msg, String token);\n\n    public void batchProduce(String secret, String to, Message[] msgs, String token);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IPublisher.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.message.model.Message;\n\npublic interface IPublisher {\n\n    public void publish(String secret, Message[] msgs);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IRequester.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.MessageResponseTimeoutException;\nimport com.messagebus.client.message.model.Message;\n\npublic interface IRequester {\n\n    public Message request(String secret, String to, Message msg, String token, long timeout)\n            throws MessageResponseTimeoutException;\n\n    public byte[] primitiveRequest(String secret, String target, byte[] requestMsg, String token, long timeoutOfMilliSecond);\n\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IResponser.java",
    "content": "package com.messagebus.client.carry;\n\n\nimport com.messagebus.client.IRequestListener;\n\nimport java.util.concurrent.TimeUnit;\n\npublic interface IResponser {\n\n    /**\n     * response a temp message to a named queue\n     *\n     * @param toTmpQueue      the temp queue name\n     * @param msg             the entity of message\n     * @param receiveListener\n     * @param secret\n     * @param onRequest\n     * @param timeout\n     * @param timeUnit\n     */\n    public void response(String secret, IRequestListener onRequest, long timeout, TimeUnit timeUnit);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IRpcRequester.java",
    "content": "package com.messagebus.client.carry;\n\n/**\n * Created by yanghua on 4/8/15.\n */\npublic interface IRpcRequester {\n\n    public Object call(String secret, String target, String methodName, Object[] params, String token, long timeoutOfMilliSecond);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/IRpcResponser.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.IRpcMessageProcessor;\nimport com.messagebus.client.WrappedRpcServer;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 4/8/15.\n */\npublic interface IRpcResponser {\n\n    public void callback(String secret, Class<?> clazzOfInterface, Object serviceProvider, long timeout, TimeUnit timeUnit);\n\n    public WrappedRpcServer buildRpcServer(String secret, IRpcMessageProcessor rpcMsgProcessor);\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/carry/ISubscriber.java",
    "content": "package com.messagebus.client.carry;\n\nimport com.messagebus.client.IMessageReceiveListener;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/1/15.\n */\npublic interface ISubscriber {\n\n    public void subscribe(String secret,\n                          String from, String token, IMessageReceiveListener onMessage,\n                          long timeout, TimeUnit unit);\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/BroadcastEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.base.Strings;\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.common.Constants;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Created by yanghua on 6/29/15.\n */\npublic class BroadcastEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(BroadcastEventProcessor.class);\n\n    private static final String EVENT_ROUTING_KEY_NAME = \"routingkey.proxy.message.inner.#\";\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n        MessageContext context = event.getMessageContext();\n        if (!context.getCarryType().equals(MessageCarryType.BROADCAST)) {\n            logger.error(\"the message carry type should be broadcast\");\n            event.getMessageContext().setThrowable(new RuntimeException(\n                    \"the message carry type should be broadcast\"));\n        }\n\n        this.validateMessageProperties(context);\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        boolean              hasPermission;\n        MessageContext       context = event.getMessageContext();\n        ConfigManager.Source source  = context.getSource();\n        hasPermission = source.getBroadcastable().equals(\"1\");\n        if (!hasPermission) {\n            logger.error(\"the source with name : \" + source.getName()\n                    + \", with secret : \" + source.getSecret() + \" can not broadcast !\");\n            event.getMessageContext().setThrowable(new RuntimeException(\"the queue with name : \" + source.getName()\n                    + \", with secret : \" + source.getSecret() + \" can not broadcast !\"));\n        }\n    }\n\n    @Subscribe\n    public void onBroadcast(BroadcastEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onBroadcast =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        try {\n            for (Message msg : context.getMessages()) {\n\n                Map<String, Object> map = new HashMap<String, Object>(1);\n                map.put(\"type\", \"notice\");\n                msg.setHeaders(map);\n                AMQP.BasicProperties properties = MessageHeaderTransfer.box(msg);\n\n                ProxyProducer.produce(Constants.PROXY_EXCHANGE_NAME,\n                        context.getChannel(),\n                        EVENT_ROUTING_KEY_NAME,\n                        msg.getContent(),\n                        properties);\n\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(e));\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    private void validateMessageProperties(MessageContext context) {\n        Date currentDate = new Date();\n        for (Message msg : context.getMessages()) {\n            //app id\n            if (Strings.isNullOrEmpty(msg.getAppId()))\n                msg.setAppId(context.getSource().getAppId());\n\n            //timestamp\n            if (msg.getTimestamp() == 0)\n                msg.setTimestamp(currentDate.getTime());\n        }\n    }\n\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class BroadcastEvent extends CarryEvent {\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/CarryEvent.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.common.Event;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class CarryEvent extends Event {\n\n    private MessageContext messageContext;\n\n    public MessageContext getMessageContext() {\n        return messageContext;\n    }\n\n    public void setMessageContext(MessageContext messageContext) {\n        this.messageContext = messageContext;\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/CommonEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.base.Strings;\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport com.messagebus.common.RandomHelper;\nimport com.messagebus.common.UUIDGenerator;\nimport com.messagebus.interactor.proxy.ProxyConsumer;\nimport com.rabbitmq.client.QueueingConsumer;\nimport com.rabbitmq.client.ShutdownSignalException;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.Random;\nimport java.util.concurrent.*;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic abstract class CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(CommonEventProcessor.class);\n\n    private static final Random random = new Random();\n\n    protected void onValidate(CarryEvent event) {\n        //todo\n    }\n\n    protected void exceptionCheck(CarryEvent event) {\n        if (event.getMessageContext().getThrowable() != null)\n            return;\n    }\n\n    @Subscribe\n    public void onMsgIdGenerate(MsgIdGenerateEvent event) {\n        this.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onMsgIdGenerate =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        Message[]      msgs    = context.getMessages();\n        for (Message msg : msgs) {\n            UUIDGenerator generator = new UUIDGenerator(random.nextInt(31), Constants.DEFAULT_DATACENTER_ID_FOR_UUID);\n            logger.debug(\"message id is : \" + generator.nextId());\n            msg.setMessageId(generator.nextId());\n            msg.setCorrelationId(context.getSource().getName());\n        }\n    }\n\n    @Subscribe\n    public void onMsgBodySizeCheck(MsgBodySizeCheckEvent event) {\n        this.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onMsgBodySizeCheck =-=-=-\");\n        MessageContext     context = event.getMessageContext();\n        ConfigManager.Sink sink    = context.getSink();\n\n        if (sink != null && !Strings.isNullOrEmpty(sink.getMsgBodySize())) {\n            String msgBodySizeStr = sink.getMsgBodySize();\n            int    msgBodySize    = Integer.parseInt(msgBodySizeStr);\n\n            if (msgBodySize != -1) {\n                Message[] msgs = context.getMessages();\n                for (Message msg : msgs) {\n                    if (msg.getContent().length > msgBodySize) {\n                        logger.error(\"message body's size can not be more than : \" + msgBodySizeStr\n                                + \" B, the limit comes from queue name : \" + sink.getName());\n                        event.getMessageContext().setThrowable(\n                                new RuntimeException(\"message body's size can not be more than : \"\n                                        + msgBodySizeStr + \" B\"));\n                        return;\n                    }\n                }\n            }\n        }\n    }\n\n    @Subscribe\n    public void onTagGenerate(TagGenerateEvent event) {\n        this.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onTagGenerate =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        String         tag     = \"consumer.tag.\" + RandomHelper.randomNumberAndCharacter(6);\n        context.setConsumerTag(tag);\n    }\n\n    @Subscribe\n    public void onMsgBodyCompress(MsgBodyCompressEvent event) {\n        this.exceptionCheck(event);\n        //TODO : 不提供自定义功能,有总线决定压缩方式\n//        logger.debug(\"=-=-=- event : onMsgBodyCompress =-=-=-\");\n//        MessageContext context = event.getMessageContext();\n//        String compressAlgo = context.getSink().getCompress();\n//        if (!Strings.isNullOrEmpty(compressAlgo)) {\n//            ICompressor compressor = CompressorFactory.createCompressor(compressAlgo);\n//            if (compressor != null) {\n//                for (Message msg : context.getMessages()) {\n//                    if (msg.getHeaders() == null) msg.setHeaders(new HashMap<String, Object>(1));\n//                    msg.getHeaders().put(Constants.MESSAGE_HEADER_KEY_COMPRESS_ALGORITHM, compressAlgo);\n//                    msg.setContent(compressor.compress(msg.getContent()));\n//                }\n//            } else {\n//                logger.error(\"the target node with name : \" + context.getSink().getName()\n//                                 + \" configured a compress named : \" + compressAlgo\n//                                 + \" but client can not get the compressor instance. \");\n//            }\n//        }\n    }\n\n    @Subscribe\n    public void onPreConsume(PreConsumeEvent event) {\n        this.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPreConsume =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        if (!context.isSync()) {\n            QueueingConsumer consumer = null;\n            try {\n                boolean autoAck = context.getSink().isAutoAck();\n                consumer = ProxyConsumer.consume(context.getChannel(),\n                        context.getSink().getQueueName(),\n                        autoAck,\n                        context.getConsumerTag());\n            } catch (IOException e) {\n                logger.error(e);\n                event.getMessageContext().setThrowable(\n                        new RuntimeException(e));\n                return;\n            }\n\n            //add external params\n            context.getOtherParams().put(\"consumer\", consumer);\n        }\n    }\n\n    @Subscribe\n    public void onAsyncMessageLoop(AsyncMessageLoopEvent event) {\n        this.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onAsyncMessageLoop =-=-=-\");\n        MessageContext  context         = event.getMessageContext();\n        ExecutorService executor        = Executors.newFixedThreadPool(1);\n        Future<?>       messageLoopTask = executor.submit(new MessageLoopTask(context));\n\n        //block until interrupt or timeout\n        try {\n            messageLoopTask.get(context.getTimeout(), context.getTimeoutUnit());\n        } catch (InterruptedException e) {\n            logger.info(\" consume interrupted!\");\n        } catch (ExecutionException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        } catch (TimeoutException e) {\n            logger.info(\"message loop timeout after : \"\n                    + context.getTimeout() + \" [\" + context.getTimeoutUnit() + \"]\");\n            event.getMessageContext().setThrowable(e);\n        } finally {\n            //close the consume based on this channel\n            synchronized (context.getChannel()) {\n                try {\n                    if (context.getChannel().isOpen()) {\n                        context.getChannel().basicCancel(context.getConsumerTag());\n                    }\n                } catch (IOException e1) {\n                    logger.error(e1);\n                    event.getMessageContext().setThrowable(e1);\n                }\n            }\n        }\n    }\n\n    public abstract void process(MessageContext msgContext);\n\n    public static class MsgIdGenerateEvent extends CarryEvent {\n    }\n\n    public static class TagGenerateEvent extends CarryEvent {\n    }\n\n    public static class PreConsumeEvent extends CarryEvent {\n    }\n\n    public static class MsgBodyCompressEvent extends CarryEvent {\n    }\n\n    public static class MsgBodySizeCheckEvent extends CarryEvent {\n    }\n\n    public static class AsyncMessageLoopEvent extends CarryEvent {\n    }\n\n\n    /**\n     * another message loop task for consume and process message\n     */\n    private class MessageLoopTask implements Runnable {\n\n        private MessageContext msgContext;\n\n        public MessageLoopTask(MessageContext msgContext) {\n            this.msgContext = msgContext;\n        }\n\n        @Override\n        public void run() {\n            QueueingConsumer currentConsumer = (QueueingConsumer) msgContext.getOtherParams().get(\"consumer\");\n            int              retryCount      = 0, retryTotalCount = 10;\n            boolean          stop            = false;\n            try {\n                while (!stop) {\n                    try {\n                        QueueingConsumer.Delivery delivery = currentConsumer.nextDelivery();\n\n                        final Message msg = MessageFactory.createMessage(delivery);\n\n                        if (msg == null) continue;\n\n                        doUncompress(msgContext, msg);\n\n                        msgContext.setConsumeMsgs(new ArrayList<Message>(1) {{\n                            this.add(msg);\n                        }});\n\n                        process(msgContext);\n\n                        if (!msgContext.getSink().isAutoAck()) {\n                            msgContext.getChannel().basicAck(delivery.getEnvelope().getDeliveryTag(), false);\n                        }\n                    } catch (InterruptedException e) {\n                        logger.info(\" message loop task interrupted!\");\n                    } catch (ShutdownSignalException e) {\n                        retryCount++;\n                        if (retryCount >= retryTotalCount) stop = true;\n                    } catch (Exception e) {\n                        logger.error(e);\n                    }\n                }\n            } catch (Exception e) {\n                logger.error(e);\n            }\n        }\n    }\n\n    protected void validateMessagesProperties(MessageContext context) {\n        Date currentDate = new Date();\n        for (Message msg : context.getMessages()) {\n            //app id\n            if (msg.getAppId() == null || msg.getAppId().isEmpty())\n                msg.setAppId(context.getSource().getAppId());\n\n            //timestamp\n            if (msg.getTimestamp() == 0)\n                msg.setTimestamp(currentDate.getTime());\n        }\n    }\n\n    protected void doUncompress(MessageContext context, Message receivedMsg) {\n        //TODO : 不提供自定义功能,有总线决定压缩方式\n//        String compressAlgo = context.getSource().getCompress();\n//        if (!Strings.isNullOrEmpty(compressAlgo)) {\n//            ICompressor compressor = CompressorFactory.createCompressor(compressAlgo);\n//            if (compressor != null) {\n//                receivedMsg.setContent(compressor.uncompress(receivedMsg.getContent()));\n//            } else {\n//                logger.error(\"the target node with name : \" + context.getSink().getName()\n//                                 + \" configured a compress named : \" + compressAlgo\n//                                 + \" but client can not get the compressor instance. \");\n//            }\n//        }\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/ConsumeEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.base.Strings;\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.interactor.proxy.ProxyConsumer;\nimport com.rabbitmq.client.GetResponse;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by yanghua on 6/26/15.\n */\npublic class ConsumeEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(ConsumeEventProcessor.class);\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext context = event.getMessageContext();\n\n        ConfigManager.Sink sink          = context.getSink();\n        boolean            hasPermission = false;\n        hasPermission = MessageCarryType.lookup(sink.getType()).equals(MessageCarryType.CONSUME)\n                && !Strings.isNullOrEmpty(sink.getQueueName())\n                && !Strings.isNullOrEmpty(sink.getName());\n\n        if (!hasPermission) {\n            logger.error(\"permission error : can not consume. may be communicate type is wrong. \" +\n                    \" current secret is : \" + sink.getSecret());\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\"permission error : can not consume. may be communicate type is wrong. \" +\n                            \" current secret is : \" + sink.getSecret()));\n        }\n    }\n\n    @Subscribe\n    public void onSyncConsume(SyncConsumeEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onSyncConsume =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        if (context.isSync()) {\n            List<Message> consumeMsgs = new ArrayList<Message>(context.getConsumeMsgNum());\n            context.setConsumeMsgs(consumeMsgs);\n            try {\n                int countDown = context.getConsumeMsgNum();\n                while (countDown-- > 0) {\n                    GetResponse response = ProxyConsumer.consumeSingleMessage(context.getChannel(),\n                            context.getSink().getQueueName());\n\n                    if (response == null) continue;\n\n                    final Message msg = MessageFactory.createMessage(response);\n\n                    if (msg == null) continue;\n\n                    this.doUncompress(context, msg);\n\n                    consumeMsgs.add(msg);\n                }\n            } catch (IOException e) {\n                logger.error(e);\n                event.getMessageContext().setThrowable(e);\n            } catch (RuntimeException e) {\n                logger.error(e);\n                event.getMessageContext().setThrowable(e);\n            }\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        IMessageReceiveListener receiveListener = msgContext.getReceiveListener();\n        receiveListener.onMessage(msgContext.getConsumeMsgs().get(0));\n    }\n\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class SyncConsumeEvent extends CarryEvent {\n    }\n\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/ProduceEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.common.Constants;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ProduceEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(ProduceEventProcessor.class);\n\n    public ProduceEventProcessor() {\n    }\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n\n        MessageContext       context = event.getMessageContext();\n        ConfigManager.Source source  = context.getSource();\n        if (!context.getCarryType().equals(MessageCarryType.PRODUCE)) {\n            logger.error(\"message carry type should be produce, but current is : \"\n                    + context.getCarryType()\n                    + \"; node name : \" + source.getName()\n                    + \"; node secret is : \" + source.getSecret());\n            event.getMessageContext().setThrowable(new RuntimeException(\"message carry type should be produce, but current is : \"\n                    + context.getCarryType()\n                    + \"; node name : \" + source.getName()\n                    + \"; node secret is : \" + source.getSecret()));\n            return;\n        }\n\n        if (context.getSink() == null) {\n            logger.error(\"target node can not be null \"\n                    + \"; node name : \" + source.getName()\n                    + \"; node secret is : \" + source.getSecret());\n            event.getMessageContext().setThrowable(new RuntimeException(\"target node can not be null \"\n                    + \"; node name : \" + source.getName()\n                    + \"; node secret is : \" + source.getSecret()));\n            return;\n        }\n\n        if (!MessageCarryType.lookup(context.getSink().getType()).equals(MessageCarryType.CONSUME)) {\n            logger.error(\"target node's type is illegal , \"\n                    + \"target node name : \" + context.getSink().getName());\n            event.getMessageContext().setThrowable(new RuntimeException(\"target node's type is illegal , \"\n                    + \"target node name : \" + context.getSink().getName()));\n            return;\n        }\n\n        this.validateMessagesProperties(context);\n    }\n\n    @Subscribe\n    public void onPermissionCheckEvent(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheckEvent =-=-=-\");\n        MessageContext       context = event.getMessageContext();\n        ConfigManager.Source source  = context.getSource();\n        ConfigManager.Sink   sink    = context.getSink();\n\n        boolean hasPermission = false;\n\n        ConfigManager.Stream stream = context.getStream();\n        hasPermission = stream.getSourceName().equals(source.getName())\n                && stream.getSinkSecret().equals(sink.getSecret());\n\n        if (!hasPermission) {\n            logger.error(\"[handle] can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\");\n            event.getMessageContext().setThrowable(new RuntimeException(\"can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\"));\n            return;\n        }\n    }\n\n    @Subscribe\n    public void onProduce(ProduceEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onProduce =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        try {\n            if (context.isEnableTransaction()) {\n                for (Message msg : context.getMessages()) {\n                    AMQP.BasicProperties properties = MessageHeaderTransfer.box(msg);\n                    ProxyProducer.produceWithTX(Constants.PROXY_EXCHANGE_NAME,\n                            context.getChannel(),\n                            context.getSink().getRoutingKey(),\n                            msg.getContent(),\n                            properties);\n                }\n            } else {\n                for (Message msg : context.getMessages()) {\n                    AMQP.BasicProperties properties = MessageHeaderTransfer.box(msg);\n\n                    ProxyProducer.produce(Constants.PROXY_EXCHANGE_NAME,\n                            context.getChannel(),\n                            context.getSink().getRoutingKey(),\n                            msg.getContent(),\n                            properties);\n                }\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        } catch (Exception e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    //region events definition\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class ProduceEvent extends CarryEvent {\n    }\n    //endregion\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/PublishEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.common.Constants;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 6/26/15.\n */\npublic class PublishEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(PublishEventProcessor.class);\n\n    public PublishEventProcessor() {\n    }\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n        MessageContext context = event.getMessageContext();\n        if (!context.getCarryType().equals(MessageCarryType.PUBLISH)) {\n            logger.error(\"message carry type should be publish \");\n            event.getMessageContext().setThrowable(new RuntimeException(\"message carry type should be publish \"));\n            return;\n        }\n\n        this.validateMessagesProperties(context);\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext       context       = event.getMessageContext();\n        ConfigManager.Source source        = context.getSource();\n        boolean              hasPermission = false;\n\n        hasPermission = MessageCarryType.lookup(source.getType()).equals(MessageCarryType.PUBLISH);\n        if (!hasPermission) {\n            logger.error(\"can not publish message! maybe the communicate is error. \"\n                    + \" secret is : \" + context.getSecret());\n            event.getMessageContext().setThrowable(new RuntimeException(\"can not publish message! maybe the communicate is error. \"\n                    + \" secret is : \" + context.getSecret()));\n            return;\n        }\n    }\n\n    @Subscribe\n    public void onPublish(PublishEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPublish =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        try {\n            for (Message msg : context.getMessages()) {\n                AMQP.BasicProperties properties = MessageHeaderTransfer.box(msg);\n\n                ProxyProducer.produce(Constants.PROXY_EXCHANGE_NAME,\n                        context.getChannel(),\n                        context.getSource().getRoutingKey(),\n                        msg.getContent(),\n                        properties);\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        } catch (Exception e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    //region publish events definition\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class PublishEvent extends CarryEvent {\n    }\n    //endregion\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/RequestEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.common.Constants;\nimport com.messagebus.interactor.proxy.ProxyConsumer;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.messagebus.interactor.rabbitmq.QueueManager;\nimport com.rabbitmq.client.AMQP;\nimport com.rabbitmq.client.QueueingConsumer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\n\n/**\n * Created by yanghua on 6/27/15.\n */\npublic class RequestEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(RequestEventProcessor.class);\n\n    public RequestEventProcessor() {\n    }\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n        MessageContext context = event.getMessageContext();\n\n        if (!context.getCarryType().equals(MessageCarryType.REQUEST)) {\n            logger.error(\"message carry type should be request\");\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\"message carry type should be request\"));\n            return;\n        }\n\n        if (!MessageCarryType.lookup(context.getSource().getType()).equals(MessageCarryType.REQUEST)) {\n            logger.error(\"message carry type should be request\");\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\"message carry type should be request\"));\n            return;\n        }\n\n        Message[] msgs = context.getMessages();\n        if (msgs == null || msgs.length != 1) {\n            logger.error(\" request message must be just one! \");\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\" request message must be just one! \"));\n            return;\n        }\n\n        if (context.getSink() == null) {\n            logger.error(\" sink can not be null. \");\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\" sink can not be null. \"));\n            return;\n        }\n\n        this.validateMessagesProperties(context);\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext       context = event.getMessageContext();\n        ConfigManager.Source source  = context.getSource();\n        ConfigManager.Sink   sink    = context.getSink();\n        String               token   = context.getToken();\n\n        boolean hasPermission = false;\n\n        ConfigManager.Stream stream = context.getStream();\n        hasPermission = stream != null && stream.getToken().equals(token)\n                && stream.getSourceSecret().equals(source.getSecret())\n                && stream.getSinkSecret().equals(sink.getSecret());\n\n        if (!hasPermission) {\n            logger.error(\"[handle] can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\");\n            event.getMessageContext().setThrowable(new RuntimeException(\"can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\"));\n            return;\n        }\n    }\n\n    @Subscribe\n    public void onTempQueueInitialize(TempQueueInitializeEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onTempQueueInitialize =-=-=-\");\n        MessageContext context       = event.getMessageContext();\n        String         correlationId = context.getSource().getName();\n        context.getMessages()[0].setCorrelationId(correlationId);\n        QueueManager queueManager = QueueManager.defaultQueueManager(context.getHost());\n        try {\n            queueManager.create(correlationId);\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        } catch (Exception e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        }\n    }\n\n    @Subscribe\n    public void onRequest(RequestEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onRequest =-=-=-\");\n        MessageContext       context    = event.getMessageContext();\n        Message              reqMsg     = context.getMessages()[0];\n        AMQP.BasicProperties properties = MessageHeaderTransfer.box(reqMsg);\n        try {\n            ProxyProducer.produceWithTX(Constants.PROXY_EXCHANGE_NAME,\n                    context.getChannel(),\n                    context.getSink().getRoutingKey(),\n                    reqMsg.getContent(),\n                    properties);\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        } catch (Exception e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        }\n    }\n\n    @Subscribe\n    public void onBlockAndTimeout(BlockAndTimeoutResponseEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onBlockAndTimeout =-=-=-\");\n        MessageContext context       = event.getMessageContext();\n        String         correlationId = context.getMessages()[0].getCorrelationId();\n\n        try {\n            //just receive one\n            QueueingConsumer consumer = ProxyConsumer.consume(\n                    context.getChannel(),\n                    correlationId,\n                    true,\n                    context.getConsumerTag());\n            QueueingConsumer.Delivery delivery = consumer.nextDelivery(context.getTimeout() * 1000);\n\n            //timeout\n            if (delivery == null) {\n                context.setIsTimeout(true);\n                return;\n            }\n\n            final Message msg = MessageFactory.createMessage(delivery);\n\n            if (msg == null) return;\n\n            context.setConsumeMsgs(new ArrayList<Message>(1) {{\n                this.add(msg);\n            }});\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        } catch (InterruptedException e) {\n        } finally {\n            //delete temp queue\n            QueueManager queueManager = QueueManager.defaultQueueManager(context.getHost());\n            String       msgIdStr     = String.valueOf(correlationId);\n            try {\n                if (queueManager.exists(msgIdStr)) {\n                    queueManager.delete(msgIdStr);\n                }\n            } catch (IOException e) {\n                logger.error(e);\n                event.getMessageContext().setThrowable(e);\n            }\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    //region event definition\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class TempQueueInitializeEvent extends CarryEvent {\n    }\n\n    public static class RequestEvent extends CarryEvent {\n    }\n\n    public static class BlockAndTimeoutResponseEvent extends CarryEvent {\n    }\n    //endregion\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/ResponseEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.IRequestListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.interactor.proxy.ProxyProducer;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 6/29/15.\n */\npublic class ResponseEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(ResponseEventProcessor.class);\n\n    public ResponseEventProcessor() {\n    }\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n        MessageContext context = event.getMessageContext();\n        if (!context.getCarryType().equals(MessageCarryType.RESPONSE)) {\n            logger.error(\" message carry type should be response \");\n            event.getMessageContext().setThrowable(\n                    new RuntimeException(\"message carry type should be response \"));\n        }\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext     context       = event.getMessageContext();\n        ConfigManager.Sink sink          = context.getSink();\n        boolean            hasPermission = MessageCarryType.lookup(sink.getType()).equals(MessageCarryType.RESPONSE);\n\n        if (!hasPermission) {\n            logger.error(\"permission error : can not response. \" +\n                    \"may be communicate type is wrong. \" +\n                    \"current secret is : \" + sink.getSecret());\n            event.getMessageContext().setThrowable(new RuntimeException(\"permission error : can not response. \" +\n                    \"may be communicate type is wrong. \" +\n                    \"current secret is : \" + sink.getSecret()));\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        IRequestListener requestListener = msgContext.getRequestListener();\n        Message          requestMsg      = msgContext.getConsumeMsgs().get(0);\n        String           tempQueueName   = requestMsg.getCorrelationId();\n        msgContext.setTempQueueName(tempQueueName);\n        Message respMsg = requestListener.onRequest(msgContext.getConsumeMsgs().get(0));\n\n        AMQP.BasicProperties properties = MessageHeaderTransfer.box(respMsg);\n        try {\n            ProxyProducer.produce(\"\",\n                    msgContext.getChannel(),\n                    tempQueueName,\n                    respMsg.getContent(),\n                    properties);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (Exception e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/RpcRequestEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.common.Constants;\nimport com.rabbitmq.tools.jsonrpc.JsonRpcClient;\nimport com.rabbitmq.tools.jsonrpc.JsonRpcException;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeoutException;\n\n/**\n * Created by yanghua on 6/29/15.\n */\npublic class RpcRequestEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(RpcRequestEventProcessor.class);\n\n    public RpcRequestEventProcessor() {\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext       context       = event.getMessageContext();\n        ConfigManager.Source source        = context.getSource();\n        ConfigManager.Sink   sink          = context.getSink();\n        boolean              hasPermission = false;\n\n        hasPermission = context.getStream() != null\n                && context.getStream().getSinkSecret().equals(sink.getSecret())\n                && context.getStream().getSourceName().equals(source.getName());\n\n        if (!hasPermission) {\n            logger.error(\"[handle] can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\");\n            event.getMessageContext().setThrowable(new RuntimeException(\"can not produce message from queue [\" + source.getName() +\n                    \"] to queue [\" + sink.getName() + \"]\"));\n        }\n    }\n\n    @Subscribe\n    public void onRpcRequest(RpcRequestEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onRpcRequest =-=-=-\");\n        MessageContext context = event.getMessageContext();\n        JsonRpcClient  client  = null;\n        try {\n            client = new JsonRpcClient(context.getChannel(),\n                    Constants.PROXY_EXCHANGE_NAME,\n                    context.getSink().getRoutingKey(),\n                    (int) context.getTimeout());\n            Object[] params = null;\n            if (context.getOtherParams().get(\"params\") != null) {\n                params = (Object[]) context.getOtherParams().get(\"params\");\n            }\n            Object respObj = client.call(context.getOtherParams().get(\"methodName\").toString(), params);\n            context.getOtherParams().put(\"result\", respObj);\n        } catch (IOException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        } catch (TimeoutException e) {\n            context.setIsTimeout(true);\n        } catch (JsonRpcException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(new RuntimeException(e));\n        } finally {\n            try {\n                if (client != null) client.close();\n            } catch (IOException e) {\n                logger.error(e);\n            }\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n    public static class RpcRequestEvent extends CarryEvent {\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/RpcResponseEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.common.ExceptionHelper;\nimport com.rabbitmq.tools.jsonrpc.JsonRpcServer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.concurrent.*;\n\n/**\n * Created by yanghua on 6/29/15.\n */\npublic class RpcResponseEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(RpcResponseEventProcessor.class);\n\n    public RpcResponseEventProcessor() {\n    }\n\n    @Subscribe\n    public void onRpcResponse(RpcResponseEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onRpcResponse =-=-=-\");\n        MessageContext  context           = event.getMessageContext();\n        ExecutorService executor          = Executors.newFixedThreadPool(1);\n        Future<?>       rpcServerLoopTask = executor.submit(new RpcServerLoopTask(context));\n\n        try {\n            rpcServerLoopTask.get(context.getTimeout(), context.getTimeoutUnit());\n        } catch (InterruptedException e) {\n            logger.info(\" rpc server interrupted!\");\n        } catch (ExecutionException e) {\n            logger.error(e);\n            event.getMessageContext().setThrowable(e);\n        } catch (TimeoutException e) {\n            logger.info(\"message loop timeout after : \"\n                    + context.getTimeout() + \" [\" + context.getTimeoutUnit() + \"]\");\n            event.getMessageContext().setThrowable(e);\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        throw new UnsupportedOperationException(\"this method should be implemented in consume event processor!\");\n    }\n\n    public static class RpcResponseEvent extends CarryEvent {\n    }\n\n    /**\n     * inner class : rpc server loop task\n     */\n    private class RpcServerLoopTask implements Runnable {\n\n        private MessageContext msgContext;\n\n        public RpcServerLoopTask(MessageContext msgContext) {\n            this.msgContext = msgContext;\n        }\n\n        @Override\n        public void run() {\n            Class<?>      clazzOfInterface = (Class<?>) msgContext.getOtherParams().get(\"clazzOfInterface\");\n            Object        obj              = msgContext.getOtherParams().get(\"serviceProvider\");\n            JsonRpcServer server           = null;\n            try {\n                server = new JsonRpcServer(msgContext.getChannel(),\n                        msgContext.getSink().getQueueName(),\n                        clazzOfInterface,\n                        obj);\n                server.mainloop();\n            } catch (IOException e) {\n                ExceptionHelper.logException(logger, e, \"real rpc responser\");\n                throw new RuntimeException(e);\n            } finally {\n                if (server != null) {\n                    server.terminateMainloop();\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/carry/SubscribeEventProcessor.java",
    "content": "package com.messagebus.client.event.carry;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.ConfigManager;\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.MessageContext;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.model.MessageCarryType;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * Created by yanghua on 6/27/15.\n */\npublic class SubscribeEventProcessor extends CommonEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(SubscribeEventProcessor.class);\n\n    @Subscribe\n    public void onValidate(ValidateEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onValidate =-=-=-\");\n        super.onValidate(event);\n    }\n\n    @Subscribe\n    public void onPermissionCheck(PermissionCheckEvent event) {\n        super.exceptionCheck(event);\n        logger.debug(\"=-=-=- event : onPermissionCheck =-=-=-\");\n        MessageContext       context = event.getMessageContext();\n        ConfigManager.Sink   sink    = context.getSink();\n        ConfigManager.Source source  = context.getSource();\n        ConfigManager.Stream stream  = context.getStream();\n\n        boolean hasPermission = MessageCarryType.lookup(sink.getType()).equals(MessageCarryType.SUBSCRIBE);\n        hasPermission = hasPermission && (stream != null && stream.getSourceSecret().equals(source.getSecret())\n                && sink.getName().equals(stream.getSinkName()));\n\n        if (!hasPermission) {\n            logger.error(\"permission error : can not subscribe. may be communicate type is wrong . \" +\n                    \" current secret is : \" + sink.getSecret());\n            event.getMessageContext().setThrowable(new RuntimeException(\"permission error : can not subscribe. may be communicate type is wrong . \" +\n                    \" current secret is : \" + sink.getSecret()));\n        }\n    }\n\n    @Override\n    public void process(MessageContext msgContext) {\n        Message                 msg             = msgContext.getConsumeMsgs().get(0);\n        IMessageReceiveListener receiveListener = msgContext.getReceiveListener();\n        receiveListener.onMessage(msg);\n    }\n\n    public static class ValidateEvent extends CarryEvent {\n    }\n\n    public static class PermissionCheckEvent extends CarryEvent {\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/ClientDestroyEvent.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.messagebus.common.Event;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ClientDestroyEvent extends Event {\n\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/ClientDestroyEventProcessor.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.google.common.eventbus.Subscribe;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ClientDestroyEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(ClientDestroyEventProcessor.class);\n\n    @Subscribe\n    public void onClientDestroy(ClientDestroyEvent event) {\n        logger.debug(\"event : onClientDestroyEvent\");\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/ClientInitedEvent.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.messagebus.common.Event;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ClientInitedEvent extends Event {\n\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/ClientInitedEventProcessor.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.google.common.eventbus.Subscribe;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ClientInitedEventProcessor {\n\n    private static final Log logger = LogFactory.getLog(ClientInitedEventProcessor.class);\n\n    @Subscribe\n    public void onClientInited(ClientInitedEvent event) {\n        logger.debug(\"event : onClientInitedEvent\");\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/InnerEvent.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.common.Event;\n\n/**\n * Created by yanghua on 10/28/15.\n */\npublic class InnerEvent extends Event {\n\n    private Message msg;\n\n    public InnerEvent() {\n    }\n\n    public Message getMsg() {\n        return msg;\n    }\n\n    public void setMsg(Message msg) {\n        this.msg = msg;\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/event/component/NoticeEvent.java",
    "content": "package com.messagebus.client.event.component;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.common.Event;\n\n/**\n * Created by yanghua on 6/29/15.\n */\npublic class NoticeEvent extends Event {\n\n    private Message msg;\n\n    public NoticeEvent() {\n    }\n\n    public Message getMsg() {\n        return msg;\n    }\n\n    public void setMsg(Message notification) {\n        this.msg = notification;\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/extension/thrift/TAMQPClientTransport.java",
    "content": "package com.messagebus.client.extension.thrift;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.common.ExceptionHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.thrift.transport.TTransport;\nimport org.apache.thrift.transport.TTransportException;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * Created by yanghua on 4/16/15.\n */\npublic class TAMQPClientTransport extends TTransport {\n\n    private static final Log logger = LogFactory.getLog(TAMQPClientTransport.class);\n\n    private Messagebus client;\n    private String     secret;\n    private String     target;\n    private String     token;\n    private long       timeout;\n\n    private ByteArrayOutputStream reqMsgStream  = new ByteArrayOutputStream();\n    private InputStream           respMsgStream = null;\n\n    public TAMQPClientTransport(Messagebus client,\n                                String secret,\n                                String target,\n                                String token,\n                                long timeoutOfMilliSecond) {\n        this.client = client;\n        this.secret = secret;\n        this.target = target;\n        this.token = token;\n        this.timeout = timeoutOfMilliSecond;\n    }\n\n    @Override\n    public boolean isOpen() {\n        return client.isOpen();\n    }\n\n    @Override\n    public void open() throws TTransportException {\n\n    }\n\n    @Override\n    public void close() {\n\n    }\n\n    @Override\n    public int read(byte[] bytes, int i, int i1) throws TTransportException {\n        if (this.respMsgStream == null) {\n            throw new TTransportException(\"Response buffer is empty, no request.\");\n        } else {\n            try {\n                int iox = this.respMsgStream.read(bytes, i, i1);\n                if (iox == -1) {\n                    throw new TTransportException(\"No more data available.\");\n                } else {\n                    return iox;\n                }\n            } catch (IOException var5) {\n                throw new TTransportException(var5);\n            }\n        }\n    }\n\n    @Override\n    public void write(byte[] bytes, int i, int i1) throws TTransportException {\n        this.reqMsgStream.write(bytes, i, i1);\n    }\n\n    public void flush() throws TTransportException {\n        byte[] data = this.reqMsgStream.toByteArray();\n        this.reqMsgStream.reset();\n\n        byte[] responseData = new byte[0];\n        try {\n            responseData = this.client.primitiveRequest(secret, target, data, token, timeout);\n        } catch (Exception e) {\n            ExceptionHelper.logException(logger, e, \"[flush]\");\n        }\n        this.respMsgStream = new ByteArrayInputStream(responseData);\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/extension/thrift/ThriftMessageHandler.java",
    "content": "package com.messagebus.client.extension.thrift;\n\nimport com.messagebus.client.IRpcMessageProcessor;\nimport com.messagebus.common.ExceptionHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.TProcessor;\nimport org.apache.thrift.protocol.TProtocol;\nimport org.apache.thrift.protocol.TProtocolFactory;\nimport org.apache.thrift.transport.TIOStreamTransport;\nimport org.apache.thrift.transport.TTransport;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.InputStream;\nimport java.io.OutputStream;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic class ThriftMessageHandler implements IRpcMessageProcessor {\n\n    private static final Log logger = LogFactory.getLog(ThriftMessageHandler.class);\n\n    private TProcessor       processor;\n    private TProtocolFactory inProtocolFactory;\n    private TProtocolFactory outProtocolFactory;\n\n    public ThriftMessageHandler(TProcessor processor,\n                                TProtocolFactory inProtocolFactory,\n                                TProtocolFactory outProtocolFactory) {\n        this.processor = processor;\n        this.inProtocolFactory = inProtocolFactory;\n        this.outProtocolFactory = outProtocolFactory;\n    }\n\n    @Override\n    public byte[] onRpcMessage(byte[] inMsg) {\n        InputStream  in          = new ByteArrayInputStream(inMsg);\n        OutputStream out         = new ByteArrayOutputStream();\n        TTransport   transport   = new TIOStreamTransport(in, out);\n        TProtocol    inProtocol  = inProtocolFactory.getProtocol(transport);\n        TProtocol    outProtocol = outProtocolFactory.getProtocol(transport);\n\n        try {\n            processor.process(inProtocol, outProtocol);\n            return ((ByteArrayOutputStream) out).toByteArray();\n        } catch (TException e) {\n            ExceptionHelper.logException(logger, e, \"onRpcMessage\");\n            throw new RuntimeException(e);\n        } finally {\n            transport.close();\n        }\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/message/model/Message.java",
    "content": "package com.messagebus.client.message.model;\n\nimport java.io.Serializable;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class Message implements Cloneable, Serializable {\n\n    //header\n    private long                messageId;\n    private String              type;\n    private long                timestamp;\n    private short               priority;\n    private String              expiration;\n    private Map<String, Object> headers;\n    private String              contentEncoding;\n    private String              contentType;\n    private String              replyTo;\n    private String              appId;\n    private String              userId;\n    private String              clusterId;\n    private String              correlationId;\n\n    private short deliveryMode = 2;\n\n    private byte[] content;\n\n    public Message() {\n    }\n\n    public long getMessageId() {\n        return messageId;\n    }\n\n    public void setMessageId(long messageId) {\n        this.messageId = messageId;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public long getTimestamp() {\n        return timestamp;\n    }\n\n    public void setTimestamp(long timestamp) {\n        this.timestamp = timestamp;\n    }\n\n    public short getPriority() {\n        return priority;\n    }\n\n    public void setPriority(short priority) {\n        this.priority = priority;\n    }\n\n    public String getExpiration() {\n        return expiration;\n    }\n\n    public short getDeliveryMode() {\n        return 2;\n    }\n\n    public Map<String, Object> getHeaders() {\n        return headers;\n    }\n\n    public void setHeaders(Map<String, Object> headers) {\n        this.headers = headers;\n    }\n\n    public String getContentEncoding() {\n        return contentEncoding;\n    }\n\n    public void setContentEncoding(String contentEncoding) {\n        this.contentEncoding = contentEncoding;\n    }\n\n    public String getContentType() {\n        return contentType;\n    }\n\n    public void setContentType(String contentType) {\n        this.contentType = contentType;\n    }\n\n    public String getReplyTo() {\n        return replyTo;\n    }\n\n    public void setReplyTo(String replyTo) {\n        this.replyTo = replyTo;\n    }\n\n    public String getAppId() {\n        return appId;\n    }\n\n    public void setAppId(String appId) {\n        this.appId = appId;\n    }\n\n    public String getUserId() {\n        return userId;\n    }\n\n    protected void setUserId(String userId) {\n        this.userId = null;\n    }\n\n    public String getClusterId() {\n        return clusterId;\n    }\n\n    protected void setClusterId(String clusterId) {\n        this.clusterId = null;\n    }\n\n    public String getCorrelationId() {\n        return correlationId;\n    }\n\n    public void setCorrelationId(String correlationId) {\n        this.correlationId = correlationId;\n    }\n\n    public byte[] getContent() {\n        return content;\n    }\n\n    public void setContent(byte[] content) {\n        this.content = content;\n    }\n\n    @Override\n    public Object clone() throws CloneNotSupportedException {\n        Message cloneObj = (Message) super.clone();\n        if (cloneObj.getHeaders() != null) {\n            HashMap<String, Object> header = new HashMap<String, Object>(cloneObj.getHeaders().size());\n            for (Map.Entry<String, Object> item : cloneObj.getHeaders().entrySet()) {\n                header.put(item.getKey(), item.getValue());\n            }\n            cloneObj.setHeaders(header);\n        } else {\n            cloneObj.setHeaders(new HashMap<String, Object>(1));\n        }\n\n        return cloneObj;\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/message/model/MessageFactory.java",
    "content": "package com.messagebus.client.message.model;\n\n\nimport com.messagebus.client.message.transfer.MessageHeaderTransfer;\nimport com.rabbitmq.client.AMQP;\nimport com.rabbitmq.client.GetResponse;\nimport com.rabbitmq.client.QueueingConsumer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\npublic class MessageFactory {\n\n    private static final Log logger = LogFactory.getLog(MessageFactory.class);\n\n    public static Message createMessage() {\n        Message aMsg;\n\n        aMsg = new Message();\n\n        return aMsg;\n    }\n\n    public static Message createMessage(QueueingConsumer.Delivery delivery) {\n        AMQP.BasicProperties properties = delivery.getProperties();\n        byte[]               msgBody    = delivery.getBody();\n\n        Message msg = MessageFactory.createMessage();\n        initMessage(msg, properties, msgBody);\n\n        return msg;\n    }\n\n    public static Message createMessage(GetResponse response) {\n        AMQP.BasicProperties properties = response.getProps();\n        byte[]               msgBody    = response.getBody();\n\n        Message msg = MessageFactory.createMessage();\n        initMessage(msg, properties, msgBody);\n\n        return msg;\n    }\n\n    private static void initMessage(Message msg,\n                                    AMQP.BasicProperties properties,\n                                    byte[] bodyData) {\n        MessageHeaderTransfer.unbox(properties, msg);\n        msg.setContent(bodyData);\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/message/model/MessageJSONSerializer.java",
    "content": "package com.messagebus.client.message.model;\n\nimport com.google.gson.*;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.Collection;\n\npublic class MessageJSONSerializer {\n\n    private static final Log  logger = LogFactory.getLog(MessageJSONSerializer.class);\n    private static final Gson gson   = new GsonBuilder().serializeNulls().create();\n\n    public static String serialize(Message msg) {\n        return gson.toJson(msg);\n    }\n\n    public static Message deSerialize(String msgStr) {\n        JsonParser  parser  = new JsonParser();\n        JsonElement element = parser.parse(msgStr);\n\n        Message msg = gson.fromJson(element, Message.class);\n\n        return msg;\n    }\n\n    public static Message deSerialize(JsonElement msgElement) {\n        JsonObject obj = msgElement.getAsJsonObject();\n        Message    msg = gson.fromJson(obj.get(\"message\"), Message.class);\n\n        return msg;\n    }\n\n    public static String serializeMessages(Collection<Message> msgs) {\n        return gson.toJson(msgs);\n    }\n\n    public static Message[] deSerializeMessages(String msgArrStr) {\n        int i = 0;\n\n        JsonParser  parser  = new JsonParser();\n        JsonElement element = parser.parse(msgArrStr);\n\n        if (!element.isJsonArray()) {\n            logger.error(\"unsupported original data. it should be a string of json object array \");\n            throw new UnsupportedOperationException(\"unsupported original data. \" +\n                    \"it should be a string of json object array \");\n        }\n\n        Message[] msgs = new Message[element.getAsJsonArray().size()];\n\n        for (JsonElement e : element.getAsJsonArray()) {\n            Message msg = gson.fromJson(e, Message.class);\n\n            msgs[i++] = msg;\n        }\n\n        return msgs;\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/message/transfer/MessageHeaderTransfer.java",
    "content": "package com.messagebus.client.message.transfer;\n\nimport com.messagebus.client.message.model.Message;\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.Date;\n\npublic class MessageHeaderTransfer {\n\n    private static final Log logger = LogFactory.getLog(MessageHeaderTransfer.class);\n\n    public static AMQP.BasicProperties box(Message msg) {\n        AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();\n\n        return builder.messageId(String.valueOf(msg.getMessageId()))\n                .appId(msg.getAppId())\n                .clusterId(msg.getClusterId())\n                .contentEncoding(msg.getContentEncoding())\n                .contentType(msg.getContentType())\n                .correlationId(msg.getCorrelationId())\n                .deliveryMode((int) msg.getDeliveryMode())\n                .expiration(msg.getExpiration())\n                .headers(msg.getHeaders())\n                .priority((int) msg.getPriority())\n                .replyTo(msg.getReplyTo())\n                .timestamp(new Date(msg.getTimestamp()))\n                .type(msg.getType())\n                .userId(msg.getUserId())\n                .build();\n    }\n\n    public static Message unbox(AMQP.BasicProperties properties,\n                                Message msg) {\n        //common properties\n        msg.setCorrelationId(properties.getCorrelationId());\n        msg.setHeaders(properties.getHeaders());\n        msg.setTimestamp(properties.getTimestamp().getTime());\n        String msgIdStr = properties.getMessageId();\n        if (msgIdStr != null && !msgIdStr.isEmpty())\n            msg.setMessageId(Long.parseLong(msgIdStr));\n        else\n            logger.error(\"[unbox] illegal message id (can not be null) \");\n\n        msg.setContentEncoding(properties.getContentEncoding());\n        msg.setContentType(properties.getContentType());\n        msg.setAppId(properties.getAppId());\n        msg.setReplyTo(properties.getReplyTo());\n\n        return msg;\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/model/BaseModel.java",
    "content": "package com.messagebus.client.model;\n\nimport java.io.Serializable;\n\n/**\n * the root class of all models\n */\npublic class BaseModel implements Serializable {\n\n    @Override\n    public String toString() {\n        return \"BaseModel\";\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/model/Config.java",
    "content": "package com.messagebus.client.model;\n\nimport java.io.Serializable;\n\npublic class Config implements Serializable {\n\n    private String key;\n    private String value;\n\n    public Config() {\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public void setKey(String key) {\n        this.key = key;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    @Override\n    public String toString() {\n        return \"Config{\" +\n                \"key='\" + key + '\\'' +\n                \", value='\" + value + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/model/HandlerModel.java",
    "content": "package com.messagebus.client.model;\n\nimport java.io.Serializable;\n\n/**\n * the model of handler.xml's element\n */\npublic class HandlerModel extends BaseModel implements Serializable {\n\n    private String handlerName;\n    private String handlerPath;\n\n    public HandlerModel() {\n    }\n\n    public String getHandlerName() {\n        return handlerName;\n    }\n\n    public void setHandlerName(String handlerName) {\n        this.handlerName = handlerName;\n    }\n\n    public String getHandlerPath() {\n        return handlerPath;\n    }\n\n    public void setHandlerPath(String handlerPath) {\n        this.handlerPath = handlerPath;\n    }\n\n    @Override\n    public String toString() {\n        return \"Handler{\" +\n                \"handlerName='\" + handlerName + '\\'' +\n                \", handlerPath='\" + handlerPath + '\\'' +\n                \"} \";\n    }\n}\n"
  },
  {
    "path": "client/src/main/java/com/messagebus/client/model/MessageCarryType.java",
    "content": "package com.messagebus.client.model;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * message carry type\n */\npublic enum MessageCarryType {\n\n    PRODUCE,\n    CONSUME,\n    REQUEST,\n    RESPONSE,\n    PUBLISH,\n    SUBSCRIBE,\n    BROADCAST,\n    RPCREQUEST,\n    RPCRESPONSE;\n\n    private static final ConcurrentMap<String, MessageCarryType> lookups =\n            new ConcurrentHashMap<String, MessageCarryType>(9);\n\n    static {\n        lookups.put(\"produce\", PRODUCE);\n        lookups.put(\"consume\", CONSUME);\n        lookups.put(\"request\", REQUEST);\n        lookups.put(\"response\", RESPONSE);\n        lookups.put(\"publish\", PUBLISH);\n        lookups.put(\"subscribe\", SUBSCRIBE);\n        lookups.put(\"broadcast\", BROADCAST);\n        lookups.put(\"rpcrequest\", RPCREQUEST);\n        lookups.put(\"rpcresponse\", RPCRESPONSE);\n    }\n\n\n    public static MessageCarryType lookup(String strType) {\n        MessageCarryType result = lookups.get(strType);\n\n        if (result == null)\n            throw new UnknownError(\"can not find the enum item of MessageCarryType which \" +\n                    \" maped the key : \" + strType);\n\n        return result;\n    }\n\n\n    public String stringOf() {\n        for (Map.Entry<String, MessageCarryType> entry : lookups.entrySet()) {\n            if (entry.getValue().equals(this))\n                return entry.getKey();\n        }\n\n        return \"\";\n    }\n\n}\n"
  },
  {
    "path": "client/src/main/resources/log4j.properties",
    "content": "#log4j.rootLogger=INFO, dailyLog\n#log4j.appender.dailyLog=org.apache.log4j.ConsoleAppender\n##log4j.appender.dailyLog=org.apache.log4j.DailyRollingFileAppender\n##log4j.appender.dailyLog.file=/Users/yanghua/Documents/ofbiz/mini-ofbiz/runtime/logs/access_log\n##log4j.appender.dailyLog.DatePattern='.'yyyy-MM-dd\n##log4j.appender.dailyLog.encoding=utf-8\n#log4j.appender.dailyLog.layout=org.apache.log4j.PatternLayout\n#log4j.appender.dailyLog.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss,SSS}] [%-5p] [messagebus] [messagebus] [%t] [%c] [%F:%L] %m %n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/Broadcast.java",
    "content": "package com.messagebus.client.api;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.event.component.NoticeEvent;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/20/15.\n */\npublic class Broadcast extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(Broadcast.class);\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    public void testBroadcast() throws Exception {\n        String secret = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        NotificationEventProcessor eventProcessor = new NotificationEventProcessor();\n        client.registerEventProcessor(eventProcessor);\n\n        client.broadcast(secret, new Message[]{msg});\n\n        TimeUnit.SECONDS.sleep(5);\n\n        client.unregisterEventProcessor(eventProcessor);\n    }\n\n    public static class NotificationEventProcessor {\n\n        @Subscribe\n        public void onNotification(NoticeEvent event) {\n            logger.info(\"onNotification\");\n            Message message = event.getMsg();\n            assertNotNull(message);\n            assertEquals(\"test\", new String(message.getContent(), Constants.CHARSET_OF_UTF8));\n        }\n\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/ComponentEventListener.java",
    "content": "package com.messagebus.client.api;\n\nimport com.google.common.eventbus.Subscribe;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.event.component.ClientDestroyEvent;\nimport com.messagebus.client.event.component.ClientInitedEvent;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.junit.Test;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 6/25/15.\n */\npublic class ComponentEventListener extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(ComponentEventListener.class);\n\n    @Override\n    public void setUp() throws Exception {\n\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n\n    }\n\n    @Test\n    public void testComponentEvent() throws Exception {\n        singlePool = new MessagebusSinglePool(zkConnectionStr);\n        singlePool.registerComponentEventListener(new EventListener());\n        client = singlePool.getResource();\n\n        TimeUnit.SECONDS.sleep(5);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    public class EventListener {\n\n        @Subscribe\n        public void onClientInited(ClientInitedEvent event) {\n            logger.debug(\" outer of component event : onClientInited\");\n        }\n\n        @Subscribe\n        public void onClientDestroy(ClientDestroyEvent event) {\n            logger.debug(\" outer of component event : onClientDestroy\");\n        }\n\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/ProduceConsume.java",
    "content": "package com.messagebus.client.api;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/20/15.\n */\npublic class ProduceConsume extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(ProduceConsume.class);\n\n    private String consumeSecret = \"kjhasdfhlkuqjhgaebjhasgdfabfak\";\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    private void commonProduce() {\n        String secret = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n        String token  = \"hlkasjdhfkqlwhlfalksjdhgssssas\";\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n        msg.setContent(\"test\".getBytes());\n\n        client.produce(secret, \"erpDemoConsume\", msg, token);\n    }\n\n    public void testSimpleProduceConsume() throws Exception {\n        commonProduce();\n\n        List<Message> msgs = client.consume(consumeSecret, 1);\n        assertNotNull(msgs);\n        assertEquals(1, msgs.size());\n        Message result = msgs.get(0);\n        assertNotNull(result);\n        assertNotNull(result.getContent());\n        assertEquals(\"test\", new String(result.getContent()));\n\n        for (Message item : msgs) {\n            logger.info(item.getMessageId());\n        }\n    }\n\n    public void testProduceAndConsumeWithPushStyle() {\n        commonProduce();\n\n        client.consume(consumeSecret, 3, TimeUnit.SECONDS, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                assertNotNull(message);\n                assertEquals(\"test\", new String(message.getContent(), Constants.CHARSET_OF_UTF8));\n            }\n        });\n    }\n\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/ProduceConsumeLoopback.java",
    "content": "//package com.messagebus.client.api;\n//\n//import com.messagebus.client.IMessageReceiveListener;\n//import com.messagebus.client.core.BaseTestCase;\n//import com.messagebus.client.message.model.Message;\n//import com.messagebus.client.message.model.MessageFactory;\n//import com.messagebus.client.message.model.MessageType;\n//import com.messagebus.common.Constants;\n//\n//import java.util.concurrent.TimeUnit;\n//\n///**\n// * Created by yanghua on 3/25/15.\n// */\n//public class ProduceConsumeLoopback extends BaseTestCase {\n//\n//    @Override\n//    public void setUp() throws Exception {\n//        super.setUp();\n//    }\n//\n//    @Override\n//    public void tearDown() throws Exception {\n//        super.tearDown();\n//    }\n//\n//    private void commonProduce() {\n//        String secret = \"jnmzqwemnjaksdfqjnkajfjasndfnw\";\n//        String token = \"jnmzqwemnjaksdfqjnkajfjasndfnw\";\n//\n//        Message msg = MessageFactory.createMessage(MessageType.QueueMessage);\n//        msg.setContentType(\"text/plain\");\n//        msg.setContentEncoding(\"utf-8\");\n//        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n//\n//        client.produce(secret, \"erpDemoProduce-Consume\", msg, token);\n//    }\n//\n//    public void testLoopBack() throws Exception {\n//        commonProduce();\n//\n//        String consumeSecret = \"jnmzqwemnjaksdfqjnkajfjasndfnw\";\n//        client.consume(consumeSecret, 10, TimeUnit.SECONDS, new IMessageReceiveListener() {\n//            @Override\n//            public void onMessage(Message message) {\n//                assertNotNull(message);\n//                assertEquals(\"test\", new String(message.getContent(), Constants.CHARSET_OF_UTF8));\n//            }\n//        });\n//    }\n//}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/PublishSubscribe.java",
    "content": "package com.messagebus.client.api;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/20/15.\n */\npublic class PublishSubscribe extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(PublishSubscribe.class);\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    public void testPublishAndSubscribe() throws Exception {\n        String secret = \"oiqwenncuicnsdfuasdfnkajkwqowe\";\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        client.publish(secret, new Message[]{msg});\n\n        //--------------------------subscribe-------------------------------\n\n        secret = \"nckljsenlkjanefluiwnlanfmsdfas\";\n        String token = \"nclajsdljhqiuwehfiusaiudfhiausd\";\n        client.subscribe(secret, \"erpDemoPublish\", token, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                assertNotNull(message);\n                assertEquals(\"test\", new String(message.getContent(), Constants.CHARSET_OF_UTF8));\n            }\n        }, 3, TimeUnit.SECONDS);\n\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/RequestResponse.java",
    "content": "package com.messagebus.client.api;\n\nimport com.google.common.base.Strings;\nimport com.messagebus.client.IRequestListener;\nimport com.messagebus.client.MessageResponseTimeoutException;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/20/15.\n */\npublic class RequestResponse extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(RequestResponse.class);\n\n    @Override\n    public void setUp() throws Exception {\n\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n\n    }\n\n    public void testRequestAndResponse() throws Exception {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                final String         secret     = \"muciasnajjkasbdfbaskjdfkjkasja\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n                final Messagebus     client     = singlePool.getResource();\n\n                client.response(secret, new IRequestListener() {\n\n                    @Override\n                    public Message onRequest(Message requestMsg) {\n                        if (Strings.isNullOrEmpty(requestMsg.getCorrelationId())) {\n                            logger.info(\"got requested message : \" + requestMsg.getCorrelationId());\n                        }\n\n                        assertNotNull(requestMsg);\n                        assertEquals(\"test\", new String(requestMsg.getContent(), Constants.CHARSET_OF_UTF8));\n\n                        Message respMsg = MessageFactory.createMessage();\n                        respMsg.setContentType(\"text/plain\");\n                        respMsg.setContentEncoding(\"utf-8\");\n                        respMsg.setCorrelationId(requestMsg.getCorrelationId());\n\n                        respMsg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n                        return respMsg;\n                    }\n\n                }, 15, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n        String               secret     = \"iuoqiwejicaoisfaisfbsqewnfjnfa\";\n        String               token      = \"cakjdhfjasdflqjoiajsdjflqkuwef\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n        Messagebus           client     = singlePool.getResource();\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        Message responseMsg = null;\n\n        try {\n            responseMsg = client.request(secret, \"erpDemoResponse\", msg, token, 10);\n        } catch (MessageResponseTimeoutException e) {\n            e.printStackTrace();\n        }\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n\n        assertNotNull(responseMsg);\n        assertEquals(\"test\", new String(responseMsg.getContent(), Constants.CHARSET_OF_UTF8));\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/api/RpcRequestResponse.java",
    "content": "package com.messagebus.client.api;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.core.BaseTestCase;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 4/8/15.\n */\npublic class RpcRequestResponse extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(RpcRequestResponse.class);\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    public void testSimpleRpc() throws Exception {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                String               secret     = \"jhliquwdlaisudfqbjhasdfulquias\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n                final Messagebus     client     = singlePool.getResource();\n\n                client.callback(secret, TestInterface.class, new HelloServiceProvider(), 10, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n        Messagebus           client     = singlePool.getResource();\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"erpDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"sayHello\";\n        Object responseObj = client.call(secret, targetQueue, methodName, new Object[0], token, 10000);\n\n        assertNull(responseObj);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    public void testReturnValueRpc() throws Exception {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                String               secret     = \"jhliquwdlaisudfqbjhasdfulquias\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n                final Messagebus     client     = singlePool.getResource();\n\n                client.callback(secret, TestInterface.class, new HelloServiceProvider(), 10, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n        Messagebus           client     = singlePool.getResource();\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"erpDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"returnValueMethod\";\n        Object responseObj = client.call(secret, targetQueue, methodName, new Object[0], token, 10000);\n\n        assertNotNull(responseObj);\n        assertEquals(\"hello world\", responseObj.toString());\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    public void testParamNoReturnValueRpc() throws Exception {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                String               secret     = \"jhliquwdlaisudfqbjhasdfulquias\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n                final Messagebus     client     = singlePool.getResource();\n\n                client.callback(secret, TestInterface.class, new HelloServiceProvider(), 10, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n        Messagebus           client     = singlePool.getResource();\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"erpDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"printParam\";\n        Object responseObj = client.call(secret, targetQueue, methodName, new Object[]{\"hello world\"}, token, 10000);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    public void testReturnParamValueRpc() throws Exception {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                String               secret     = \"jhliquwdlaisudfqbjhasdfulquias\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n                final Messagebus     client     = singlePool.getResource();\n\n                client.callback(secret, TestInterface.class, new HelloServiceProvider(), 10, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n        Messagebus           client     = singlePool.getResource();\n\n        String secret      = \"kliwhiduhaiucvarkjajksdbfkjabw\";\n        String targetQueue = \"erpDemoRpcResponse\";\n        String token       = \"klasehnfkljashdnflhkjahwlekdjf\";\n        String methodName  = \"returnParam\";\n        Object responseObj = client.call(secret, targetQueue, methodName, new Object[]{\"hello world\"}, token, 10000);\n\n        assertNotNull(responseObj);\n        assertEquals(\"hello world\", responseObj.toString());\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    public static interface TestInterface {\n\n        public void sayHello();\n\n        public String returnValueMethod();\n\n        public void printParam(String arg1);\n\n        public String returnParam(String arg1);\n\n    }\n\n    public static class HelloServiceProvider implements TestInterface {\n\n        @Override\n        public void sayHello() {\n            logger.info(\"hello...\");\n        }\n\n        @Override\n        public String returnValueMethod() {\n            return \"hello world\";\n        }\n\n        @Override\n        public void printParam(String arg1) {\n            System.out.println(arg1);\n        }\n\n        @Override\n        public String returnParam(String arg1) {\n            return arg1;\n        }\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/core/BaseTestCase.java",
    "content": "package com.messagebus.client.core;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.common.TestVariableInfo;\nimport junit.framework.TestCase;\n\n/**\n * Created by yanghua on 3/20/15.\n */\npublic class BaseTestCase extends TestCase {\n\n    protected String zkConnectionStr = TestVariableInfo.ZK_CONNECTION_STRING;\n\n    protected MessagebusSinglePool singlePool;\n    protected Messagebus           client;\n\n    @Override\n    public void setUp() throws Exception {\n        singlePool = new MessagebusSinglePool(zkConnectionStr);\n        client = singlePool.getResource();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/core/MessageUtil.java",
    "content": "package com.messagebus.client.core;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\n\n/**\n * Created by yanghua on 3/27/15.\n */\npublic class MessageUtil {\n\n    public static Message create(int sizeOfByte) {\n        Message msg = MessageFactory.createMessage();\n\n        byte[] content = generate(sizeOfByte);\n\n        msg.setContent(content);\n\n        return msg;\n    }\n\n    private static byte[] generate(int sizeOfByte) {\n        byte[] result = new byte[sizeOfByte];\n        for (int i = 0; i < sizeOfByte; i++) {\n            result[i] = (byte) 1;\n        }\n\n        return result;\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/feature/CalcService.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.9.2)\n * <p/>\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *\n * @generated\n */\npackage com.messagebus.client.feature;\n\nimport org.apache.thrift.EncodingUtils;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.async.AsyncMethodCallback;\nimport org.apache.thrift.protocol.TTupleProtocol;\nimport org.apache.thrift.scheme.IScheme;\nimport org.apache.thrift.scheme.SchemeFactory;\nimport org.apache.thrift.scheme.StandardScheme;\nimport org.apache.thrift.scheme.TupleScheme;\nimport org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.annotation.Generated;\nimport java.util.*;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\"})\n@Generated(value = \"Autogenerated by Thrift Compiler (0.9.2)\", date = \"2015-4-17\")\npublic class CalcService {\n\n    public interface Iface {\n\n        public int calcSum() throws TException;\n\n    }\n\n    public interface AsyncIface {\n\n        public void calcSum(AsyncMethodCallback resultHandler) throws TException;\n\n    }\n\n    public static class Client extends org.apache.thrift.TServiceClient implements Iface {\n        public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {\n            public Factory() {\n            }\n\n            public Client getClient(org.apache.thrift.protocol.TProtocol prot) {\n                return new Client(prot);\n            }\n\n            public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n                return new Client(iprot, oprot);\n            }\n        }\n\n        public Client(org.apache.thrift.protocol.TProtocol prot) {\n            super(prot, prot);\n        }\n\n        public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n            super(iprot, oprot);\n        }\n\n        public int calcSum() throws TException {\n            send_calcSum();\n            return recv_calcSum();\n        }\n\n        public void send_calcSum() throws TException {\n            calcSum_args args = new calcSum_args();\n            sendBase(\"calcSum\", args);\n        }\n\n        public int recv_calcSum() throws TException {\n            calcSum_result result = new calcSum_result();\n            receiveBase(result, \"calcSum\");\n            if (result.isSetSuccess()) {\n                return result.success;\n            }\n            throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"calcSum failed: unknown result\");\n        }\n\n    }\n\n    public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {\n        public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {\n            private org.apache.thrift.async.TAsyncClientManager clientManager;\n            private org.apache.thrift.protocol.TProtocolFactory protocolFactory;\n\n            public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {\n                this.clientManager = clientManager;\n                this.protocolFactory = protocolFactory;\n            }\n\n            public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {\n                return new AsyncClient(protocolFactory, clientManager, transport);\n            }\n        }\n\n        public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {\n            super(protocolFactory, clientManager, transport);\n        }\n\n        public void calcSum(AsyncMethodCallback resultHandler) throws TException {\n            checkReady();\n            calcSum_call method_call = new calcSum_call(resultHandler, this, ___protocolFactory, ___transport);\n            this.___currentMethod = method_call;\n            ___manager.call(method_call);\n        }\n\n        public static class calcSum_call extends org.apache.thrift.async.TAsyncMethodCall {\n            public calcSum_call(AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws TException {\n                super(client, protocolFactory, transport, resultHandler, false);\n            }\n\n            public void write_args(org.apache.thrift.protocol.TProtocol prot) throws TException {\n                prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"calcSum\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n                calcSum_args args = new calcSum_args();\n                args.write(prot);\n                prot.writeMessageEnd();\n            }\n\n            public int getResult() throws TException {\n                if (getState() != State.RESPONSE_READ) {\n                    throw new IllegalStateException(\"Method call not finished!\");\n                }\n                org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n                org.apache.thrift.protocol.TProtocol              prot            = client.getProtocolFactory().getProtocol(memoryTransport);\n                return (new Client(prot)).recv_calcSum();\n            }\n        }\n\n    }\n\n    public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {\n        private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class.getName());\n\n        public Processor(I iface) {\n            super(iface, getProcessMap(new HashMap<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));\n        }\n\n        protected Processor(I iface, Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n            super(iface, getProcessMap(processMap));\n        }\n\n        private static <I extends Iface> Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(Map<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n            processMap.put(\"calcSum\", new calcSum());\n            return processMap;\n        }\n\n        public static class calcSum<I extends Iface> extends org.apache.thrift.ProcessFunction<I, calcSum_args> {\n            public calcSum() {\n                super(\"calcSum\");\n            }\n\n            public calcSum_args getEmptyArgsInstance() {\n                return new calcSum_args();\n            }\n\n            protected boolean isOneway() {\n                return false;\n            }\n\n            public calcSum_result getResult(I iface, calcSum_args args) throws TException {\n                calcSum_result result = new calcSum_result();\n                result.success = iface.calcSum();\n                result.setSuccessIsSet(true);\n                return result;\n            }\n        }\n\n    }\n\n    public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {\n        private static final Logger LOGGER = LoggerFactory.getLogger(AsyncProcessor.class.getName());\n\n        public AsyncProcessor(I iface) {\n            super(iface, getProcessMap(new HashMap<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));\n        }\n\n        protected AsyncProcessor(I iface, Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> processMap) {\n            super(iface, getProcessMap(processMap));\n        }\n\n        private static <I extends AsyncIface> Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> getProcessMap(Map<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>> processMap) {\n            processMap.put(\"calcSum\", new calcSum());\n            return processMap;\n        }\n\n        public static class calcSum<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, calcSum_args, Integer> {\n            public calcSum() {\n                super(\"calcSum\");\n            }\n\n            public calcSum_args getEmptyArgsInstance() {\n                return new calcSum_args();\n            }\n\n            public AsyncMethodCallback<Integer> getResultHandler(final AsyncFrameBuffer fb, final int seqid) {\n                final org.apache.thrift.AsyncProcessFunction fcall = this;\n                return new AsyncMethodCallback<Integer>() {\n                    public void onComplete(Integer o) {\n                        calcSum_result result = new calcSum_result();\n                        result.success = o;\n                        result.setSuccessIsSet(true);\n                        try {\n                            fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY, seqid);\n                            return;\n                        } catch (Exception e) {\n                            LOGGER.error(\"Exception writing to internal frame buffer\", e);\n                        }\n                        fb.close();\n                    }\n\n                    public void onError(Exception e) {\n                        byte                    msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n                        org.apache.thrift.TBase msg;\n                        calcSum_result          result  = new calcSum_result();\n                        {\n                            msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n                            msg = (org.apache.thrift.TBase) new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n                        }\n                        try {\n                            fcall.sendResponse(fb, msg, msgType, seqid);\n                            return;\n                        } catch (Exception ex) {\n                            LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n                        }\n                        fb.close();\n                    }\n                };\n            }\n\n            protected boolean isOneway() {\n                return false;\n            }\n\n            public void start(I iface, calcSum_args args, AsyncMethodCallback<Integer> resultHandler) throws TException {\n                iface.calcSum(resultHandler);\n            }\n        }\n\n    }\n\n    public static class calcSum_args implements org.apache.thrift.TBase<calcSum_args, calcSum_args._Fields>, java.io.Serializable, Cloneable, Comparable<calcSum_args> {\n        private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"calcSum_args\");\n\n\n        private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n\n        static {\n            schemes.put(StandardScheme.class, new calcSum_argsStandardSchemeFactory());\n            schemes.put(TupleScheme.class, new calcSum_argsTupleSchemeFactory());\n        }\n\n\n        /**\n         * The set of fields this struct contains, along with convenience methods for finding and manipulating them.\n         */\n        public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n            ;\n\n            private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n            static {\n                for (_Fields field : EnumSet.allOf(_Fields.class)) {\n                    byName.put(field.getFieldName(), field);\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, or null if its not found.\n             */\n            public static _Fields findByThriftId(int fieldId) {\n                switch (fieldId) {\n                    default:\n                        return null;\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, throwing an exception\n             * if it is not found.\n             */\n            public static _Fields findByThriftIdOrThrow(int fieldId) {\n                _Fields fields = findByThriftId(fieldId);\n                if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n                return fields;\n            }\n\n            /**\n             * Find the _Fields constant that matches name, or null if its not found.\n             */\n            public static _Fields findByName(String name) {\n                return byName.get(name);\n            }\n\n            private final short  _thriftId;\n            private final String _fieldName;\n\n            _Fields(short thriftId, String fieldName) {\n                _thriftId = thriftId;\n                _fieldName = fieldName;\n            }\n\n            public short getThriftFieldId() {\n                return _thriftId;\n            }\n\n            public String getFieldName() {\n                return _fieldName;\n            }\n        }\n\n        public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n\n        static {\n            Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n            metaDataMap = Collections.unmodifiableMap(tmpMap);\n            org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(calcSum_args.class, metaDataMap);\n        }\n\n        public calcSum_args() {\n        }\n\n        /**\n         * Performs a deep copy on <i>other</i>.\n         */\n        public calcSum_args(calcSum_args other) {\n        }\n\n        public calcSum_args deepCopy() {\n            return new calcSum_args(this);\n        }\n\n        @Override\n        public void clear() {\n        }\n\n        public void setFieldValue(_Fields field, Object value) {\n            switch (field) {\n            }\n        }\n\n        public Object getFieldValue(_Fields field) {\n            switch (field) {\n            }\n            throw new IllegalStateException();\n        }\n\n        /**\n         * Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSet(_Fields field) {\n            if (field == null) {\n                throw new IllegalArgumentException();\n            }\n\n            switch (field) {\n            }\n            throw new IllegalStateException();\n        }\n\n        @Override\n        public boolean equals(Object that) {\n            if (that == null)\n                return false;\n            if (that instanceof calcSum_args)\n                return this.equals((calcSum_args) that);\n            return false;\n        }\n\n        public boolean equals(calcSum_args that) {\n            if (that == null)\n                return false;\n\n            return true;\n        }\n\n        @Override\n        public int hashCode() {\n            List<Object> list = new ArrayList<Object>();\n\n            return list.hashCode();\n        }\n\n        @Override\n        public int compareTo(calcSum_args other) {\n            if (!getClass().equals(other.getClass())) {\n                return getClass().getName().compareTo(other.getClass().getName());\n            }\n\n            int lastComparison = 0;\n\n            return 0;\n        }\n\n        public _Fields fieldForId(int fieldId) {\n            return _Fields.findByThriftId(fieldId);\n        }\n\n        public void read(org.apache.thrift.protocol.TProtocol iprot) throws TException {\n            schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n        }\n\n        public void write(org.apache.thrift.protocol.TProtocol oprot) throws TException {\n            schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n        }\n\n        @Override\n        public String toString() {\n            StringBuilder sb    = new StringBuilder(\"calcSum_args(\");\n            boolean       first = true;\n\n            sb.append(\")\");\n            return sb.toString();\n        }\n\n        public void validate() throws TException {\n            // check for required fields\n            // check for sub-struct validity\n        }\n\n        private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n            try {\n                write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n            try {\n                read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private static class calcSum_argsStandardSchemeFactory implements SchemeFactory {\n            public calcSum_argsStandardScheme getScheme() {\n                return new calcSum_argsStandardScheme();\n            }\n        }\n\n        private static class calcSum_argsStandardScheme extends StandardScheme<calcSum_args> {\n\n            public void read(org.apache.thrift.protocol.TProtocol iprot, calcSum_args struct) throws TException {\n                org.apache.thrift.protocol.TField schemeField;\n                iprot.readStructBegin();\n                while (true) {\n                    schemeField = iprot.readFieldBegin();\n                    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {\n                        break;\n                    }\n                    switch (schemeField.id) {\n                        default:\n                            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                    }\n                    iprot.readFieldEnd();\n                }\n                iprot.readStructEnd();\n\n                // check for required fields of primitive type, which can't be checked in the validate method\n                struct.validate();\n            }\n\n            public void write(org.apache.thrift.protocol.TProtocol oprot, calcSum_args struct) throws TException {\n                struct.validate();\n\n                oprot.writeStructBegin(STRUCT_DESC);\n                oprot.writeFieldStop();\n                oprot.writeStructEnd();\n            }\n\n        }\n\n        private static class calcSum_argsTupleSchemeFactory implements SchemeFactory {\n            public calcSum_argsTupleScheme getScheme() {\n                return new calcSum_argsTupleScheme();\n            }\n        }\n\n        private static class calcSum_argsTupleScheme extends TupleScheme<calcSum_args> {\n\n            @Override\n            public void write(org.apache.thrift.protocol.TProtocol prot, calcSum_args struct) throws TException {\n                TTupleProtocol oprot = (TTupleProtocol) prot;\n            }\n\n            @Override\n            public void read(org.apache.thrift.protocol.TProtocol prot, calcSum_args struct) throws TException {\n                TTupleProtocol iprot = (TTupleProtocol) prot;\n            }\n        }\n\n    }\n\n    public static class calcSum_result implements org.apache.thrift.TBase<calcSum_result, calcSum_result._Fields>, java.io.Serializable, Cloneable, Comparable<calcSum_result> {\n        private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"calcSum_result\");\n\n        private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.I32, (short) 0);\n\n        private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n\n        static {\n            schemes.put(StandardScheme.class, new calcSum_resultStandardSchemeFactory());\n            schemes.put(TupleScheme.class, new calcSum_resultTupleSchemeFactory());\n        }\n\n        public int success; // required\n\n        /**\n         * The set of fields this struct contains, along with convenience methods for finding and manipulating them.\n         */\n        public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n            SUCCESS((short) 0, \"success\");\n\n            private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n            static {\n                for (_Fields field : EnumSet.allOf(_Fields.class)) {\n                    byName.put(field.getFieldName(), field);\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, or null if its not found.\n             */\n            public static _Fields findByThriftId(int fieldId) {\n                switch (fieldId) {\n                    case 0: // SUCCESS\n                        return SUCCESS;\n                    default:\n                        return null;\n                }\n            }\n\n            /**\n             * Find the _Fields constant that matches fieldId, throwing an exception\n             * if it is not found.\n             */\n            public static _Fields findByThriftIdOrThrow(int fieldId) {\n                _Fields fields = findByThriftId(fieldId);\n                if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n                return fields;\n            }\n\n            /**\n             * Find the _Fields constant that matches name, or null if its not found.\n             */\n            public static _Fields findByName(String name) {\n                return byName.get(name);\n            }\n\n            private final short  _thriftId;\n            private final String _fieldName;\n\n            _Fields(short thriftId, String fieldName) {\n                _thriftId = thriftId;\n                _fieldName = fieldName;\n            }\n\n            public short getThriftFieldId() {\n                return _thriftId;\n            }\n\n            public String getFieldName() {\n                return _fieldName;\n            }\n        }\n\n        // isset id assignments\n        private static final int  __SUCCESS_ISSET_ID = 0;\n        private              byte __isset_bitfield   = 0;\n        public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n\n        static {\n            Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n            tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT,\n                    new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n            metaDataMap = Collections.unmodifiableMap(tmpMap);\n            org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(calcSum_result.class, metaDataMap);\n        }\n\n        public calcSum_result() {\n        }\n\n        public calcSum_result(\n                int success) {\n            this();\n            this.success = success;\n            setSuccessIsSet(true);\n        }\n\n        /**\n         * Performs a deep copy on <i>other</i>.\n         */\n        public calcSum_result(calcSum_result other) {\n            __isset_bitfield = other.__isset_bitfield;\n            this.success = other.success;\n        }\n\n        public calcSum_result deepCopy() {\n            return new calcSum_result(this);\n        }\n\n        @Override\n        public void clear() {\n            setSuccessIsSet(false);\n            this.success = 0;\n        }\n\n        public int getSuccess() {\n            return this.success;\n        }\n\n        public calcSum_result setSuccess(int success) {\n            this.success = success;\n            setSuccessIsSet(true);\n            return this;\n        }\n\n        public void unsetSuccess() {\n            __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n        }\n\n        /**\n         * Returns true if field success is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSetSuccess() {\n            return EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n        }\n\n        public void setSuccessIsSet(boolean value) {\n            __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n        }\n\n        public void setFieldValue(_Fields field, Object value) {\n            switch (field) {\n                case SUCCESS:\n                    if (value == null) {\n                        unsetSuccess();\n                    } else {\n                        setSuccess((Integer) value);\n                    }\n                    break;\n\n            }\n        }\n\n        public Object getFieldValue(_Fields field) {\n            switch (field) {\n                case SUCCESS:\n                    return Integer.valueOf(getSuccess());\n\n            }\n            throw new IllegalStateException();\n        }\n\n        /**\n         * Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise\n         */\n        public boolean isSet(_Fields field) {\n            if (field == null) {\n                throw new IllegalArgumentException();\n            }\n\n            switch (field) {\n                case SUCCESS:\n                    return isSetSuccess();\n            }\n            throw new IllegalStateException();\n        }\n\n        @Override\n        public boolean equals(Object that) {\n            if (that == null)\n                return false;\n            if (that instanceof calcSum_result)\n                return this.equals((calcSum_result) that);\n            return false;\n        }\n\n        public boolean equals(calcSum_result that) {\n            if (that == null)\n                return false;\n\n            boolean this_present_success = true;\n            boolean that_present_success = true;\n            if (this_present_success || that_present_success) {\n                if (!(this_present_success && that_present_success))\n                    return false;\n                if (this.success != that.success)\n                    return false;\n            }\n\n            return true;\n        }\n\n        @Override\n        public int hashCode() {\n            List<Object> list = new ArrayList<Object>();\n\n            boolean present_success = true;\n            list.add(present_success);\n            if (present_success)\n                list.add(success);\n\n            return list.hashCode();\n        }\n\n        @Override\n        public int compareTo(calcSum_result other) {\n            if (!getClass().equals(other.getClass())) {\n                return getClass().getName().compareTo(other.getClass().getName());\n            }\n\n            int lastComparison = 0;\n\n            lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n            if (lastComparison != 0) {\n                return lastComparison;\n            }\n            if (isSetSuccess()) {\n                lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n                if (lastComparison != 0) {\n                    return lastComparison;\n                }\n            }\n            return 0;\n        }\n\n        public _Fields fieldForId(int fieldId) {\n            return _Fields.findByThriftId(fieldId);\n        }\n\n        public void read(org.apache.thrift.protocol.TProtocol iprot) throws TException {\n            schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n        }\n\n        public void write(org.apache.thrift.protocol.TProtocol oprot) throws TException {\n            schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n        }\n\n        @Override\n        public String toString() {\n            StringBuilder sb    = new StringBuilder(\"calcSum_result(\");\n            boolean       first = true;\n\n            sb.append(\"success:\");\n            sb.append(this.success);\n            first = false;\n            sb.append(\")\");\n            return sb.toString();\n        }\n\n        public void validate() throws TException {\n            // check for required fields\n            // check for sub-struct validity\n        }\n\n        private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n            try {\n                write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n            try {\n                // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n                __isset_bitfield = 0;\n                read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n            } catch (TException te) {\n                throw new java.io.IOException(te);\n            }\n        }\n\n        private static class calcSum_resultStandardSchemeFactory implements SchemeFactory {\n            public calcSum_resultStandardScheme getScheme() {\n                return new calcSum_resultStandardScheme();\n            }\n        }\n\n        private static class calcSum_resultStandardScheme extends StandardScheme<calcSum_result> {\n\n            public void read(org.apache.thrift.protocol.TProtocol iprot, calcSum_result struct) throws TException {\n                org.apache.thrift.protocol.TField schemeField;\n                iprot.readStructBegin();\n                while (true) {\n                    schemeField = iprot.readFieldBegin();\n                    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {\n                        break;\n                    }\n                    switch (schemeField.id) {\n                        case 0: // SUCCESS\n                            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n                                struct.success = iprot.readI32();\n                                struct.setSuccessIsSet(true);\n                            } else {\n                                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                            }\n                            break;\n                        default:\n                            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n                    }\n                    iprot.readFieldEnd();\n                }\n                iprot.readStructEnd();\n\n                // check for required fields of primitive type, which can't be checked in the validate method\n                struct.validate();\n            }\n\n            public void write(org.apache.thrift.protocol.TProtocol oprot, calcSum_result struct) throws TException {\n                struct.validate();\n\n                oprot.writeStructBegin(STRUCT_DESC);\n                if (struct.isSetSuccess()) {\n                    oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n                    oprot.writeI32(struct.success);\n                    oprot.writeFieldEnd();\n                }\n                oprot.writeFieldStop();\n                oprot.writeStructEnd();\n            }\n\n        }\n\n        private static class calcSum_resultTupleSchemeFactory implements SchemeFactory {\n            public calcSum_resultTupleScheme getScheme() {\n                return new calcSum_resultTupleScheme();\n            }\n        }\n\n        private static class calcSum_resultTupleScheme extends TupleScheme<calcSum_result> {\n\n            @Override\n            public void write(org.apache.thrift.protocol.TProtocol prot, calcSum_result struct) throws TException {\n                TTupleProtocol oprot     = (TTupleProtocol) prot;\n                BitSet         optionals = new BitSet();\n                if (struct.isSetSuccess()) {\n                    optionals.set(0);\n                }\n                oprot.writeBitSet(optionals, 1);\n                if (struct.isSetSuccess()) {\n                    oprot.writeI32(struct.success);\n                }\n            }\n\n            @Override\n            public void read(org.apache.thrift.protocol.TProtocol prot, calcSum_result struct) throws TException {\n                TTupleProtocol iprot    = (TTupleProtocol) prot;\n                BitSet         incoming = iprot.readBitSet(1);\n                if (incoming.get(0)) {\n                    struct.success = iprot.readI32();\n                    struct.setSuccessIsSet(true);\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/feature/CalcServiceImpl.java",
    "content": "package com.messagebus.client.feature;\n\nimport org.apache.thrift.TException;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic class CalcServiceImpl implements CalcService.Iface {\n\n    @Override\n    public int calcSum() throws TException {\n        int sum = 0;\n        for (int i = 1; i <= 100; i++) {\n            sum += i;\n        }\n        return sum;\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/feature/MessageBodySize.java",
    "content": "package com.messagebus.client.feature;\n\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.core.MessageUtil;\nimport com.messagebus.client.message.model.Message;\n\n/**\n * Created by yanghua on 3/27/15.\n */\npublic class MessageBodySize extends BaseTestCase {\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    public void testMsgBodySizeOverhead() throws Exception {\n        String secret = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n        String token  = \"hlkasjdhfkqlwhlfalksjdhgssssas\";\n\n        Message msg = MessageUtil.create(4000);\n\n        client.produce(secret, \"emapDemoConsume\", msg, token);\n    }\n}\n\n\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/feature/MessageNumLimit.java",
    "content": "package com.messagebus.client.feature;\n\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.core.MessageUtil;\nimport com.messagebus.client.message.model.Message;\n\n/**\n * Created by yanghua on 3/27/15.\n */\npublic class MessageNumLimit extends BaseTestCase {\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n    public void testMessageNumLimit() throws Exception {\n        String secret = \"muqwejlaksdfkljaliqwejflkasdfs\";\n        String token  = \"jhlkasdfkjhasdfqwkasdfjqkwjhas\";\n\n        Message msg = MessageUtil.create(500);\n\n        for (int i = 0; i < 300; i++) {\n            client.produce(secret, \"erpDemoProduce-Consume\", msg, token);\n        }\n\n    }\n}\n"
  },
  {
    "path": "client/src/test/java/com/messagebus/client/feature/ThriftWithAMQPRpc.java",
    "content": "package com.messagebus.client.feature;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.WrappedRpcServer;\nimport com.messagebus.client.core.BaseTestCase;\nimport com.messagebus.client.extension.thrift.TAMQPClientTransport;\nimport com.messagebus.client.extension.thrift.ThriftMessageHandler;\nimport com.messagebus.common.TestVariableInfo;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.thrift.TProcessor;\nimport org.apache.thrift.protocol.TJSONProtocol;\nimport org.apache.thrift.protocol.TProtocol;\nimport org.apache.thrift.protocol.TProtocolFactory;\nimport org.apache.thrift.transport.TTransport;\n\n/**\n * Created by yanghua on 4/17/15.\n */\npublic class ThriftWithAMQPRpc extends BaseTestCase {\n\n    private static final Log logger = LogFactory.getLog(ThriftWithAMQPRpc.class);\n\n    @Override\n    public void setUp() throws Exception {\n        super.setUp();\n    }\n\n    @Override\n    public void tearDown() throws Exception {\n        super.tearDown();\n    }\n\n\n    public void testThriftRpc() throws Exception {\n        TTransport transport = new TAMQPClientTransport(this.client,\n                \"kliwhiduhaiucvarkjajksdbfkjabw\",\n                \"emapDemoRpcResponse\",\n                \"klasehnfkljashdnflhkjahwlekdjf\",\n                10000);\n        transport.open();\n        TProtocol          protocol = new TJSONProtocol(transport);\n        CalcService.Client client   = new CalcService.Client(protocol);\n        int                result   = client.calcSum();\n        logger.info(result);\n        transport.close();\n    }\n\n    public static void main(String[] args) {\n        String zkConnectionStr = TestVariableInfo.ZK_CONNECTION_STRING;\n\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(zkConnectionStr);\n\n        Messagebus client = singlePool.getResource();\n\n        //server code\n        WrappedRpcServer rpcServer = null;\n        try {\n            TProcessor       processor          = new CalcService.Processor(new CalcServiceImpl());\n            TProtocolFactory inProtocolFactory  = new TJSONProtocol.Factory();\n            TProtocolFactory outProtocolFactory = new TJSONProtocol.Factory();\n            rpcServer = client.buildRpcServer(\"mshdfjbqwejhfgasdfbjqkygaksdfa\",\n                    new ThriftMessageHandler(processor, inProtocolFactory, outProtocolFactory));\n\n            rpcServer.mainLoop();\n        } finally {\n            rpcServer.close();\n            singlePool.returnResource(client);\n            singlePool.destroy();\n        }\n    }\n}\n"
  },
  {
    "path": "common-component/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>common</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n        <!-- apache http client -->\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.2.1</version>\n        </dependency>\n\n        <!-- for compressor -->\n        <dependency>\n            <groupId>org.xerial.snappy</groupId>\n            <artifactId>snappy-java</artifactId>\n            <version>1.1.1.7</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.ning</groupId>\n            <artifactId>compress-lzf</artifactId>\n            <version>1.0.3</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/AuthInfo.java",
    "content": "package com.messagebus.common;\n\nimport java.io.Serializable;\n\npublic class AuthInfo implements Serializable {\n\n    private String userName;\n    private String password;\n\n    public AuthInfo() {\n    }\n\n    public AuthInfo(String userName, String password) {\n        this.userName = userName;\n        this.password = password;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    @Override\n    public String toString() {\n        return \"AuthInfo{\" +\n            \"userName='\" + userName + '\\'' +\n            \", password='\" + password + '\\'' +\n            '}';\n    }\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/Constants.java",
    "content": "package com.messagebus.common;\n\nimport java.nio.charset.Charset;\n\n/**\n * User: yanghua\n * Date: 6/29/14\n * Time: 9:11 PM\n * Copyright (c) 2013 yanghua. All rights reserved.\n */\npublic class Constants {\n\n    public static final Byte[] EMPTY_BYTE_ARRAY = new Byte[0];\n\n    public static final byte[] EMPTY_PRIMITIVE_BYTE_ARRAY = new byte[0];\n\n    public static final String PROXY_EXCHANGE_NAME     = \"exchange.proxy\";\n    public static final String DEFAULT_FILE_QUEUE_NAME = \"queue.proxy.log.file\";\n    public static final String DEFAULT_CONFIG_RPC_RESPONSE_ROUTING_KEY = \"routingkey.proxy.message.rpc.configRpcResponse\";\n\n    public static final Charset CHARSET_OF_UTF8 = Charset.forName(\"UTF-8\");\n\n    public static final long DEFAULT_DATACENTER_ID_FOR_UUID = 00001L;\n\n    public static final String MESSAGE_HEADER_KEY_COMPRESS_ALGORITHM = \"compressor\";\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/Event.java",
    "content": "package com.messagebus.common;\n\nimport java.io.Serializable;\n\n/**\n * Created by yanghua on 6/24/15.\n */\npublic class Event implements Serializable {\n\n    private String description;\n\n    public Event() {\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    @Override\n    public String toString() {\n        return \"Event{\" +\n            \"description='\" + description + '\\'' +\n            '}';\n    }\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/ExceptionHelper.java",
    "content": "package com.messagebus.common;\n\nimport org.apache.commons.logging.Log;\n\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\npublic class ExceptionHelper {\n\n    public static String extractStackTrace(Throwable t) {\n        if (t == null) {\n            return \"\";\n        }\n\n        StringWriter sw = new StringWriter();\n        PrintWriter pw = new PrintWriter(sw);\n\n        try {\n            t.printStackTrace(pw);\n            return sw.toString();\n        } finally {\n            pw.close();\n        }\n    }\n\n    public static void logException(final Log logger, Throwable t, String additionalInfo) {\n        if (additionalInfo != null)\n            logger.error(additionalInfo);\n        logger.error(\"-*- stacktrace -*- : \" + extractStackTrace(t));\n        logger.error(\"-*- course -*- : \" + extractStackTrace(t.getCause()));\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/GsonUtil.java",
    "content": "package com.messagebus.common;\n\nimport com.google.gson.*;\n\nimport java.lang.reflect.Type;\nimport java.math.BigDecimal;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Created by yanghua on 4/1/15.\n */\npublic class GsonUtil {\n\n    /**\n     * convert json-object string to map\n     *\n     * @param jsonObjStr the string representation of json-object\n     * @return the map object\n     */\n    public static Map jsonStrToMap(String jsonObjStr) {\n        GsonBuilder gsonBuilder = new GsonBuilder();\n        gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());\n        Gson gson = gsonBuilder.create();\n\n        return gson.fromJson(jsonObjStr, Map.class);\n    }\n\n    public static List jsonStrToList(String jsonObjStr) {\n        GsonBuilder gsonBuilder = new GsonBuilder();\n        gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());\n        Gson gson = gsonBuilder.create();\n\n        return gson.fromJson(jsonObjStr, List.class);\n    }\n\n    /**\n     * inner static class : implement JsonDeserializer interface\n     * which overrides the default implementation\n     */\n    private static class NaturalDeserializer implements JsonDeserializer<Object> {\n\n        @Override\n        public Object deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {\n            if (jsonElement.isJsonNull()) return null;\n            else if (jsonElement.isJsonPrimitive()) return handlePrimitive(jsonElement.getAsJsonPrimitive());\n            else if (jsonElement.isJsonArray()) return handleArray(jsonElement.getAsJsonArray(), context);\n            else return handleObject(jsonElement.getAsJsonObject(), context);\n        }\n\n        private Object handlePrimitive(JsonPrimitive json) {\n            if (json.isBoolean())\n                return json.getAsBoolean();\n            else if (json.isString())\n                return json.getAsString();\n            else {\n                BigDecimal bigDec = json.getAsBigDecimal();\n                // Find out if it is an int type\n                try {\n                    bigDec.toBigIntegerExact();\n                    try {\n                        return bigDec.intValueExact();\n                    } catch (ArithmeticException e) {\n                    }\n                    return bigDec.longValue();\n                } catch (ArithmeticException e) {\n                }\n                // Just return it as a double\n                return bigDec.doubleValue();\n            }\n        }\n\n        private Object handleArray(JsonArray json, JsonDeserializationContext context) {\n            Object[] array = new Object[json.size()];\n            for (int i = 0; i < array.length; i++)\n                array[i] = context.deserialize(json.get(i), Object.class);\n            return array;\n        }\n\n        private Object handleObject(JsonObject json, JsonDeserializationContext context) {\n            Map<String, Object> map = new HashMap<String, Object>();\n            for (Map.Entry<String, JsonElement> entry : json.entrySet())\n                map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));\n            return map;\n        }\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/HttpHelper.java",
    "content": "package com.messagebus.common;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.utils.URIBuilder;\nimport org.apache.http.impl.client.DefaultHttpClient;\nimport org.apache.http.util.EntityUtils;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Map;\n\n/**\n * the util class for http request\n */\npublic class HttpHelper {\n\n    private static final Log logger = LogFactory.getLog(HttpHelper.class);\n\n\n    public static String syncHTTPGet(Map<String, Object> requestParamDic, AuthInfo authInfo) {\n        HttpClient httpClient = new DefaultHttpClient();\n\n        HttpResponse response = null;\n        try {\n            URI uri = new URIBuilder()\n                .setScheme(\"http\")\n                .setHost(requestParamDic.get(\"host\").toString())\n                .setPort(Integer.parseInt(requestParamDic.get(\"port\").toString()))\n                .setPath(requestParamDic.get(\"path\").toString())\n                .setUserInfo(authInfo.getUserName(), authInfo.getPassword())\n                .build();\n            HttpGet httpGet = new HttpGet(uri);\n            response = httpClient.execute(httpGet);\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                long len = entity.getContentLength();\n                if (len == -1)\n                    return \"\";\n\n                if (len < 2 * 1024 * 1024) {\n                    return EntityUtils.toString(entity);\n                } else {\n                    logger.error(\"[syncHTTPGet] response length is too large : (\" + len + \") B \" +\n                                     \"; and the url is : \" + uri.getRawPath());\n                    return \"\";\n                }\n            }\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"syncHTTPGet\");\n            throw new RuntimeException(e);\n        } catch (URISyntaxException e) {\n            ExceptionHelper.logException(logger, e, \"syncHTTPGet\");\n            throw new RuntimeException(e);\n        }\n\n        return \"\";\n    }\n\n    public static void asyncHTTPGet(String urlStr, AuthInfo authInfo, IAsyncCallback callback) {\n\n    }\n\n    public static void syncHTTPPut(String urlStr, AuthInfo authInfo) {\n\n    }\n\n    public static void asyncHTTPPut(String urlStr, AuthInfo authInfo, IAsyncCallback callback) {\n\n    }\n\n    public static void syncHTTPPost(String urlStr, AuthInfo authInfo) {\n\n    }\n\n    public static void asyncHTTPPost(String urlStr, AuthInfo authInfo, IAsyncCallback callback) {\n\n    }\n\n    public static void syncHTTPDelete(String urlStr, AuthInfo authInfo) {\n\n    }\n\n    public static void asyncHTTPDelete(String urlStr, AuthInfo authInfo, IAsyncCallback callback) {\n\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/IAsyncCallback.java",
    "content": "package com.messagebus.common;\n\npublic interface IAsyncCallback {\n\n    public void onResponse(String data);\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/InnerNoticeEntity.java",
    "content": "package com.messagebus.common;\n\nimport java.io.Serializable;\n\n/**\n * Created by yanghua on 10/28/15.\n */\npublic class InnerNoticeEntity implements Serializable {\n\n    private String identifier;\n    private String value;\n    private String type;\n\n    public InnerNoticeEntity() {\n    }\n\n    public String getIdentifier() {\n        return identifier;\n    }\n\n    public void setIdentifier(String identifier) {\n        this.identifier = identifier;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/NumberHelper.java",
    "content": "package com.messagebus.common;\n\nimport java.text.NumberFormat;\n\npublic class NumberHelper {\n\n    public static double fractionDigits(double original, int digitNum) {\n        NumberFormat format = NumberFormat.getNumberInstance();\n        format.setMaximumFractionDigits(digitNum);\n        String tmp = format.format(original);\n        tmp = tmp.replace(\",\", \"\");\n        return Double.valueOf(tmp);\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/RandomHelper.java",
    "content": "package com.messagebus.common;\n\nimport java.util.Random;\n\npublic class RandomHelper {\n\n    /**\n     * generate random character and number mixed sequence with a given <p>length</p>\n     *\n     * @param length the sequence's length that will be generated\n     * @return generated sequence\n     */\n\n    public static String randomNumberAndCharacter(int length) {\n        StringBuilder sb = new StringBuilder();\n        Random rand = new Random();\n        Random randdata = new Random();\n        int data = 0;\n\n        for (int i = 0; i < length; i++) {\n            int index = rand.nextInt(3);\n            switch (index) {\n                case 0:\n                    data = randdata.nextInt(10);\n                    sb.append(data);\n                    break;\n                case 1:\n                    data = randdata.nextInt(26) + 65;\n                    sb.append((char) data);\n                    break;\n                case 2:\n                    data = randdata.nextInt(26) + 97;\n                    sb.append((char) data);\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        return sb.toString();\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/RouterType.java",
    "content": "package com.messagebus.common;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Desc: the definition of exchange type\n * more detail see : http://lostechies.com/derekgreer/2012/03/28/rabbitmq-for-windows-exchange-types/\n * User: yanghua\n * Date: 6/29/14\n * Time: 8:53 AM\n * Copyright (c) 2013 yanghua. All rights reserved.\n */\npublic enum RouterType {\n\n    DIRECT,\n    FANOUT,\n    TOPIC,\n    HEADERS;\n\n    private static final Map<String, RouterType> lookups = new HashMap<String, RouterType>(4);\n\n    static {\n        lookups.put(\"direct\", DIRECT);\n        lookups.put(\"fanout\", FANOUT);\n        lookups.put(\"topic\", TOPIC);\n        lookups.put(\"headers\", HEADERS);\n    }\n\n\n    public static String fromEnum(RouterType item) {\n        for (Map.Entry<String, RouterType> entry : lookups.entrySet()) {\n            if (entry.getValue().equals(item))\n                return entry.getKey();\n        }\n\n        throw new IllegalArgumentException(\"illegal param : \" + item.toString());\n    }\n\n    public static RouterType lookup(String produceModeStr) {\n        for (Map.Entry<String, RouterType> entry : lookups.entrySet()) {\n            if (entry.getKey().equals(produceModeStr))\n                return entry.getValue();\n        }\n\n        throw new IllegalArgumentException(\"illegal param : \" + produceModeStr +\n                                               \" . can not fetch a enum item .\");\n    }\n\n    @Override\n    public String toString() {\n        for (Map.Entry<String, RouterType> item : lookups.entrySet()) {\n            if (this.equals(item.getValue())) {\n                return item.getKey();\n            }\n        }\n\n        throw new UnknownError(\"unknown Enum item \");\n    }\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/ShellHelper.java",
    "content": "package com.messagebus.common;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.BufferedInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\npublic class ShellHelper {\n\n    private static final Log logger = LogFactory.getLog(ShellHelper.class);\n\n    public static ExecResult exec(String cmdStr) throws IOException, InterruptedException {\n        String[] cmd = {\"/bin/sh\", \"-c\", cmdStr};\n        Process process = Runtime.getRuntime().exec(cmd);\n        process.waitFor();\n\n        String errStr = translateFromStream(process.getErrorStream());\n        String infoStr = translateFromStream(process.getInputStream());\n\n        ExecResult execResult = new ExecResult();\n        execResult.setError(errStr);\n        execResult.setInfo(infoStr);\n\n        logger.debug(\"[exec] occurs a error, \" + \" and error msg is :\" + errStr + \" command is : \" + cmdStr);\n        logger.debug(\"[exec] output info is \" + infoStr);\n\n        return execResult;\n    }\n\n    private static String translateFromStream(InputStream stream) throws IOException {\n        BufferedInputStream bufferedInputStream = new BufferedInputStream(stream);\n\n        StringBuilder sb = new StringBuilder();\n        byte[] buffer = new byte[1024];\n        int bytesRead = 0;\n        while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {\n            sb.append(new String(buffer, 0, bytesRead));\n        }\n\n        return sb.toString();\n    }\n\n    public static class ExecResult {\n\n        private String info;\n        private String error;\n\n        public ExecResult() {\n        }\n\n        public String getInfo() {\n            return info;\n        }\n\n        public void setInfo(String info) {\n            this.info = info;\n        }\n\n        public String getError() {\n            return error;\n        }\n\n        public void setError(String error) {\n            this.error = error;\n        }\n\n        @Override\n        public String toString() {\n            return \"ExecResult{\" +\n                \"info='\" + info + '\\'' +\n                \", error='\" + error + '\\'' +\n                '}';\n        }\n    }\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/TestVariableInfo.java",
    "content": "package com.messagebus.common;\n\n/**\n * Created by yanghua on 4/7/15.\n */\npublic class TestVariableInfo {\n\n    public static String ZK_CONNECTION_STRING = \"127.0.0.1:2181\";\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/UUIDGenerator.java",
    "content": "package com.messagebus.common;\n\n/**\n * base on twitter's Snowflake\n */\npublic class UUIDGenerator {\n\n    private long workerId;\n    private long datacenterId;\n    private long sequence = 0L;\n\n    private long twepoch = 1288834974657L;\n\n    private long workerIdBits     = 5L;\n    private long datacenterIdBits = 5L;\n    private long maxWorkerId      = -1L ^ (-1L << workerIdBits);\n    private long maxDatacenterId  = -1L ^ (-1L << datacenterIdBits);\n    private long sequenceBits     = 12L;\n\n    private long workerIdShift      = sequenceBits;\n    private long datacenterIdShift  = sequenceBits + workerIdBits;\n    private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;\n    private long sequenceMask       = -1L ^ (-1L << sequenceBits);\n\n    private long lastTimestamp = -1L;\n\n    public UUIDGenerator(long workerId, long datacenterId) {\n        // sanity check for workerId\n        if (workerId > maxWorkerId || workerId < 0) {\n            throw new IllegalArgumentException(String.format(\"worker Id can't be greater than %d or less than 0\", maxWorkerId));\n        }\n        if (datacenterId > maxDatacenterId || datacenterId < 0) {\n            throw new IllegalArgumentException(String.format(\"datacenter Id can't be greater than %d or less than 0\", maxDatacenterId));\n        }\n        this.workerId = workerId;\n        this.datacenterId = datacenterId;\n    }\n\n    public synchronized long nextId() {\n        long timestamp = timeGen();\n\n        if (timestamp < lastTimestamp) {\n            throw new RuntimeException(String.format(\"Clock moved backwards.  Refusing to generate id for %d milliseconds\", lastTimestamp - timestamp));\n        }\n\n        if (lastTimestamp == timestamp) {\n            sequence = (sequence + 1) & sequenceMask;\n            if (sequence == 0) {\n                timestamp = tilNextMillis(lastTimestamp);\n            }\n        } else {\n            sequence = 0L;\n        }\n\n        lastTimestamp = timestamp;\n\n        return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;\n    }\n\n    protected long tilNextMillis(long lastTimestamp) {\n        long timestamp = timeGen();\n        while (timestamp <= lastTimestamp) {\n            timestamp = timeGen();\n        }\n        return timestamp;\n    }\n\n    protected long timeGen() {\n        return System.currentTimeMillis();\n    }\n\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/compress/CompressEnum.java",
    "content": "package com.messagebus.common.compress;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Created by yanghua on 5/23/15.\n */\npublic enum CompressEnum {\n\n    SNAPPY,\n    LZF,\n    LZ4;\n\n    private static Map<String, CompressEnum> lookupMaps = new HashMap<String, CompressEnum>(3);\n\n    static {\n        lookupMaps.put(\"snappy\", SNAPPY);\n        lookupMaps.put(\"lzf\", LZF);\n        lookupMaps.put(\"lz4\", LZ4);\n    }\n\n    private CompressEnum() {\n    }\n\n    public static CompressEnum lookup(String strVal) {\n        if (strVal == null || strVal.isEmpty()) {\n            throw new RuntimeException(\"param : strVal can not be null or empty\");\n        }\n\n        return lookupMaps.get(strVal.toLowerCase());\n    }\n\n    public static String stringVal(CompressEnum compressEnum) {\n        if (compressEnum == null) {\n            throw new NullPointerException(\"param : compressEnum can not be null\");\n        }\n\n        for (Map.Entry<String, CompressEnum> entry : lookupMaps.entrySet()) {\n            if (compressEnum.equals(entry.getValue())) {\n                return entry.getKey();\n            }\n        }\n\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/compress/CompressorFactory.java",
    "content": "package com.messagebus.common.compress;\n\n/**\n * Created by yanghua on 6/18/15.\n */\npublic final class CompressorFactory {\n\n    public static ICompressor createCompressor(String algorName) {\n        CompressEnum compressEnum = CompressEnum.lookup(algorName);\n\n        switch (compressEnum) {\n\n            case SNAPPY:\n                return new SnappyCompressor();\n\n            case LZF:\n                return new LZFCompressor();\n\n            default:\n                throw new UnsupportedOperationException(\"unsupported compress mode : \" + compressEnum.name());\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/compress/ICompressor.java",
    "content": "package com.messagebus.common.compress;\n\nimport java.nio.charset.Charset;\n\n/**\n * Created by yanghua on 6/18/15.\n */\npublic interface ICompressor {\n\n    public byte[] compress(byte[] source);\n\n    public byte[] uncompress(byte[] target);\n\n    public byte[] compressString(String source);\n\n    public byte[] compressString(String source, Charset charset);\n\n    public String uncompressString(byte[] target);\n\n    public String uncompressString(byte[] target, Charset charset);\n\n    public byte[] compressStream(byte[] source);\n\n    public byte[] uncompressStream(byte[] target);\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/compress/LZFCompressor.java",
    "content": "package com.messagebus.common.compress;\n\nimport com.ning.compress.lzf.*;\n\nimport java.io.*;\nimport java.nio.charset.Charset;\n\n/**\n * LZF compressor\n * more detail : https://github.com/ning/compress\n */\nclass LZFCompressor implements ICompressor {\n\n    public byte[] compress(byte[] source) {\n        return LZFEncoder.encode(source);\n    }\n\n    public byte[] uncompress(byte[] target) {\n        try {\n            return LZFDecoder.decode(target);\n        } catch (LZFException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] compressString(String source) {\n        byte[] strBytes = source.getBytes();\n        return LZFEncoder.encode(strBytes);\n    }\n\n    public byte[] compressString(String source, Charset charset) {\n        byte[] strBytes = source.getBytes(charset);\n        return LZFEncoder.encode(strBytes);\n    }\n\n    public String uncompressString(byte[] target) {\n        try {\n            byte[] sourceBytes = LZFDecoder.decode(target);\n            return new String(sourceBytes);\n        } catch (LZFException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public String uncompressString(byte[] target, Charset charset) {\n        try {\n            byte[] sourceBytes = LZFDecoder.decode(target);\n            return new String(sourceBytes, charset);\n        } catch (LZFException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] compressStream(byte[] source) {\n        OutputStream compressStream = null;\n        try {\n            ByteArrayOutputStream baos = new ByteArrayOutputStream();\n            compressStream = new LZFOutputStream(baos);\n            compressStream.write(source);\n            compressStream.flush();\n\n            byte[] compressed = baos.toByteArray();\n            return compressed;\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        } finally {\n            try {\n                if (compressStream != null) {\n                    compressStream.close();\n                }\n            } catch (IOException e) {\n\n            }\n        }\n    }\n\n    public byte[] uncompressStream(byte[] target) {\n        byte[] bytes = null;\n        InputStream uncompressedStream = null;\n        ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        try {\n            ByteArrayInputStream bais = new ByteArrayInputStream(target);\n            uncompressedStream = new LZFCompressingInputStream(bais);\n\n            int num = -1;\n            byte[] buf = new byte[1024];\n            baos = new ByteArrayOutputStream();\n\n            while ((num = uncompressedStream.read(buf, 0, buf.length)) != -1) {\n                baos.write(bytes, 0, num);\n            }\n\n            return baos.toByteArray();\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        } finally {\n            try {\n                if (uncompressedStream != null) {\n                    uncompressedStream.close();\n                }\n\n                baos.close();\n            } catch (IOException e) {\n\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/java/com/messagebus/common/compress/SnappyCompressor.java",
    "content": "package com.messagebus.common.compress;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.xerial.snappy.Snappy;\nimport org.xerial.snappy.SnappyInputStream;\nimport org.xerial.snappy.SnappyOutputStream;\n\nimport java.io.*;\nimport java.nio.charset.Charset;\n\n/**\n * snappy compressor\n * more detail : https://github.com/xerial/snappy-java\n */\nclass SnappyCompressor implements ICompressor {\n\n    private static final Log logger = LogFactory.getLog(SnappyCompressor.class);\n\n    public byte[] compress(byte[] source) {\n        try {\n            return Snappy.compress(source);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] uncompress(byte[] target) {\n        try {\n            return Snappy.uncompress(target);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] compressString(String source) {\n        try {\n            return Snappy.compress(source);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] compressString(String source, Charset charset) {\n        try {\n            return Snappy.compress(source, charset);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public String uncompressString(byte[] target) {\n        try {\n            return Snappy.uncompressString(target);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public String uncompressString(byte[] target, Charset charset) {\n        try {\n            return Snappy.uncompressString(target, charset);\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    public byte[] compressStream(byte[] source) {\n        ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        OutputStream stream = new SnappyOutputStream(baos);\n        byte[] compressed;\n        try {\n            stream.write(source);\n            stream.flush();\n\n            compressed = baos.toByteArray();\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } finally {\n            try {\n                stream.close();\n            } catch (IOException e) {\n\n            }\n        }\n\n        return compressed;\n    }\n\n    public byte[] uncompressStream(byte[] target) {\n        ByteArrayOutputStream baos = null;\n        InputStream inputStream = null;\n        try {\n            ByteArrayInputStream bais = new ByteArrayInputStream(target);\n            inputStream = new SnappyInputStream(bais);\n\n            byte[] buf = new byte[1024];\n            int num = -1;\n            baos = new ByteArrayOutputStream();\n            while ((num = inputStream.read(buf, 0, buf.length)) != -1) {\n                baos.write(buf, 0, num);\n            }\n\n            return baos.toByteArray();\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } finally {\n            try {\n                if (inputStream != null) {\n                    inputStream.close();\n                }\n\n                if (baos != null) {\n                    baos.close();\n                }\n            } catch (IOException e) {\n\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "common-component/src/main/resources/log4j.properties",
    "content": "# Configure logging for testing\nlog4j.rootLogger=INFO, stdout\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.encoding=utf-8\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n"
  },
  {
    "path": "httpbridge/README.md",
    "content": "#Restful API\n##produce：\n\n```\n/messagebus/queues/{qname}/messages?appkey={appkey}&type={produce}\n```\n\nhttp method : `POST`\n\nrequest params :\n\n* path : qname - queue name\n* querystring : \n\t* appkey - auth key （must）\n\t* type - identify API，value `produce` （must）\n* request body : \n\t* messages - message object list （must）\n\t\nresponse :\n\n```js\n{\n\tstatusCode: 10200,\n\terror: \"\",\n\tmsg: \"\",\n\tdata: ''\n}\n```\n\n##consume:\n\n```\n/messagebus/queues/{qname}/messages?appkey={appkey}&type={consume}&mode={sync}&num={num}\n```\n\nhttp method : `GET`\n\nrequest params : \n\n* path : qname - queue name\n* querystring : \n\t* appkey - auth key （must）\n\t* type - identify API，value `consume` （must）\n\t* mode - value `sync` or `async` （must）\n\t* num - except num，from  0 < num to 100(equals) （mode must be sync）\n\t\nresponse : \n\n```js\n{\n\tstatusCode: 10200,\n\terror: \"\",\n\tmsg: \"\",\n\tdata: [\n\t\t{\n\t\t\tmessageHeader: {\n\t\t\t\tmessageId: 520133271997313000,\n\t\t\t\ttype: \"appMessage\",\n\t\t\t\ttimestamp: null,\n\t\t\t\tpriority: 0,\n\t\t\t\texpiration: null,\n\t\t\t\tdeliveryMode: 2,\n\t\t\t\theaders: null,\n\t\t\t\tcontentEncoding: null,\n\t\t\t\tcontentType: null,\n\t\t\t\treplyTo: null,\n\t\t\t\tappId: null,\n\t\t\t\tuserId: null,\n\t\t\t\tclusterId: null,\n\t\t\t\tcorrelationId: null\n\t\t\t},\n\t\t\tmessageBody: {\n\t\t\t\tmessageBody: [\n\t\t\t\t\t116,\n\t\t\t\t\t101,\n\t\t\t\t\t115,\n\t\t\t\t\t116\n\t\t\t\t]\n\t\t\t},\n\t\t\tmessageType: \"AppMessage\"\n\t\t}\n\t]\n}\n\n```\n\n##request:\n\n```\n/messagebus/queues/{qname}/messages?appkey={appkey}&type={type}&timeout={timeout}\n```\n\nhttp method : `POST`\n\nrequest params :\n\n* path : qname - queue name\n* querystring : \n\t* appkey - auth key（must）\n\t* type - identify API，value `request`（must）\n\t* timeout - timeout，unit microsecond（must）\n* request body : \n\t* message - message object （client blocked and just once）\n\t\nresponse :\n\n```js\n{\n\tstatusCode: 10200,\n\terror: \"\",\n\tmsg: \"\",\n\tdata: {\n\t\t\tmessageHeader: {\n\t\t\t\tmessageId: 520133271997313000,\n\t\t\t\ttype: \"appMessage\",\n\t\t\t\ttimestamp: null,\n\t\t\t\tpriority: 0,\n\t\t\t\texpiration: null,\n\t\t\t\tdeliveryMode: 2,\n\t\t\t\theaders: null,\n\t\t\t\tcontentEncoding: null,\n\t\t\t\tcontentType: null,\n\t\t\t\treplyTo: null,\n\t\t\t\tappId: null,\n\t\t\t\tuserId: null,\n\t\t\t\tclusterId: null,\n\t\t\t\tcorrelationId: null\n\t\t\t},\n\t\t\tmessageBody: {\n\t\t\t\tmessageBody: [\n\t\t\t\t\t116,\n\t\t\t\t\t101,\n\t\t\t\t\t115,\n\t\t\t\t\t116\n\t\t\t\t]\n\t\t\t},\n\t\t\tmessageType: \"AppMessage\"\n\t}\n}\n```\n\n\n##response:\n\n```\n/messagebus/queues/{qname}/messages?appkey={appkey}\n```\nhttp method : `POST`\n\nrequest params : \n\n* path : qname - queue name\n* querystring : \n\t* appkey - auth key（must）\n\t* type - identify API，value `response`（must）\n* request body :\n\t* message - message object\n\t\nresponse :\n\n```js\n{\n\tstatusCode: 10200,\n\terror: \"\",\n\tmsg: \"\",\n\tdata: ''\n}\n```\n"
  },
  {
    "path": "httpbridge/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>httpbridge</artifactId>\n    <packaging>war</packaging>\n    <version>1.0.5</version>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>client</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n        <!-- servlet it's version shuold be at least 3.1.0 to support jetty version 9.X  -->\n        <dependency>\n            <groupId>javax.servlet</groupId>\n            <artifactId>javax.servlet-api</artifactId>\n            <version>3.1.0</version>\n        </dependency>\n\n\n        <!-- continuation of jetty -->\n        <dependency>\n            <groupId>org.eclipse.jetty</groupId>\n            <artifactId>jetty-continuation</artifactId>\n            <version>9.3.0.M0</version>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <finalName>httpbridge</finalName>\n        <plugins>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>2.3.2</version>\n                <inherited>true</inherited>\n                <configuration>\n                    <source>1.6</source>\n                    <target>1.6</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <skipTests>true</skipTests>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n\n</project>"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/controller/ExceptionHandler.java",
    "content": "package com.messagebus.httpbridge.controller;\n\nimport com.messagebus.httpbridge.util.Constants;\nimport com.messagebus.httpbridge.util.ResponseUtil;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 3/31/15.\n */\npublic class ExceptionHandler extends HttpServlet {\n\n    private static final Log logger = LogFactory.getLog(ExceptionHandler.class);\n\n    @Override\n    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        String uri = (String) req.getAttribute(\"javax.servlet.error.request_uri\");\n        Object exception = req.getAttribute(\"javax.servlet.error.exception\");\n\n        logger.error(\"error uri : \" + uri);\n        logger.error(\"error type : \" + exception);\n\n        ResponseUtil.response(resp, Constants.HTTP_FAILED_CODE, exception.toString(), \"\", \"\\\"\\\"\");\n    }\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/controller/HttpBridge.java",
    "content": "package com.messagebus.httpbridge.controller;\n\nimport com.google.common.base.Strings;\nimport com.messagebus.client.*;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.model.MessageJSONSerializer;\nimport com.messagebus.client.model.MessageCarryType;\nimport com.messagebus.httpbridge.util.CommonUtil;\nimport com.messagebus.httpbridge.util.Constants;\nimport com.messagebus.httpbridge.util.ResponseUtil;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.eclipse.jetty.continuation.Continuation;\nimport org.eclipse.jetty.continuation.ContinuationListener;\nimport org.eclipse.jetty.continuation.ContinuationSupport;\n\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class HttpBridge extends HttpServlet {\n\n    private static final Log logger = LogFactory.getLog(HttpBridge.class);\n\n    private static final String CONSUME_MODE_PULL = \"pull\";\n    private static final String CONSUME_MODE_PUSH = \"push\";\n\n    @Override\n    protected void service(HttpServletRequest req, HttpServletResponse resp)\n        throws ServletException, IOException {\n        logger.info(\"[service] url is : \" + req.getRequestURI());\n        String apiType = req.getParameter(\"apiType\");\n\n        if (Strings.isNullOrEmpty(apiType)) {\n            ResponseUtil.response(resp,\n                                  Constants.HTTP_FAILED_CODE, \"the query string : type can not be null or empty\",\n                                  \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String secret = req.getParameter(\"secret\");\n        if (Strings.isNullOrEmpty(secret)) {\n            ResponseUtil.response(resp,\n                                  Constants.HTTP_FAILED_CODE, \"param : secret can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        MessageCarryType msgCarryType = MessageCarryType.lookup(apiType);\n\n        switch (msgCarryType) {\n            case PRODUCE:\n                this.produce(req, resp);\n                break;\n\n            case CONSUME:\n                this.consume(req, resp);\n                break;\n\n            case PUBLISH:\n                this.publish(req, resp);\n                break;\n\n            case SUBSCRIBE:\n                this.subscribe(req, resp);\n                break;\n\n            case REQUEST:\n                this.request(req, resp);\n                break;\n\n            case RESPONSE:\n                ResponseUtil.response(resp,\n                                      Constants.HTTP_FAILED_CODE, \"unsupported type : \" + msgCarryType.toString(), \"\", \"\\\"\\\"\");\n                break;\n\n            default:\n                ResponseUtil.response(resp,\n                                      Constants.HTTP_FAILED_CODE, \"invalidate type\", \"\", \"\\\"\\\"\");\n        }\n    }\n\n    private void produce(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        String httpMethod = request.getMethod().toLowerCase();\n        if (httpMethod.equals(\"get\")) {\n            produceWithGet(request, response);\n        } else if (httpMethod.equals(\"post\")) {\n            produceWithPost(request, response);\n        }\n    }\n\n    private void produceWithGet(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        if (!request.getMethod().toLowerCase().equals(\"get\")) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE,\n                                  \"error http request method\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String callback = request.getParameter(\"callback\");\n        if (Strings.isNullOrEmpty(callback)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"param : callback can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String queueName = request.getRequestURI().split(\"/\")[3];\n        String token = request.getParameter(\"token\");\n\n        if (Strings.isNullOrEmpty(queueName)) {\n            ResponseUtil.responseForJsonp(response, callback,\n                                          Constants.HTTP_FAILED_CODE, \"param : qname can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        if (Strings.isNullOrEmpty(token)) {\n            ResponseUtil.responseForJsonp(response, callback,\n                                          Constants.HTTP_FAILED_CODE, \"param : token can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n\n        String contentEncoding = request.getParameter(\"contentEncoding\");\n        if (Strings.isNullOrEmpty(contentEncoding)) {\n            contentEncoding = \"UTF-8\";\n        }\n\n        String contentType = request.getParameter(\"contentType\");\n        if (Strings.isNullOrEmpty(contentType)) {\n            ResponseUtil.responseForJsonp(response, callback,\n                                          Constants.HTTP_FAILED_CODE, \"param : contentType can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        if (!CommonUtil.validMessageType(contentType)) {\n            ResponseUtil.responseForJsonp(response, callback,\n                                          Constants.HTTP_FAILED_CODE, \"param : contentType should be : \" + Constants.TEXT_PLAIN_CONTENT_TYPE, \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String replyTo = request.getParameter(\"replyTo\");\n        if (Strings.isNullOrEmpty(replyTo)) {\n            replyTo = queueName;\n        }\n\n        String appId = request.getParameter(\"appId\");\n        if (Strings.isNullOrEmpty(appId)) {\n            appId = \"\";\n        }\n\n        String correlationId = request.getParameter(\"correlationId\");\n        if (Strings.isNullOrEmpty(correlationId)) {\n            correlationId = queueName;\n        }\n\n        String content = request.getParameter(\"content\");\n        if (Strings.isNullOrEmpty(content)) {\n            content = \"\";\n        }\n\n        Message msg = MessageFactory.createMessage();\n        msg.setTimestamp(new Date().getTime());\n        msg.setContentEncoding(contentEncoding);\n        msg.setContentType(contentType);\n        msg.setReplyTo(replyTo);\n        msg.setAppId(appId);\n        msg.setCorrelationId(correlationId);\n        msg.setContent(content.getBytes());\n\n        MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        Messagebus messagebus = pool.getResource();\n\n        try {\n            messagebus.produce(request.getParameter(\"secret\"), queueName, msg, token);\n            ResponseUtil.responseForJsonp(response, callback, Constants.HTTP_SUCCESS_CODE, \"\", \"\", \"\\\"\\\"\");\n        } catch (Exception e) {\n            ResponseUtil.responseForJsonp(response, callback,\n                                          Constants.HTTP_FAILED_CODE, \"[produce] occurs a exception : \" + e.getMessage(), \"\", \"\\\"\\\"\");\n        } finally {\n            pool.returnResource(messagebus);\n        }\n\n    }\n\n    private void produceWithPost(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        String queueName = request.getRequestURI().split(\"/\")[3];\n        String token = request.getParameter(\"token\");\n        String msgArrStr = request.getParameter(\"messages\");\n\n        if (Strings.isNullOrEmpty(queueName)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"param : qname can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        if (Strings.isNullOrEmpty(token)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"param : token can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        if (Strings.isNullOrEmpty(msgArrStr)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"param : messages can not be null or empty\", \"\", \"''\");\n            return;\n        }\n\n        Message[] msgArr = MessageJSONSerializer.deSerializeMessages(msgArrStr);\n\n        boolean mergedValidResult = true;\n        for (Message msg : msgArr) {\n            mergedValidResult = mergedValidResult && CommonUtil.validMessageType(msg.getContentType());\n            if (!mergedValidResult) {\n                ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"invalid message content type\", \"\", \"\\\"\\\"\");\n                return;\n            }\n        }\n\n        MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        Messagebus messagebus = pool.getResource();\n\n        try {\n            messagebus.batchProduce(request.getParameter(\"secret\"), queueName, msgArr, token);\n            ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", \"\\\"\\\"\");\n        } catch (Exception e) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"[produce] occurs a exception : \" + e.getMessage(), \"\", \"\\\"\\\"\");\n        } finally {\n            pool.returnResource(messagebus);\n        }\n    }\n\n    private void consume(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        if (!request.getMethod().toLowerCase().equals(\"get\")) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"error http request method\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String mode = request.getParameter(\"mode\");\n        if (Strings.isNullOrEmpty(mode)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"the param : mode can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String lowerMode = mode.toLowerCase();\n        if (lowerMode.equals(CONSUME_MODE_PULL)) {\n            this.consumeWithPull(request, response);\n        } else if (lowerMode.equals(CONSUME_MODE_PUSH)) {\n            this.consumeWithPush(request, response);\n        } else {\n            logger.error(\"[consume] invalidate param : mode with value - \" + mode);\n        }\n    }\n\n    private void publish(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        if (!request.getMethod().toLowerCase().equals(\"post\")) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"error http request method\", \"\", \"\");\n            return;\n        }\n\n        String msgArrStr = request.getParameter(\"messages\");\n\n        Message[] msgArr = MessageJSONSerializer.deSerializeMessages(msgArrStr);\n\n        boolean mergedValidResult = true;\n        for (Message msg : msgArr) {\n            mergedValidResult = CommonUtil.validMessageType(msg.getContentType());\n            if (!mergedValidResult) {\n                ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"invalid message content type\", \"\", \"\\\"\\\"\");\n                return;\n            }\n        }\n\n        MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        Messagebus messagebus = pool.getResource();\n\n        try {\n            messagebus.publish(request.getParameter(\"secret\"), msgArr);\n            ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", \"\\\"\\\"\");\n        } catch (Exception e) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"[produce] occurs a exception : \" + e.getMessage(), \"\", \"\\\"\\\"\");\n        } finally {\n            pool.returnResource(messagebus);\n        }\n\n    }\n\n    private void subscribe(final HttpServletRequest request, final HttpServletResponse response)\n        throws ServletException, IOException {\n        if (!request.getMethod().toLowerCase().equals(\"get\")) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"error http request method\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        final Continuation continuation = ContinuationSupport.getContinuation(request);\n\n        if (continuation.isExpired()) {\n            ResponseUtil.response(response, Constants.HTTP_TIMEOUT_CODE, \"timeout\",\n                                  \"there is no message could be consumed in \" +\n                                      Constants.MAX_CONSUME_CONTINUATION_TIMEOUT + \" ms\", \"\\\"\\\"\");\n            return;\n        }\n\n        continuation.setTimeout(Constants.MAX_CONSUME_CONTINUATION_TIMEOUT);\n        continuation.suspend(response);\n\n        final MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        final Messagebus messagebus = pool.getResource();\n        final List<Message> receivedMsgs = new ArrayList<Message>();\n\n        continuation.addContinuationListener(new ContinuationListener() {\n            @Override\n            public void onComplete(Continuation continuation) {\n                try {\n                    if (receivedMsgs.size() != 0) {\n                        String msgStr = MessageJSONSerializer.serializeMessages(receivedMsgs);\n                        ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", msgStr);\n                    }\n                } catch (IOException e) {\n                    logger.error(\"[onComplete] occurs a IOException : \" + e.getMessage());\n                }\n            }\n\n            @Override\n            public void onTimeout(Continuation continuation) {\n                try {\n                    if (receivedMsgs.size() == 0) {\n                        ResponseUtil.response(response, Constants.HTTP_TIMEOUT_CODE, \"\", \"\", \"\\\"\\\"\");\n                    } else {\n                        String msgStr = MessageJSONSerializer.serializeMessages(receivedMsgs);\n                        ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", msgStr);\n                    }\n                } catch (IOException e) {\n                    logger.error(\"[onTimeout] occurs a IOException : \" + e.getMessage());\n                }\n            }\n        });\n\n        try {\n            messagebus.subscribe(\n                    request.getParameter(\"secret\"),\n                    request.getParameter(\"from\"),\n                    request.getParameter(\"token\"), new IMessageReceiveListener() {\n\n                @Override\n                public void onMessage(Message message) {\n                    receivedMsgs.add(message);\n                }\n\n            }, Constants.MAX_CONSUME_CONTINUATION_TIMEOUT, TimeUnit.MILLISECONDS);\n        } catch (Exception e) {\n            logger.error(\"[consumeWithPush] occurs a Exception : \" + e.getMessage());\n            continuation.undispatch();\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"[consumeWithPush] occurs a Exception : \" + e.getMessage(), \"\", \"\\\"\\\"\");\n        } finally {\n            pool.returnResource(messagebus);\n            continuation.complete();\n        }\n    }\n\n    private void request(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n\n        if (!request.getMethod().toLowerCase().equals(\"post\")) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"error request method !\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n\n        String timeoutStr = request.getParameter(\"timeout\");\n        if (Strings.isNullOrEmpty(timeoutStr)) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"param : timeout can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        long timeout;\n        try {\n            timeout = Long.parseLong(timeoutStr);\n        } catch (NumberFormatException e) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"illegal param : timeout \", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        if (timeout < Constants.MIN_REQUEST_TIMEOUT || timeout > Constants.MAX_REQUEST_TIMEOUT) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"invalid param : timeout it should be greater than :\" + Constants.MIN_REQUEST_TIMEOUT +\n                    \"and less than : \" + Constants.MAX_REQUEST_TIMEOUT, \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String token = request.getParameter(\"token\");\n        if (Strings.isNullOrEmpty(token)) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"param : token can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        String queueName = request.getRequestURI().split(\"/\")[3];\n        String msgStr = request.getParameter(\"message\");\n\n        if (Strings.isNullOrEmpty(msgStr)) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"param : msgStr can not be null or empty\", \"\", \"\\\"\\\"\");\n            return;\n        }\n\n        Message msg = MessageJSONSerializer.deSerialize(msgStr);\n\n        MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        Messagebus messagebus = pool.getResource();\n        try {\n            Message responseMsg = messagebus.request(request.getParameter(\"secret\"), queueName, msg, token, timeout);\n\n            String respMsgStr = MessageJSONSerializer.serialize(responseMsg);\n            ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", respMsgStr);\n        } catch (MessagebusUnOpenException e) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"occurs a messagebus unopen exception\", \"\", \"\\\"\\\"\");\n        } catch (MessageResponseTimeoutException e) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"occurs a response timeout exception\", \"\", \"\\\"\\\"\");\n        } catch (Exception e) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"occurs a exception : \" + e.getMessage(), \"\", \"\\\"\\\"\");\n        } finally {\n            pool.returnResource(messagebus);\n        }\n    }\n\n    @Deprecated\n    private void response(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        throw new UnsupportedOperationException(\"unsupported operation!\");\n    }\n\n    private void consumeWithPull(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n        String numStr = request.getParameter(\"num\");\n        if (Strings.isNullOrEmpty(numStr)) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"when consume with pull mode the param :  num can not be null or empty\", \"\", \"''\");\n            return;\n        }\n        int num = 0;\n\n        try {\n            num = Integer.parseInt(numStr);\n        } catch (NumberFormatException e) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"invalidate param : num, it must be a integer!\", \"\", \"''\");\n            return;\n        }\n\n        if (num < Constants.MIN_CONSUME_NUM || num > Constants.MAX_CONSUME_NUM) {\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \" invalidate param : num , it should be less than \"\n                    + Constants.MAX_CONSUME_NUM + \" and greater than \" + Constants.MIN_CONSUME_NUM, \"\", \"''\");\n            return;\n        }\n\n        MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        Messagebus messagebus = pool.getResource();\n\n        List<Message> messages = null;\n        try {\n            messages = messagebus.consume(request.getParameter(\"secret\"), num);\n        } catch (Exception e) {\n            ResponseUtil.response(response, Constants.HTTP_FAILED_CODE, \"\", \"\", \"[]\");\n            return;\n        } finally {\n            pool.returnResource(messagebus);\n        }\n\n        if (messages == null) {\n            ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", \"[]\");\n        } else {\n            String msgsStr = MessageJSONSerializer.serializeMessages(messages);\n            ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", msgsStr);\n        }\n    }\n\n    private void consumeWithPush(HttpServletRequest request, final HttpServletResponse response)\n        throws ServletException, IOException {\n\n        final Continuation continuation = ContinuationSupport.getContinuation(request);\n\n        if (continuation.isExpired()) {\n            ResponseUtil.response(response, Constants.HTTP_TIMEOUT_CODE, \"timeout\",\n                                  \"there is no message could be consumed in \" +\n                                      Constants.MAX_CONSUME_CONTINUATION_TIMEOUT + \" ms\", \"[]\");\n            return;\n        }\n\n        continuation.setTimeout(Constants.MAX_CONSUME_CONTINUATION_TIMEOUT);\n        continuation.suspend(response);\n\n        final MessagebusPool pool = (MessagebusPool) (getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ));\n        final Messagebus messagebus = pool.getResource();\n\n        final List<Message> receivedMsgs = new ArrayList<Message>();\n\n        continuation.addContinuationListener(new ContinuationListener() {\n            @Override\n            public void onComplete(Continuation continuation) {\n                try {\n                    if (receivedMsgs.size() != 0) {\n                        String msgStr = MessageJSONSerializer.serializeMessages(receivedMsgs);\n                        ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", msgStr);\n                    } else {\n                        ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", \"[]\");\n                    }\n                } catch (IOException e) {\n                    logger.error(\"[onComplete] occurs a IOException : \" + e.getMessage());\n                }\n            }\n\n            @Override\n            public void onTimeout(Continuation continuation) {\n                try {\n                    if (receivedMsgs.size() == 0) {\n                        ResponseUtil.response(response, Constants.HTTP_TIMEOUT_CODE, \"\", \"\", \"''\");\n                    } else {\n                        String msgStr = MessageJSONSerializer.serializeMessages(receivedMsgs);\n                        ResponseUtil.response(response, Constants.HTTP_SUCCESS_CODE, \"\", \"\", msgStr);\n                    }\n                } catch (IOException e) {\n                    logger.error(\"[onTimeout] occurs a IOException : \" + e.getMessage());\n                }\n            }\n        });\n\n        try {\n            messagebus.consume(request.getParameter(\"secret\"),\n                               Constants.MAX_CONSUME_CONTINUATION_TIMEOUT,\n                               TimeUnit.MILLISECONDS,\n                               new IMessageReceiveListener() {\n                                   @Override\n                                   public void onMessage(Message message) {\n                                       receivedMsgs.add(message);\n                                   }\n                               });\n        } catch (Exception e) {\n            logger.error(\"[consumeWithPush] occurs a Exception : \" + e.getMessage());\n            continuation.undispatch();\n            ResponseUtil.response(response,\n                                  Constants.HTTP_FAILED_CODE, \"[consumeWithPush] occurs a Exception : \" + e.getMessage(), \"\", \"''\");\n        } finally {\n            pool.returnResource(messagebus);\n            continuation.complete();\n        }\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/filter/URLDispatcher.java",
    "content": "package com.messagebus.httpbridge.filter;\n\nimport com.google.common.base.Strings;\nimport com.google.gson.Gson;\nimport com.messagebus.httpbridge.util.Constants;\nimport com.messagebus.httpbridge.util.ResponseUtil;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport javax.servlet.*;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * Created by yanghua on 9/30/14.\n */\npublic class URLDispatcher implements Filter {\n\n    private static final Log    logger           = LogFactory.getLog(URLDispatcher.class);\n    private static final Gson   gson             = new Gson();\n    private static final String URI_PREFIX       = \"/messagebus/queues\";\n    private static final String ERROR_URI_PERFIX = \"/error\";\n    private static final String KEY_OF_SECRET    = \"secret\";\n    private static final String KEY_OF_TYPE      = \"apiType\";\n\n\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException {\n\n    }\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest request = (HttpServletRequest) servletRequest;\n        String uri = request.getRequestURI();\n        if (uri.startsWith(ERROR_URI_PERFIX)) {\n            filterChain.doFilter(request, servletResponse);\n        }\n\n        if (!uri.startsWith(URI_PREFIX)) {\n            logger.error(\"[doFilter] request uri is \" + request.getRequestURI());\n            ResponseUtil.response((HttpServletResponse) servletResponse, Constants.HTTP_NOT_FOUND_CODE,\n                                  \"the request uri : \" + request.getRequestURI() + \"is not found!\",\n                                  \"\", gson.toJson(\"\"));\n        } else {\n            String appKeyVal = request.getParameter(KEY_OF_SECRET);\n            String type = request.getParameter(KEY_OF_TYPE);\n            if (Strings.isNullOrEmpty(appKeyVal)) {\n                logger.error(\"[doFilter] missed query string : \" + KEY_OF_SECRET);\n                ResponseUtil.response((HttpServletResponse) servletResponse, Constants.HTTP_FAILED_CODE,\n                                      \"missed query string : \" + KEY_OF_SECRET + \"!\", \"\", gson.toJson(\"\"));\n            } else if (Strings.isNullOrEmpty(type)) {\n                logger.error(\"[doFilter] missed query string : \" + KEY_OF_TYPE);\n                ResponseUtil.response((HttpServletResponse) servletResponse, Constants.HTTP_FAILED_CODE,\n                                      \"missed query string : \" + KEY_OF_TYPE + \"!\", \"\", gson.toJson(\"\"));\n            } else {\n                filterChain.doFilter(request, servletResponse);\n            }\n        }\n    }\n\n    @Override\n    public void destroy() {\n\n    }\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/listener/AppContextListener.java",
    "content": "package com.messagebus.httpbridge.listener;\n\nimport com.messagebus.client.MessagebusPool;\nimport com.messagebus.httpbridge.util.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\nimport javax.servlet.ServletContext;\nimport javax.servlet.ServletContextEvent;\nimport javax.servlet.ServletContextListener;\n\npublic class AppContextListener implements ServletContextListener {\n\n    private static final Log logger = LogFactory.getLog(AppContextListener.class);\n\n    @Override\n    public void contextInitialized(ServletContextEvent servletContextEvent) {\n        ServletContext servletContext = servletContextEvent.getServletContext();\n        String pubsuberHost = servletContext.getInitParameter(\"pubsuberHost\");\n        int pubsuberPort = Integer.parseInt(servletContext.getInitParameter(\"pubsuberPort\"));\n\n        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();\n        poolConfig.setMaxTotal(Integer.parseInt(servletContext.getInitParameter(\"messagebuspool.maxtotal\")));\n        MessagebusPool messagebusPool = new MessagebusPool(pubsuberHost, poolConfig);\n        servletContextEvent.getServletContext().setAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ, messagebusPool);\n    }\n\n    @Override\n    public void contextDestroyed(ServletContextEvent servletContextEvent) {\n        MessagebusPool messagebusPool = (MessagebusPool) servletContextEvent.getServletContext().getAttribute(Constants.KEY_OF_MESSAGEBUS_POOL_OBJ);\n        if (messagebusPool != null) {\n            messagebusPool.destroy();\n        }\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/model/TextMessage.java",
    "content": "package com.messagebus.httpbridge.model;\n\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * Created by yanghua on 3/31/15.\n */\npublic class TextMessage {\n\n    //header\n    private long                messageId;\n    private String              type;\n    private Date                timestamp;\n    private short               priority;\n    private String              expiration;\n    private Map<String, Object> headers;\n    private String              contentEncoding;\n    private String              contentType;\n    private String              replyTo;\n    private String              appId;\n    private String              userId;\n    private String              clusterId;\n    private String              correlationId;\n\n    private short deliveryMode = 2;\n\n    private String      content;\n\n    public TextMessage() {}\n\n    public long getMessageId() {\n        return messageId;\n    }\n\n    public void setMessageId(long messageId) {\n        this.messageId = messageId;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Date getTimestamp() {\n        return timestamp;\n    }\n\n    public void setTimestamp(Date timestamp) {\n        this.timestamp = timestamp;\n    }\n\n    public short getPriority() {\n        return priority;\n    }\n\n    public void setPriority(short priority) {\n        this.priority = priority;\n    }\n\n    public String getExpiration() {\n        return expiration;\n    }\n\n    public short getDeliveryMode() {\n        return 2;\n    }\n\n    public Map<String, Object> getHeaders() {\n        return headers;\n    }\n\n    public void setHeaders(Map<String, Object> headers) {\n        this.headers = headers;\n    }\n\n    public String getContentEncoding() {\n        return contentEncoding;\n    }\n\n    public void setContentEncoding(String contentEncoding) {\n        this.contentEncoding = contentEncoding;\n    }\n\n    public String getContentType() {\n        return contentType;\n    }\n\n    public void setContentType(String contentType) {\n        this.contentType = contentType;\n    }\n\n    public String getReplyTo() {\n        return replyTo;\n    }\n\n    public void setReplyTo(String replyTo) {\n        this.replyTo = replyTo;\n    }\n\n    public String getAppId() {\n        return appId;\n    }\n\n    public void setAppId(String appId) {\n        this.appId = appId;\n    }\n\n    public String getUserId() {\n        return userId;\n    }\n\n    protected void setUserId(String userId) {\n        this.userId = null;\n    }\n\n    public String getClusterId() {\n        return clusterId;\n    }\n\n    protected void setClusterId(String clusterId) {\n        this.clusterId = null;\n    }\n\n    public String getCorrelationId() {\n        return correlationId;\n    }\n\n    public void setCorrelationId(String correlationId) {\n        this.correlationId = correlationId;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/util/CommonUtil.java",
    "content": "package com.messagebus.httpbridge.util;\n\nimport com.google.common.base.Strings;\n\n/**\n * Created by yanghua on 3/30/15.\n */\npublic class CommonUtil {\n\n    public static boolean validMessageType(String msgTypeStr) {\n        if (Strings.isNullOrEmpty(msgTypeStr)) {\n            return false;\n        }\n\n        return msgTypeStr.equals(Constants.TEXT_PLAIN_CONTENT_TYPE);\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/util/Constants.java",
    "content": "package com.messagebus.httpbridge.util;\n\npublic class Constants {\n\n    //region response status code\n    private static final int HTTP_BASE_CODE          = 10000;\n    public static final  int HTTP_SUCCESS_CODE       = HTTP_BASE_CODE + 200;\n    public static final  int HTTP_FAILED_CODE        = HTTP_BASE_CODE + 500;\n    public static final  int HTTP_INVALID_PARAM_CODE = HTTP_BASE_CODE + 501;\n    public static final  int HTTP_TIMEOUT_CODE       = HTTP_BASE_CODE + 502;\n    public static final  int HTTP_NOT_FOUND_CODE     = HTTP_BASE_CODE + 404;\n    //endregion\n\n    public static final String KEY_OF_MESSAGEBUS_POOL_OBJ = \"messagebusPool\";\n\n    //consume mode pull\n    public static final int MAX_CONSUME_NUM = 500;\n    public static final int MIN_CONSUME_NUM = 1;\n\n    //consume mode push\n    public static final long MAX_CONSUME_CONTINUATION_TIMEOUT = 30000L;\n\n    //request timeout\n    public static final long MAX_REQUEST_TIMEOUT = 60000L;\n    public static final long MIN_REQUEST_TIMEOUT = 100L;\n\n    public static final String TEXT_PLAIN_CONTENT_TYPE = \"text/plain\";\n\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/util/ResponseUtil.java",
    "content": "package com.messagebus.httpbridge.util;\n\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.nio.charset.Charset;\n\npublic class ResponseUtil {\n\n    public static void response(HttpServletResponse response,\n                                int statusCode,\n                                String err,\n                                String msg,\n                                String data) throws IOException {\n        response.setCharacterEncoding(\"utf-8\");\n        response.setContentType(\"application/json\");\n        String responseStr = \"{ \\\"statusCode\\\" : \" + statusCode + \",\" +\n            \" \\\"error\\\" : \\\"\" + err + \"\\\",\" +\n            \" \\\"msg\\\" : \\\"\" + msg + \"\\\", \" +\n            \" \\\"data\\\" : \" + data +\n            \"}\";\n        response.setContentLength(responseStr.getBytes(Charset.defaultCharset()).length);\n        PrintWriter writer = response.getWriter();\n        writer.write(responseStr);\n        writer.flush();\n        writer.close();\n    }\n\n    public static void responseForJsonp(HttpServletResponse response,\n                                        String callback,\n                                        int statusCode, String err,\n                                        String msg,\n                                        String data) throws IOException {\n        response.setCharacterEncoding(\"utf-8\");\n        response.setContentType(\"text/javascript\");\n        String responseStr = callback + \"({ \\\"statusCode\\\" : \" + statusCode + \",\" +\n            \" \\\"error\\\" : \\\"\" + err + \"\\\",\" +\n            \" \\\"msg\\\" : \\\"\" + msg + \"\\\", \" +\n            \" \\\"data\\\" : \" + data +\n            \"})\";\n        response.setContentLength(responseStr.getBytes(Charset.defaultCharset()).length);\n        PrintWriter writer = response.getWriter();\n        writer.write(responseStr);\n        writer.flush();\n        writer.close();\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/java/com/messagebus/httpbridge/util/TextMessageJSONSerializer.java",
    "content": "package com.messagebus.httpbridge.util;\n\nimport com.google.gson.*;\nimport com.google.gson.stream.JsonReader;\nimport com.google.gson.stream.JsonWriter;\nimport com.messagebus.client.message.model.Message;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.Collection;\n\n/**\n * Created by yanghua on 3/30/15.\n */\npublic class TextMessageJSONSerializer {\n\n    private static final Log  logger = LogFactory.getLog(TextMessageJSONSerializer.class);\n    private static final Gson gson   = new GsonBuilder()\n        .serializeNulls()\n        .registerTypeAdapter(byte[].class,\n                             new TextMessageJSONSerializer.ByteArrAdapter())\n        .create();\n\n    public static String serialize(Message msg) {\n        return gson.toJson(msg);\n    }\n\n    public static Message deSerialize(String msgStr) {\n        JsonParser parser = new JsonParser();\n        JsonElement element = parser.parse(msgStr);\n\n        Message msg = gson.fromJson(element, Message.class);\n\n        return msg;\n    }\n\n    public static Message deSerialize(JsonElement msgElement) {\n        JsonObject obj = msgElement.getAsJsonObject();\n        Message msg = gson.fromJson(obj.get(\"message\"), Message.class);\n\n        return msg;\n    }\n\n    public static String serializeMessages(Collection<Message> msgs) {\n        return gson.toJson(msgs);\n    }\n\n    public static Message[] deSerializeMessages(String msgArrStr) {\n        int i = 0;\n\n        JsonParser parser = new JsonParser();\n        JsonElement element = parser.parse(msgArrStr);\n\n        if (!element.isJsonArray()) {\n            logger.error(\"unsupported original data. it should be a string of json object array \");\n            throw new UnsupportedOperationException(\"unsupported original data. \" +\n                                                        \"it should be a string of json object array \");\n        }\n\n        Message[] msgs = new Message[element.getAsJsonArray().size()];\n\n        for (JsonElement e : element.getAsJsonArray()) {\n            Message msg = gson.fromJson(e, Message.class);\n\n            msgs[i++] = msg;\n        }\n\n        return msgs;\n    }\n\n    private static class ByteArrAdapter extends TypeAdapter<byte[]> {\n\n        @Override\n        public void write(JsonWriter jsonWriter, byte[] bytes) throws IOException {\n            if (bytes == null) {\n                jsonWriter.nullValue();\n            } else {\n                jsonWriter.value(new String(bytes));\n            }\n        }\n\n        @Override\n        public byte[] read(JsonReader jsonReader) throws IOException {\n            if (jsonReader.peek() == null) {\n                return null;\n            }\n\n            String tmp = jsonReader.nextString();\n            if (tmp == null)\n                return new byte[0];\n\n            return tmp.getBytes();\n        }\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/main/resources/log4j.properties",
    "content": "# Configure logging for testing\nlog4j.rootLogger=INFO, stdout\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.encoding=utf-8\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n"
  },
  {
    "path": "httpbridge/src/main/webapp/WEB-INF/jetty-web.xml",
    "content": "<?xml version=\"1.0\"  encoding=\"ISO-8859-1\"?>\n<!DOCTYPE Configure PUBLIC \"-//Jetty//Configure//EN\" \"http://www.eclipse.org/jetty/configure.dtd\">\n\n<Configure class=\"org.eclipse.jetty.webapp.WebAppContext\">\n    <Set name=\"contextPath\">/</Set>\n</Configure>"
  },
  {
    "path": "httpbridge/src/main/webapp/WEB-INF/web.xml",
    "content": "<!DOCTYPE web-app PUBLIC\n        \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\n        \"http://java.sun.com/dtd/web-app_2_3.dtd\" >\n\n<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee\n\t\t  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\n         version=\"3.0\">\n    <display-name>Message Bus Http Bridge</display-name>\n\n    <context-param>\n        <param-name>pubsuberHost</param-name>\n        <param-value>202.195.244.146</param-value>\n    </context-param>\n\n    <context-param>\n        <param-name>pubsuberPort</param-name>\n        <param-value>6379</param-value>\n    </context-param>\n\n    <context-param>\n        <param-name>messagebuspool.maxtotal</param-name>\n        <param-value>200</param-value>\n    </context-param>\n\n    <servlet>\n        <servlet-name>httpBridge</servlet-name>\n        <servlet-class>com.messagebus.httpbridge.controller.HttpBridge</servlet-class>\n        <async-supported>true</async-supported>\n    </servlet>\n\n    <servlet>\n        <servlet-name>exception</servlet-name>\n        <servlet-class>com.messagebus.httpbridge.controller.ExceptionHandler</servlet-class>\n    </servlet>\n\n    <servlet-mapping>\n        <servlet-name>httpBridge</servlet-name>\n        <url-pattern>/messagebus/*</url-pattern>\n    </servlet-mapping>\n\n    <servlet-mapping>\n        <servlet-name>exception</servlet-name>\n        <url-pattern>/error</url-pattern>\n    </servlet-mapping>\n\n    <filter>\n        <filter-name>urlDispatcher</filter-name>\n        <filter-class>com.messagebus.httpbridge.filter.URLDispatcher</filter-class>\n        <async-supported>true</async-supported>\n    </filter>\n\n    <filter-mapping>\n        <filter-name>urlDispatcher</filter-name>\n        <url-pattern>/*</url-pattern>\n    </filter-mapping>\n\n    <listener>\n        <listener-class>com.messagebus.httpbridge.listener.AppContextListener</listener-class>\n    </listener>\n    \n    <error-page>\n        <exception-type>java.lang.Exception</exception-type>\n        <location>/error</location>\n    </error-page>\n\n</web-app>"
  },
  {
    "path": "httpbridge/src/test/java/com/messagebus/httpbridge/util/PropertiesHelper.java",
    "content": "package com.messagebus.httpbridge.util;\n\nimport java.io.IOException;\nimport java.util.Properties;\n\n/**\n * Created by yanghua on 3/25/15.\n */\npublic class PropertiesHelper {\n\n    private static final Properties commonProperties;\n\n    static {\n        commonProperties = new Properties();\n        try {\n            commonProperties.load(commonProperties.getClass().getClassLoader().getResourceAsStream(\"common.properties\"));\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static String getPropertyValue(String key) {\n        return commonProperties.getProperty(key);\n    }\n\n}\n"
  },
  {
    "path": "httpbridge/src/test/resource/common.properties",
    "content": "messagebus.pubsuber.host=172.16.206.250\nmessagebus.pubsuber.port=6379\n\nmessagebus.httpbridge.host=172.16.206.29\nmessagebus.httpbridge.port=8080"
  },
  {
    "path": "interactor-component/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>interactor-component</artifactId>\n    <packaging>jar</packaging>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>common</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n    </dependencies>\n\n    <build>\n        <finalName>messagebus-client</finalName>\n        <plugins>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>2.3.2</version>\n                <inherited>true</inherited>\n                <configuration>\n                    <source>1.6</source>\n                    <target>1.6</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/proxy/ProxyConsumer.java",
    "content": "package com.messagebus.interactor.proxy;\n\nimport com.rabbitmq.client.Channel;\nimport com.rabbitmq.client.GetResponse;\nimport com.rabbitmq.client.QueueingConsumer;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\npublic class ProxyConsumer {\n\n    private static final Log logger = LogFactory.getLog(ProxyConsumer.class);\n\n    public static QueueingConsumer consume(Channel channel,\n                                           String queueName,\n                                           boolean autoAck,\n                                           String consumerTag) throws IOException {\n        QueueingConsumer consumer = new QueueingConsumer(channel);\n        channel.basicConsume(queueName, autoAck, consumerTag, consumer);\n        return consumer;\n    }\n\n\n    public static GetResponse consumeSingleMessage(Channel channel,\n                                                   String queueName) throws IOException {\n        return channel.basicGet(queueName, true);\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/proxy/ProxyProducer.java",
    "content": "package com.messagebus.interactor.proxy;\n\nimport com.rabbitmq.client.AMQP;\nimport com.rabbitmq.client.Channel;\n\nimport java.io.IOException;\nimport java.util.List;\n\npublic class ProxyProducer {\n\n    public static void produce(String exchangeName,\n                               Channel channel,\n                               String routingKey,\n                               byte[] data,\n                               AMQP.BasicProperties properties\n    ) throws IOException {\n        channel.basicPublish(exchangeName, routingKey, properties, data);\n    }\n\n    public static void produceWithTX(String exchangeName,\n                                     Channel channel,\n                                     String routingKey,\n                                     byte[] data,\n                                     AMQP.BasicProperties properties\n    ) throws IOException {\n\n        //transaction begin\n        channel.txSelect();\n\n        channel.basicPublish(exchangeName, routingKey, properties, data);\n\n        //commit every message with wrapped a transaction\n        //NOTE: it is almost for security! Not for normal, because of bad performance!!!\n        channel.txCommit();\n    }\n\n    public static void batchProduce(String exchangeName,\n                                    Channel channel,\n                                    String routingKey,\n                                    List<byte[]> dataList,\n                                    AMQP.BasicProperties properties\n    ) throws IOException {\n        for (byte[] bytes : dataList)\n            produce(exchangeName, channel, routingKey, bytes, properties);\n    }\n\n    public static void batchProduceWithTX(String exchangeName,\n                                          Channel channel,\n                                          String routingKey,\n                                          List<byte[]> dataList,\n                                          AMQP.BasicProperties properties\n    ) throws IOException {\n        for (byte[] bytes : dataList)\n            produceWithTX(exchangeName, channel, routingKey, bytes, properties);\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/AbstractInitializer.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport com.google.common.base.Strings;\nimport com.rabbitmq.client.Address;\nimport com.rabbitmq.client.Channel;\nimport com.rabbitmq.client.Connection;\nimport com.rabbitmq.client.ConnectionFactory;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeoutException;\n\npublic abstract class AbstractInitializer {\n\n    private static final Log logger = LogFactory.getLog(AbstractInitializer.class);\n\n    protected Connection connection;\n    protected Channel    channel;\n    protected String     mqConnectionStr;\n\n    protected AbstractInitializer(String mqConnectionStr) {\n        this.mqConnectionStr = mqConnectionStr;\n    }\n\n    protected void init() {\n        if (Strings.isNullOrEmpty(mqConnectionStr)) {\n            logger.info(\"can not get mq connection info\");\n            throw new RuntimeException(\"can not get mq connection info\");\n        }\n        String[] hostPortPairArr = mqConnectionStr.split(\",\");\n\n        Address[] addresses = new com.rabbitmq.client.Address[hostPortPairArr.length];\n\n        for (int i = 0; i < hostPortPairArr.length; i++) {\n            String[] hostPortArr = hostPortPairArr[i].split(\":\");\n            com.rabbitmq.client.Address address = new com.rabbitmq.client.Address(\n                    hostPortArr[0], Integer.parseInt(hostPortArr[1])\n            );\n            addresses[i] = address;\n        }\n\n        ConnectionFactory connectionFactory = new ConnectionFactory();\n\n        connectionFactory.setAutomaticRecoveryEnabled(true);\n        connectionFactory.setTopologyRecoveryEnabled(true);\n        connectionFactory.setConnectionTimeout(60000);\n        connectionFactory.setRequestedHeartbeat(10);\n\n        try {\n            this.connection = connectionFactory.newConnection(addresses);\n            this.channel = this.connection.createChannel();\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (TimeoutException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } catch (Exception e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        }\n    }\n\n    protected void close() {\n        try {\n            if (this.channel != null && this.channel.isOpen()) {\n                this.channel.close();\n            }\n\n            if (this.connection != null && this.connection.isOpen()) {\n                this.connection.close();\n            }\n        } catch (IOException e) {\n            logger.error(\"close exception \", e);\n            throw new RuntimeException(\"close exception \", e);\n        } catch (TimeoutException e) {\n            logger.error(\"close exception \", e);\n            throw new RuntimeException(\"close exception \", e);\n        } catch (Exception e) {\n            logger.error(\"close exception \", e);\n            throw new RuntimeException(\"close exception \", e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/Exchange.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport java.io.Serializable;\n\n/**\n * Created by yanghua on 11/20/15.\n */\npublic class Exchange implements Serializable {\n\n    private int    id;\n    private String name;\n    private String exchangeName;\n    private int    parentId;\n    private String routerType;\n    private String routingKey;\n    private String description;\n\n    public Exchange() {\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getExchangeName() {\n        return exchangeName;\n    }\n\n    public void setExchangeName(String exchangeName) {\n        this.exchangeName = exchangeName;\n    }\n\n    public int getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(int parentId) {\n        this.parentId = parentId;\n    }\n\n    public String getRouterType() {\n        return routerType;\n    }\n\n    public void setRouterType(String routerType) {\n        this.routerType = routerType;\n    }\n\n    public String getRoutingKey() {\n        return routingKey;\n    }\n\n    public void setRoutingKey(String routingKey) {\n        this.routingKey = routingKey;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/ExchangeManager.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport com.rabbitmq.client.Channel;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\npublic class ExchangeManager extends AbstractInitializer {\n\n    private static Log logger = LogFactory.getLog(ExchangeManager.class);\n\n    private static volatile ExchangeManager instance;\n\n    private ExchangeManager(String host) {\n        super(host);\n    }\n\n    public static ExchangeManager defaultManager(String host) {\n        if (instance == null) {\n            synchronized (ExchangeManager.class) {\n                if (instance == null) {\n                    instance = new ExchangeManager(host);\n                }\n            }\n        }\n\n        return instance;\n    }\n\n    public void create(String exchangeName, String routerType) throws IOException {\n        super.init();\n        this.channel.exchangeDeclare(exchangeName, routerType, true);\n        super.close();\n    }\n\n    public void create(String exchangeName,\n                       String routerType,\n                       String bindTo,\n                       String routingKey) throws IOException {\n        super.init();\n        this.channel.exchangeDeclare(exchangeName, routerType, true);\n\n        //bind\n        if (bindTo != null && !bindTo.isEmpty() && this.innerExists(bindTo, channel))\n            this.channel.exchangeBind(exchangeName, bindTo, routingKey);\n\n        super.close();\n    }\n\n    public void bind(String exchangeName, String bindTo, String routingKey) throws IOException {\n        super.init();\n        if (!this.innerExists(exchangeName, channel) || !this.innerExists(bindTo, channel)) {\n            logger.error(\"exchange : \" + exchangeName + \" or \" + bindTo + \"is not exists\");\n            throw new IOException(\"exchange : \" + exchangeName + \" or \" + bindTo + \"is not exists\");\n        }\n\n        this.channel.exchangeBind(exchangeName, bindTo, routingKey);\n        super.close();\n    }\n\n    public void unbind(String exchangeName, String unbindTo, String routingKey) throws IOException {\n        super.init();\n        if (!this.innerExists(exchangeName, channel) || !this.innerExists(unbindTo, channel)) {\n            logger.error(\"exchange : \" + exchangeName + \" or \" + unbindTo + \"is not exists\");\n            throw new IOException(\"exchange : \" + exchangeName + \" or \" + unbindTo + \"is not exists\");\n        }\n\n        this.channel.exchangeUnbind(exchangeName, unbindTo, routingKey);\n        super.close();\n    }\n\n    public void delete(String exchangeName) throws IOException {\n        super.init();\n        if (!this.innerExists(exchangeName, channel)) {\n            logger.error(\"exchange : \" + exchangeName + \" is not exists\");\n            throw new IOException(\"exchange : \" + exchangeName + \" is not exists\");\n        }\n\n        this.channel.exchangeDelete(exchangeName);\n        super.close();\n    }\n\n    public boolean exchangeExists(String exchangeName) throws IOException {\n        super.init();\n        boolean result = true;\n        try {\n            this.channel.exchangeDeclarePassive(exchangeName);\n        } catch (IOException e) {\n            result = false;\n        }\n        super.close();\n\n        return result;\n    }\n\n    private boolean innerExists(String exchangeName, Channel outerChannel) {\n        boolean result = true;\n        try {\n            outerChannel.exchangeDeclarePassive(exchangeName);\n        } catch (IOException e) {\n            result = false;\n        }\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/MQDataInitializer.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport com.rabbitmq.client.AMQP;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class MQDataInitializer extends AbstractInitializer {\n\n    private static          Log               logger   = LogFactory.getLog(MQDataInitializer.class);\n    private static volatile MQDataInitializer instance = null;\n\n    private MQDataInitializer(String mqConnectionStr) {\n        super(mqConnectionStr);\n    }\n\n    public static MQDataInitializer getInstance(String mqConnectionStr) {\n        if (instance == null) {\n            synchronized (MQDataInitializer.class) {\n                if (instance == null) {\n                    instance = new MQDataInitializer(mqConnectionStr);\n                }\n            }\n        }\n\n        return instance;\n    }\n\n    public void deleteQueueNoWait(String queueName) {\n        try {\n            super.init();\n            AMQP.Queue.DeleteOk deleteOk = channel.queueDelete(queueName);\n            if (deleteOk == null) {\n                throw new RuntimeException(\"delete queue with name : \" + queueName + \" failed.\");\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } finally {\n            super.close();\n        }\n    }\n\n    public void initExchange(List<Exchange> sortedExchanges, Map<Integer, Exchange> exchangeMap) {\n        try {\n            super.init();\n\n            //declare exchange\n            for (Exchange exchange : sortedExchanges) {\n                channel.exchangeDeclare(exchange.getExchangeName(), exchange.getRouterType(), true);\n            }\n\n            //bind exchange\n            for (Exchange exchange : sortedExchanges) {\n                if (exchange.getParentId() == -1)\n                    continue;\n\n                channel.exchangeBind(exchange.getExchangeName(),\n                        exchangeMap.get(exchange.getParentId()).getExchangeName(),\n                        exchange.getRoutingKey());\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } finally {\n            super.close();\n        }\n    }\n\n    public void initQueue(List<Queue> queues) {\n\n        try {\n            super.init();\n\n            //declare queue\n            for (Queue queue : queues) {\n                Map<String, Object> queueConfig = new HashMap<String, Object>(2);\n\n                if (queue.getThreshold() != -1) {\n                    queueConfig.put(\"x-max-length\", queue.getThreshold());\n                }\n\n                if (queue.getThreshold() != -1 && queue.getMsgBodySize() != -1) {\n                    int allMsgSize = queue.getThreshold() * queue.getMsgBodySize();\n                    queueConfig.put(\"x-max-length-bytes\", allMsgSize);\n                }\n\n                if (queue.getTtl() != -1) {\n                    channel.queueDelete(queue.getQueueName());\n                    queueConfig.put(\"x-expires\", queue.getTtl());\n                }\n\n                if (queue.getTtlPerMsg() != -1) {\n                    channel.queueDelete(queue.getQueueName());\n                    queueConfig.put(\"x-message-ttl\", queue.getTtlPerMsg());\n                }\n\n                channel.queueDeclare(queue.getQueueName(), true, false, false, queueConfig);\n            }\n\n            //bind queue\n            for (Queue queue : queues) {\n                channel.queueBind(queue.getQueueName(),\n                        queue.getBindExchange(),\n                        queue.getRoutingKey());\n            }\n        } catch (IOException e) {\n            logger.error(e);\n            throw new RuntimeException(e);\n        } finally {\n            super.close();\n        }\n    }\n\n    private void destroyTopologyComponent() throws IOException {\n        //call reset-app\n    }\n\n    private boolean exchangeExists(String exchangeName) throws IOException {\n        boolean result = true;\n        try {\n            channel.exchangeDeclarePassive(exchangeName);\n        } catch (IOException e) {\n            result = false;\n            if (!channel.isOpen()) {\n                super.init();\n            }\n        }\n\n        return result;\n    }\n\n    private boolean queueExists(String queueName) throws IOException {\n        boolean result = true;\n        try {\n            channel.queueDeclarePassive(queueName);\n        } catch (IOException e) {\n            result = false;\n            if (!channel.isOpen()) {\n                super.init();\n            }\n        }\n\n        return result;\n    }\n\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/Queue.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport java.io.Serializable;\n\n/**\n * Created by yanghua on 11/20/15.\n */\npublic class Queue implements Serializable {\n\n    private String queueName;\n    private String bindExchange;\n    private String routingKey;\n    private String typeId;\n    private int    threshold;\n    private int    msgBodySize;\n    private int    ttl;\n    private int    ttlPerMsg;\n\n    public Queue() {\n    }\n\n    public String getQueueName() {\n        return queueName;\n    }\n\n    public void setQueueName(String queueName) {\n        this.queueName = queueName;\n    }\n\n    public String getBindExchange() {\n        return bindExchange;\n    }\n\n    public void setBindExchange(String bindExchange) {\n        this.bindExchange = bindExchange;\n    }\n\n    public String getRoutingKey() {\n        return routingKey;\n    }\n\n    public void setRoutingKey(String routingKey) {\n        this.routingKey = routingKey;\n    }\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public int getThreshold() {\n        return threshold;\n    }\n\n    public void setThreshold(int threshold) {\n        this.threshold = threshold;\n    }\n\n    public int getMsgBodySize() {\n        return msgBodySize;\n    }\n\n    public void setMsgBodySize(int msgBodySize) {\n        this.msgBodySize = msgBodySize;\n    }\n\n    public int getTtl() {\n        return ttl;\n    }\n\n    public void setTtl(int ttl) {\n        this.ttl = ttl;\n    }\n\n    public int getTtlPerMsg() {\n        return ttlPerMsg;\n    }\n\n    public void setTtlPerMsg(int ttlPerMsg) {\n        this.ttlPerMsg = ttlPerMsg;\n    }\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/QueueManager.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport com.rabbitmq.client.Channel;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\n\npublic class QueueManager extends AbstractInitializer {\n\n    private static final Log logger = LogFactory.getLog(QueueManager.class);\n\n    private static volatile QueueManager instance = null;\n\n    private QueueManager(String host) {\n        super(host);\n    }\n\n    public static QueueManager defaultQueueManager(String host) {\n        if (instance == null) {\n            synchronized (QueueManager.class) {\n                if (instance == null)\n                    instance = new QueueManager(host);\n            }\n        }\n\n        return instance;\n    }\n\n    public void create(String queueName) throws IOException {\n        super.init();\n        if (queueName.isEmpty()) {\n            logger.error(\"[create] queueName param is empty\");\n            throw new IOException(\"[create] queueName param is empty\");\n        }\n        this.channel.queueDeclare(queueName, true, false, false, null);\n        super.close();\n    }\n\n    public void create(String queueName, String bindTo, String routingKey) throws IOException {\n        super.init();\n        if (queueName.isEmpty()) {\n            logger.error(\"[create] queueName param is empty\");\n            throw new IOException(\"[create] queueName param is empty\");\n        }\n\n        this.channel.queueDeclare(queueName, true, false, false, null);\n        if (bindTo != null && !bindTo.isEmpty() && this.innerExists(bindTo, this.channel))\n            this.channel.queueBind(queueName, bindTo, routingKey);\n        super.close();\n    }\n\n    public void bind(String queueName, String bindTo, String routingKey) throws IOException {\n        super.init();\n        if (!this.innerExists(queueName, this.channel)) {\n            logger.error(\"[bind] queue : \" + queueName + \" is not exists!\");\n            throw new IOException(\"queue : \" + queueName + \" is not exists!\");\n        }\n\n        if (!this.innerExists(bindTo, this.channel)) {\n            logger.error(\"[bind] bindTo : \" + bindTo + \" is not exists!\");\n            throw new IOException(\"[bind] bindTo : \" + bindTo + \" is not exists!\");\n        }\n        this.channel.queueBind(queueName, bindTo, routingKey);\n\n        super.close();\n    }\n\n    public void unbind(String queueName, String unbindTo, String routingKey) throws IOException {\n        super.init();\n        if (queueName.isEmpty()) {\n            logger.error(\"[unbind] queueName is empty\");\n            throw new IOException(\"[unbind] queueName is empty\");\n        }\n\n        if (unbindTo.isEmpty()) {\n            logger.error(\"[ubind] unbindTo param is empty\");\n            throw new IOException(\"[ubind] unbindTo param is empty\");\n        }\n\n        if (!this.innerExists(queueName, this.channel)) {\n            logger.error(\"[unbind] queue : \" + queueName + \" is not exists\");\n        }\n\n        if (!this.innerExists(unbindTo, this.channel)) {\n            logger.error(\"[unbind] unbind queue : \" + unbindTo + \" is not exists\");\n        }\n\n        this.channel.queueUnbind(queueName, unbindTo, routingKey);\n        super.close();\n    }\n\n    public void delete(String queueName) throws IOException {\n        super.init();\n        if (queueName.isEmpty()) {\n            logger.error(\"[delete] queueName is empty\");\n            throw new IOException(\"[delete] queueName is empty\");\n        }\n\n        if (!this.innerExists(queueName, this.channel)) {\n            logger.error(\"[delete] queue : \" + queueName + \" is not exists\");\n        }\n\n        this.channel.queueDelete(queueName);\n        super.close();\n    }\n\n    public boolean exists(String queueName) throws IOException {\n        super.init();\n        boolean result = true;\n        try {\n            this.channel.queueDeclarePassive(queueName);\n        } catch (IOException e) {\n            result = false;\n        }\n        super.close();\n\n        return result;\n    }\n\n    /**\n     * for other function, it borrow a outer channel\n     *\n     * @param queueName\n     * @param outerChannel\n     * @return\n     */\n    private boolean innerExists(String queueName, Channel outerChannel) {\n        boolean result = true;\n        try {\n            outerChannel.queueDeclarePassive(queueName);\n        } catch (IOException e) {\n            result = false;\n        }\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/rabbitmq/RabbitmqServerManager.java",
    "content": "package com.messagebus.interactor.rabbitmq;\n\nimport com.messagebus.common.ExceptionHelper;\nimport com.messagebus.interactor.util.ShellHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.IOException;\nimport java.net.Inet4Address;\nimport java.net.UnknownHostException;\n\npublic class RabbitmqServerManager {\n\n    private static final Log logger = LogFactory.getLog(RabbitmqServerManager.class);\n\n    public static void start(String mqHost) {\n        if (!comeFromSameHost(mqHost)) {\n            throw new RuntimeException(\"the message bus server's host and the mq server's host\" +\n                    \" are not the same\");\n        }\n\n        logger.info(\"starting mq server...\");\n        String mqServerStartupCmdStr = \"rabbitmq-server start\";\n        try {\n            ShellHelper.exec(\"/usr/sbin/service \" + mqServerStartupCmdStr);\n        } catch (IOException e) {\n            ExceptionHelper.logException(logger, e, \"start\");\n            throw new RuntimeException(e);\n        } catch (InterruptedException e) {\n\n        }\n    }\n\n    public static void stop(String mqHost) {\n        if (!comeFromSameHost(mqHost)) {\n            throw new RuntimeException(\"the message bus server's host and the mq server's host\" +\n                    \" are not the same\");\n        }\n\n        logger.info(\"stopping mq server...\");\n        String mqServerStopCmdStr = \"rabbitmq-server stop\";\n        try {\n            ShellHelper.exec(\"/usr/sbin/service \" + mqServerStopCmdStr);\n        } catch (IOException e) {\n            logger.error(\"occurs an IOException : \" + e.getMessage());\n            throw new RuntimeException(\"occurs an IOException : \" + e.getMessage());\n        } catch (InterruptedException e) {\n\n        }\n    }\n\n    public static boolean isAlive(String mqHost) {\n        if (!comeFromSameHost(mqHost)) {\n            throw new RuntimeException(\"the message bus server's host and the mq server's host\" +\n                    \" are not the same\");\n        }\n\n        try {\n            ShellHelper.ExecResult result = ShellHelper.exec(\"rabbitmqctl status | grep 'pid'\");\n            return result.getInfo().contains(\"pid\");\n        } catch (IOException e) {\n            logger.error(\"[isAlive] occurs IOException : \" + e.getMessage());\n            return false;\n        } catch (InterruptedException e) {\n            return false;\n        }\n    }\n\n    private static boolean comeFromSameHost(String host) {\n        try {\n            String ipStr = Inet4Address.getLocalHost().getHostAddress();\n            return ipStr.equals(host);\n        } catch (UnknownHostException e) {\n            logger.error(\"unknown host exception : \" + e.toString());\n            throw new RuntimeException(\"unknown host exception : \" + e.toString());\n        }\n    }\n\n}\n"
  },
  {
    "path": "interactor-component/src/main/java/com/messagebus/interactor/util/ShellHelper.java",
    "content": "package com.messagebus.interactor.util;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.io.BufferedInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\npublic class ShellHelper {\n\n    private static final Log logger = LogFactory.getLog(ShellHelper.class);\n\n    public static ExecResult exec(String cmdStr) throws IOException, InterruptedException {\n        String[] cmd     = {\"/bin/sh\", \"-c\", cmdStr};\n        Process  process = Runtime.getRuntime().exec(cmd);\n        process.waitFor();\n\n        String errStr  = translateFromStream(process.getErrorStream());\n        String infoStr = translateFromStream(process.getInputStream());\n\n        ExecResult execResult = new ExecResult();\n        execResult.setError(errStr);\n        execResult.setInfo(infoStr);\n\n        logger.debug(\"[exec] occurs a error, \" + \" and error msg is :\" + errStr + \" command is : \" + cmdStr);\n        logger.debug(\"[exec] output info is \" + infoStr);\n\n        return execResult;\n    }\n\n    private static String translateFromStream(InputStream stream) throws IOException {\n        BufferedInputStream bufferedInputStream = new BufferedInputStream(stream);\n\n        StringBuilder sb        = new StringBuilder();\n        byte[]        buffer    = new byte[1024];\n        int           bytesRead = 0;\n        while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {\n            sb.append(new String(buffer, 0, bytesRead));\n        }\n\n        return sb.toString();\n    }\n\n    public static class ExecResult {\n\n        private String info;\n        private String error;\n\n        public ExecResult() {\n        }\n\n        public String getInfo() {\n            return info;\n        }\n\n        public void setInfo(String info) {\n            this.info = info;\n        }\n\n        public String getError() {\n            return error;\n        }\n\n        public void setError(String error) {\n            this.error = error;\n        }\n\n        @Override\n        public String toString() {\n            return \"ExecResult{\" +\n                    \"info='\" + info + '\\'' +\n                    \", error='\" + error + '\\'' +\n                    '}';\n        }\n    }\n\n}\n"
  },
  {
    "path": "managesystem/banyan_DB.sql",
    "content": "CREATE DATABASE  IF NOT EXISTS `banyan_DB` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;\nUSE `banyan_DB`;\n-- MySQL dump 10.13  Distrib 5.6.17, for osx10.6 (i386)\n--\n-- Host: 172.16.206.17    Database: banyan_DB\n-- ------------------------------------------------------\n-- Server version\t5.6.19-0ubuntu0.14.04.1\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8 */;\n/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n/*!40103 SET TIME_ZONE='+00:00' */;\n/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n--\n-- Table structure for table `APP`\n--\n\nDROP TABLE IF EXISTS `APP`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `APP` (\n  `APP_ID` varchar(20) NOT NULL,\n  `NAME` varchar(100) DEFAULT NULL,\n  `CREATOR` varchar(20) DEFAULT NULL,\n  `FROM_DATE` datetime DEFAULT NULL,\n  `THRU_DATE` datetime DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`APP_ID`),\n  KEY `fk_App_UserLogin` (`CREATOR`),\n  KEY `APP_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `APP_TXCRTS` (`CREATED_TX_STAMP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `APP`\n--\n\nLOCK TABLES `APP` WRITE;\n/*!40000 ALTER TABLE `APP` DISABLE KEYS */;\nINSERT INTO `APP` VALUES ('1','server','admin','2015-03-22 09:15:45',NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('100','cms','banyanAdmin','2015-03-28 10:15:45',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('101','oa','banyanAdmin','2015-03-28 10:15:45',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('2','console','admin','2015-03-22 09:15:45',NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('3','emap','banyanAdmin','2015-03-16 10:15:45',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('4','erp','banyanAdmin','2015-03-16 10:15:45',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('5','amp','banyanAdmin','2015-03-31 03:28:30',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('6','logSys','banyanAdmin','2015-04-27 13:28:30',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('7','remoteAmp','banyanAdmin','2015-04-28 20:10:30',NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40');\n/*!40000 ALTER TABLE `APP` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `AUDIT_TYPE`\n--\n\nDROP TABLE IF EXISTS `AUDIT_TYPE`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `AUDIT_TYPE` (\n  `AUDIT_TYPE_CODE` varchar(100) NOT NULL,\n  `AUDIT_TYPE_NAME` varchar(100) DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`AUDIT_TYPE_CODE`),\n  KEY `AUDIT_TYPE_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `AUDIT_TYPE_TXCRTS` (`CREATED_TX_STAMP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `AUDIT_TYPE`\n--\n\nLOCK TABLES `AUDIT_TYPE` WRITE;\n/*!40000 ALTER TABLE `AUDIT_TYPE` DISABLE KEYS */;\nINSERT INTO `AUDIT_TYPE` VALUES ('AUDIT_BEFORE','???','2015-04-28 19:48:16','2015-04-28 19:48:16','2015-04-28 19:47:17','2015-04-28 19:47:17'),('AUDIT_FAILED','?????','2015-04-28 19:48:16','2015-04-28 19:48:16','2015-04-28 19:47:17','2015-04-28 19:47:17'),('AUDIT_SUCCESS','????','2015-04-28 19:48:16','2015-04-28 19:48:16','2015-04-28 19:47:17','2015-04-28 19:47:17');\n/*!40000 ALTER TABLE `AUDIT_TYPE` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `CONFIG`\n--\n\nDROP TABLE IF EXISTS `CONFIG`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `CONFIG` (\n  `CONFIG_ID` varchar(20) NOT NULL,\n  `ITEM_KEY` varchar(100) DEFAULT NULL,\n  `ITEM_VALUE` varchar(255) DEFAULT NULL,\n  `TYPE` varchar(255) DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`CONFIG_ID`),\n  KEY `CONFIG_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `CONFIG_TXCRTS` (`CREATED_TX_STAMP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `CONFIG`\n--\n\nLOCK TABLES `CONFIG` WRITE;\n/*!40000 ALTER TABLE `CONFIG` DISABLE KEYS */;\nINSERT INTO `CONFIG` VALUES ('1','messagebus.client.host','172.16.206.29','client','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('2','messagebus.client.port','5672','client','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17');\n/*!40000 ALTER TABLE `CONFIG` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `NODE`\n--\n\nDROP TABLE IF EXISTS `NODE`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `NODE` (\n  `NODE_ID` varchar(20) NOT NULL,\n  `SECRET` varchar(255) DEFAULT NULL,\n  `NAME` varchar(100) DEFAULT NULL,\n  `VALUE` varchar(255) DEFAULT NULL,\n  `PARENT_ID` varchar(20) DEFAULT NULL,\n  `TYPE` varchar(20) DEFAULT NULL,\n  `ROUTER_TYPE` varchar(255) DEFAULT NULL,\n  `ROUTING_KEY` varchar(255) DEFAULT NULL,\n  `AVAILABLE` char(1) DEFAULT NULL,\n  `IS_INNER` char(1) DEFAULT NULL,\n  `IS_VIRTUAL` char(1) DEFAULT NULL,\n  `COMMUNICATE_TYPE` varchar(100) DEFAULT NULL,\n  `CREATOR` varchar(20) DEFAULT NULL,\n  `APP_ID` varchar(20) DEFAULT NULL,\n  `RATE_LIMIT` varchar(60) DEFAULT NULL,\n  `THRESHOLD` varchar(60) DEFAULT NULL,\n  `MSG_BODY_SIZE` varchar(60) DEFAULT NULL,\n  `TTL` varchar(60) DEFAULT NULL,\n  `TTL_PER_MSG` varchar(60) DEFAULT NULL,\n  `AUDIT_TYPE_CODE` varchar(100) DEFAULT NULL,\n  `CAN_BROADCAST` char(1) DEFAULT NULL,\n  `FROM_DATE` datetime DEFAULT NULL,\n  `THRU_DATE` datetime DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`NODE_ID`),\n  KEY `fk_Node_UserLogin` (`CREATOR`),\n  KEY `fk_Node_AuditType` (`AUDIT_TYPE_CODE`),\n  KEY `fk_Node_App` (`APP_ID`),\n  KEY `NODE_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `NODE_TXCRTS` (`CREATED_TX_STAMP`),\n  CONSTRAINT `fk_Node_App` FOREIGN KEY (`APP_ID`) REFERENCES `APP` (`APP_ID`),\n  CONSTRAINT `fk_Node_AuditType` FOREIGN KEY (`AUDIT_TYPE_CODE`) REFERENCES `AUDIT_TYPE` (`AUDIT_TYPE_CODE`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `NODE`\n--\n\nLOCK TABLES `NODE` WRITE;\n/*!40000 ALTER TABLE `NODE` DISABLE KEYS */;\nINSERT INTO `NODE` VALUES ('1',NULL,'proxy','exchange.proxy','-1','0','fanout',NULL,'1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('10','iqwjasdfklakqoiajsidfoasidjoqw','serverInfoResponse','queue.proxy.message.reqresp.serverInfoResponse','6','1',NULL,'routingkey.proxy.message.reqresp.serverInfoResponse','1','0','0','response','banyanAdmin','1',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('100','kjhqwehuksadhjkhkqfkjshduwuhas','cmsDemoProduce','queue.proxy.message.procon.cmsDemoProduce','4','1',NULL,'routingkey.proxy.message.procon.cmsDemoProduce','1','0','1','produce','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('101','qiuiuchvqihuchvqnuicoaudhfieqi','cmsDemoConsume','queue.proxy.message.procon.cmsDemoConsume','4','1',NULL,'routingkey.proxy.message.procon.cmsDemoConsume','1','0','0','consume','banyanAdmin','4','1000','20000','2000',NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('102','ijwlieulcaisduhfilhliuhdfbsjhx','cmsDemoPublish','queue.proxy.message.pubsub.cmsDemoPublish','5','1',NULL,'routingkey.proxy.message.pubsub.cmsDemoPublish','1','0','1','publish','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('103','jnsdlkblkAWEHLIDVBAJSDlohkjasn','cmsDemoSubscribe','queue.proxy.message.pubsub.cmsDemoSubscribe','5','1',NULL,'routingkey.proxy.message.pubsub.cmsDemoSubscribe','1','0','0','subscribe','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('104','mfqemwqkjdkuhxqnklhawjebuwyiud','oaDemoProduce','queue.proxy.message.procon.oaDemoProduce','4','1',NULL,'routingkey.proxy.message.procon.oaDemoProduce','1','0','1','produce','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('105','miwenasuhqiboudfqiuhfiuhdfquha','oaDemoConsume','queue.proxy.message.procon.oaDemoConsume','4','1',NULL,'routingkey.proxy.message.procon.oaDemoConsume','1','0','0','consume','banyanAdmin','4','1000','20000','2000',NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('106','ewoiasnflieunjkdflqienflsdifln','oaDemoPublish','queue.proxy.message.pubsub.oaDemoPublish','5','1',NULL,'routingkey.proxy.message.pubsub.oaDemoPublish','1','0','1','publish','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('107','mnxcblawkebflifiauhfqliwuhflan','oaDemoSubscribe','queue.proxy.message.pubsub.oaDemoSubscribe','5','1',NULL,'routingkey.proxy.message.pubsub.oaDemoSubscribe','1','0','0','subscribe','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_BEFORE',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('11','nadjfqulaudhfkauwaudhfakqajd','serverCmdResponse','queue.proxy.message.reqresp.serverCmdResponse','6','1',NULL,'routingkey.proxy.message.reqresp.serverCmdResponse','1','0','0','response','banyanAdmin','1',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('12','miuhqihusahdfuhaksjhfuiqweka','serverInfoRequest','queue.proxy.message.reqresp.serverInfoRequest','6','1',NULL,'routingkey.proxy.message.reqresp.serverInfoRequest','1','0','0','request','banyanAdmin','2',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('13','lauhsdjkfhqiuwequhiausdfhuah','serverCmdRequest','queue.proxy.message.reqresp.serverCmdRequest','6','1',NULL,'routingkey.proxy.message.reqresp.serverCmdRequest','1','0','0','request','banyanAdmin','2',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('2',NULL,'log','exchange.proxy.log','1','0','fanout',NULL,'1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('200','iojawdnaisdflknoiankjfdblaidcas','appDataQueue','queue.proxy.message.procon.appDataQueue','4','1',NULL,'routingkey.proxy.message.procon.appDataQueue','1','0','0','produce-consume','banyanAdmin','5',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('201','qliudwnfljainfqlhalsdbfqlwehfbl','appErrorEventQueue','queue.proxy.message.procon.appErrorEventQueue','4','1',NULL,'routingkey.proxy.message.procon.appErrorEventQueue','1','0','0','consume','banyanAdmin','5',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('3',NULL,'message','exchange.proxy.message','1','0','topic',NULL,'1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('300','liredkifnhaqweuhfqbablwddflawea','appErrorEventProducer','queue.proxy.message.procon.appErrorEventProducer','4','1',NULL,'routingkey.proxy.message.procon.appErrorEventProducer','1','0','1','produce','banyanAdmin','6',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('4',NULL,'procon','exchange.proxy.message.procon','3','0','topic','routingkey.proxy.message.procon.#','1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('400','jbdlhbcLQHDBLASBDALsdblASHBDjhn','appErrorRemoteQProducer','queue.proxy.message.procon.appErrorRemoteQProducer','4','1',NULL,'routingkey.proxy.message.procon.appErrorRemoteQProducer','1','0','1','produce','banyanAdmin','7',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('401','lkaqnwejnfalwefjbsdfkjasnfjqlas','appErrorRemoteQ','queue.proxy.message.procon.appErrorRemoteQ','4','1',NULL,'routingkey.proxy.message.procon.appErrorRemoteQ','1','0','0','consume','banyanAdmin','7',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('43','kljasdoifqoikjhhhqwhebasdfasdf','erpDemoProduce','queue.proxy.message.procon.erpDemoProduce','4','1',NULL,'routingkey.proxy.message.procon.erpDemoProduce','1','0','1','produce','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS','1',NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('44','kjhasdfhlkuqjhgaebjhasgdfabfak','erpDemoConsume','queue.proxy.message.procon.erpDemoConsume','4','1',NULL,'routingkey.proxy.message.procon.erpDemoConsume','1','0','0','consume','banyanAdmin','4','1000','20000','2000',NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('45','jnmzqwemnjaksdfqjnkajfjasndfnw','erpDemoProduce-Consume','queue.proxy.message.procon.erpDemoProduce-Consume','4','1',NULL,'routingkey.proxy.message.procon.erpDemoProduce-Consume','1','0','0','produce-consume','banyanAdmin','4',NULL,'100','500',NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('46','iuoqiwejicaoisfaisfbsqewnfjnfa','erpDemoRequest','queue.proxy.message.reqresp.erpDemoRequest','6','1',NULL,'routingkey.proxy.message.reqresp.erpDemoRequest','1','0','1','request','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('47','muciasnajjkasbdfbaskjdfkjkasja','erpDemoResponse','queue.proxy.message.reqresp.erpDemoResponse','6','1',NULL,'routingkey.proxy.message.reqresp.erpDemoResponse','1','0','0','response','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('48','qiwernjknfaawenkjasdfkjnakllas','erpDemoRequest-Response','queue.proxy.message.reqresp.erpDemoRequest-Response','6','1',NULL,'routingkey.proxy.message.reqresp.erpDemoRequest-Response','1','0','0','request-response','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('49','oiqwenncuicnsdfuasdfnkajkwqowe','erpDemoPublish','queue.proxy.message.pubsub.erpDemoPublish','5','1',NULL,'routingkey.proxy.message.pubsub.erpDemoPublish','1','0','1','publish','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('5',NULL,'pubsub','exchange.proxy.message.pubsub','3','0','topic','routingkey.proxy.message.pubsub.#','1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('50','nckljsenlkjanefluiwnlanfmsdfas','erpDemoSubscribe','queue.proxy.message.pubsub.erpDemoSubscribe','5','1',NULL,'routingkey.proxy.message.pubsub.erpDemoSubscribe','1','0','0','subscribe','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('51','xzmjsdafnkjanuwqijpasdfnanlkna','erpDemoPublish-Subscribe','queue.proxy.message.pubsub.erpDemoPublish-Subscribe','5','1',NULL,'routingkey.proxy.message.pubsub.erpDemoPublish-Subscribe','1','0','0','publish-subscribe','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('52','kliwhiduhaiucvarkjajksdbfkjabw','erpDemoRpcRequest','queue.proxy.message.rpc.erpDemoRpcRequest','7','1',NULL,'routingkey.proxy.message.rpc.erpDemoRpcRequest','1','0','1','rpcrequest','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('53','jhliquwdlaisudfqbjhasdfulquias','erpDemoRpcResponse','queue.proxy.message.rpc.erpDemoRpcResponse','7','1',NULL,'routingkey.proxy.message.rpc.erpDemoRpcResponse','1','0','0','rpcresponse','banyanAdmin','4',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('6',NULL,'reqresp','exchange.proxy.message.reqresp','3','0','topic','routingkey.proxy.message.reqresp.#','1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('7',NULL,'rpc','exchange.proxy.message.rpc','3','0','topic','routingkey.proxy.message.rpc.#','1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('73','muqwejlaksdfkljaliqwejflkasdfs','emapDemoProduce','queue.proxy.message.procon.emapDemoProduce','4','1',NULL,'routingkey.proxy.message.procon.emapDemoProduce','1','0','1','produce','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('74','zxdjnflakwenklasjdflkqpiasdfnj','emapDemoConsume','queue.proxy.message.procon.emapDemoConsume','4','1',NULL,'routingkey.proxy.message.procon.emapDemoConsume','1','0','0','consume','banyanAdmin','3','2000',NULL,'1000',NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('75','zxjnlasndflkjasdlflqwekjnflaks','emapDemoProduce-Consume','queue.proxy.message.procon.emapDemoProduce-Consume','4','1',NULL,'routingkey.proxy.message.procon.emapDemoProduce-Consume','1','0','0','produce-consume','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('76','mzxhblawdblulawkwkkwksifhlaasd','emapDemoRequest','queue.proxy.message.reqresp.emapDemoRequest','6','1',NULL,'routingkey.proxy.message.reqresp.emapDemoRequest','1','0','1','request','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('77','zxjhvclawenlkfhsladfnqpwenflak','emapDemoResponse','queue.proxy.message.reqresp.emapDemoResponse','6','1',NULL,'routingkey.proxy.message.reqresp.emapDemoResponse','1','0','0','response','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('78','xcvnbladflkasudflwepqowiejfoas','emapDemoRequest-Response','queue.proxy.message.reqresp.emapDemoRequest-Response','6','1',NULL,'routingkey.proxy.message.reqresp.emapDemoRequest-Response','1','0','0','request-response','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('79','zxcjvhlawenlkfhsalfqpiieiwqqsd','emapDemoPublish','queue.proxy.message.pubsub.emapDemoPublish','5','1',NULL,'routingkey.proxy.message.pubsub.emapDemoPublish','1','0','1','publish','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('8',NULL,'notification','exchange.proxy.message.notification','3','0','fanout','routingkey.proxy.message.notification.#','1','1',NULL,NULL,'banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('80','zxcnvblawelkusahdfqwiuhowefhnx','emapDemoSubscribe','queue.proxy.message.pubsub.emapDemoSubscribe','5','1',NULL,'routingkey.proxy.message.pubsub.emapDemoSubscribe','1','0','0','subscribe','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('81','zxcnvblaeflbwehiouhusduaflsuda','emapDemoPublish-Subscribe','queue.proxy.message.pubsub.emapDemoPublish-Subscribe','5','1',NULL,'routingkey.proxy.message.pubsub.emapDemoPublish-Subscribe','1','0','0','publish-subscribe','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('82','jnhiuerhskjdhfiasdkjhasdlkwerf','emapDemoRpcRequest','queue.proxy.message.rpc.emapDemoRpcRequest','7','1',NULL,'routingkey.proxy.message.rpc.emapDemoRpcRequest','1','0','0','rpcrequest','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('83','mshdfjbqwejhfgasdfbjqkygaksdfa','emapDemoRpcResponse','queue.proxy.message.rpc.emapDemoRpcResponse','7','1',NULL,'routingkey.proxy.message.rpc.emapDemoRpcResponse','1','0','0','rpcresponse','banyanAdmin','3',NULL,NULL,NULL,NULL,NULL,'AUDIT_SUCCESS',NULL,NULL,NULL,'2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('9','hkajhdfiuwxjdhakjdshuuuqoxdfasg','file','exchange.proxy.log.file','2','1',NULL,NULL,'1','1',NULL,'consume','banyanAdmin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17');\n/*!40000 ALTER TABLE `NODE` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `NODE_AUDIT_HISTORY`\n--\n\nDROP TABLE IF EXISTS `NODE_AUDIT_HISTORY`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `NODE_AUDIT_HISTORY` (\n  `NODE_AUDIT_ID` varchar(20) NOT NULL,\n  `NODE_ID` varchar(20) DEFAULT NULL,\n  `AUDIT_TYPE_CODE` varchar(100) DEFAULT NULL,\n  `AUDITOR` varchar(20) DEFAULT NULL,\n  `FROM_DATE` datetime DEFAULT NULL,\n  `THRU_DATE` datetime DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`NODE_AUDIT_ID`),\n  KEY `fk_NodeAuditHistory_AuditType` (`AUDIT_TYPE_CODE`),\n  KEY `fk_NodeAuditHistory_Node` (`NODE_ID`),\n  KEY `fk_NodeAuditHistory_UserLogin` (`AUDITOR`),\n  KEY `ND_ADT_HSTR_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `ND_ADT_HSTR_TXCRTS` (`CREATED_TX_STAMP`),\n  CONSTRAINT `fk_NodeAuditHistory_Node` FOREIGN KEY (`NODE_ID`) REFERENCES `NODE` (`NODE_ID`),\n  CONSTRAINT `fk_NodeAuditHistory_AuditType` FOREIGN KEY (`AUDIT_TYPE_CODE`) REFERENCES `AUDIT_TYPE` (`AUDIT_TYPE_CODE`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `NODE_AUDIT_HISTORY`\n--\n\nLOCK TABLES `NODE_AUDIT_HISTORY` WRITE;\n/*!40000 ALTER TABLE `NODE_AUDIT_HISTORY` DISABLE KEYS */;\n/*!40000 ALTER TABLE `NODE_AUDIT_HISTORY` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `QUEUE_RATE_WARNING`\n--\n\nDROP TABLE IF EXISTS `QUEUE_RATE_WARNING`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `QUEUE_RATE_WARNING` (\n  `WARNING_ID` varchar(20) NOT NULL,\n  `NODE_ID` varchar(20) DEFAULT NULL,\n  `RATE_LIMIT` varchar(255) DEFAULT NULL,\n  `REAL_RATE` varchar(255) DEFAULT NULL,\n  `FROM_DATE` datetime DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`WARNING_ID`),\n  KEY `fk_QueueRateWarning_Node` (`NODE_ID`),\n  KEY `Q_RT_WRNNG_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `Q_RT_WRNNG_TXCRTS` (`CREATED_TX_STAMP`),\n  CONSTRAINT `fk_QueueRateWarning_Node` FOREIGN KEY (`NODE_ID`) REFERENCES `NODE` (`NODE_ID`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `QUEUE_RATE_WARNING`\n--\n\nLOCK TABLES `QUEUE_RATE_WARNING` WRITE;\n/*!40000 ALTER TABLE `QUEUE_RATE_WARNING` DISABLE KEYS */;\nINSERT INTO `QUEUE_RATE_WARNING` VALUES ('1','74','2000','4000','2015-03-28 10:12:11','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('2','74','2000','4321','2015-03-28 11:02:11','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('3','74','2000','5242','2015-03-28 12:43:11','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('4','74','2000','4324','2015-03-28 13:45:11','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('5','74','2000','7645','2015-03-28 14:23:11','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40');\n/*!40000 ALTER TABLE `QUEUE_RATE_WARNING` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `SINK`\n--\n\nDROP TABLE IF EXISTS `SINK`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `SINK` (\n  `SINK_ID` varchar(20) NOT NULL,\n  `TOKEN` varchar(255) DEFAULT NULL,\n  `FLOW_FROM` varchar(20) DEFAULT NULL,\n  `FROM_COMMUNICATE_TYPE` varchar(100) DEFAULT NULL,\n  `FLOW_TO` varchar(20) DEFAULT NULL,\n  `TO_COMMUNICATE_TYPE` varchar(100) DEFAULT NULL,\n  `ENABLE` char(1) DEFAULT NULL,\n  `CREATOR` varchar(20) DEFAULT NULL,\n  `AUDIT_TYPE_CODE` varchar(100) DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`SINK_ID`),\n  KEY `fk_Sink_UserLogin` (`CREATOR`),\n  KEY `fk_Sink_AuditType` (`AUDIT_TYPE_CODE`),\n  KEY `fk_Sink_Node_flowFrom` (`FLOW_FROM`),\n  KEY `fk_Sink_Node_flowTo` (`FLOW_TO`),\n  KEY `SINK_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `SINK_TXCRTS` (`CREATED_TX_STAMP`),\n  CONSTRAINT `fk_Sink_Node_flowTo` FOREIGN KEY (`FLOW_TO`) REFERENCES `NODE` (`NODE_ID`),\n  CONSTRAINT `fk_Sink_AuditType` FOREIGN KEY (`AUDIT_TYPE_CODE`) REFERENCES `AUDIT_TYPE` (`AUDIT_TYPE_CODE`),\n  CONSTRAINT `fk_Sink_Node_flowFrom` FOREIGN KEY (`FLOW_FROM`) REFERENCES `NODE` (`NODE_ID`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `SINK`\n--\n\nLOCK TABLES `SINK` WRITE;\n/*!40000 ALTER TABLE `SINK` DISABLE KEYS */;\nINSERT INTO `SINK` VALUES ('1','masdjfqiowieqooeirfajhfihfweld','12','request','10','response','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('10','nclajsdljhqiuwehfiusaiudfhiausd','49','publish','80','subscribe','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('100','iuwqijshdiuqjbuisdfiuewiuhiuiqw','100',NULL,'105',NULL,'1','banyanAdmin','AUDIT_BEFORE','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('101','akjfqkanlkjsdhfiqnlkajdhaskjasd','104',NULL,'101',NULL,'1','banyanAdmin','AUDIT_BEFORE','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('11','njafjqwhefuyasdafkbdgfkauyeqwku','79','publish','50','subscribe','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('12','migurhiquehoiusdhfouwiefhasboudy','79','publish','80','subscribe','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('13','qjenfiuqwefqiefoiusdfie2hfbwhfbd','300','produce','201','consume','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('14','kjandkjfnasdjkfasndfalkjbwejlaas','400','produce','401','consume','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('2','masuehiuiauhfiuqoquhaisudfhuqe','13','request','11','response','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17','2015-04-28 19:47:17'),('3','hlkasjdhfkqlwhlfalksjdhgssssas','43','produce','74','consume','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('4','jhlkasdfkjhasdfqwkasdfjqkwjhas','73','produce','45','produce-consume','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('5','cakjdhfjasdflqjoiajsdjflqkuwef','46','request','77','response','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('6','cnjasdfluqhwehlkjqwheaizjdhasd','78','request-response','47','response','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('7','klasehnfkljashdnflhkjahwlekdjf','52','rpcrequest','83','rpcresponse','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('8','kjashdlkfjabsdkfjhbakwjlkhqwjh','82','rpcrequest','53','rpcresponse','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40'),('9','laksjdfkjiqwheiuudiuhvqweqwefa','49','publish','50','subscribe','1','banyanAdmin','AUDIT_SUCCESS','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40','2015-04-28 19:48:40');\n/*!40000 ALTER TABLE `SINK` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Table structure for table `SINK_AUDIT_HISTORY`\n--\n\nDROP TABLE IF EXISTS `SINK_AUDIT_HISTORY`;\n/*!40101 SET @saved_cs_client     = @@character_set_client */;\n/*!40101 SET character_set_client = utf8 */;\nCREATE TABLE `SINK_AUDIT_HISTORY` (\n  `SINK_AUDIT_ID` varchar(20) NOT NULL,\n  `SINK_ID` varchar(20) DEFAULT NULL,\n  `AUDIT_TYPE_CODE` varchar(100) DEFAULT NULL,\n  `AUDITOR` varchar(20) DEFAULT NULL,\n  `FROM_DATE` datetime DEFAULT NULL,\n  `THRU_DATE` datetime DEFAULT NULL,\n  `LAST_UPDATED_STAMP` datetime DEFAULT NULL,\n  `LAST_UPDATED_TX_STAMP` datetime DEFAULT NULL,\n  `CREATED_STAMP` datetime DEFAULT NULL,\n  `CREATED_TX_STAMP` datetime DEFAULT NULL,\n  PRIMARY KEY (`SINK_AUDIT_ID`),\n  KEY `fk_SinkAuditHistory_AuditType` (`AUDIT_TYPE_CODE`),\n  KEY `fk_SinkAuditHistory_Sink` (`SINK_ID`),\n  KEY `fk_SinkAuditHistory_UserLogin` (`AUDITOR`),\n  KEY `SNK_ADT_HSR_TXSTMP` (`LAST_UPDATED_TX_STAMP`),\n  KEY `SNK_ADT_HSR_TXCRTS` (`CREATED_TX_STAMP`),\n  CONSTRAINT `fk_SinkAuditHistory_Sink` FOREIGN KEY (`SINK_ID`) REFERENCES `SINK` (`SINK_ID`),\n  CONSTRAINT `fk_SinkAuditHistory_AuditType` FOREIGN KEY (`AUDIT_TYPE_CODE`) REFERENCES `AUDIT_TYPE` (`AUDIT_TYPE_CODE`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n/*!40101 SET character_set_client = @saved_cs_client */;\n\n--\n-- Dumping data for table `SINK_AUDIT_HISTORY`\n--\n\nLOCK TABLES `SINK_AUDIT_HISTORY` WRITE;\n/*!40000 ALTER TABLE `SINK_AUDIT_HISTORY` DISABLE KEYS */;\n/*!40000 ALTER TABLE `SINK_AUDIT_HISTORY` ENABLE KEYS */;\nUNLOCK TABLES;\n\n--\n-- Dumping events for database 'banyan_DB'\n--\n\n--\n-- Dumping routines for database 'banyan_DB'\n--\n/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\n\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n\n-- Dump completed on 2015-05-06  9:11:30\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.messagebus</groupId>\n    <artifactId>messagebus</artifactId>\n    <packaging>pom</packaging>\n    <version>1.0.5</version>\n    <modules>\n        <module>client</module>\n        <module>common-component</module>\n        <module>interactor-component</module>\n        <module>scenario</module>\n        <module>httpbridge</module>\n    </modules>\n    <name>a message bus</name>\n\n    <dependencies>\n        <!-- junit -->\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n\n        <!-- Logging -->\n        <dependency>\n            <groupId>commons-logging</groupId>\n            <artifactId>commons-logging</artifactId>\n            <version>1.1.1</version>\n        </dependency>\n\n        <dependency>\n            <groupId>log4j</groupId>\n            <artifactId>log4j</artifactId>\n            <version>1.2.16</version>\n        </dependency>\n\n        <!-- Null and NotNull annotation -->\n        <dependency>\n            <groupId>org.jetbrains</groupId>\n            <artifactId>annotations</artifactId>\n            <version>13.0</version>\n        </dependency>\n\n        <!-- rabbitMQ -->\n        <dependency>\n            <groupId>com.rabbitmq</groupId>\n            <artifactId>amqp-client</artifactId>\n            <version>3.5.3</version>\n        </dependency>\n\n        <!-- gson -->\n        <dependency>\n            <groupId>com.google.code.gson</groupId>\n            <artifactId>gson</artifactId>\n            <version>2.2.4</version>\n        </dependency>\n\n        <!-- bson -->\n        <dependency>\n            <groupId>de.undercouch</groupId>\n            <artifactId>bson4jackson</artifactId>\n            <version>2.4.0</version>\n        </dependency>\n\n        <!-- dom4j for xml parse -->\n        <dependency>\n            <groupId>dom4j</groupId>\n            <artifactId>dom4j</artifactId>\n            <version>1.6.1</version>\n        </dependency>\n        <dependency>\n            <groupId>jaxen</groupId>\n            <artifactId>jaxen</artifactId>\n            <version>1.1.6</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.google.guava</groupId>\n            <artifactId>guava</artifactId>\n            <version>18.0</version>\n        </dependency>\n\n    </dependencies>\n\n    <!--<repositories>-->\n        <!--<repository>-->\n            <!--<id>release</id>-->\n            <!--<name>release@172.16.1.104</name>-->\n            <!--<url>http://172.16.1.104:8081/nexus/content/groups/public/</url>-->\n        <!--</repository>-->\n    <!--</repositories>-->\n\n    <!--<distributionManagement>-->\n        <!--<repository>-->\n            <!--<id>release</id>-->\n            <!--<name>release@172.16.1.104</name>-->\n            <!--<url>http://172.16.1.104:8081/nexus/content/repositories/releases/</url>-->\n        <!--</repository>-->\n    <!--</distributionManagement>-->\n\n</project>"
  },
  {
    "path": "scenario/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>messagebus</artifactId>\n        <groupId>com.messagebus</groupId>\n        <version>1.0.5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>scenario</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>common</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.messagebus</groupId>\n            <artifactId>client</artifactId>\n            <version>1.0.5</version>\n        </dependency>\n\n    </dependencies>\n\n</project>"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/BroadcastSubscribe.java",
    "content": "package com.messagebus.scenario.client;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class BroadcastSubscribe {\n\n    private static final Log logger = LogFactory.getLog(BroadcastSubscribe.class);\n\n    private static final String host = \"127.0.0.1\";\n    private static final int    port = 6379;\n\n    public static void main(String[] args) {\n        broadcast();\n\n        subscribe1();\n\n        subscribe2();\n    }\n\n    private static void broadcast() {\n        String secret = \"mucasdjfaskdufhqiiuuasdfasdnus\";\n        String token = \"qiakdjfanekisdfadfhkqljwqheu\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        client.broadcast(secret, new Message[]{msg});\n\n        logger.info(\" broadcast! \");\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void subscribe1() {\n        String secret = \"kjhasdfhlkuqjhgaebjhasgdfabfak\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        //notification handler\n        client.setNotificationListener(new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(\"received notification !\");\n                logger.info(message.getMessageId());\n            }\n        });\n\n        //business handler\n        client.consume(secret, 3, TimeUnit.SECONDS, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(message.getMessageId());\n            }\n        });\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void subscribe2() {\n        String sercet = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        client.setNotificationListener(new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(\"received notification !\");\n                logger.info(message.getMessageId());\n            }\n        });\n\n        client.consume(sercet, 3, TimeUnit.SECONDS, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(message.getMessageId());\n            }\n        });\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/ClientUnderMultiThread.java",
    "content": "package com.messagebus.scenario.client;\n\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 3/6/15.\n */\npublic class ClientUnderMultiThread {\n\n    private static final Log logger = LogFactory.getLog(ClientUnderMultiThread.class);\n\n    private static final String pubsuberHost = \"127.0.0.1\";\n    private static final int    pubsuberPort = 6379;\n\n    public static void main(String[] args) {\n        logger.info(\"start produce...\");\n        ProduceClient produceClient = new ProduceClient();\n        produceClient.simulate();\n\n        try {\n            TimeUnit.SECONDS.sleep(4);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        logger.info(\"start consume...\");\n        ConsumeClient consumeClient = new ConsumeClient();\n        consumeClient.simulate();\n    }\n\n    private static class ProduceClient {\n\n        private CountDownLatch counter = new CountDownLatch(2);\n\n        public void simulate() {\n            logger.info(\"ProduceClient simulate start\");\n            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();\n            poolConfig.setMaxTotal(2);\n\n            MessagebusSinglePool pool = new MessagebusSinglePool(pubsuberHost);\n\n            Thread tmpThread;\n            for (int i = 0; i < 2; i++) {\n                tmpThread = new Thread(new ProduceThread(pool, counter));\n                tmpThread.setName(\"produceThread-\" + i);\n                tmpThread.start();\n            }\n\n            try {\n                counter.await();\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n\n            pool.destroy();\n            logger.info(\"ProduceClient simulate end\");\n        }\n    }\n\n    private static class ConsumeClient {\n\n        private CountDownLatch counter = new CountDownLatch(2);\n\n        public void simulate() {\n            logger.info(\"ConsumeClient simulate start\");\n            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();\n            poolConfig.setMaxTotal(2);\n            String appId = \"D0fW8u2u1v7S1IvI8qoQg3dUlLL5b36q\";\n            MessagebusSinglePool pool = new MessagebusSinglePool(pubsuberHost);\n\n            Thread tmpThread;\n            for (int i = 0; i < 2; i++) {\n                tmpThread = new Thread(new ConsumeThread(pool, counter));\n                tmpThread.setName(\"consumeThread-\" + i);\n                tmpThread.start();\n            }\n\n            try {\n                counter.await();\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n\n            pool.destroy();\n            logger.info(\"ConsumeClient simulate end\");\n        }\n    }\n\n    private static class ProduceThread implements Runnable {\n\n        private MessagebusSinglePool pool;\n        private CountDownLatch       counter;\n\n        public ProduceThread(MessagebusSinglePool pool, CountDownLatch counter) {\n            this.pool = pool;\n            this.counter = counter;\n        }\n\n        @Override\n        public void run() {\n            Messagebus client = pool.getResource();\n            Message msg = MessageFactory.createMessage();\n            msg.setContentType(\"text/plain\");\n            msg.setContentEncoding(\"utf-8\");\n\n            msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n            String secret = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n            String token = \"hlkasjdhfkqlwhlfalksjdhgssssas\";\n\n            client.produce(secret, \"emapDemoConsume\", msg, token);\n            pool.returnResource(client);\n\n            counter.countDown();\n        }\n    }\n\n    private static class ConsumeThread implements Runnable {\n\n        private MessagebusSinglePool pool;\n        private CountDownLatch       counter;\n\n        public ConsumeThread(MessagebusSinglePool pool, CountDownLatch counter) {\n            this.pool = pool;\n            this.counter = counter;\n        }\n\n        @Override\n        public void run() {\n            String secret = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n            Messagebus client = pool.getResource();\n            List<Message> msgs = client.consume(secret, 10);\n            pool.returnResource(client);\n\n            for (Message msg : msgs) {\n                logger.info(msg.getMessageId());\n            }\n\n            counter.countDown();\n        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/ProduceConsume.java",
    "content": "package com.messagebus.scenario.client;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport com.messagebus.scenario.util.PropertiesHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 2/23/15.\n */\npublic class ProduceConsume {\n\n    private static final Log logger = LogFactory.getLog(ProduceConsume.class);\n\n    public static void main(String[] args) {\n        produce();\n\n        consumeWithPushStyle();\n\n        //or\n//        consumeWithPullStyle();\n\n        //or async consume\n//        asyncConsume();\n    }\n\n    private static void produce() {\n        String secret = \"kljasdoifqoikjhhhqwhebasdfasdf\";\n        String token = \"hlkasjdhfkqlwhlfalksjdhgssssas\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(\n            PropertiesHelper.getPropertyValue(\"messagebus.pubsuber.host\")\n        );\n        Messagebus client = singlePool.getResource();\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        client.produce(secret, \"emapDemoConsume\", msg, token);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void consumeWithPullStyle() {\n        String secret = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(\n            PropertiesHelper.getPropertyValue(\"messagebus.pubsuber.host\")\n        );\n        Messagebus client = singlePool.getResource();\n\n        List<Message> msgs = client.consume(secret, 1);\n\n        for (Message msg : msgs) {\n            logger.info(msg.getMessageId());\n        }\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void consumeWithPushStyle() {\n        String secret = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(\n            PropertiesHelper.getPropertyValue(\"messagebus.pubsuber.host\")\n        );\n        Messagebus client = singlePool.getResource();\n\n        client.consume(secret, 10, TimeUnit.SECONDS, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(message.getMessageId());\n            }\n        });\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void asyncConsume() {\n        AsyncConsumeThread asyncConsumeThread = new AsyncConsumeThread();\n        asyncConsumeThread.startup();\n\n        try {\n            TimeUnit.SECONDS.sleep(3);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        asyncConsumeThread.shutdown();\n    }\n\n    private static class AsyncConsumeThread implements Runnable {\n\n        private Thread               currentThread;\n        private MessagebusSinglePool singlePool;\n        private Messagebus           client;\n\n        public AsyncConsumeThread() {\n            this.currentThread = new Thread(this);\n            this.currentThread.setName(\"AsyncConsumeThread\");\n            this.currentThread.setDaemon(true);\n        }\n\n        @Override\n        public void run() {\n            String secret = \"zxdjnflakwenklasjdflkqpiasdfnj\";\n            singlePool = new MessagebusSinglePool(\n                PropertiesHelper.getPropertyValue(\"messagebus.pubsuber.host\")\n            );\n            client = singlePool.getResource();\n\n            //register notification listener\n            client.setNotificationListener(new IMessageReceiveListener() {\n                @Override\n                public void onMessage(Message message) {\n                    logger.info(\"received notification : \" + message.getAppId());\n                }\n            });\n\n            //long long time\n            client.consume(secret, Integer.MAX_VALUE, TimeUnit.SECONDS, new IMessageReceiveListener() {\n                @Override\n                public void onMessage(Message message) {\n                    logger.info(message.getMessageId());\n                }\n            });\n        }\n\n        public void startup() {\n            this.currentThread.start();\n        }\n\n        public void shutdown() {\n            singlePool.returnResource(client);\n            singlePool.destroy();\n            this.currentThread.interrupt();\n        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/PublishSubscribe.java",
    "content": "package com.messagebus.scenario.client;\n\nimport com.messagebus.client.IMessageReceiveListener;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 2/24/15.\n */\npublic class PublishSubscribe {\n\n    private static final Log logger = LogFactory.getLog(PublishSubscribe.class);\n\n    private static final String host = \"127.0.0.1\";\n    private static final int    port = 6379;\n\n    public static void main(String[] args) {\n        publish();\n\n        subscribe1();\n\n        subscribe2();\n    }\n\n    private static void publish() {\n        String secret = \"oiqwenncuicnsdfuasdfnkajkwqowe\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        client.publish(secret, new Message[]{msg});\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void subscribe1() {\n        String secret = \"nckljsenlkjanefluiwnlanfmsdfas\";\n        String token = \"kjkjasdjfhkajsdfhksdjhfkasdf\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        client.subscribe(secret, \"\", token, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(message.getMessageId());\n            }\n        }, 3, TimeUnit.SECONDS);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n    private static void subscribe2() {\n        String secret = \"zxcnvblawelkusahdfqwiuhowefhnx\";\n        String token = \"kjkjasdjfhkajsdfhksdjhfkasdf\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        client.subscribe(secret, \"\", token, new IMessageReceiveListener() {\n            @Override\n            public void onMessage(Message message) {\n                logger.info(message.getMessageId());\n            }\n        }, 3, TimeUnit.SECONDS);\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/RequestResponse.java",
    "content": "package com.messagebus.scenario.client;\n\nimport com.google.common.base.Strings;\nimport com.messagebus.client.IRequestListener;\nimport com.messagebus.client.MessageResponseTimeoutException;\nimport com.messagebus.client.Messagebus;\nimport com.messagebus.client.MessagebusSinglePool;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Created by yanghua on 2/24/15.\n */\npublic class RequestResponse {\n\n    private static final Log logger = LogFactory.getLog(RequestResponse.class);\n\n    private static final String host = \"127.0.0.1\";\n    private static final int    port = 6379;\n\n    public static void main(String[] args) {\n        response();\n\n        request();\n    }\n\n    private static void request() {\n        String secret = \"iuoqiwejicaoisfaisfbsqewnfjnfa\";\n        String token = \"cakjdhfjasdflqjoiajsdjflqkuwef\";\n        MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n        Messagebus client = singlePool.getResource();\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContentType(\"text/plain\");\n        msg.setContentEncoding(\"utf-8\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        Message responseMsg = null;\n\n        try {\n            responseMsg = client.request(secret, \"emapDemoResponse\", msg, token, 10);\n        } catch (MessageResponseTimeoutException e) {\n            e.printStackTrace();\n        }\n\n        singlePool.returnResource(client);\n        singlePool.destroy();\n\n        if (responseMsg != null) {\n            logger.info(\"received response message : \" + responseMsg.getCorrelationId());\n        }\n    }\n\n    private static void response() {\n        new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n                final String secret = \"zxjhvclawenlkfhsladfnqpwenflak\";\n                MessagebusSinglePool singlePool = new MessagebusSinglePool(host);\n                final Messagebus client = singlePool.getResource();\n\n                client.response(secret, new IRequestListener() {\n\n                    @Override\n                    public Message onRequest(Message requestMsg) {\n                        if (Strings.isNullOrEmpty(requestMsg.getCorrelationId())) {\n                            logger.info(\"got requested message : \" + requestMsg.getCorrelationId());\n                        }\n\n                        Message respMsg = MessageFactory.createMessage();\n                        respMsg.setContentType(\"text/plain\");\n                        respMsg.setContentEncoding(\"utf-8\");\n                        respMsg.setCorrelationId(requestMsg.getCorrelationId());\n\n                        respMsg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n                        return respMsg;\n                    }\n\n                }, 10, TimeUnit.SECONDS);\n\n                singlePool.returnResource(client);\n                singlePool.destroy();\n            }\n\n        }).start();\n\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/client/XSLTTestCase.java",
    "content": "package com.messagebus.scenario.client;\n\nimport javax.xml.transform.Source;\nimport javax.xml.transform.Transformer;\nimport javax.xml.transform.TransformerException;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.transform.stream.StreamSource;\n\n/**\n * Created by yanghua on 4/4/15.\n */\npublic class XSLTTestCase {\n\n    public static void main(String[] args) {\n        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();\n\n        Source xmlSource = new StreamSource(classLoader.getResourceAsStream(\"producerXml.xml\"));\n        Source xsltSource = new StreamSource(classLoader.getResourceAsStream(\"pToc.xsl\"));\n\n        TransformerFactory transFact = TransformerFactory.newInstance();\n        try {\n            Transformer trans = transFact.newTransformer(xsltSource);\n            trans.transform(xmlSource, new StreamResult(System.out));\n        } catch (TransformerException e) {\n            e.printStackTrace();\n        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/httpBridge/ProduceConsume.java",
    "content": "package com.messagebus.scenario.httpBridge;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.model.MessageJSONSerializer;\nimport com.messagebus.common.Constants;\nimport com.messagebus.scenario.util.PropertiesHelper;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.NameValuePair;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.impl.client.DefaultHttpClient;\nimport org.apache.http.message.BasicNameValuePair;\nimport org.apache.http.util.EntityUtils;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class ProduceConsume {\n\n    private static final Log logger = LogFactory.getLog(ProduceConsume.class);\n\n    public static void main(String[] args) {\n        testProduceWithPost();\n\n//        testProduceWithGet();\n\n        testConsume(\"pull\");\n    }\n\n    private static void testProduceWithPost() {\n        String testUrlFormat = \"http://%s:%s/messagebus/queues/%s/messages?secret=%s&apiType=produce&token=%s\";\n        String testQueue = \"appDataQueue\";\n        String secret = \"iojawdnaisdflknoiankjfdblaidcas\";\n        String token = \"iojawdnaisdflknoiankjfdblaidcas\";\n\n        String url = String.format(testUrlFormat,\n                                   PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.host\"),\n                                   Integer.parseInt(PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.port\")),\n                                   testQueue,\n                                   secret,\n                                   token);\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        Message msg = MessageFactory.createMessage();\n        msg.setReplyTo(testQueue);\n        msg.setContentType(\"text/plain\");\n\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        List<Message> msgs = new ArrayList<Message>(1);\n        msgs.add(msg);\n        String msgs2json = MessageJSONSerializer.serializeMessages(msgs);\n\n        try {\n            HttpPost postRequest = new HttpPost(url);\n            List<NameValuePair> nvps = new ArrayList<NameValuePair>();\n            nvps.add(new BasicNameValuePair(\"messages\", msgs2json));\n            postRequest.setEntity(new UrlEncodedFormEntity(nvps));\n\n            response = httpClient.execute(postRequest);\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                logger.info(\"response is : \" + EntityUtils.toString(entity));\n            }\n        } catch (IOException e) {\n            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n        }\n    }\n\n    private static void testProduceWithGet() {\n        String testUrlFormat = \"http://%s:%s/messagebus/queues/%s/messages?secret=%s&apiType=produce&token=%s\";\n        String testQueue = \"appDataQueue\";\n        String secret = \"iojawdnaisdflknoiankjfdblaidcas\";\n        String token = \"iojawdnaisdflknoiankjfdblaidcas\";\n\n        String url = String.format(testUrlFormat,\n                                   PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.host\"),\n                                   Integer.parseInt(PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.port\")),\n                                   testQueue,\n                                   secret,\n                                   token);\n        url += \"&content=text&contentType=text/plain\";\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        try {\n            response = httpClient.execute(new HttpGet(url));\n\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                logger.info(\"response is : \" + EntityUtils.toString(entity));\n            }\n        } catch (IOException e) {\n            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n        }\n    }\n\n    private static void testConsume(String mode) {\n        String testUrlFormat = \"http://%s:%s/messagebus/queues/messages?secret=%s&apiType=consume&mode=%s&num=1\";\n        String secret = \"iojawdnaisdflknoiankjfdblaidcas\";\n\n        String url = String.format(testUrlFormat,\n                                   PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.host\"),\n                                   Integer.parseInt(PropertiesHelper.getPropertyValue(\"messagebus.httpbridge.port\")),\n                                   secret,\n                                   mode);\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        try {\n            response = httpClient.execute(new HttpGet(url));\n\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                logger.info(\"response is : \" + EntityUtils.toString(entity));\n            }\n        } catch (IOException e) {\n            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/httpBridge/PublishSubscribe.java",
    "content": "package com.messagebus.scenario.httpBridge;\n\nimport com.google.gson.Gson;\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport com.messagebus.client.message.model.MessageJSONSerializer;\nimport com.messagebus.common.Constants;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.NameValuePair;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.impl.client.DefaultHttpClient;\nimport org.apache.http.message.BasicNameValuePair;\nimport org.apache.http.util.EntityUtils;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by yanghua on 3/19/15.\n */\npublic class PublishSubscribe {\n\n    private static final Log logger = LogFactory.getLog(PublishSubscribe.class);\n\n    private static final Gson gson = new Gson();\n\n    private static String testHost = \"localhost\";\n    private static int    testPort = 8080;\n\n    public static void main(String[] args) {\n        testPublish();\n\n        testSubscribe();\n    }\n\n    private static void testPublish() {\n        String testUrlFormat = \"http://%s:%s/messagebus/queues/messages?secret=%s&type=publish&token=%s\";\n        String secret = \"oiqwenncuicnsdfuasdfnkajkwqowe\";\n        String token = \"kjkjasdjfhkajsdfhksdjhfkasdf\";\n\n        String url = String.format(testUrlFormat, testHost, testPort, secret, token);\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        Message msg = MessageFactory.createMessage();\n        msg.setContent(\"test\".getBytes(Constants.CHARSET_OF_UTF8));\n\n        List<Message> msgs = new ArrayList<Message>(1);\n        msgs.add(msg);\n        String msgs2json = MessageJSONSerializer.serializeMessages(msgs);\n\n        try {\n            HttpPost postRequest = new HttpPost(url);\n            List<NameValuePair> nvps = new ArrayList<NameValuePair>();\n            nvps.add(new BasicNameValuePair(\"messages\", msgs2json));\n            postRequest.setEntity(new UrlEncodedFormEntity(nvps));\n\n            response = httpClient.execute(postRequest);\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                logger.info(\"response is : \" + EntityUtils.toString(entity));\n            }\n        } catch (IOException e) {\n            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n        }\n    }\n\n    private static void testSubscribe() {\n        String testUrlFormat = \"http://%s:%s/messagebus/queues/messages?secret=%s&type=subscribe\";\n        String secret = \"nckljsenlkjanefluiwnlanfmsdfas\";\n\n        String url = String.format(testUrlFormat, testHost, testPort, secret);\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        try {\n            response = httpClient.execute(new HttpGet(url));\n\n            HttpEntity entity = response.getEntity();\n            if (entity != null) {\n                logger.info(\"response is : \" + EntityUtils.toString(entity));\n            }\n        } catch (IOException e) {\n            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/httpBridge/RequestTemplate.java",
    "content": "package com.messagebus.scenario.httpBridge;\n\nimport com.messagebus.client.message.model.Message;\nimport com.messagebus.client.message.model.MessageFactory;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.impl.client.DefaultHttpClient;\n\npublic class RequestTemplate {\n\n    private static final Log logger = LogFactory.getLog(RequestTemplate.class);\n\n    private static String testUrlFormat = \"http://%s:%s/messagebus/queues/%s/messages?appkey=%s&type=request&timeout=%s\";\n    private static String testHost      = \"localhost\";\n    private static int    testPort      = 8081;\n    private static String testQueue     = \"crm\";\n    private static String appkey        = \"jahksjdfhakjdflkasdjflk\";\n    private static long   timeout       = 5000;\n\n    public static void main(String[] args) {\n        String url = String.format(testUrlFormat, testHost, testPort, testQueue, appkey, timeout);\n\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpResponse response = null;\n\n        Message msg = MessageFactory.createMessage();\n        msg.setReplyTo(testQueue);\n\n        msg.setContent(\"test\".getBytes());\n\n//        String msg2json = MessageJSONSerializer.serialize(testMsg);\n//\n//        try {\n//            HttpPost postRequest = new HttpPost(url);\n//            List<NameValuePair> nvps = new ArrayList<>();\n//            nvps.add(new BasicNameValuePair(\"message\", msg2json));\n//            postRequest.setEntity(new UrlEncodedFormEntity(nvps));\n//\n//            response = httpClient.execute(postRequest);\n//            HttpEntity entity = response.getEntity();\n//            if (entity != null) {\n//                long len = entity.getContentLength();\n//                if (len == -1)\n//                    logger.error(\"there is no response data.\");\n//                else if (len < 2 * 1024 * 1024) {\n//                    logger.info(\"response is : \" + EntityUtils.toString(entity));\n//                } else {\n//                    logger.error(\"[syncHTTPGet] response length is too large : (\" + len + \") B \" +\n//                                     \"; and the url is : \" + url);\n//                }\n//            }\n//        } catch (IOException e) {\n//            logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n//        } finally {\n//            if (response != null)\n//                try {\n//                    response.close();\n//                } catch (IOException e) {\n//                    logger.error(\"[syncHTTPGet] finally block occurs a IOException : \" + e.getMessage());\n//                }\n//        }\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/httpBridge/ResponseTemplate.java",
    "content": "package com.messagebus.scenario.httpBridge;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\n\npublic class ResponseTemplate {\n\n    //there are two end points, follow there steps:\n    /*\n        send a request (end point 1)\n        get a response (end point 2)\n        send a response (end point 2)\n        get a response (end point 1)\n    */\n\n    private static final Log logger = LogFactory.getLog(ResponseTemplate.class);\n\n    private static String testUrlFormat = \"http://%s:%s/messagebus/queues/%s/messages?appkey=%s&type=%s&timeout=%s\";\n    private static String testHost      = \"localhost\";\n    private static int    testPort      = 8081;\n    private static String testQueue     = \"crm\";\n    private static String appkey        = \"jahksjdfhakjdflkasdjflk\";\n    private static long   timeout       = 30000;\n\n    private static volatile Object lockObj = new Object();\n\n    public static void main(String[] args) {\n//        try {\n//            EndPoint1 e1 = new EndPoint1();\n//            e1.start();\n//\n//            TimeUnit.SECONDS.sleep(3);\n//\n//            EndPoint2 e2 = new EndPoint2();\n//            e2.start();\n//\n//            //block 30s\n//            TimeUnit.SECONDS.sleep(40);\n//        } catch (InterruptedException e) {\n//\n//        }\n    }\n\n//    private static class EndPoint1 extends Thread {\n//\n//        @Override\n//        public void run() {\n//            CloseableHttpResponse response = null;\n//            try {\n//                String url = String.format(testUrlFormat, testHost, testPort, testQueue, appkey, \"request\", timeout);\n//\n//                CloseableHttpClient httpClient = HttpClients.createDefault();\n//\n//                Message testMsg = MessageFactory.createMessage(MessageType.QueueMessage);\n//                testMsg.setContent(\"test\".getBytes());\n//\n//                String msg2json = MessageJSONSerializer.serialize(testMsg);\n//\n//                HttpPost postRequest = new HttpPost(url);\n//                List<NameValuePair> nvps = new ArrayList<NameValuePair>();\n//                nvps.add(new BasicNameValuePair(\"message\", msg2json));\n//                postRequest.setEntity(new UrlEncodedFormEntity(nvps));\n//\n//                response = httpClient.execute(postRequest);\n//\n//                HttpEntity entity = response.getEntity();\n//                if (entity != null) {\n//                    logger.info(\"end point 1 received response : \" + EntityUtils.toString(entity));\n//                }\n//            } catch (IOException e) {\n//                logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n//            } finally {\n//                if (response != null)\n//                    try {\n//                        response.close();\n//                    } catch (IOException e) {\n//                        logger.error(\"[syncHTTPGet] finally block occurs a IOException : \" + e.getMessage());\n//                    }\n//            }\n//        }\n//    }\n//\n//    private static class EndPoint2 extends Thread {\n//\n//        @Override\n//        public void run() {\n//            CloseableHttpResponse response = null;\n//            CloseableHttpResponse resp = null;\n//            try {\n//                synchronized (lockObj) {\n//                    String url = String.format(testUrlFormat, testHost, testPort, testQueue, appkey, \"consume\", timeout);\n//                    url += \"&mode=sync&num=1\";\n//\n//                    CloseableHttpClient httpClient = HttpClients.createDefault();\n//                    HttpGet get = new HttpGet(url);\n//\n//                    //get request\n//                    response = httpClient.execute(get);\n//                    HttpEntity entity = response.getEntity();\n//                    if (entity != null) {\n//                        String responseData = EntityUtils.toString(entity);\n//                        logger.info(\"end point 2 : received response : \" + responseData);\n//\n//                        Message msg = extractRequestMsg(responseData);\n//\n//                        String tmpQueueName = String.valueOf(msg.getMessageId());\n//\n//                        String responseUrl = String.format(testUrlFormat, testHost, testPort,\n//                                                           tmpQueueName, appkey, \"response\", timeout);\n//\n//                        //send response\n//                        CloseableHttpClient responseHttpClient = HttpClients.createDefault();\n//\n//\n//                        Message testMsg = MessageFactory.createMessage(MessageType.QueueMessage);\n//                        testMsg.setContent(\"test\".getBytes());\n//\n//                        String msg2json = MessageJSONSerializer.serialize(testMsg);\n//\n//                        HttpPost postRequest = new HttpPost(responseUrl);\n//                        List<NameValuePair> nvps = new ArrayList<NameValuePair>();\n//                        nvps.add(new BasicNameValuePair(\"message\", msg2json));\n//                        postRequest.setEntity(new UrlEncodedFormEntity(nvps));\n//\n//                        resp = responseHttpClient.execute(postRequest);\n//                        HttpEntity responseEntity = response.getEntity();\n//\n//                        lockObj.notify();\n//                    }\n//                }\n//            } catch (IOException e) {\n//                logger.error(\"[syncHTTPGet] occurs a IOException : \" + e.getMessage());\n//            } finally {\n//                if (response != null)\n//                    try {\n//                        response.close();\n//                    } catch (IOException e) {\n//                        logger.error(\"[syncHTTPGet] finally block occurs a IOException : \" + e.getMessage());\n//                    }\n//\n//                if (resp != null)\n//                    try {\n//                        resp.close();\n//                    } catch (IOException e) {\n//                        logger.error(\"[syncHTTPGet] finally block occurs a IOException : \" + e.getMessage());\n//                    }\n//            }\n//        }\n//    }\n//\n//    private static Message extractRequestMsg(String respData) {\n//        JsonParser parser = new JsonParser();\n//        JsonElement element = parser.parse(respData);\n//        JsonObject object = element.getAsJsonObject();\n//        JsonElement dataElement = object.get(\"data\");\n//        if (!dataElement.isJsonArray()) {\n//            return null;\n//        }\n//\n//        JsonElement msgElement = dataElement.getAsJsonArray().get(0);\n//\n//        return MessageJSONSerializer.deSerialize(msgElement, MessageType.QueueMessage);\n//    }\n\n\n}\n"
  },
  {
    "path": "scenario/src/main/java/com/messagebus/scenario/util/PropertiesHelper.java",
    "content": "package com.messagebus.scenario.util;\n\nimport java.io.IOException;\nimport java.util.Properties;\n\n/**\n * Created by yanghua on 3/25/15.\n */\npublic class PropertiesHelper {\n\n    private static final Properties commonProperties;\n\n    static {\n        commonProperties = new Properties();\n        try {\n            commonProperties.load(PropertiesHelper.class.getClassLoader().getResourceAsStream(\"common.properties\"));\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static String getPropertyValue(String key) {\n        return commonProperties.getProperty(key);\n    }\n\n}\n"
  },
  {
    "path": "scenario/src/main/resources/common.properties",
    "content": "messagebus.pubsuber.host=172.16.206.250\nmessagebus.pubsuber.port=6379\n\nmessagebus.httpbridge.host=172.16.206.28\nmessagebus.httpbridge.port=8081"
  },
  {
    "path": "scenario/src/main/resources/consumerSchema.xml",
    "content": "<?xml version=\"1.0\" ?>\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n    <xs:element name=\"XS\">\n        <xs:complexType>\n            <xs:sequence>\n                <xs:element name=\"XSBH\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"15\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"XSXM\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"XSXB\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"CSNF\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"CSYF\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"CSRQ\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"SFTZ\" type=\"xs:unsignedShort\">\n                </xs:element>\n            </xs:sequence>\n        </xs:complexType>\n    </xs:element>\n</xs:schema>"
  },
  {
    "path": "scenario/src/main/resources/pToc.xsl",
    "content": "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n    <xsl:output method=\"xml\" indent=\"yes\"/>\n    <xsl:template match=\"/\">\n        <XS>\n            <XSBH>\n                <xsl:value-of select=\"student/studentId\"/>\n            </XSBH>\n            <XSXM>\n                <xsl:value-of select=\"student/name\"/>\n            </XSXM>\n            <XSXB>\n                <xsl:choose>\n                    <xsl:when test=\"sex &lt; 1\">女</xsl:when>\n                    <xsl:otherwise>男</xsl:otherwise>\n                </xsl:choose>\n            </XSXB>\n            <CSNF>\n                <xsl:value-of select=\"substring(student/birthday, 1, 4)\"/>\n            </CSNF>\n            <CSYF>\n                <xsl:value-of select=\"substring(student/birthday, 6, 7)\"/>\n            </CSYF>\n            <CSRQ>\n                <xsl:value-of select=\"substring(student/birthday, 9, 10)\"/>\n            </CSRQ>\n            <SFTZ>\n                1\n            </SFTZ>\n        </XS>\n    </xsl:template>\n</xsl:stylesheet>"
  },
  {
    "path": "scenario/src/main/resources/producerSchema.xml",
    "content": "<?xml version=\"1.0\" ?>\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n    <xs:element name=\"student\">\n        <xs:complexType>\n            <xs:sequence>\n                <xs:element name=\"studentId\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"15\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"name\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"10\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"sex\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:unsignedShort\">\n                            <xs:maxLength value=\"1\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"birthday\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"20\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n                <xs:element name=\"major\" type=\"xs:string\">\n                    <xs:simpleType>\n                        <xs:restriction base=\"xs:string\">\n                            <xs:maxLength value=\"100\"/>\n                        </xs:restriction>\n                    </xs:simpleType>\n                </xs:element>\n            </xs:sequence>\n        </xs:complexType>\n    </xs:element>\n</xs:schema>"
  },
  {
    "path": "scenario/src/main/resources/producerXml.xml",
    "content": "<?xml version=\"1.0\" ?>\n<student xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"producerSchema.xml\">\n    <studentId>A07021012</studentId>\n    <name>jack</name>\n    <sex>1</sex>\n    <birthday>1986/10/20</birthday>\n    <major>Computer Since and technology</major>\n</student>\n\n\n        <!--<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>-->\n        <!--<catalog>-->\n        <!--<cd>-->\n        <!--<title>Empire Burlesque</title>-->\n        <!--<artist>Bob Dylan</artist>-->\n        <!--<country>USA</country>-->\n        <!--<company>Columbia</company>-->\n        <!--<price>10.90</price>-->\n        <!--<year>1985</year>-->\n        <!--</cd>-->\n        <!--</catalog>-->\n\n"
  }
]