[
  {
    "path": ".gitignore",
    "content": "target/\n.project\n.settings/\n.classpath\n/logs\n"
  },
  {
    "path": ".mymetadata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project-module\n  type=\"WEB\"\n  name=\"WeixinMultiPlatform\"\n  id=\"myeclipse.1418610851099\"\n  context-root=\"/weixin-mp\"\n  j2ee-spec=\"5.0\"\n  archive=\"WeixinMultiPlatform.war\">\r\n  <attributes>\r\n    <attribute name=\"webrootdir\" value=\"src/main/webapp\" />\r\n  </attributes>\r\n</project-module>\r\n\r\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# WeixinMultiPlatform\nweixin-mp-java 基于Java，Spring，Maven实现的微信公众平台一整套代码，从前端Controller到后端的Dao的实现&lt;br /> ==============  1.0.1 2013-1月更新: 支持上传下载多媒体文件 支持接收消息(语音似乎总有问题,同时收到来自微信两个服务器的空的POST的请求,论坛上也有很多人反映此情况) 支持用户管理 支持自定义菜单CRD 支持推广支持接口  强化测试代码 优化代码结构,增加WxMessageHandlerIfc, 只要实现该接口的所有spring bean在收到消息后都会被自动调用.  ==============  实现功能：消息接口,通用接口和菜单接口（没有内测号无法测试）&lt;br />  ==============  由于涉及的框架比较杂乱，在此一一解释：&lt;br />  1. 简便实用的前置条件：&lt;br />    你的项目是基于Spring，Maven，Hibernate架构；&lt;br />    你的项目至少有一个已经存在的配置文件；&lt;br />    需要在配置文件(例子：application.properties)中添加&lt;br />      wx_token=your_token&lt;br />      wx_appid=asdf&lt;br />      wx_appsecret=secret&lt;br />    没有在线的Maven仓库，强烈建议clone代码到本地作为子工程使用；&lt;br />  2. 如果你是通过spring-annotation配置bean的话，那么只要在你的Spring xml配置文件里加入以下两句便可：&lt;br />    \t&amp;lt;context:component-scan base-package=\"com.hamster.weixinmp\" /&amp;gt;&lt;br /> \t&amp;lt;util:properties id=\"wxProperties\" location=\"classpath:/application.properties\"/&amp;gt;&lt;br />    如果没有util的话，在beans xml声明中加入：&lt;br />       xmlns:util=\"http://www.springframework.org/schema/util\"&lt;br />       xsi:schemaLocation=\"…..&lt;br /> \t\thttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd\"&lt;br />    在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean的packageToScan中添加org.hamster.weixinmp.dao  3. 如果不想用数据库，那么只扫描com.hamster.weixinmp.service和com.hamster.weixinmp.controller即可，所有的dao在wxService中配置模式均为可选，如果没有注入，则不会执行存储操作；&lt;br />  4. 项目使用了lombok生成Getter/Setter, toString, hashCode, equals方法，lombok有eclipse插件，具体怎么安装请看这里：http://projectlombok.org/download.html，如果不想用lombok的话那么就手动删掉那些注解并用eclipse等工具重新生成一下这些方法便可。&lt;br />  5. 如果你的项目是通过xml的方式配置的话，你需要将所有的dao，service和controller配置到xml中（浩大的工程= =）&lt;br />  6. 数据库的前缀为wx_，一般来说不会有冲突，真冲突了那就自己手动改改吧，反正也不麻烦&lt;br />  7. 数据库有些额外的字段，比如自增长的id，created_date等，用不到就无视吧&lt;br />  8. 如果你不用maven的话……那就把java代码都拷贝到自己的工程里面去吧……&lt;br />\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>weixin-mp</artifactId>\n\t<name>Weixin Multi Platform</name>\n\t<version>1.0.2</version>\n\t<groupId>org.hamster</groupId>\n\t<packaging>war</packaging>\n  \t<url>http://maven.apache.org</url>\n\t<properties>\n\t\t<!-- version definitions of dependencies -->\n\t\t<spring-data-jpa.version>1.3.2.RELEASE</spring-data-jpa.version>\n\t\t<cglib.version>2.2.2</cglib.version>\n\t\t<spring.version>3.1.3.RELEASE</spring.version>\n\t\t<slf4j.version>1.7.2</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\t\t<commons-io.version>2.4</commons-io.version>\n\t\t<httpclient.version>4.3.1</httpclient.version>\n\t\t<commons-lang3.version>3.1</commons-lang3.version>\n\t\t<hibernate.version>3.6.10.Final</hibernate.version>\n\t\t<commons-httpclient.version>3.0.1</commons-httpclient.version>\n\t\t<h2.version>1.3.170</h2.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<gson.version>2.2.4</gson.version>\n\t\t<guava.version>15.0</guava.version>\n\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t</properties>\n\n\t<dependencyManagement>\n\t\t<dependencies>\n\t\t\t<!-- third party dependencies -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework.data</groupId>\n\t\t\t\t<artifactId>spring-data-jpa</artifactId>\n\t\t\t\t<version>${spring-data-jpa.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>junit</groupId>\n\t\t\t\t\t\t<artifactId>junit-dep</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>cglib</groupId>\n\t\t\t\t<artifactId>cglib</artifactId>\n\t\t\t\t<version>${cglib.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.google.code.gson</groupId>\n\t\t\t\t<artifactId>gson</artifactId>\n\t\t\t\t<version>${gson.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.google.guava</groupId>\n\t\t\t\t<artifactId>guava</artifactId>\n\t\t\t\t<version>${guava.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<!-- web begin -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework</groupId>\n\t\t\t\t<artifactId>spring-webmvc</artifactId>\n\t\t\t\t<version>3.2.4.RELEASE</version>\n\t\t\t</dependency>\n\t\t\t<!-- web end -->\n\t\t\t<!-- LOGGING begin -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t\t<version>${slf4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t<artifactId>slf4j-simple</artifactId>\n\t\t\t\t<version>${slf4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t\t<version>${slf4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t<artifactId>jcl-over-slf4j</artifactId>\n\t\t\t\t<version>${slf4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t<artifactId>jul-to-slf4j</artifactId>\n\t\t\t\t<version>${slf4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>log4j</groupId>\n\t\t\t\t<artifactId>log4j</artifactId>\n\t\t\t\t<version>${log4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- LOGGING end -->\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t\t<artifactId>httpclient</artifactId>\n\t\t\t\t<version>${httpclient.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t\t<artifactId>httpmime</artifactId>\n\t\t\t\t<version>${httpclient.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t\t<artifactId>commons-lang3</artifactId>\n\t\t\t\t<version>${commons-lang3.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t<version>${commons-io.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t\t<artifactId>hibernate-entitymanager</artifactId>\n\t\t\t\t<version>${hibernate.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<!-- Test Begin -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>junit</groupId>\n\t\t\t\t<artifactId>junit</artifactId>\n\t\t\t\t<version>${junit.version}</version>\n\t\t\t\t<scope>test</scope>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t  <groupId>mysql</groupId>\n\t\t\t  <artifactId>mysql-connector-java</artifactId>\n\t\t\t  <version>5.1.18</version>\n\t\t\t</dependency>\n\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework</groupId>\n\t\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t\t<version>${spring.version}</version>\n\t\t\t\t<scope>test</scope>\n\t\t\t</dependency>\n\n\t\t</dependencies>\n\t</dependencyManagement>\n\n\t<dependencies>\n\t\t<!-- third party dependencies -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.data</groupId>\n\t\t\t<artifactId>spring-data-jpa</artifactId>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>junit</groupId>\n\t\t\t\t\t<artifactId>junit-dep</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>cglib</groupId>\n\t\t\t<artifactId>cglib</artifactId>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.google.code.gson</groupId>\n\t\t\t<artifactId>gson</artifactId>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t  <groupId>com.google.guava</groupId>\n\t\t  <artifactId>guava</artifactId>\n\t\t  <version>15.0</version><!--$NO-MVN-MAN-VER$-->\n\t\t  <type>pom</type>\n\t\t</dependency>\n\n\t\t<!-- web begin -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-webmvc</artifactId>\n\t\t\t<version>3.2.4.RELEASE</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-core</artifactId>\n\t\t\t<version>3.2.4.RELEASE</version>\n\t\t</dependency>\n\t\t<!-- web end -->\n\t\t<!-- LOGGING begin -->\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-simple</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>jcl-over-slf4j</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>jul-to-slf4j</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t</dependency>\n\t\t<!-- LOGGING end -->\n\t\t<dependency>\n            <groupId>javax.servlet</groupId>\n            <artifactId>servlet-api</artifactId>\n            <version>2.5</version>\n            <scope>provided</scope>\n        </dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>fastjson</artifactId>\n\t\t\t<version>1.2.0</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t<artifactId>httpclient</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t<artifactId>httpmime</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t<artifactId>commons-lang3</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-io</groupId>\n\t\t\t<artifactId>commons-io</artifactId>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-entitymanager</artifactId>\n\t\t</dependency>\n\n\t\t<!-- Test Begin -->\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t  <groupId>mysql</groupId>\n\t\t  <artifactId>mysql-connector-java</artifactId>\n\t\t  <version>5.1.18</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n</project>\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/config/WxConfig.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.config;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 29, 2013\n *\n */\n@Configuration\npublic class WxConfig {\n\tpublic static final String TABLE_PREFIX = \"wx_\";\n\tpublic static final int COL_LEN_URL  = 1024;\n\tpublic static final int COL_LEN_CONTENT  = 4000;\n\tpublic static final int COL_LEN_TITLE  = 200;\n\tpublic static final int COL_LEN_USER_NAME  = 100;\n\tpublic static final int COL_LEN_INDICATOR  = 64;\n\t\n\tprivate @Value(\"#{wxProperties.wx_token}\") String token;\n\tprivate @Value(\"#{wxProperties.wx_appid}\") String appid;\n\tprivate @Value(\"#{wxProperties.wx_appsecret}\") String appsecret;\n\t\n\tprivate @Value(\"#{wxProperties.wx_menu_create_url}\") String menuCreateUrl;\n\tprivate @Value(\"#{wxProperties.wx_menu_get_url}\") String menuGetUrl;\n\tprivate @Value(\"#{wxProperties.wx_menu_delete_url}\") String menuDeleteUrl;\n\t\n\tprivate @Value(\"#{wxProperties.wx_access_token_create_url}\") String accessTokenCreateUrl;\n\t\n\tprivate @Value(\"#{wxProperties.wx_custom_send_url}\") String customSendUrl;\n\n\tprivate @Value(\"#{wxProperties.wx_media_upload_url}\") String mediaUploadUrl;\n\t\n\tprivate @Value(\"#{wxProperties.wx_qrcode_create_url}\") String qrcodeCreateUrl;\n\t\n\tprivate @Value(\"#{wxProperties.wx_user_info_url}\") String userInfoUrl;\n\tprivate @Value(\"#{wxProperties.wx_user_get_url}\") String userGetUrl;\n\t\n\tprivate @Value(\"#{wxProperties.wx_groups_create_url}\") String groupsCreateUrl;\n\tprivate @Value(\"#{wxProperties.wx_groups_get_url}\") String groupsGetUrl;\n\tprivate @Value(\"#{wxProperties.wx_groups_getid_url}\") String groupsGetIdUrl;\n\tprivate @Value(\"#{wxProperties.wx_groups_update_url}\") String groupsUpdateUrl;\n\tprivate @Value(\"#{wxProperties.wx_groups_members_update_url}\") String groupsMembersUpdateUrl;\n\tpublic String getToken() {\n\t\treturn token;\n\t}\n\tpublic void setToken(String token) {\n\t\tthis.token = token;\n\t}\n\tpublic String getAppid() {\n\t\treturn appid;\n\t}\n\tpublic void setAppid(String appid) {\n\t\tthis.appid = appid;\n\t}\n\tpublic String getAppsecret() {\n\t\treturn appsecret;\n\t}\n\tpublic void setAppsecret(String appsecret) {\n\t\tthis.appsecret = appsecret;\n\t}\n\tpublic String getMenuCreateUrl() {\n\t\treturn menuCreateUrl;\n\t}\n\tpublic void setMenuCreateUrl(String menuCreateUrl) {\n\t\tthis.menuCreateUrl = menuCreateUrl;\n\t}\n\tpublic String getMenuGetUrl() {\n\t\treturn menuGetUrl;\n\t}\n\tpublic void setMenuGetUrl(String menuGetUrl) {\n\t\tthis.menuGetUrl = menuGetUrl;\n\t}\n\tpublic String getMenuDeleteUrl() {\n\t\treturn menuDeleteUrl;\n\t}\n\tpublic void setMenuDeleteUrl(String menuDeleteUrl) {\n\t\tthis.menuDeleteUrl = menuDeleteUrl;\n\t}\n\tpublic String getAccessTokenCreateUrl() {\n\t\treturn accessTokenCreateUrl;\n\t}\n\tpublic void setAccessTokenCreateUrl(String accessTokenCreateUrl) {\n\t\tthis.accessTokenCreateUrl = accessTokenCreateUrl;\n\t}\n\tpublic String getCustomSendUrl() {\n\t\treturn customSendUrl;\n\t}\n\tpublic void setCustomSendUrl(String customSendUrl) {\n\t\tthis.customSendUrl = customSendUrl;\n\t}\n\tpublic String getMediaUploadUrl() {\n\t\treturn mediaUploadUrl;\n\t}\n\tpublic void setMediaUploadUrl(String mediaUploadUrl) {\n\t\tthis.mediaUploadUrl = mediaUploadUrl;\n\t}\n\tpublic String getQrcodeCreateUrl() {\n\t\treturn qrcodeCreateUrl;\n\t}\n\tpublic void setQrcodeCreateUrl(String qrcodeCreateUrl) {\n\t\tthis.qrcodeCreateUrl = qrcodeCreateUrl;\n\t}\n\tpublic String getUserInfoUrl() {\n\t\treturn userInfoUrl;\n\t}\n\tpublic void setUserInfoUrl(String userInfoUrl) {\n\t\tthis.userInfoUrl = userInfoUrl;\n\t}\n\tpublic String getUserGetUrl() {\n\t\treturn userGetUrl;\n\t}\n\tpublic void setUserGetUrl(String userGetUrl) {\n\t\tthis.userGetUrl = userGetUrl;\n\t}\n\tpublic String getGroupsCreateUrl() {\n\t\treturn groupsCreateUrl;\n\t}\n\tpublic void setGroupsCreateUrl(String groupsCreateUrl) {\n\t\tthis.groupsCreateUrl = groupsCreateUrl;\n\t}\n\tpublic String getGroupsGetUrl() {\n\t\treturn groupsGetUrl;\n\t}\n\tpublic void setGroupsGetUrl(String groupsGetUrl) {\n\t\tthis.groupsGetUrl = groupsGetUrl;\n\t}\n\tpublic String getGroupsGetIdUrl() {\n\t\treturn groupsGetIdUrl;\n\t}\n\tpublic void setGroupsGetIdUrl(String groupsGetIdUrl) {\n\t\tthis.groupsGetIdUrl = groupsGetIdUrl;\n\t}\n\tpublic String getGroupsUpdateUrl() {\n\t\treturn groupsUpdateUrl;\n\t}\n\tpublic void setGroupsUpdateUrl(String groupsUpdateUrl) {\n\t\tthis.groupsUpdateUrl = groupsUpdateUrl;\n\t}\n\tpublic String getGroupsMembersUpdateUrl() {\n\t\treturn groupsMembersUpdateUrl;\n\t}\n\tpublic void setGroupsMembersUpdateUrl(String groupsMembersUpdateUrl) {\n\t\tthis.groupsMembersUpdateUrl = groupsMembersUpdateUrl;\n\t}\n\tpublic static String getTablePrefix() {\n\t\treturn TABLE_PREFIX;\n\t}\n\tpublic static int getColLenUrl() {\n\t\treturn COL_LEN_URL;\n\t}\n\tpublic static int getColLenContent() {\n\t\treturn COL_LEN_CONTENT;\n\t}\n\tpublic static int getColLenTitle() {\n\t\treturn COL_LEN_TITLE;\n\t}\n\tpublic static int getColLenUserName() {\n\t\treturn COL_LEN_USER_NAME;\n\t}\n\tpublic static int getColLenIndicator() {\n\t\treturn COL_LEN_INDICATOR;\n\t}\n\tpublic WxConfig() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxConfig(String token, String appid, String appsecret,\n\t\t\tString menuCreateUrl, String menuGetUrl, String menuDeleteUrl,\n\t\t\tString accessTokenCreateUrl, String customSendUrl,\n\t\t\tString mediaUploadUrl, String qrcodeCreateUrl, String userInfoUrl,\n\t\t\tString userGetUrl, String groupsCreateUrl, String groupsGetUrl,\n\t\t\tString groupsGetIdUrl, String groupsUpdateUrl,\n\t\t\tString groupsMembersUpdateUrl) {\n\t\tsuper();\n\t\tthis.token = token;\n\t\tthis.appid = appid;\n\t\tthis.appsecret = appsecret;\n\t\tthis.menuCreateUrl = menuCreateUrl;\n\t\tthis.menuGetUrl = menuGetUrl;\n\t\tthis.menuDeleteUrl = menuDeleteUrl;\n\t\tthis.accessTokenCreateUrl = accessTokenCreateUrl;\n\t\tthis.customSendUrl = customSendUrl;\n\t\tthis.mediaUploadUrl = mediaUploadUrl;\n\t\tthis.qrcodeCreateUrl = qrcodeCreateUrl;\n\t\tthis.userInfoUrl = userInfoUrl;\n\t\tthis.userGetUrl = userGetUrl;\n\t\tthis.groupsCreateUrl = groupsCreateUrl;\n\t\tthis.groupsGetUrl = groupsGetUrl;\n\t\tthis.groupsGetIdUrl = groupsGetIdUrl;\n\t\tthis.groupsUpdateUrl = groupsUpdateUrl;\n\t\tthis.groupsMembersUpdateUrl = groupsMembersUpdateUrl;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxConfig [token=\" + token + \", appid=\" + appid + \", appsecret=\"\n\t\t\t\t+ appsecret + \", menuCreateUrl=\" + menuCreateUrl\n\t\t\t\t+ \", menuGetUrl=\" + menuGetUrl + \", menuDeleteUrl=\"\n\t\t\t\t+ menuDeleteUrl + \", accessTokenCreateUrl=\"\n\t\t\t\t+ accessTokenCreateUrl + \", customSendUrl=\" + customSendUrl\n\t\t\t\t+ \", mediaUploadUrl=\" + mediaUploadUrl + \", qrcodeCreateUrl=\"\n\t\t\t\t+ qrcodeCreateUrl + \", userInfoUrl=\" + userInfoUrl\n\t\t\t\t+ \", userGetUrl=\" + userGetUrl + \", groupsCreateUrl=\"\n\t\t\t\t+ groupsCreateUrl + \", groupsGetUrl=\" + groupsGetUrl\n\t\t\t\t+ \", groupsGetIdUrl=\" + groupsGetIdUrl + \", groupsUpdateUrl=\"\n\t\t\t\t+ groupsUpdateUrl + \", groupsMembersUpdateUrl=\"\n\t\t\t\t+ groupsMembersUpdateUrl + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime\n\t\t\t\t* result\n\t\t\t\t+ ((accessTokenCreateUrl == null) ? 0 : accessTokenCreateUrl\n\t\t\t\t\t\t.hashCode());\n\t\tresult = prime * result + ((appid == null) ? 0 : appid.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((appsecret == null) ? 0 : appsecret.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((customSendUrl == null) ? 0 : customSendUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((groupsCreateUrl == null) ? 0 : groupsCreateUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((groupsGetIdUrl == null) ? 0 : groupsGetIdUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((groupsGetUrl == null) ? 0 : groupsGetUrl.hashCode());\n\t\tresult = prime\n\t\t\t\t* result\n\t\t\t\t+ ((groupsMembersUpdateUrl == null) ? 0\n\t\t\t\t\t\t: groupsMembersUpdateUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((groupsUpdateUrl == null) ? 0 : groupsUpdateUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((mediaUploadUrl == null) ? 0 : mediaUploadUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((menuCreateUrl == null) ? 0 : menuCreateUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((menuDeleteUrl == null) ? 0 : menuDeleteUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((menuGetUrl == null) ? 0 : menuGetUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((qrcodeCreateUrl == null) ? 0 : qrcodeCreateUrl.hashCode());\n\t\tresult = prime * result + ((token == null) ? 0 : token.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((userGetUrl == null) ? 0 : userGetUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((userInfoUrl == null) ? 0 : userInfoUrl.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxConfig other = (WxConfig) obj;\n\t\tif (accessTokenCreateUrl == null) {\n\t\t\tif (other.accessTokenCreateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!accessTokenCreateUrl.equals(other.accessTokenCreateUrl))\n\t\t\treturn false;\n\t\tif (appid == null) {\n\t\t\tif (other.appid != null)\n\t\t\t\treturn false;\n\t\t} else if (!appid.equals(other.appid))\n\t\t\treturn false;\n\t\tif (appsecret == null) {\n\t\t\tif (other.appsecret != null)\n\t\t\t\treturn false;\n\t\t} else if (!appsecret.equals(other.appsecret))\n\t\t\treturn false;\n\t\tif (customSendUrl == null) {\n\t\t\tif (other.customSendUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!customSendUrl.equals(other.customSendUrl))\n\t\t\treturn false;\n\t\tif (groupsCreateUrl == null) {\n\t\t\tif (other.groupsCreateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupsCreateUrl.equals(other.groupsCreateUrl))\n\t\t\treturn false;\n\t\tif (groupsGetIdUrl == null) {\n\t\t\tif (other.groupsGetIdUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupsGetIdUrl.equals(other.groupsGetIdUrl))\n\t\t\treturn false;\n\t\tif (groupsGetUrl == null) {\n\t\t\tif (other.groupsGetUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupsGetUrl.equals(other.groupsGetUrl))\n\t\t\treturn false;\n\t\tif (groupsMembersUpdateUrl == null) {\n\t\t\tif (other.groupsMembersUpdateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupsMembersUpdateUrl.equals(other.groupsMembersUpdateUrl))\n\t\t\treturn false;\n\t\tif (groupsUpdateUrl == null) {\n\t\t\tif (other.groupsUpdateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupsUpdateUrl.equals(other.groupsUpdateUrl))\n\t\t\treturn false;\n\t\tif (mediaUploadUrl == null) {\n\t\t\tif (other.mediaUploadUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!mediaUploadUrl.equals(other.mediaUploadUrl))\n\t\t\treturn false;\n\t\tif (menuCreateUrl == null) {\n\t\t\tif (other.menuCreateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!menuCreateUrl.equals(other.menuCreateUrl))\n\t\t\treturn false;\n\t\tif (menuDeleteUrl == null) {\n\t\t\tif (other.menuDeleteUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!menuDeleteUrl.equals(other.menuDeleteUrl))\n\t\t\treturn false;\n\t\tif (menuGetUrl == null) {\n\t\t\tif (other.menuGetUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!menuGetUrl.equals(other.menuGetUrl))\n\t\t\treturn false;\n\t\tif (qrcodeCreateUrl == null) {\n\t\t\tif (other.qrcodeCreateUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!qrcodeCreateUrl.equals(other.qrcodeCreateUrl))\n\t\t\treturn false;\n\t\tif (token == null) {\n\t\t\tif (other.token != null)\n\t\t\t\treturn false;\n\t\t} else if (!token.equals(other.token))\n\t\t\treturn false;\n\t\tif (userGetUrl == null) {\n\t\t\tif (other.userGetUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!userGetUrl.equals(other.userGetUrl))\n\t\t\treturn false;\n\t\tif (userInfoUrl == null) {\n\t\t\tif (other.userInfoUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!userInfoUrl.equals(other.userInfoUrl))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMediaType.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n *\n */\npublic class WxMediaType {\n\t\n\tpublic static final String VIDEO = \"Video\";\n\tpublic static final String VOICE = \"Voice\";\n\tpublic static final String MUSIC = \"Music\";\n\tpublic static final String THUMB = \"Thumb\";\n\tpublic static final String IMAGE = \"Image\";\n\tpublic static final String PIC_DESC = \"Article\";\n\tpublic static final String DEFAULT = \"Default\";\n\n\tprivate WxMediaType() {\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMediaTypeEnum.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic enum WxMediaTypeEnum {\n\tIMAGE(WxMediaType.IMAGE),\n\tMUSIC(WxMediaType.MUSIC),\n\tPIC_DESC(WxMediaType.PIC_DESC),\n\tTHUMB(WxMediaType.THUMB),\n\tVIDEO(WxMediaType.VIDEO),\n\tVOICE(WxMediaType.VOICE),\n\tDEFAULT(WxMediaType.DEFAULT),\n\t;\n\n\t/**\n\t * @param text\n\t */\n\tWxMediaTypeEnum(final String text) {\n\t\tthis._text = text;\n\t}\n\n\tprivate final String _text;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see java.lang.Enum#toString()\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn _text;\n\t}\n\t\n\tpublic static WxMediaTypeEnum inst(String strVal) {\n\t\tfor (WxMediaTypeEnum type : WxMediaTypeEnum.values()) {\n\t\t\tif (type.toString().equalsIgnoreCase(strVal)) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMenuBtnType.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic class WxMenuBtnType {\n\tpublic static final String VIEW = \"view\";\n\tpublic static final String CLICK = \"click\";\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMenuBtnTypeEnum.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic enum WxMenuBtnTypeEnum {\n\tVIEW(WxMenuBtnType.VIEW), CLICK(WxMenuBtnType.CLICK);\n\t/**\n\t * @param text\n\t */\n\tWxMenuBtnTypeEnum(final String text) {\n\t\tthis._text = text;\n\t}\n\n\tprivate final String _text;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see java.lang.Enum#toString()\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn _text;\n\t}\n\t\n\tpublic static WxMenuBtnTypeEnum inst(String strVal) {\n\t\tfor (WxMenuBtnTypeEnum type : WxMenuBtnTypeEnum.values()) {\n\t\t\tif (type.toString().equalsIgnoreCase(strVal)) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgEventType.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n * \n */\npublic class WxMsgEventType {\n\tpublic static final String SUBSCRIBE = \"subscribe\";\n\tpublic static final String UNSUBSCRIBE = \"unsubscribe\";\n\tpublic static final String SCAN = \"scan\";\n\tpublic static final String LOCATION = \"LOCATION\"; // wtf??\n\tpublic static final String CLICK = \"CLICK\"; // wtf??\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgEventTypeEnum.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic enum WxMsgEventTypeEnum {\n\tSUBSCRIBE(WxMsgEventType.SUBSCRIBE),\n\tUNSUBSCRIBE(WxMsgEventType.UNSUBSCRIBE),\n\tSCAN(WxMsgEventType.SCAN),\n\tLOCATION(WxMsgEventType.LOCATION),\n\tCLICK(WxMsgEventType.CLICK);\n\t\n\t/**\n\t * @param text\n\t */\n\tWxMsgEventTypeEnum(final String text) {\n\t\tthis._text = text;\n\t}\n\n\tprivate final String _text;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see java.lang.Enum#toString()\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn _text;\n\t}\n\t\n\tpublic static WxMsgEventTypeEnum inst(String strVal) {\n\t\tfor (WxMsgEventTypeEnum type : WxMsgEventTypeEnum.values()) {\n\t\t\tif (type.toString().equalsIgnoreCase(strVal)) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgRespType.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\npublic class WxMsgRespType {\n\tpublic static final String TEXT = \"text\";\n\tpublic static final String IMAGE = \"image\";\n\tpublic static final String VOICE = \"voice\";\n\tpublic static final String VIDEO = \"video\";\n\tpublic static final String MUSIC = \"music\";\n\tpublic static final String NEWS = \"news\";\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgRespTypeEnum.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic enum WxMsgRespTypeEnum {\n\tTEXT(WxMsgRespType.TEXT), IMAGE(WxMsgRespType.IMAGE), MUSIC(WxMsgRespType.MUSIC), \n\tNEWS(WxMsgRespType.NEWS), VIDEO(WxMsgRespType.VIDEO), VOICE(WxMsgRespType.VOICE);\n\t/**\n\t * @param text\n\t */\n\tprivate WxMsgRespTypeEnum(final String text) {\n\t\tthis._text = text;\n\t}\n\n\tprivate final String _text;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see java.lang.Enum#toString()\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn _text;\n\t}\n\t\n\tpublic static WxMsgRespTypeEnum inst(String strVal) {\n\t\tfor (WxMsgRespTypeEnum type : WxMsgRespTypeEnum.values()) {\n\t\t\tif (type.toString().equalsIgnoreCase(strVal)) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgType.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n * \n */\npublic class WxMsgType {\n\tpublic static final String TEXT = \"text\";\n\tpublic static final String IMAGE = \"image\";\n\tpublic static final String LOCATION = \"location\";\n\tpublic static final String LINK = \"link\";\n\tpublic static final String EVENT = \"event\";\n\tpublic static final String VIDEO = \"video\";\n\tpublic static final String VOICE = \"voice\";\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/constant/WxMsgTypeEnum.java",
    "content": "package org.hamster.weixinmp.constant;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\npublic enum WxMsgTypeEnum {\n\t\n\t\n\tTEXT(WxMsgType.TEXT), IMAGE(WxMsgType.IMAGE), LOCATION(WxMsgType.LOCATION), \n\tLINK(WxMsgType.LINK), EVENT(WxMsgType.EVENT), VIDEO(WxMsgType.VIDEO), VOICE(WxMsgType.VOICE);\n\t/**\n\t * @param text\n\t */\n\tprivate WxMsgTypeEnum(final String text) {\n\t\tthis._text = text;\n\t}\n\n\tprivate final String _text;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see java.lang.Enum#toString()\n\t */\n\t@Override\n\tpublic String toString() {\n\t\treturn _text;\n\t}\n\t\n\tpublic static WxMsgTypeEnum inst(String strVal) {\n\t\tfor (WxMsgTypeEnum type : WxMsgTypeEnum.values()) {\n\t\t\tif (type.toString().equalsIgnoreCase(strVal)) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/controller/WxController.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.controller;\n\nimport org.apache.log4j.Logger;\nimport org.dom4j.DocumentException;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxMessageService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Controller\n@RequestMapping(\"/rest/weixinmp\")\npublic class WxController {\n\tprivate static final Logger log = Logger.getLogger(WxController.class);\n\t\n\t@Autowired\n\tprivate WxAuthService authService;\n\t@Autowired\n\tprivate WxMessageService messageService;\n\t\n\t@RequestMapping(method = {RequestMethod.GET,})\n\tpublic @ResponseBody\n\tString authGet(@RequestParam(\"signature\") String signature,\n\t\t\t@RequestParam(\"timestamp\") String timestamp,\n\t\t\t@RequestParam(\"nonce\") String nonce,\n\t\t\t@RequestParam(\"echostr\") String echostr) throws WxException {\n\t\tif (authService.validateAuth(signature, timestamp, nonce, echostr)) {\n\t\t\tlog.info(\"received authentication message from Weixin Server.\");\n\t\t\treturn echostr;\n\t\t}\n\t\treturn null;\n\t}\n\n\t@RequestMapping(method = RequestMethod.POST)\n\tpublic @ResponseBody\n\tString post(@RequestBody String requestBody) throws DocumentException, WxException {\n\t\tWxBaseMsgEntity msg = messageService.parseXML(requestBody);\n\t\tlog.info(\"received \" + msg.getMsgType() + \" message.\");\n\t\t\n\t\tWxBaseRespEntity resp = messageService.handleMessage(msg);\n\t\t\n\t\treturn messageService.parseRespXML(resp).asXML();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/controller/util/WxJsonUtil.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.controller.util;\n\nimport java.util.List;\n\nimport org.hamster.weixinmp.dao.entity.menu.WxMenuBtnEntity;\nimport org.hamster.weixinmp.model.WxAccessTokenJson;\nimport org.hamster.weixinmp.model.WxRespCode;\nimport org.hamster.weixinmp.model.menu.WxMenuCreateJson;\n\nimport com.google.gson.Gson;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n *\n */\npublic class WxJsonUtil {\n\n\tprivate WxJsonUtil() {\n\t}\n\t\n\tpublic static final String toMenuCreateReqBody(List<WxMenuBtnEntity> wxMenuBtnList) {\n\t\tGson gson = new Gson();\n\t\tWxMenuCreateJson wxMenuCreateJson = new WxMenuCreateJson();\n\t\twxMenuCreateJson.setButton(wxMenuBtnList);\n\t\treturn gson.toJson(wxMenuCreateJson);\n\t}\n\t\n\tpublic static final WxRespCode toWxErrorJson(String errorResult) {\n\t\tif (errorResult != null && (errorResult.startsWith(\"{\\\"errcode\")\n\t\t\t\t|| errorResult.startsWith(\"{\\\"errmsg\"))) {\n\t\t\treturn new Gson().fromJson(errorResult, WxRespCode.class);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static final WxAccessTokenJson toAccessTokenJson(String result) {\n\t\treturn new Gson().fromJson(result, WxAccessTokenJson.class);\n\t}\n\t\n\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/controller/util/WxXmlUtil.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.controller.util;\n\nimport java.util.Date;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.dom4j.Document;\nimport org.dom4j.DocumentException;\nimport org.dom4j.DocumentHelper;\nimport org.dom4j.Element;\nimport org.hamster.weixinmp.constant.WxMsgTypeEnum;\nimport org.hamster.weixinmp.dao.entity.auth.WxAuthReq;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgVideoEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgVoiceEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespImageEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVideoEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVoiceEntity;\nimport org.hamster.weixinmp.util.WxUtil;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\npublic class WxXmlUtil {\n\n\tprivate WxXmlUtil() {\n\t}\n\n\tpublic static WxAuthReq getAuthReq(String signature, String timestamp,\n\t\t\tString nonce, String echostr) {\n\t\tWxAuthReq result = new WxAuthReq();\n\t\tresult.setSignature(signature);\n\t\tresult.setTimestamp(timestamp);\n\t\tresult.setNonce(nonce);\n\t\tresult.setEchostr(echostr);\n\t\treturn result;\n\t}\n\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/\n\t * FromUserName&gt; <br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;1348831860&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Content&gt;&lt;![CDATA[this is a\n\t * test]]&gt;&lt;/Content&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br />\n\t * &lt;/xml&gt;<br />\n\t * </code>\n\t * \n\t * @param xmlstr\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgTextEntity getMsgText(Element ele) throws DocumentException {\n\t\tWxMsgTextEntity result = msgEntityFactory(WxMsgTextEntity.class, ele);\n\t\tresult.setMsgId(longVal(ele, \"MsgId\"));\n\t\tresult.setContent(strVal(ele, \"Content\"));\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;\n \t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;\n     * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;\n \t * &nbsp;&nbsp;&lt;CreateTime&gt;1348831860&lt;/CreateTime&gt;\n     * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;\n     * &nbsp;&nbsp;&lt;PicUrl&gt;&lt;![CDATA[this is a url]]&gt;&lt;/PicUrl&gt;\n     * &nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;\n     * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;\n     * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * @param xmlstr\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgImageEntity getMsgImage(Element ele) throws DocumentException {\n\t\tWxMsgImageEntity result = msgEntityFactory(WxMsgImageEntity.class, ele);\n\t\tWxItemImageEntity image = new WxItemImageEntity();\n\t\timage.setMediaId(strVal(ele, \"MediaId\"));\n\t\timage.setPicUrl(strVal(ele, \"PicUrl\"));\n\t\tresult.setImage(image);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;1357290913&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[voice]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;Format&gt;&lt;![CDATA[Format]]&gt;&lt;/Format&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * @param ele\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgVoiceEntity getMsgVoice(Element ele) throws DocumentException {\n\t\tWxMsgVoiceEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele);\n\t\tWxItemVoiceEntity voice = new WxItemVoiceEntity();\n\t\tvoice.setMediaId(strVal(ele, \"MediaId\"));\n\t\tvoice.setFormat(strVal(ele, \"Format\"));\n\t\tif (!StringUtils.isEmpty(ele.elementText(\"Recognition\"))) {\n\t\t\tvoice.setRecognition(strVal(ele, \"Recognition\"));\n\t\t}\n\t\tresult.setVoice(voice);\n\t\treturn result;\n\t}\n\t\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;1357290913&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[video]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;ThumbMediaId&gt;&lt;![CDATA[thumb_media_id]]&gt;&lt;/ThumbMediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * @param ele\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgVideoEntity getMsgVideo(Element ele) throws DocumentException {\n\t\tWxMsgVideoEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele);\n\t\tWxItemVideoEntity video = new WxItemVideoEntity();\n\t\tvideo.setMediaId(strVal(ele, \"MediaId\"));\n\t\tWxItemThumbEntity thumb = new WxItemThumbEntity();\n\t\tthumb.setMediaId(strVal(ele, \"ThumbMediaId\"));\n\t\tvideo.setThumb(thumb);\n\t\tresult.setVideo(video);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;1351776360&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[location]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Location_X&gt;23.134521&lt;/Location_X&gt;<br />\n\t * &nbsp;&nbsp;&lt;Location_Y&gt;113.358803&lt;/Location_Y&gt;<br />\n\t * &nbsp;&nbsp;&lt;Scale&gt;20&lt;/Scale&gt;<br />\n\t * &nbsp;&nbsp;&lt;Label&gt;&lt;![CDATA[Location Information]]&gt;&lt;/Label&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * \n\t * @param xmlstr\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgLocEntity getMsgLoc(Element ele) throws DocumentException {\n\t\tWxMsgLocEntity result = msgEntityFactory(WxMsgLocEntity.class, ele);\n\t\tresult.setLabel(strVal(ele, \"Label\"));\n\t\tresult.setLocationX(doubleVal(ele, \"Location_X\"));\n\t\tresult.setLocationY(doubleVal(ele, \"Location_Y\"));\n\t\tresult.setScale(doubleVal(ele, \"Scale\"));\n\t\treturn result;\n\t}\n\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;1351776360&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[link]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[公众平台官网链接]]&gt;&lt;/Title&gt;<br />\n\t * &nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[公众平台官网链接]]&gt;&lt;/Description&gt;<br />\n\t * &nbsp;&nbsp;&lt;Url&gt;&lt;![CDATA[url]]&gt;&lt;/Url&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br />\n\t * &lt;/xml&gt; \n\t * </code>\n\t * \n\t * @param xmlstr\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgLinkEntity getMsgLink(Element ele) throws DocumentException {\n\t\tWxMsgLinkEntity result = msgEntityFactory(WxMsgLinkEntity.class, ele);\n\t\tresult.setTitle(strVal(ele, \"Title\"));\n\t\tresult.setDescription(strVal(ele, \"Description\"));\n\t\tresult.setUrl(strVal(ele, \"Url\"));\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[FromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;123456789&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[event]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Event&gt;&lt;![CDATA[EVENT]]&gt;&lt;/Event&gt;<br />\n\t * &nbsp;&nbsp;&lt;EventKey&gt;&lt;![CDATA[EVENTKEY]]&gt;&lt;/EventKey&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * @param xmlstr\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static WxMsgEventEntity getMsgEvent(Element ele) throws DocumentException {\n\t\tWxMsgEventEntity result = msgEntityFactory(WxMsgEventEntity.class, ele);\n\t\tresult.setEvent(strVal(ele, \"Event\"));\n\t\tif (ele.elementText(\"EventKey\") != null) {\n\t\t\tresult.setEventKey(strVal(ele, \"EventKey\"));\n\t\t}\n\t\tif (ele.elementText(\"Ticket\") != null) {\n\t\t\tresult.setEventKey(strVal(ele, \"Ticket\"));\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Content&gt;&lt;![CDATA[content]]&gt;&lt;/Content&gt;<br />\n\t * &nbsp;&nbsp;&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * @param respText\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespTextXML(WxRespTextEntity respText) throws DocumentException {\n\t\tElement ele = respEntityFactory(respText);\n\t\tele.addElement(\"Content\").addCDATA(respText.getContent());\n\t\treturn ele;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Image&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;/Image&gt;<br />\n\t * &lt;/xml&gt;<br />\n\t * </code>\n\t * \n\t * @param respImage\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespImage(WxRespImageEntity respImage) throws DocumentException {\n\t\tElement ele = respEntityFactory(respImage);\n\t\tElement imageEle = ele.addElement(\"Image\");\n\t\timageEle.addElement(\"MediaId\").addCDATA(respImage.getImage().getMediaId());\n\t\treturn ele;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[voice]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Voice&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;/Voice&gt;<br />\n\t * &lt;/xml&gt;<br />\n\t * </code>\n\t * \n\t * @param respVoice\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespVoice(WxRespVoiceEntity respVoice) throws DocumentException {\n\t\tElement ele = respEntityFactory(respVoice);\n\t\tElement voiceEle = ele.addElement(\"Voice\");\n\t\tvoiceEle.addElement(\"MediaId\").addCDATA(respVoice.getVoice().getMediaId());\n\t\treturn ele;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[video]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Video&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/MediaId&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[title]]&gt;&lt;/Title&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[description]]&gt;&lt;/Description&gt;<br />\n\t * &nbsp;&nbsp;&lt;/Video&gt;<br />\n\t * &lt;/xml&gt;<br />\n\t * </code>\n\t * \n\t * @param respVideo\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespVideo(WxRespVideoEntity respVideo) throws DocumentException {\n\t\tElement ele = respEntityFactory(respVideo);\n\t\tElement videoEle = ele.addElement(\"Video\");\n\t\tvideoEle.addElement(\"MediaId\").addCDATA(respVideo.getVideo().getMediaId());\n\t\tvideoEle.addElement(\"Title\").addCDATA(StringUtils.defaultString(respVideo.getVideo().getTitle()));\n\t\tvideoEle.addElement(\"Description\").addCDATA(StringUtils.defaultString(respVideo.getVideo().getDescription()));\n\t\treturn ele;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n\t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n\t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n\t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[music]]&gt;&lt;/MsgType&gt;<br />\n\t * &nbsp;&nbsp;&lt;Music&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[TITLE]]&gt;&lt;/Title&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[DESCRIPTION]]&gt;&lt;/Description&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;MusicUrl&gt;&lt;![CDATA[MUSIC_Url]]&gt;&lt;/MusicUrl&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;HQMusicUrl&gt;&lt;![CDATA[HQ_MUSIC_Url]]&gt;&lt;/HQMusicUrl&gt;<br />\n\t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;ThumbMediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;/ThumbMediaId&gt;<br />\n\t * &nbsp;&nbsp;&lt;/Music&gt;<br />\n\t * &nbsp;&nbsp;&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;<br />\n\t * &lt;/xml&gt;\n\t * </code>\n\t * \n\t * @param respMusic\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespMusic(WxRespMusicEntity respMusic, WxItemThumbEntity thumb) throws DocumentException {\n\t\tElement ele = respEntityFactory(respMusic);\n\t\tElement musicEle = ele.addElement(\"Music\");\n\t\tmusicEle.addElement(\"Title\").addCDATA(StringUtils.defaultString(respMusic.getMusic().getTitle()));\n\t\tmusicEle.addElement(\"Description\").addCDATA(StringUtils.defaultString(respMusic.getMusic().getDescription()));\n\t\tmusicEle.addElement(\"MusicUrl\").addCDATA(StringUtils.defaultString(respMusic.getMusic().getMusicUrl()));\n\t\tmusicEle.addElement(\"HQMusicUrl\").addCDATA(StringUtils.defaultString(respMusic.getMusic().getHqMusicUrl()));\n\t\tmusicEle.addElement(\"ThumbMediaId\").addCDATA(thumb.getMediaId());\n\t\treturn ele;\n\t}\n\t\n\t/**\n\t * <code>\n\t * &lt;xml&gt;<br />\n \t * &nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;/ToUserName&gt;<br />\n \t * &nbsp;&nbsp;&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;/FromUserName&gt;<br />\n \t * &nbsp;&nbsp;&lt;CreateTime&gt;12345678&lt;/CreateTime&gt;<br />\n \t * &nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;<br />\n \t * &nbsp;&nbsp;&lt;ArticleCount&gt;2&lt;/ArticleCount&gt;<br />\n \t * &nbsp;&nbsp;&lt;Articles&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[title1]]&gt;&lt;/Title&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[description1]]&gt;&lt;/Description&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;PicUrl&gt;&lt;![CDATA[picurl]]&gt;&lt;/PicUrl&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Url&gt;&lt;![CDATA[url]]&gt;&lt;/Url&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;item&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[title]]&gt;&lt;/Title&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[description]]&gt;&lt;/Description&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;PicUrl&gt;&lt;![CDATA[picurl]]&gt;&lt;/PicUrl&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Url&gt;&lt;![CDATA[url]]&gt;&lt;/Url&gt;<br />\n \t * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br />\n \t * &nbsp;&nbsp;&lt;/Articles&gt;<br />\n \t * &nbsp;&nbsp;&lt;FuncFlag&gt;1&lt;/FuncFlag&gt;<br />\n\t * &lt;/xml&gt; \n\t * </code>\n\t * \n\t * @param respPicDesc\n\t * @return\n\t * @throws DocumentException\n\t */\n\tpublic static Element getRespPicDesc(WxRespPicDescEntity respPicDesc) throws DocumentException {\n\t\tElement ele = respEntityFactory(respPicDesc);\n\t\tele.addElement(\"ArticleCount\").addText(String.valueOf(respPicDesc.getArticles().size()));\n\t\tElement articlesEle = ele.addElement(\"Articles\");\n\t\tfor (WxItemPicDescEntity item : respPicDesc.getArticles()) {\n\t\t\tElement itemEle = articlesEle.addElement(\"item\");\n\t\t\titemEle.addElement(\"Title\").addCDATA(item.getTitle());\n\t\t\titemEle.addElement(\"Description\").addCDATA(item.getDescription());\n\t\t\titemEle.addElement(\"PicUrl\").addCDATA(item.getPicUrl());\n\t\t\titemEle.addElement(\"HQMusicUrl\").addCDATA(item.getUrl());\n\t\t}\n\t\treturn ele;\n\t}\n\t\n\tpublic static Element toXML(String xmlstr) throws DocumentException {\n\t\tDocument doc = DocumentHelper.parseText(xmlstr);\n\t\treturn doc.getRootElement();\n\t}\n\t\n\tpublic static WxMsgTypeEnum getReqType(Element ele) {\n\t\tString type = ele.element(\"MsgType\").getTextTrim();\n\t\treturn WxMsgTypeEnum.inst(type);\n\t}\n\t\n\t\n\t//////////////////////////////////////////////////\n\t//                Private Methods               //\n    //////////////////////////////////////////////////\n\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T> T msgEntityFactory(\n\t\t\tClass<? extends WxBaseMsgEntity> clazz, Element ele) {\n\t\tWxBaseMsgEntity result;\n\t\ttry {\n\t\t\tresult = clazz.newInstance();\n\t\t\tresult.setToUserName(strVal(ele, \"ToUserName\"));\n\t\t\tresult.setFromUserName(strVal(ele, \"FromUserName\"));\n\t\t\tresult.setCreateTime(longVal(ele, \"CreateTime\"));\n\t\t\tresult.setCreatedDate(new Date());\n\t\t\tresult.setMsgType(strVal(ele, \"MsgType\"));\n\t\t\tif (ele.element(\"MsgId\") != null) {\n\t\t\t\tresult.setMsgId(longVal(ele, \"MsgId\"));\n\t\t\t}\n\t\t\treturn (T) result;\n\t\t} catch (Exception e) {\n\t\t\t// never occurs\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static Element respEntityFactory(WxBaseRespEntity entity) {\n\t\tElement ele = DocumentHelper.createElement(\"xml\");\n\t\tele.addElement(\"ToUserName\").addCDATA(entity.getToUserName());\n\t\tele.addElement(\"FromUserName\").addCDATA(entity.getFromUserName());\n\t\tString createTime = String.valueOf(entity.getCreateTime());\n\t\tif (StringUtils.isBlank(createTime)) {\n\t\t\tLong currentTime = WxUtil.currentTimeInSec();\n\t\t\tentity.setCreateTime(currentTime);\n\t\t\tcreateTime = String.valueOf(currentTime);\n\t\t}\n\t\tele.addElement(\"CreateTime\").setText(createTime);\n\t\tele.addElement(\"MsgType\").addCDATA(entity.getMsgType());\n\t\tele.addElement(\"FuncFlag\").setText(String.valueOf(entity.getFuncFlag()));\n\t\treturn ele;\n\t}\n\n\tprivate static String strVal(Element ele, String name) {\n\t\treturn ele.element(name).getStringValue();\n\t}\n\n\tprivate static Long longVal(Element ele, String name) {\n\t\treturn Long.valueOf(ele.element(name).getStringValue());\n\t}\n\n\tprivate static Double doubleVal(Element ele, String name) {\n\t\treturn Double.valueOf(ele.element(name).getStringValue());\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/auth/WxAuth.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.auth;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * \n * \n * @author honey.zhao@aliyun.com\n * @version Aug 3, 2013\n * \n */\n@Entity\n@Table(name = \"wx_auth\")\npublic class WxAuth extends WxBaseEntity {\n\t@Column(name = \"grant_type\", length = 50, nullable = false)\n\tprivate String grantType;\n\t@Column(name = \"appid\", length = 100, nullable = false)\n\tprivate String appid;\n\t@Column(name = \"secret\", length = 100, nullable = false)\n\tprivate String secret;\n\t@SerializedName(\"access_token\")\n\t@Column(name = \"access_token\", length = 200, nullable = false)\n\tprivate String accessToken;\n\t@SerializedName(\"expires_in\")\n\t@Column(name = \"expires_in\", nullable = false)\n\tprivate Long expiresIn;\n\tpublic String getGrantType() {\n\t\treturn grantType;\n\t}\n\tpublic void setGrantType(String grantType) {\n\t\tthis.grantType = grantType;\n\t}\n\tpublic String getAppid() {\n\t\treturn appid;\n\t}\n\tpublic void setAppid(String appid) {\n\t\tthis.appid = appid;\n\t}\n\tpublic String getSecret() {\n\t\treturn secret;\n\t}\n\tpublic void setSecret(String secret) {\n\t\tthis.secret = secret;\n\t}\n\tpublic String getAccessToken() {\n\t\treturn accessToken;\n\t}\n\tpublic void setAccessToken(String accessToken) {\n\t\tthis.accessToken = accessToken;\n\t}\n\tpublic Long getExpiresIn() {\n\t\treturn expiresIn;\n\t}\n\tpublic void setExpiresIn(Long expiresIn) {\n\t\tthis.expiresIn = expiresIn;\n\t}\n\tpublic WxAuth() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxAuth(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxAuth(String grantType, String appid, String secret,\n\t\t\tString accessToken, Long expiresIn) {\n\t\tsuper();\n\t\tthis.grantType = grantType;\n\t\tthis.appid = appid;\n\t\tthis.secret = secret;\n\t\tthis.accessToken = accessToken;\n\t\tthis.expiresIn = expiresIn;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxAuth [grantType=\" + grantType + \", appid=\" + appid\n\t\t\t\t+ \", secret=\" + secret + \", accessToken=\" + accessToken\n\t\t\t\t+ \", expiresIn=\" + expiresIn + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((accessToken == null) ? 0 : accessToken.hashCode());\n\t\tresult = prime * result + ((appid == null) ? 0 : appid.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((expiresIn == null) ? 0 : expiresIn.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((grantType == null) ? 0 : grantType.hashCode());\n\t\tresult = prime * result + ((secret == null) ? 0 : secret.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxAuth other = (WxAuth) obj;\n\t\tif (accessToken == null) {\n\t\t\tif (other.accessToken != null)\n\t\t\t\treturn false;\n\t\t} else if (!accessToken.equals(other.accessToken))\n\t\t\treturn false;\n\t\tif (appid == null) {\n\t\t\tif (other.appid != null)\n\t\t\t\treturn false;\n\t\t} else if (!appid.equals(other.appid))\n\t\t\treturn false;\n\t\tif (expiresIn == null) {\n\t\t\tif (other.expiresIn != null)\n\t\t\t\treturn false;\n\t\t} else if (!expiresIn.equals(other.expiresIn))\n\t\t\treturn false;\n\t\tif (grantType == null) {\n\t\t\tif (other.grantType != null)\n\t\t\t\treturn false;\n\t\t} else if (!grantType.equals(other.grantType))\n\t\t\treturn false;\n\t\tif (secret == null) {\n\t\t\tif (other.secret != null)\n\t\t\t\treturn false;\n\t\t} else if (!secret.equals(other.secret))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/auth/WxAuthReq.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.auth;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 27, 2013\n */\n@Entity\n@Table(name = \"wx_auth_req\")\npublic class WxAuthReq extends WxBaseEntity {\n\t@Column(name = \"signature\", length = 100, nullable = false)\n\tprivate String signature;\n\t@Column(name = \"timestamp\", length = 50, nullable = false)\n\tprivate String timestamp;\n\t@Column(name = \"nonce\", length = 50, nullable = false)\n\tprivate String nonce;\n\t@Column(name = \"echostr\", length = 200, nullable = false)\n\tprivate String echostr;\n\tpublic String getSignature() {\n\t\treturn signature;\n\t}\n\tpublic void setSignature(String signature) {\n\t\tthis.signature = signature;\n\t}\n\tpublic String getTimestamp() {\n\t\treturn timestamp;\n\t}\n\tpublic void setTimestamp(String timestamp) {\n\t\tthis.timestamp = timestamp;\n\t}\n\tpublic String getNonce() {\n\t\treturn nonce;\n\t}\n\tpublic void setNonce(String nonce) {\n\t\tthis.nonce = nonce;\n\t}\n\tpublic String getEchostr() {\n\t\treturn echostr;\n\t}\n\tpublic void setEchostr(String echostr) {\n\t\tthis.echostr = echostr;\n\t}\n\tpublic WxAuthReq() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxAuthReq [signature=\" + signature + \", timestamp=\" + timestamp\n\t\t\t\t+ \", nonce=\" + nonce + \", echostr=\" + echostr + \"]\";\n\t}\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/base/WxBaseEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.base;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.persistence.Id;\nimport javax.persistence.MappedSuperclass;\n\nimport com.google.gson.annotations.Expose;\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 27, 2013\n * \n */\n@MappedSuperclass\npublic abstract class WxBaseEntity {\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\t@Expose(serialize = false, deserialize = false)\n\t@SerializedName(\"_id\")\n\tprotected Long id;\n\t@Column(name = \"created_date\")\n\t@Expose(serialize = false, deserialize = false)\n\t@SerializedName(\"_createddate\")\n\tprotected Date createdDate;\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\tpublic Date getCreatedDate() {\n\t\treturn createdDate;\n\t}\n\tpublic void setCreatedDate(Date createdDate) {\n\t\tthis.createdDate = createdDate;\n\t}\n\tpublic WxBaseEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxBaseEntity(Long id, Date createdDate) {\n\t\tsuper();\n\t\tthis.id = id;\n\t\tthis.createdDate = createdDate;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxBaseEntity [id=\" + id + \", createdDate=\" + createdDate + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result\n\t\t\t\t+ ((createdDate == null) ? 0 : createdDate.hashCode());\n\t\tresult = prime * result + ((id == null) ? 0 : id.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxBaseEntity other = (WxBaseEntity) obj;\n\t\tif (createdDate == null) {\n\t\t\tif (other.createdDate != null)\n\t\t\t\treturn false;\n\t\t} else if (!createdDate.equals(other.createdDate))\n\t\t\treturn false;\n\t\tif (id == null) {\n\t\t\tif (other.id != null)\n\t\t\t\treturn false;\n\t\t} else if (!id.equals(other.id))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/base/WxBaseItemMediaEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.base;\n\nimport javax.persistence.MappedSuperclass;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n\n@MappedSuperclass\npublic class WxBaseItemMediaEntity extends WxBaseEntity {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/base/WxBaseMsgEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.base;\n\nimport javax.persistence.Column;\nimport javax.persistence.DiscriminatorColumn;\nimport javax.persistence.Entity;\nimport javax.persistence.Inheritance;\nimport javax.persistence.InheritanceType;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_base\")\n@DiscriminatorColumn(name = \"msg_type\", length = 20)\n@Inheritance(strategy = InheritanceType.JOINED)\npublic abstract class WxBaseMsgEntity extends WxBaseEntity {\n\n\t@Column(name = \"to_user_name\", length = WxConfig.COL_LEN_USER_NAME, nullable = false)\n\tprotected String toUserName;\n\t@Column(name = \"from_user_name\", length = WxConfig.COL_LEN_USER_NAME, nullable = false)\n\tprotected String fromUserName;\n\t@Column(name = \"create_time\", nullable = false)\n\tprotected Long createTime;\n\t@Column(name = \"msg_type\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprotected String msgType;\n\t@Column(name = \"msg_id\", nullable = true)\n\tprotected Long msgId;\n\tpublic String getToUserName() {\n\t\treturn toUserName;\n\t}\n\tpublic void setToUserName(String toUserName) {\n\t\tthis.toUserName = toUserName;\n\t}\n\tpublic String getFromUserName() {\n\t\treturn fromUserName;\n\t}\n\tpublic void setFromUserName(String fromUserName) {\n\t\tthis.fromUserName = fromUserName;\n\t}\n\tpublic Long getCreateTime() {\n\t\treturn createTime;\n\t}\n\tpublic void setCreateTime(Long createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\tpublic String getMsgType() {\n\t\treturn msgType;\n\t}\n\tpublic void setMsgType(String msgType) {\n\t\tthis.msgType = msgType;\n\t}\n\tpublic Long getMsgId() {\n\t\treturn msgId;\n\t}\n\tpublic void setMsgId(Long msgId) {\n\t\tthis.msgId = msgId;\n\t}\n\tpublic WxBaseMsgEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper();\n\t\tthis.toUserName = toUserName;\n\t\tthis.fromUserName = fromUserName;\n\t\tthis.createTime = createTime;\n\t\tthis.msgType = msgType;\n\t\tthis.msgId = msgId;\n\t}\n\tpublic WxBaseMsgEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxBaseMsgEntity [toUserName=\" + toUserName + \", fromUserName=\"\n\t\t\t\t+ fromUserName + \", createTime=\" + createTime + \", msgType=\"\n\t\t\t\t+ msgType + \", msgId=\" + msgId + \"]\";\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/base/WxBaseRespEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.base;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.MappedSuperclass;\n\nimport org.hamster.weixinmp.config.WxConfig;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@MappedSuperclass\npublic abstract class WxBaseRespEntity extends WxBaseEntity {\n\t@Column(name=\"func_flag\", nullable = false)\n\tprotected Integer funcFlag;\n\t@Column(name = \"to_user_name\", length = WxConfig.COL_LEN_USER_NAME, nullable = false)\n\tprotected String toUserName;\n\t@Column(name = \"from_user_name\", length = WxConfig.COL_LEN_USER_NAME, nullable = false)\n\tprotected String fromUserName;\n\t@Column(name = \"create_time\", nullable = false)\n\tprotected Long createTime;\n\t@Column(name = \"msg_type\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprotected String msgType;\n\tpublic WxBaseRespEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxBaseRespEntity(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxBaseRespEntity(Integer funcFlag, String toUserName,\n\t\t\tString fromUserName, Long createTime, String msgType) {\n\t\tsuper();\n\t\tthis.funcFlag = funcFlag;\n\t\tthis.toUserName = toUserName;\n\t\tthis.fromUserName = fromUserName;\n\t\tthis.createTime = createTime;\n\t\tthis.msgType = msgType;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxBaseRespEntity [funcFlag=\" + funcFlag + \", toUserName=\"\n\t\t\t\t+ toUserName + \", fromUserName=\" + fromUserName\n\t\t\t\t+ \", createTime=\" + createTime + \", msgType=\" + msgType + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((createTime == null) ? 0 : createTime.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((fromUserName == null) ? 0 : fromUserName.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((funcFlag == null) ? 0 : funcFlag.hashCode());\n\t\tresult = prime * result + ((msgType == null) ? 0 : msgType.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((toUserName == null) ? 0 : toUserName.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxBaseRespEntity other = (WxBaseRespEntity) obj;\n\t\tif (createTime == null) {\n\t\t\tif (other.createTime != null)\n\t\t\t\treturn false;\n\t\t} else if (!createTime.equals(other.createTime))\n\t\t\treturn false;\n\t\tif (fromUserName == null) {\n\t\t\tif (other.fromUserName != null)\n\t\t\t\treturn false;\n\t\t} else if (!fromUserName.equals(other.fromUserName))\n\t\t\treturn false;\n\t\tif (funcFlag == null) {\n\t\t\tif (other.funcFlag != null)\n\t\t\t\treturn false;\n\t\t} else if (!funcFlag.equals(other.funcFlag))\n\t\t\treturn false;\n\t\tif (msgType == null) {\n\t\t\tif (other.msgType != null)\n\t\t\t\treturn false;\n\t\t} else if (!msgType.equals(other.msgType))\n\t\t\treturn false;\n\t\tif (toUserName == null) {\n\t\t\tif (other.toUserName != null)\n\t\t\t\treturn false;\n\t\t} else if (!toUserName.equals(other.toUserName))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\tpublic Integer getFuncFlag() {\n\t\treturn funcFlag;\n\t}\n\tpublic void setFuncFlag(Integer funcFlag) {\n\t\tthis.funcFlag = funcFlag;\n\t}\n\tpublic String getToUserName() {\n\t\treturn toUserName;\n\t}\n\tpublic void setToUserName(String toUserName) {\n\t\tthis.toUserName = toUserName;\n\t}\n\tpublic String getFromUserName() {\n\t\treturn fromUserName;\n\t}\n\tpublic void setFromUserName(String fromUserName) {\n\t\tthis.fromUserName = fromUserName;\n\t}\n\tpublic Long getCreateTime() {\n\t\treturn createTime;\n\t}\n\tpublic void setCreateTime(Long createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\tpublic String getMsgType() {\n\t\treturn msgType;\n\t}\n\tpublic void setMsgType(String msgType) {\n\t\tthis.msgType = msgType;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemImageEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n *\n */\n@Entity\n@Table(name=WxConfig.TABLE_PREFIX + \"item_image\")\npublic class WxItemImageEntity extends WxBaseItemMediaEntity {\n\t@Column(name = \"media_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = true)\n\tprivate String mediaId;\n\t@Column(name=\"pic_url\", length=WxConfig.COL_LEN_URL, nullable=true)\n\tprivate String picUrl;\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\tpublic String getPicUrl() {\n\t\treturn picUrl;\n\t}\n\tpublic void setPicUrl(String picUrl) {\n\t\tthis.picUrl = picUrl;\n\t}\n\tpublic WxItemImageEntity(String mediaId, String picUrl) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t\tthis.picUrl = picUrl;\n\t}\n\tpublic WxItemImageEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemImageEntity [mediaId=\" + mediaId + \", picUrl=\" + picUrl\n\t\t\t\t+ \"]\";\n\t}\n\t\n\t\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemMusicEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Entity\n@Table(name=WxConfig.TABLE_PREFIX + \"item_music\")\npublic class WxItemMusicEntity extends WxBaseItemMediaEntity {\n\t@Column(name = \"media_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = true)\n\tprivate String mediaId;\n\t@Column(name=\"title\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String title;\n\t@Column(name=\"description\", length = WxConfig.COL_LEN_CONTENT, nullable = true)\n\tprivate String description;\n\t@Column(name=\"music_url\", length = WxConfig.COL_LEN_URL, nullable = true)\n\tprivate String musicUrl;\n\t@Column(name=\"hq_music_url\", length = WxConfig.COL_LEN_URL, nullable = true)\n\tprivate String hqMusicUrl;\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic String getMusicUrl() {\n\t\treturn musicUrl;\n\t}\n\tpublic void setMusicUrl(String musicUrl) {\n\t\tthis.musicUrl = musicUrl;\n\t}\n\tpublic String getHqMusicUrl() {\n\t\treturn hqMusicUrl;\n\t}\n\tpublic void setHqMusicUrl(String hqMusicUrl) {\n\t\tthis.hqMusicUrl = hqMusicUrl;\n\t}\n\tpublic WxItemMusicEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxItemMusicEntity(String mediaId, String title, String description,\n\t\t\tString musicUrl, String hqMusicUrl) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.musicUrl = musicUrl;\n\t\tthis.hqMusicUrl = hqMusicUrl;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemMusicEntity [mediaId=\" + mediaId + \", title=\" + title\n\t\t\t\t+ \", description=\" + description + \", musicUrl=\" + musicUrl\n\t\t\t\t+ \", hqMusicUrl=\" + hqMusicUrl + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((description == null) ? 0 : description.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((hqMusicUrl == null) ? 0 : hqMusicUrl.hashCode());\n\t\tresult = prime * result + ((mediaId == null) ? 0 : mediaId.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((musicUrl == null) ? 0 : musicUrl.hashCode());\n\t\tresult = prime * result + ((title == null) ? 0 : title.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxItemMusicEntity other = (WxItemMusicEntity) obj;\n\t\tif (description == null) {\n\t\t\tif (other.description != null)\n\t\t\t\treturn false;\n\t\t} else if (!description.equals(other.description))\n\t\t\treturn false;\n\t\tif (hqMusicUrl == null) {\n\t\t\tif (other.hqMusicUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!hqMusicUrl.equals(other.hqMusicUrl))\n\t\t\treturn false;\n\t\tif (mediaId == null) {\n\t\t\tif (other.mediaId != null)\n\t\t\t\treturn false;\n\t\t} else if (!mediaId.equals(other.mediaId))\n\t\t\treturn false;\n\t\tif (musicUrl == null) {\n\t\t\tif (other.musicUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!musicUrl.equals(other.musicUrl))\n\t\t\treturn false;\n\t\tif (title == null) {\n\t\t\tif (other.title != null)\n\t\t\t\treturn false;\n\t\t} else if (!title.equals(other.title))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemPicDescEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name=WxConfig.TABLE_PREFIX + \"wx_item_pic_desc\")\npublic class WxItemPicDescEntity extends WxBaseItemMediaEntity {\n\t@Column(name=\"title\", length = WxConfig.COL_LEN_TITLE, nullable = false)\n\tprivate String title;\n\t@Column(name=\"description\", length = WxConfig.COL_LEN_CONTENT, nullable = false)\n\tprivate String description;\n\t@Column(name=\"pic_url\", length = WxConfig.COL_LEN_URL, nullable = false)\n\tprivate String picUrl;\n\t@Column(name=\"url\", length = WxConfig.COL_LEN_URL, nullable = false)\n\tprivate String url;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic String getPicUrl() {\n\t\treturn picUrl;\n\t}\n\tpublic void setPicUrl(String picUrl) {\n\t\tthis.picUrl = picUrl;\n\t}\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\tpublic WxItemPicDescEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxItemPicDescEntity(String title, String description, String picUrl,\n\t\t\tString url) {\n\t\tsuper();\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.picUrl = picUrl;\n\t\tthis.url = url;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemPicDescEntity [title=\" + title + \", description=\"\n\t\t\t\t+ description + \", picUrl=\" + picUrl + \", url=\" + url + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((description == null) ? 0 : description.hashCode());\n\t\tresult = prime * result + ((picUrl == null) ? 0 : picUrl.hashCode());\n\t\tresult = prime * result + ((title == null) ? 0 : title.hashCode());\n\t\tresult = prime * result + ((url == null) ? 0 : url.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxItemPicDescEntity other = (WxItemPicDescEntity) obj;\n\t\tif (description == null) {\n\t\t\tif (other.description != null)\n\t\t\t\treturn false;\n\t\t} else if (!description.equals(other.description))\n\t\t\treturn false;\n\t\tif (picUrl == null) {\n\t\t\tif (other.picUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!picUrl.equals(other.picUrl))\n\t\t\treturn false;\n\t\tif (title == null) {\n\t\t\tif (other.title != null)\n\t\t\t\treturn false;\n\t\t} else if (!title.equals(other.title))\n\t\t\treturn false;\n\t\tif (url == null) {\n\t\t\tif (other.url != null)\n\t\t\t\treturn false;\n\t\t} else if (!url.equals(other.url))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemThumbEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n *\n */\n@Entity\n@Table(name=WxConfig.TABLE_PREFIX + \"item_thumb\")\npublic class WxItemThumbEntity extends WxBaseItemMediaEntity {\n\t@Column(name = \"media_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = true)\n\tprivate String mediaId;\n\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\n\tpublic WxItemThumbEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxItemThumbEntity(String mediaId) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((mediaId == null) ? 0 : mediaId.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxItemThumbEntity other = (WxItemThumbEntity) obj;\n\t\tif (mediaId == null) {\n\t\t\tif (other.mediaId != null)\n\t\t\t\treturn false;\n\t\t} else if (!mediaId.equals(other.mediaId))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemThumbEntity [mediaId=\" + mediaId + \"]\";\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemVideoEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"item_video\")\npublic class WxItemVideoEntity extends WxBaseItemMediaEntity {\n\t@Column(name = \"media_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = true)\n\tprivate String mediaId;\n\t@Column(name = \"title\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String title;\n\t@Column(name = \"description\", length = WxConfig.COL_LEN_CONTENT, nullable = true)\n\tprivate String description;\n\t@ManyToOne\n\t@JoinColumn(name = \"thumb_id\", nullable = true)\n\tWxItemThumbEntity thumb;\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic WxItemThumbEntity getThumb() {\n\t\treturn thumb;\n\t}\n\tpublic void setThumb(WxItemThumbEntity thumb) {\n\t\tthis.thumb = thumb;\n\t}\n\tpublic WxItemVideoEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxItemVideoEntity(String mediaId, String title, String description,\n\t\t\tWxItemThumbEntity thumb) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.thumb = thumb;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemVideoEntity [mediaId=\" + mediaId + \", title=\" + title\n\t\t\t\t+ \", description=\" + description + \", thumb=\" + thumb + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((description == null) ? 0 : description.hashCode());\n\t\tresult = prime * result + ((mediaId == null) ? 0 : mediaId.hashCode());\n\t\tresult = prime * result + ((thumb == null) ? 0 : thumb.hashCode());\n\t\tresult = prime * result + ((title == null) ? 0 : title.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxItemVideoEntity other = (WxItemVideoEntity) obj;\n\t\tif (description == null) {\n\t\t\tif (other.description != null)\n\t\t\t\treturn false;\n\t\t} else if (!description.equals(other.description))\n\t\t\treturn false;\n\t\tif (mediaId == null) {\n\t\t\tif (other.mediaId != null)\n\t\t\t\treturn false;\n\t\t} else if (!mediaId.equals(other.mediaId))\n\t\t\treturn false;\n\t\tif (thumb == null) {\n\t\t\tif (other.thumb != null)\n\t\t\t\treturn false;\n\t\t} else if (!thumb.equals(other.thumb))\n\t\t\treturn false;\n\t\tif (title == null) {\n\t\t\tif (other.title != null)\n\t\t\t\treturn false;\n\t\t} else if (!title.equals(other.title))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/item/WxItemVoiceEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.item;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n@Entity\n@Table(name=WxConfig.TABLE_PREFIX + \"item_voice\")\npublic class WxItemVoiceEntity extends WxBaseItemMediaEntity {\n\t@Column(name = \"media_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = true)\n\tprivate String mediaId;\n\t@Column(name = \"format\", length = 10, nullable = true)\n\tprivate String format;\n\t@Column(name = \"recognition\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String recognition;\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\tpublic String getFormat() {\n\t\treturn format;\n\t}\n\tpublic void setFormat(String format) {\n\t\tthis.format = format;\n\t}\n\tpublic String getRecognition() {\n\t\treturn recognition;\n\t}\n\tpublic void setRecognition(String recognition) {\n\t\tthis.recognition = recognition;\n\t}\n\tpublic WxItemVoiceEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxItemVoiceEntity(String mediaId, String format, String recognition) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t\tthis.format = format;\n\t\tthis.recognition = recognition;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxItemVoiceEntity [mediaId=\" + mediaId + \", format=\" + format\n\t\t\t\t+ \", recognition=\" + recognition + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((format == null) ? 0 : format.hashCode());\n\t\tresult = prime * result + ((mediaId == null) ? 0 : mediaId.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((recognition == null) ? 0 : recognition.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxItemVoiceEntity other = (WxItemVoiceEntity) obj;\n\t\tif (format == null) {\n\t\t\tif (other.format != null)\n\t\t\t\treturn false;\n\t\t} else if (!format.equals(other.format))\n\t\t\treturn false;\n\t\tif (mediaId == null) {\n\t\t\tif (other.mediaId != null)\n\t\t\t\treturn false;\n\t\t} else if (!mediaId.equals(other.mediaId))\n\t\t\treturn false;\n\t\tif (recognition == null) {\n\t\t\tif (other.recognition != null)\n\t\t\t\treturn false;\n\t\t} else if (!recognition.equals(other.recognition))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/menu/WxMenuBtnEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.menu;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\nimport com.google.gson.annotations.Expose;\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"menu_btn\")\npublic class WxMenuBtnEntity extends WxBaseEntity {\n\t@Column(name = \"key_\", length = 128, nullable = false)\n\tprivate String key;\n\t@Column(name = \"url\", length = 256, nullable = false)\n\tprivate String url;\n\t@Column(name = \"name\", length = 80, nullable = false)\n\tprivate String name;\n\t@Column(name = \"type\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String type;\n\t@ManyToOne(cascade = { CascadeType.ALL })\n\t@JoinColumn(name = \"parent_button_id\")\n\t@Expose(serialize = false, deserialize = false)\n\tprivate WxMenuBtnEntity parentButton;\n\t@OneToMany(mappedBy = \"parentButton\")\n\t@SerializedName(\"sub_button\")\n\tprivate List<WxMenuBtnEntity> subButtons;\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\tpublic WxMenuBtnEntity getParentButton() {\n\t\treturn parentButton;\n\t}\n\tpublic void setParentButton(WxMenuBtnEntity parentButton) {\n\t\tthis.parentButton = parentButton;\n\t}\n\tpublic List<WxMenuBtnEntity> getSubButtons() {\n\t\treturn subButtons;\n\t}\n\tpublic void setSubButtons(List<WxMenuBtnEntity> subButtons) {\n\t\tthis.subButtons = subButtons;\n\t}\n\tpublic WxMenuBtnEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMenuBtnEntity(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMenuBtnEntity(String key, String url, String name, String type,\n\t\t\tWxMenuBtnEntity parentButton, List<WxMenuBtnEntity> subButtons) {\n\t\tsuper();\n\t\tthis.key = key;\n\t\tthis.url = url;\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.parentButton = parentButton;\n\t\tthis.subButtons = subButtons;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMenuBtnEntity [key=\" + key + \", url=\" + url + \", name=\"\n\t\t\t\t+ name + \", type=\" + type + \", parentButton=\" + parentButton\n\t\t\t\t+ \", subButtons=\" + subButtons + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((key == null) ? 0 : key.hashCode());\n\t\tresult = prime * result + ((name == null) ? 0 : name.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((parentButton == null) ? 0 : parentButton.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((subButtons == null) ? 0 : subButtons.hashCode());\n\t\tresult = prime * result + ((type == null) ? 0 : type.hashCode());\n\t\tresult = prime * result + ((url == null) ? 0 : url.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMenuBtnEntity other = (WxMenuBtnEntity) obj;\n\t\tif (key == null) {\n\t\t\tif (other.key != null)\n\t\t\t\treturn false;\n\t\t} else if (!key.equals(other.key))\n\t\t\treturn false;\n\t\tif (name == null) {\n\t\t\tif (other.name != null)\n\t\t\t\treturn false;\n\t\t} else if (!name.equals(other.name))\n\t\t\treturn false;\n\t\tif (parentButton == null) {\n\t\t\tif (other.parentButton != null)\n\t\t\t\treturn false;\n\t\t} else if (!parentButton.equals(other.parentButton))\n\t\t\treturn false;\n\t\tif (subButtons == null) {\n\t\t\tif (other.subButtons != null)\n\t\t\t\treturn false;\n\t\t} else if (!subButtons.equals(other.subButtons))\n\t\t\treturn false;\n\t\tif (type == null) {\n\t\t\tif (other.type != null)\n\t\t\t\treturn false;\n\t\t} else if (!type.equals(other.type))\n\t\t\treturn false;\n\t\tif (url == null) {\n\t\t\tif (other.url != null)\n\t\t\t\treturn false;\n\t\t} else if (!url.equals(other.url))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgEventEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_event\")\npublic class WxMsgEventEntity extends WxBaseMsgEntity {\n\t@Column(name = \"event\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String event;\n\t@Column(name = \"event_key\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String eventKey;\n\t@Column(name = \"ticket\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String ticket;\n\t@Column(name = \"latitude\", nullable = true)\n\tprivate Double latitude;\n\t@Column(name = \"longitude\", nullable = true)\n\tprivate Double longitude;\n\t@Column(name = \"precisions\", nullable = true)\n\tprivate Double precisions;\n\tpublic String getEvent() {\n\t\treturn event;\n\t}\n\tpublic void setEvent(String event) {\n\t\tthis.event = event;\n\t}\n\tpublic String getEventKey() {\n\t\treturn eventKey;\n\t}\n\tpublic void setEventKey(String eventKey) {\n\t\tthis.eventKey = eventKey;\n\t}\n\tpublic String getTicket() {\n\t\treturn ticket;\n\t}\n\tpublic void setTicket(String ticket) {\n\t\tthis.ticket = ticket;\n\t}\n\tpublic Double getLatitude() {\n\t\treturn latitude;\n\t}\n\tpublic void setLatitude(Double latitude) {\n\t\tthis.latitude = latitude;\n\t}\n\tpublic Double getLongitude() {\n\t\treturn longitude;\n\t}\n\tpublic void setLongitude(Double longitude) {\n\t\tthis.longitude = longitude;\n\t}\n\tpublic Double getPrecisions() {\n\t\treturn precisions;\n\t}\n\tpublic void setPrecisions(Double precisions) {\n\t\tthis.precisions = precisions;\n\t}\n\tpublic WxMsgEventEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgEventEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgEventEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, String event,\n\t\t\tString eventKey, String ticket, Double latitude, Double longitude,\n\t\t\tDouble precisions) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.event = event;\n\t\tthis.eventKey = eventKey;\n\t\tthis.ticket = ticket;\n\t\tthis.latitude = latitude;\n\t\tthis.longitude = longitude;\n\t\tthis.precisions = precisions;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgEventEntity [event=\" + event + \", eventKey=\" + eventKey\n\t\t\t\t+ \", ticket=\" + ticket + \", latitude=\" + latitude\n\t\t\t\t+ \", longitude=\" + longitude + \", precisions=\" + precisions + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((event == null) ? 0 : event.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((eventKey == null) ? 0 : eventKey.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((latitude == null) ? 0 : latitude.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((longitude == null) ? 0 : longitude.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((precisions == null) ? 0 : precisions.hashCode());\n\t\tresult = prime * result + ((ticket == null) ? 0 : ticket.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgEventEntity other = (WxMsgEventEntity) obj;\n\t\tif (event == null) {\n\t\t\tif (other.event != null)\n\t\t\t\treturn false;\n\t\t} else if (!event.equals(other.event))\n\t\t\treturn false;\n\t\tif (eventKey == null) {\n\t\t\tif (other.eventKey != null)\n\t\t\t\treturn false;\n\t\t} else if (!eventKey.equals(other.eventKey))\n\t\t\treturn false;\n\t\tif (latitude == null) {\n\t\t\tif (other.latitude != null)\n\t\t\t\treturn false;\n\t\t} else if (!latitude.equals(other.latitude))\n\t\t\treturn false;\n\t\tif (longitude == null) {\n\t\t\tif (other.longitude != null)\n\t\t\t\treturn false;\n\t\t} else if (!longitude.equals(other.longitude))\n\t\t\treturn false;\n\t\tif (precisions == null) {\n\t\t\tif (other.precisions != null)\n\t\t\t\treturn false;\n\t\t} else if (!precisions.equals(other.precisions))\n\t\t\treturn false;\n\t\tif (ticket == null) {\n\t\t\tif (other.ticket != null)\n\t\t\t\treturn false;\n\t\t} else if (!ticket.equals(other.ticket))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgImageEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_image\")\n@DiscriminatorValue(WxMsgType.IMAGE)\npublic class WxMsgImageEntity extends WxBaseMsgEntity {\n\n\t@ManyToOne\n\t@JoinColumn(name = \"image_id\")\n\tprivate WxItemImageEntity image;\n\n\tpublic WxItemImageEntity getImage() {\n\t\treturn image;\n\t}\n\n\tpublic void setImage(WxItemImageEntity image) {\n\t\tthis.image = image;\n\t}\n\n\tpublic WxMsgImageEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgImageEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgImageEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, WxItemImageEntity image) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.image = image;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgImageEntity [image=\" + image + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((image == null) ? 0 : image.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgImageEntity other = (WxMsgImageEntity) obj;\n\t\tif (image == null) {\n\t\t\tif (other.image != null)\n\t\t\t\treturn false;\n\t\t} else if (!image.equals(other.image))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgLinkEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.Column;\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_link\")\n@DiscriminatorValue(WxMsgType.LINK)\npublic class WxMsgLinkEntity extends WxBaseMsgEntity {\n\t@Column(name = \"title\", length = WxConfig.COL_LEN_TITLE, nullable = false)\n\tprivate String title;\n\t@Column(name = \"description\", length = WxConfig.COL_LEN_CONTENT, nullable = false)\n\tprivate String description;\n\t@Column(name = \"url\", length = WxConfig.COL_LEN_URL, nullable = false)\n\tprivate String url;\n\tpublic WxMsgLinkEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgLinkEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgLinkEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, String title,\n\t\t\tString description, String url) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.url = url;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgLinkEntity [title=\" + title + \", description=\"\n\t\t\t\t+ description + \", url=\" + url + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((description == null) ? 0 : description.hashCode());\n\t\tresult = prime * result + ((title == null) ? 0 : title.hashCode());\n\t\tresult = prime * result + ((url == null) ? 0 : url.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgLinkEntity other = (WxMsgLinkEntity) obj;\n\t\tif (description == null) {\n\t\t\tif (other.description != null)\n\t\t\t\treturn false;\n\t\t} else if (!description.equals(other.description))\n\t\t\treturn false;\n\t\tif (title == null) {\n\t\t\tif (other.title != null)\n\t\t\t\treturn false;\n\t\t} else if (!title.equals(other.title))\n\t\t\treturn false;\n\t\tif (url == null) {\n\t\t\tif (other.url != null)\n\t\t\t\treturn false;\n\t\t} else if (!url.equals(other.url))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgLocEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.Column;\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_loc\")\n@DiscriminatorValue(WxMsgType.LOCATION)\npublic class WxMsgLocEntity extends WxBaseMsgEntity {\n\t@Column(name = \"location_x\", nullable = false)\n\tprivate Double locationX;\n\t@Column(name = \"location_y\", nullable = false)\n\tprivate Double locationY;\n\t@Column(name = \"scale\", nullable = false)\n\tprivate Double scale;\n\t@Column(name = \"label\", length = WxConfig.COL_LEN_TITLE, nullable = false)\n\tprivate String label;\n\tpublic Double getLocationX() {\n\t\treturn locationX;\n\t}\n\tpublic void setLocationX(Double locationX) {\n\t\tthis.locationX = locationX;\n\t}\n\tpublic Double getLocationY() {\n\t\treturn locationY;\n\t}\n\tpublic void setLocationY(Double locationY) {\n\t\tthis.locationY = locationY;\n\t}\n\tpublic Double getScale() {\n\t\treturn scale;\n\t}\n\tpublic void setScale(Double scale) {\n\t\tthis.scale = scale;\n\t}\n\tpublic String getLabel() {\n\t\treturn label;\n\t}\n\tpublic void setLabel(String label) {\n\t\tthis.label = label;\n\t}\n\tpublic WxMsgLocEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgLocEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxMsgLocEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, Double locationX,\n\t\t\tDouble locationY, Double scale, String label) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.locationX = locationX;\n\t\tthis.locationY = locationY;\n\t\tthis.scale = scale;\n\t\tthis.label = label;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgLocEntity [locationX=\" + locationX + \", locationY=\"\n\t\t\t\t+ locationY + \", scale=\" + scale + \", label=\" + label + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((label == null) ? 0 : label.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((locationX == null) ? 0 : locationX.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((locationY == null) ? 0 : locationY.hashCode());\n\t\tresult = prime * result + ((scale == null) ? 0 : scale.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgLocEntity other = (WxMsgLocEntity) obj;\n\t\tif (label == null) {\n\t\t\tif (other.label != null)\n\t\t\t\treturn false;\n\t\t} else if (!label.equals(other.label))\n\t\t\treturn false;\n\t\tif (locationX == null) {\n\t\t\tif (other.locationX != null)\n\t\t\t\treturn false;\n\t\t} else if (!locationX.equals(other.locationX))\n\t\t\treturn false;\n\t\tif (locationY == null) {\n\t\t\tif (other.locationY != null)\n\t\t\t\treturn false;\n\t\t} else if (!locationY.equals(other.locationY))\n\t\t\treturn false;\n\t\tif (scale == null) {\n\t\t\tif (other.scale != null)\n\t\t\t\treturn false;\n\t\t} else if (!scale.equals(other.scale))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgTextEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.Column;\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n *\n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_text\")\n@DiscriminatorValue(WxMsgType.TEXT)\npublic class WxMsgTextEntity extends WxBaseMsgEntity {\n\t@Column(name = \"content\", length = WxConfig.COL_LEN_CONTENT, nullable = false)\n\tprivate String content;\n\n\tpublic String getContent() {\n\t\treturn content;\n\t}\n\n\tpublic void setContent(String content) {\n\t\tthis.content = content;\n\t}\n\n\tpublic WxMsgTextEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgTextEntity(String content) {\n\t\tsuper();\n\t\tthis.content = content;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgTextEntity [content=\" + content + \"]\";\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgVideoEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 24, 2013\n *\n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_video\")\n@DiscriminatorValue(WxMsgType.VIDEO)\npublic class WxMsgVideoEntity extends WxBaseMsgEntity {\n\t@ManyToOne\n\t@JoinColumn(name=\"video_id\")\n\tprivate WxItemVideoEntity video;\n\n\tpublic WxItemVideoEntity getVideo() {\n\t\treturn video;\n\t}\n\n\tpublic void setVideo(WxItemVideoEntity video) {\n\t\tthis.video = video;\n\t}\n\n\tpublic WxMsgVideoEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgVideoEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgVideoEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, WxItemVideoEntity video) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.video = video;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgVideoEntity [video=\" + video + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((video == null) ? 0 : video.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgVideoEntity other = (WxMsgVideoEntity) obj;\n\t\tif (video == null) {\n\t\t\tif (other.video != null)\n\t\t\t\treturn false;\n\t\t} else if (!video.equals(other.video))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/msg/WxMsgVoiceEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.msg;\n\nimport javax.persistence.DiscriminatorValue;\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgType;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 24, 2013\n *\n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"msg_voice\")\n@DiscriminatorValue(WxMsgType.VOICE)\npublic class WxMsgVoiceEntity extends WxBaseMsgEntity {\n\t@ManyToOne\n\t@JoinColumn(name=\"voice_id\")\n\tWxItemVoiceEntity voice;\n\n\tpublic WxItemVoiceEntity getVoice() {\n\t\treturn voice;\n\t}\n\n\tpublic void setVoice(WxItemVoiceEntity voice) {\n\t\tthis.voice = voice;\n\t}\n\n\tpublic WxMsgVoiceEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgVoiceEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMsgVoiceEntity(String toUserName, String fromUserName,\n\t\t\tLong createTime, String msgType, Long msgId, WxItemVoiceEntity voice) {\n\t\tsuper(toUserName, fromUserName, createTime, msgType, msgId);\n\t\tthis.voice = voice;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxMsgVoiceEntity [voice=\" + voice + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((voice == null) ? 0 : voice.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxMsgVoiceEntity other = (WxMsgVoiceEntity) obj;\n\t\tif (voice == null) {\n\t\t\tif (other.voice != null)\n\t\t\t\treturn false;\n\t\t} else if (!voice.equals(other.voice))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/qr/WxQrEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.qr;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"qr\")\npublic class WxQrEntity extends WxBaseEntity {\n\t@Column(name = \"ticket\", length = WxConfig.COL_LEN_TITLE, nullable = true)\n\tprivate String ticket;\n\t@Column(name = \"scene\", nullable = false)\n\tprivate Long scene;\n\t@Column(name = \"expire_seconds\", nullable = true)\n\t@SerializedName(\"expire_seconds\")\n\tprivate Long expireSeconds;\n\tpublic String getTicket() {\n\t\treturn ticket;\n\t}\n\tpublic void setTicket(String ticket) {\n\t\tthis.ticket = ticket;\n\t}\n\tpublic Long getScene() {\n\t\treturn scene;\n\t}\n\tpublic void setScene(Long scene) {\n\t\tthis.scene = scene;\n\t}\n\tpublic Long getExpireSeconds() {\n\t\treturn expireSeconds;\n\t}\n\tpublic void setExpireSeconds(Long expireSeconds) {\n\t\tthis.expireSeconds = expireSeconds;\n\t}\n\tpublic WxQrEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxQrEntity(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxQrEntity(String ticket, Long scene, Long expireSeconds) {\n\t\tsuper();\n\t\tthis.ticket = ticket;\n\t\tthis.scene = scene;\n\t\tthis.expireSeconds = expireSeconds;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxQrEntity [ticket=\" + ticket + \", scene=\" + scene\n\t\t\t\t+ \", expireSeconds=\" + expireSeconds + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((expireSeconds == null) ? 0 : expireSeconds.hashCode());\n\t\tresult = prime * result + ((scene == null) ? 0 : scene.hashCode());\n\t\tresult = prime * result + ((ticket == null) ? 0 : ticket.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxQrEntity other = (WxQrEntity) obj;\n\t\tif (expireSeconds == null) {\n\t\t\tif (other.expireSeconds != null)\n\t\t\t\treturn false;\n\t\t} else if (!expireSeconds.equals(other.expireSeconds))\n\t\t\treturn false;\n\t\tif (scene == null) {\n\t\t\tif (other.scene != null)\n\t\t\t\treturn false;\n\t\t} else if (!scene.equals(other.scene))\n\t\t\treturn false;\n\t\tif (ticket == null) {\n\t\t\tif (other.ticket != null)\n\t\t\t\treturn false;\n\t\t} else if (!ticket.equals(other.ticket))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespImageEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_music\")\npublic class WxRespImageEntity extends WxBaseRespEntity {\n\t@ManyToOne\n\t@JoinColumn(name = \"image_id\")\n\tWxItemImageEntity image;\n\n\tpublic WxItemImageEntity getImage() {\n\t\treturn image;\n\t}\n\n\tpublic void setImage(WxItemImageEntity image) {\n\t\tthis.image = image;\n\t}\n\n\tpublic WxRespImageEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxRespImageEntity(WxItemImageEntity image) {\n\t\tsuper();\n\t\tthis.image = image;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespImageEntity [image=\" + image + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((image == null) ? 0 : image.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespImageEntity other = (WxRespImageEntity) obj;\n\t\tif (image == null) {\n\t\t\tif (other.image != null)\n\t\t\t\treturn false;\n\t\t} else if (!image.equals(other.image))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespMusicEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemMusicEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_music\")\npublic class WxRespMusicEntity extends WxBaseRespEntity {\n\t@ManyToOne\n\t@JoinColumn(name = \"music_id\", nullable = false)\n\tprivate WxItemMusicEntity music;\n\t@ManyToOne\n\t@JoinColumn(name = \"thumb_id\", nullable = false)\n\tprivate WxItemThumbEntity thumb;\n\tpublic WxItemMusicEntity getMusic() {\n\t\treturn music;\n\t}\n\tpublic void setMusic(WxItemMusicEntity music) {\n\t\tthis.music = music;\n\t}\n\tpublic WxItemThumbEntity getThumb() {\n\t\treturn thumb;\n\t}\n\tpublic void setThumb(WxItemThumbEntity thumb) {\n\t\tthis.thumb = thumb;\n\t}\n\tpublic WxRespMusicEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxRespMusicEntity(WxItemMusicEntity music, WxItemThumbEntity thumb) {\n\t\tsuper();\n\t\tthis.music = music;\n\t\tthis.thumb = thumb;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespMusicEntity [music=\" + music + \", thumb=\" + thumb + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((music == null) ? 0 : music.hashCode());\n\t\tresult = prime * result + ((thumb == null) ? 0 : thumb.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespMusicEntity other = (WxRespMusicEntity) obj;\n\t\tif (music == null) {\n\t\t\tif (other.music != null)\n\t\t\t\treturn false;\n\t\t} else if (!music.equals(other.music))\n\t\t\treturn false;\n\t\tif (thumb == null) {\n\t\t\tif (other.thumb != null)\n\t\t\t\treturn false;\n\t\t} else if (!thumb.equals(other.thumb))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespPicDescEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport java.util.List;\n\nimport javax.persistence.Entity;\nimport javax.persistence.JoinTable;\nimport javax.persistence.ManyToMany;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_pic_desc\")\npublic class WxRespPicDescEntity extends WxBaseRespEntity {\n\n\t@ManyToMany\n\t@JoinTable(name = \"wx_resp_pic_desc_item\")\n\tprivate List<WxItemPicDescEntity> articles;\n\n\tpublic List<WxItemPicDescEntity> getArticles() {\n\t\treturn articles;\n\t}\n\n\tpublic void setArticles(List<WxItemPicDescEntity> articles) {\n\t\tthis.articles = articles;\n\t}\n\n\tpublic WxRespPicDescEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxRespPicDescEntity(List<WxItemPicDescEntity> articles) {\n\t\tsuper();\n\t\tthis.articles = articles;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespPicDescEntity [articles=\" + articles + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result\n\t\t\t\t+ ((articles == null) ? 0 : articles.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespPicDescEntity other = (WxRespPicDescEntity) obj;\n\t\tif (articles == null) {\n\t\t\tif (other.articles != null)\n\t\t\t\treturn false;\n\t\t} else if (!articles.equals(other.articles))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespTextEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_text\")\npublic class WxRespTextEntity extends WxBaseRespEntity {\n\t@Column(name = \"content\", length = WxConfig.COL_LEN_CONTENT, nullable = false)\n\tprivate String content;\n\n\tpublic String getContent() {\n\t\treturn content;\n\t}\n\n\tpublic void setContent(String content) {\n\t\tthis.content = content;\n\t}\n\n\tpublic WxRespTextEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxRespTextEntity(String content) {\n\t\tsuper();\n\t\tthis.content = content;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespTextEntity [content=\" + content + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((content == null) ? 0 : content.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespTextEntity other = (WxRespTextEntity) obj;\n\t\tif (content == null) {\n\t\t\tif (other.content != null)\n\t\t\t\treturn false;\n\t\t} else if (!content.equals(other.content))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespVideoEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_video\")\npublic class WxRespVideoEntity extends WxBaseRespEntity {\n\n\t@ManyToOne\n\t@JoinColumn(name = \"video_id\")\n\tWxItemVideoEntity video;\n\n\tpublic WxItemVideoEntity getVideo() {\n\t\treturn video;\n\t}\n\n\tpublic void setVideo(WxItemVideoEntity video) {\n\t\tthis.video = video;\n\t}\n\n\tpublic WxRespVideoEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespVideoEntity [video=\" + video + \"]\";\n\t}\n\n\tpublic WxRespVideoEntity(WxItemVideoEntity video) {\n\t\tsuper();\n\t\tthis.video = video;\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((video == null) ? 0 : video.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespVideoEntity other = (WxRespVideoEntity) obj;\n\t\tif (video == null) {\n\t\t\tif (other.video != null)\n\t\t\t\treturn false;\n\t\t} else if (!video.equals(other.video))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/resp/WxRespVoiceEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.resp;\n\nimport javax.persistence.Entity;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 29, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"resp_voice\")\npublic class WxRespVoiceEntity extends WxBaseRespEntity {\n\n\t@ManyToOne\n\t@JoinColumn(name = \"voice_id\")\n\tprivate WxItemVoiceEntity voice;\n\n\tpublic WxItemVoiceEntity getVoice() {\n\t\treturn voice;\n\t}\n\n\tpublic void setVoice(WxItemVoiceEntity voice) {\n\t\tthis.voice = voice;\n\t}\n\n\tpublic WxRespVoiceEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxRespVoiceEntity(WxItemVoiceEntity voice) {\n\t\tsuper();\n\t\tthis.voice = voice;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxRespVoiceEntity [voice=\" + voice + \"]\";\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((voice == null) ? 0 : voice.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxRespVoiceEntity other = (WxRespVoiceEntity) obj;\n\t\tif (voice == null) {\n\t\t\tif (other.voice != null)\n\t\t\t\treturn false;\n\t\t} else if (!voice.equals(other.voice))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/user/WxGroupEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.user;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"user_group\")\npublic class WxGroupEntity extends WxBaseEntity {\n\t@SerializedName(\"id\")\n\t@Column(name=\"wx_id\", nullable=false)\n\tprivate Long wxId;\n\t@Column(name=\"name\", length=WxConfig.COL_LEN_TITLE, nullable=false)\n\tprivate String name;\n\t@Column(name=\"count\", nullable=false)\n\tprivate String count;\n\tpublic Long getWxId() {\n\t\treturn wxId;\n\t}\n\tpublic void setWxId(Long wxId) {\n\t\tthis.wxId = wxId;\n\t}\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\tpublic String getCount() {\n\t\treturn count;\n\t}\n\tpublic void setCount(String count) {\n\t\tthis.count = count;\n\t}\n\tpublic WxGroupEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxGroupEntity(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxGroupEntity(Long wxId, String name, String count) {\n\t\tsuper();\n\t\tthis.wxId = wxId;\n\t\tthis.name = name;\n\t\tthis.count = count;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxGroupEntity [wxId=\" + wxId + \", name=\" + name + \", count=\"\n\t\t\t\t+ count + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((count == null) ? 0 : count.hashCode());\n\t\tresult = prime * result + ((name == null) ? 0 : name.hashCode());\n\t\tresult = prime * result + ((wxId == null) ? 0 : wxId.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxGroupEntity other = (WxGroupEntity) obj;\n\t\tif (count == null) {\n\t\t\tif (other.count != null)\n\t\t\t\treturn false;\n\t\t} else if (!count.equals(other.count))\n\t\t\treturn false;\n\t\tif (name == null) {\n\t\t\tif (other.name != null)\n\t\t\t\treturn false;\n\t\t} else if (!name.equals(other.name))\n\t\t\treturn false;\n\t\tif (wxId == null) {\n\t\t\tif (other.wxId != null)\n\t\t\t\treturn false;\n\t\t} else if (!wxId.equals(other.wxId))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/entity/user/WxUserEntity.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.entity.user;\n\nimport java.util.Date;\n\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n * \n */\n@Entity\n@Table(name = WxConfig.TABLE_PREFIX + \"user\")\npublic class WxUserEntity extends WxBaseEntity {\n\t@SerializedName(\"openid\")\n\t@Column(name = \"open_id\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String openId;\n\t@Column(name = \"subscribe\", nullable = false)\n\tprivate Integer subscribe;\n\t@SerializedName(\"nickname\")\n\t@Column(name = \"nickname\", length = WxConfig.COL_LEN_USER_NAME, nullable = false)\n\tprivate String nickName;\n\t@Column(name = \"sex\", nullable = false)\n\tprivate Integer sex;\n\t@Column(name = \"language\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String language;\n\t@Column(name = \"city\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String city;\n\t@Column(name = \"province\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String province;\n\t@Column(name = \"country\", length = WxConfig.COL_LEN_INDICATOR, nullable = false)\n\tprivate String country;\n\t@SerializedName(\"headimgurl\")\n\t@Column(name = \"head_img_url\", length = WxConfig.COL_LEN_URL, nullable = false)\n\tprivate String headImgUrl;\n\t@SerializedName(\"subscribe_time\")\n\t@Column(name = \"subscribe_time\", nullable = false)\n\tprivate Long subscribeTime;\n\tpublic String getOpenId() {\n\t\treturn openId;\n\t}\n\tpublic void setOpenId(String openId) {\n\t\tthis.openId = openId;\n\t}\n\tpublic Integer getSubscribe() {\n\t\treturn subscribe;\n\t}\n\tpublic void setSubscribe(Integer subscribe) {\n\t\tthis.subscribe = subscribe;\n\t}\n\tpublic String getNickName() {\n\t\treturn nickName;\n\t}\n\tpublic void setNickName(String nickName) {\n\t\tthis.nickName = nickName;\n\t}\n\tpublic Integer getSex() {\n\t\treturn sex;\n\t}\n\tpublic void setSex(Integer sex) {\n\t\tthis.sex = sex;\n\t}\n\tpublic String getLanguage() {\n\t\treturn language;\n\t}\n\tpublic void setLanguage(String language) {\n\t\tthis.language = language;\n\t}\n\tpublic String getCity() {\n\t\treturn city;\n\t}\n\tpublic void setCity(String city) {\n\t\tthis.city = city;\n\t}\n\tpublic String getProvince() {\n\t\treturn province;\n\t}\n\tpublic void setProvince(String province) {\n\t\tthis.province = province;\n\t}\n\tpublic String getCountry() {\n\t\treturn country;\n\t}\n\tpublic void setCountry(String country) {\n\t\tthis.country = country;\n\t}\n\tpublic String getHeadImgUrl() {\n\t\treturn headImgUrl;\n\t}\n\tpublic void setHeadImgUrl(String headImgUrl) {\n\t\tthis.headImgUrl = headImgUrl;\n\t}\n\tpublic Long getSubscribeTime() {\n\t\treturn subscribeTime;\n\t}\n\tpublic void setSubscribeTime(Long subscribeTime) {\n\t\tthis.subscribeTime = subscribeTime;\n\t}\n\tpublic WxUserEntity() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxUserEntity(Long id, Date createdDate) {\n\t\tsuper(id, createdDate);\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxUserEntity(String openId, Integer subscribe, String nickName,\n\t\t\tInteger sex, String language, String city, String province,\n\t\t\tString country, String headImgUrl, Long subscribeTime) {\n\t\tsuper();\n\t\tthis.openId = openId;\n\t\tthis.subscribe = subscribe;\n\t\tthis.nickName = nickName;\n\t\tthis.sex = sex;\n\t\tthis.language = language;\n\t\tthis.city = city;\n\t\tthis.province = province;\n\t\tthis.country = country;\n\t\tthis.headImgUrl = headImgUrl;\n\t\tthis.subscribeTime = subscribeTime;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"WxUserEntity [openId=\" + openId + \", subscribe=\" + subscribe\n\t\t\t\t+ \", nickName=\" + nickName + \", sex=\" + sex + \", language=\"\n\t\t\t\t+ language + \", city=\" + city + \", province=\" + province\n\t\t\t\t+ \", country=\" + country + \", headImgUrl=\" + headImgUrl\n\t\t\t\t+ \", subscribeTime=\" + subscribeTime + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = super.hashCode();\n\t\tresult = prime * result + ((city == null) ? 0 : city.hashCode());\n\t\tresult = prime * result + ((country == null) ? 0 : country.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((headImgUrl == null) ? 0 : headImgUrl.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((language == null) ? 0 : language.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((nickName == null) ? 0 : nickName.hashCode());\n\t\tresult = prime * result + ((openId == null) ? 0 : openId.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((province == null) ? 0 : province.hashCode());\n\t\tresult = prime * result + ((sex == null) ? 0 : sex.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((subscribe == null) ? 0 : subscribe.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((subscribeTime == null) ? 0 : subscribeTime.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (!super.equals(obj))\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tWxUserEntity other = (WxUserEntity) obj;\n\t\tif (city == null) {\n\t\t\tif (other.city != null)\n\t\t\t\treturn false;\n\t\t} else if (!city.equals(other.city))\n\t\t\treturn false;\n\t\tif (country == null) {\n\t\t\tif (other.country != null)\n\t\t\t\treturn false;\n\t\t} else if (!country.equals(other.country))\n\t\t\treturn false;\n\t\tif (headImgUrl == null) {\n\t\t\tif (other.headImgUrl != null)\n\t\t\t\treturn false;\n\t\t} else if (!headImgUrl.equals(other.headImgUrl))\n\t\t\treturn false;\n\t\tif (language == null) {\n\t\t\tif (other.language != null)\n\t\t\t\treturn false;\n\t\t} else if (!language.equals(other.language))\n\t\t\treturn false;\n\t\tif (nickName == null) {\n\t\t\tif (other.nickName != null)\n\t\t\t\treturn false;\n\t\t} else if (!nickName.equals(other.nickName))\n\t\t\treturn false;\n\t\tif (openId == null) {\n\t\t\tif (other.openId != null)\n\t\t\t\treturn false;\n\t\t} else if (!openId.equals(other.openId))\n\t\t\treturn false;\n\t\tif (province == null) {\n\t\t\tif (other.province != null)\n\t\t\t\treturn false;\n\t\t} else if (!province.equals(other.province))\n\t\t\treturn false;\n\t\tif (sex == null) {\n\t\t\tif (other.sex != null)\n\t\t\t\treturn false;\n\t\t} else if (!sex.equals(other.sex))\n\t\t\treturn false;\n\t\tif (subscribe == null) {\n\t\t\tif (other.subscribe != null)\n\t\t\t\treturn false;\n\t\t} else if (!subscribe.equals(other.subscribe))\n\t\t\treturn false;\n\t\tif (subscribeTime == null) {\n\t\t\tif (other.subscribeTime != null)\n\t\t\t\treturn false;\n\t\t} else if (!subscribeTime.equals(other.subscribeTime))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/auth/WxAuthDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.auth;\n\nimport org.hamster.weixinmp.dao.entity.auth.WxAuth;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n *\n */\n@Repository\npublic interface WxAuthDao extends PagingAndSortingRepository<WxAuth, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/auth/WxAuthReqDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.auth;\n\nimport org.hamster.weixinmp.dao.entity.auth.WxAuthReq;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxAuthReqDao extends PagingAndSortingRepository<WxAuthReq, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemImageDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\n@Repository\npublic interface WxItemImageDao extends\n\t\tPagingAndSortingRepository<WxItemImageEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemMusicDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemMusicEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxItemMusicDao extends PagingAndSortingRepository<WxItemMusicEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemPicDescDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport java.util.List;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxItemPicDescDao extends PagingAndSortingRepository<WxItemPicDescEntity, Long> {\n\t/**\n\t * \n\t * @param ids\n\t * @return\n\t */\n\tList<WxItemPicDescEntity> findByIdIn(List<Long> ids);\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemThumbDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\n@Repository\npublic interface WxItemThumbDao extends\n\t\tPagingAndSortingRepository<WxItemThumbEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemVideoDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\n@Repository\npublic interface WxItemVideoDao extends\n\t\tPagingAndSortingRepository<WxItemVideoEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/item/WxItemVoiceDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.item;\n\nimport org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\n@Repository\npublic interface WxItemVoiceDao extends\n\t\tPagingAndSortingRepository<WxItemVoiceEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/menu/WxMenuBtnDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.menu;\n\nimport org.hamster.weixinmp.dao.entity.menu.WxMenuBtnEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n *\n */\n@Repository\npublic interface WxMenuBtnDao extends PagingAndSortingRepository<WxMenuBtnEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxBaseMsgDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\n@Repository\npublic interface WxBaseMsgDao extends PagingAndSortingRepository<WxBaseMsgEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgEventDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgEventDao extends PagingAndSortingRepository<WxMsgEventEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgImageDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgImageDao extends PagingAndSortingRepository<WxMsgImageEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgLinkDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgLinkDao extends PagingAndSortingRepository<WxMsgLinkEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgLocDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgLocDao extends PagingAndSortingRepository<WxMsgLocEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgTextDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgTextDao extends PagingAndSortingRepository<WxMsgTextEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgVideoDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgVideoEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxMsgVideoDao extends PagingAndSortingRepository<WxMsgVideoEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/msg/WxMsgVoiceDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.msg;\n\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgVoiceEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic interface WxMsgVoiceDao extends PagingAndSortingRepository<WxMsgVoiceEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespImageDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespImageEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic interface WxRespImageDao extends PagingAndSortingRepository<WxRespImageEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespMusicDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic interface WxRespMusicDao extends PagingAndSortingRepository<WxRespMusicEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespPicDescDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic interface WxRespPicDescDao extends PagingAndSortingRepository<WxRespPicDescEntity, Long> {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespTextDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic interface WxRespTextDao extends PagingAndSortingRepository<WxRespTextEntity, Long> {\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespVideoDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVideoEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic interface WxRespVideoDao extends PagingAndSortingRepository<WxRespVideoEntity, Long> {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/resp/WxRespVoiceDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.resp;\n\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVoiceEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\n@Repository\npublic interface WxRespVoiceDao extends PagingAndSortingRepository<WxRespVoiceEntity, Long> {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/user/WxGroupDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.user;\n\nimport org.hamster.weixinmp.dao.entity.user.WxGroupEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n *\n */\n@Repository\npublic interface WxGroupDao extends PagingAndSortingRepository<WxGroupEntity, Long> {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/dao/repository/user/WxUserDao.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.dao.repository.user;\n\nimport org.hamster.weixinmp.dao.entity.user.WxUserEntity;\nimport org.springframework.data.repository.PagingAndSortingRepository;\nimport org.springframework.stereotype.Repository;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n *\n */\n@Repository\npublic interface WxUserDao extends PagingAndSortingRepository<WxUserEntity, Long> {\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/exception/WxException.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.exception;\n\nimport org.hamster.weixinmp.model.WxRespCode;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n *\n */\npublic class WxException extends Exception {\n\n\tprivate static final long serialVersionUID = -5181800588832010641L;\n\tprivate WxRespCode error;\n\n\t/**\n\t * \n\t */\n\tpublic WxException() {\n\t}\n\n\t/**\n\t * @param message\n\t */\n\tpublic WxException(String message) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * @param cause\n\t */\n\tpublic WxException(Throwable cause) {\n\t\tsuper(cause);\n\t}\n\n\t/**\n\t * @param message\n\t * @param cause\n\t */\n\tpublic WxException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n\n\t\n\t/**\n\t * \n\t */\n\tpublic WxException(WxRespCode errorJson) {\n\t\tsuper(errorJson.getErrmsg());\n\t\tthis.error = errorJson;\n\t}\n\n\tpublic WxRespCode getError() {\n\t\treturn error;\n\t}\n\n\tpublic void setError(WxRespCode error) {\n\t\tthis.error = error;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/gson/WxMenuBtnSerializer.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.gson;\n\nimport java.lang.reflect.Type;\n\nimport org.hamster.weixinmp.constant.WxMenuBtnTypeEnum;\nimport org.hamster.weixinmp.dao.entity.menu.WxMenuBtnEntity;\nimport org.springframework.util.CollectionUtils;\n\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonSerializationContext;\nimport com.google.gson.JsonSerializer;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\npublic class WxMenuBtnSerializer implements JsonSerializer<WxMenuBtnEntity> {\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see com.google.gson.JsonSerializer#serialize(java.lang.Object,\n\t * java.lang.reflect.Type, com.google.gson.JsonSerializationContext)\n\t */\n\tpublic JsonElement serialize(WxMenuBtnEntity src, Type typeOfSrc,\n\t\t\tJsonSerializationContext context) {\n\t\treturn recursiveParse(src);\n\t}\n\n\tpublic JsonObject recursiveParse(WxMenuBtnEntity parentEntity) {\n\t\tJsonObject parent = new JsonObject();\n\t\tparent.addProperty(\"type\", parentEntity.getType());\n\t\tparent.addProperty(\"name\", parentEntity.getName());\n\n\t\tWxMenuBtnTypeEnum type = WxMenuBtnTypeEnum.valueOf(parentEntity\n\t\t\t\t.getType());\n\t\tswitch (type) {\n\t\tcase CLICK:\n\t\t\tparent.addProperty(\"key\", parentEntity.getKey());\n\t\t\tbreak;\n\t\tcase VIEW:\n\t\t\tparent.addProperty(\"url\", parentEntity.getUrl());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tif (!CollectionUtils.isEmpty(parentEntity.getSubButtons())) {\n\t\t\tJsonArray children = new JsonArray();\n\t\t\tfor (WxMenuBtnEntity child : parentEntity.getSubButtons()) {\n\t\t\t\tchildren.add(recursiveParse(child));\n\t\t\t}\n\t\t\tparent.add(\"sub_button\", children);\n\t\t}\n\t\treturn parent;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/WxAccessTokenJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n * \n */\npublic class WxAccessTokenJson {\n\n\tprivate String access_token;\n\tprivate String expires_in;\n\tpublic String getAccess_token() {\n\t\treturn access_token;\n\t}\n\tpublic void setAccess_token(String access_token) {\n\t\tthis.access_token = access_token;\n\t}\n\tpublic String getExpires_in() {\n\t\treturn expires_in;\n\t}\n\tpublic void setExpires_in(String expires_in) {\n\t\tthis.expires_in = expires_in;\n\t}\n\tpublic WxAccessTokenJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxAccessTokenJson(String access_token, String expires_in) {\n\t\tsuper();\n\t\tthis.access_token = access_token;\n\t\tthis.expires_in = expires_in;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/WxRespCode.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n *\n */\npublic class WxRespCode {\n\tprivate Integer errcode;\n\tprivate String errmsg;\n\tpublic Integer getErrcode() {\n\t\treturn errcode;\n\t}\n\tpublic void setErrcode(Integer errcode) {\n\t\tthis.errcode = errcode;\n\t}\n\tpublic String getErrmsg() {\n\t\treturn errmsg;\n\t}\n\tpublic void setErrmsg(String errmsg) {\n\t\tthis.errmsg = errmsg;\n\t}\n\tpublic WxRespCode() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxRespCode(Integer errcode, String errmsg) {\n\t\tsuper();\n\t\tthis.errcode = errcode;\n\t\tthis.errmsg = errmsg;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/menu/WxMenuCreateJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.menu;\n\nimport java.util.List;\n\nimport org.hamster.weixinmp.dao.entity.menu.WxMenuBtnEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Aug 4, 2013\n *\n */\npublic class WxMenuCreateJson {\n\n\tprivate List<WxMenuBtnEntity> button;\n\n\tpublic List<WxMenuBtnEntity> getButton() {\n\t\treturn button;\n\t}\n\n\tpublic void setButton(List<WxMenuBtnEntity> button) {\n\t\tthis.button = button;\n\t}\n\n\tpublic WxMenuCreateJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMenuCreateJson(List<WxMenuBtnEntity> button) {\n\t\tsuper();\n\t\tthis.button = button;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/menu/WxMenuGetJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.menu;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxMenuGetJson {\n\tprivate WxMenuCreateJson menu;\n\n\tpublic WxMenuCreateJson getMenu() {\n\t\treturn menu;\n\t}\n\n\tpublic void setMenu(WxMenuCreateJson menu) {\n\t\tthis.menu = menu;\n\t}\n\n\tpublic WxMenuGetJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxMenuGetJson(WxMenuCreateJson menu) {\n\t\tsuper();\n\t\tthis.menu = menu;\n\t}\n\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/qr/WxQrActionInfoJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.qr;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\npublic class WxQrActionInfoJson {\n\tprivate WxQrSceneJson scene;\n\n\tpublic WxQrSceneJson getScene() {\n\t\treturn scene;\n\t}\n\n\tpublic void setScene(WxQrSceneJson scene) {\n\t\tthis.scene = scene;\n\t}\n\n\tpublic WxQrActionInfoJson(WxQrSceneJson scene) {\n\t\tsuper();\n\t\tthis.scene = scene;\n\t}\n\n\tpublic WxQrActionInfoJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/qr/WxQrCreateJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.qr;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxQrCreateJson {\n\tprivate String action_name;\n\tprivate Long expire_seconds;\n\tprivate WxQrActionInfoJson action_info;\n\tpublic String getAction_name() {\n\t\treturn action_name;\n\t}\n\tpublic void setAction_name(String action_name) {\n\t\tthis.action_name = action_name;\n\t}\n\tpublic Long getExpire_seconds() {\n\t\treturn expire_seconds;\n\t}\n\tpublic void setExpire_seconds(Long expire_seconds) {\n\t\tthis.expire_seconds = expire_seconds;\n\t}\n\tpublic WxQrActionInfoJson getAction_info() {\n\t\treturn action_info;\n\t}\n\tpublic void setAction_info(WxQrActionInfoJson action_info) {\n\t\tthis.action_info = action_info;\n\t}\n\tpublic WxQrCreateJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxQrCreateJson(String action_name, Long expire_seconds,\n\t\t\tWxQrActionInfoJson action_info) {\n\t\tsuper();\n\t\tthis.action_name = action_name;\n\t\tthis.expire_seconds = expire_seconds;\n\t\tthis.action_info = action_info;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/qr/WxQrSceneJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.qr;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxQrSceneJson {\n\n\tprivate Long scene_id;\n\n\tpublic Long getScene_id() {\n\t\treturn scene_id;\n\t}\n\n\tpublic void setScene_id(Long scene_id) {\n\t\tthis.scene_id = scene_id;\n\t}\n\n\tpublic WxQrSceneJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxQrSceneJson(Long scene_id) {\n\t\tsuper();\n\t\tthis.scene_id = scene_id;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendImageJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.SendItemImageJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendImageJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate SendItemImageJson image;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic SendItemImageJson getImage() {\n\t\treturn image;\n\t}\n\tpublic void setImage(SendItemImageJson image) {\n\t\tthis.image = image;\n\t}\n\tpublic SendImageJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendImageJson(String touser, String msgtype, SendItemImageJson image) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.image = image;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendItemPicDescJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.wrapper.WxSendItemArticleWrapper;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemPicDescJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate WxSendItemArticleWrapper news;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic WxSendItemArticleWrapper getNews() {\n\t\treturn news;\n\t}\n\tpublic void setNews(WxSendItemArticleWrapper news) {\n\t\tthis.news = news;\n\t}\n\tpublic SendItemPicDescJson(String touser, String msgtype,\n\t\t\tWxSendItemArticleWrapper news) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.news = news;\n\t}\n\tpublic SendItemPicDescJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendMusicJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.SendItemMusicJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendMusicJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate SendItemMusicJson music;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic SendItemMusicJson getMusic() {\n\t\treturn music;\n\t}\n\tpublic void setMusic(SendItemMusicJson music) {\n\t\tthis.music = music;\n\t}\n\tpublic SendMusicJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendMusicJson(String touser, String msgtype, SendItemMusicJson music) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.music = music;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendTextJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.SendItemTextJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendTextJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate SendItemTextJson content;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic SendItemTextJson getContent() {\n\t\treturn content;\n\t}\n\tpublic void setContent(SendItemTextJson content) {\n\t\tthis.content = content;\n\t}\n\tpublic SendTextJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendTextJson(String touser, String msgtype, SendItemTextJson content) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.content = content;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendVideoJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.SendItemVoiceJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendVideoJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate SendItemVoiceJson voice;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic SendItemVoiceJson getVoice() {\n\t\treturn voice;\n\t}\n\tpublic void setVoice(SendItemVoiceJson voice) {\n\t\tthis.voice = voice;\n\t}\n\tpublic SendVideoJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendVideoJson(String touser, String msgtype, SendItemVoiceJson voice) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.voice = voice;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/SendVoiceJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send;\n\nimport org.hamster.weixinmp.model.send.item.SendItemVideoJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendVoiceJson {\n\tprivate String touser;\n\tprivate String msgtype;\n\tprivate SendItemVideoJson video;\n\tpublic String getTouser() {\n\t\treturn touser;\n\t}\n\tpublic void setTouser(String touser) {\n\t\tthis.touser = touser;\n\t}\n\tpublic String getMsgtype() {\n\t\treturn msgtype;\n\t}\n\tpublic void setMsgtype(String msgtype) {\n\t\tthis.msgtype = msgtype;\n\t}\n\tpublic SendItemVideoJson getVideo() {\n\t\treturn video;\n\t}\n\tpublic void setVideo(SendItemVideoJson video) {\n\t\tthis.video = video;\n\t}\n\tpublic SendVoiceJson(String touser, String msgtype, SendItemVideoJson video) {\n\t\tsuper();\n\t\tthis.touser = touser;\n\t\tthis.msgtype = msgtype;\n\t\tthis.video = video;\n\t}\n\tpublic SendVoiceJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemArticleJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemArticleJson {\n\tprivate String title;\n\tprivate String description;\n\tprivate String url;\n\tprivate String picurl;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\tpublic String getPicurl() {\n\t\treturn picurl;\n\t}\n\tpublic void setPicurl(String picurl) {\n\t\tthis.picurl = picurl;\n\t}\n\tpublic SendItemArticleJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendItemArticleJson(String title, String description, String url,\n\t\t\tString picurl) {\n\t\tsuper();\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.url = url;\n\t\tthis.picurl = picurl;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemImageJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemImageJson {\n\tprivate String mediaId;\n\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\n\tpublic SendItemImageJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic SendItemImageJson(String mediaId) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemMusicJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemMusicJson {\n\tprivate String title;\n\tprivate String description;\n\tprivate String musicurl;\n\tprivate String hqmusicurl;\n\tprivate String thumb_media_id;\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic String getMusicurl() {\n\t\treturn musicurl;\n\t}\n\tpublic void setMusicurl(String musicurl) {\n\t\tthis.musicurl = musicurl;\n\t}\n\tpublic String getHqmusicurl() {\n\t\treturn hqmusicurl;\n\t}\n\tpublic void setHqmusicurl(String hqmusicurl) {\n\t\tthis.hqmusicurl = hqmusicurl;\n\t}\n\tpublic String getThumb_media_id() {\n\t\treturn thumb_media_id;\n\t}\n\tpublic void setThumb_media_id(String thumb_media_id) {\n\t\tthis.thumb_media_id = thumb_media_id;\n\t}\n\tpublic SendItemMusicJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendItemMusicJson(String title, String description, String musicurl,\n\t\t\tString hqmusicurl, String thumb_media_id) {\n\t\tsuper();\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t\tthis.musicurl = musicurl;\n\t\tthis.hqmusicurl = hqmusicurl;\n\t\tthis.thumb_media_id = thumb_media_id;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemTextJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemTextJson {\n\tprivate String text;\n\n\tpublic String getText() {\n\t\treturn text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic SendItemTextJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic SendItemTextJson(String text) {\n\t\tsuper();\n\t\tthis.text = text;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemVideoJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemVideoJson {\n\tprivate String mediaId;\n\tprivate String title;\n\tprivate String description;\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\tpublic SendItemVideoJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic SendItemVideoJson(String mediaId, String title, String description) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t\tthis.title = title;\n\t\tthis.description = description;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/SendItemVoiceJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class SendItemVoiceJson {\n\tprivate String mediaId;\n\n\tpublic String getMediaId() {\n\t\treturn mediaId;\n\t}\n\n\tpublic void setMediaId(String mediaId) {\n\t\tthis.mediaId = mediaId;\n\t}\n\n\tpublic SendItemVoiceJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic SendItemVoiceJson(String mediaId) {\n\t\tsuper();\n\t\tthis.mediaId = mediaId;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/send/item/wrapper/WxSendItemArticleWrapper.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.send.item.wrapper;\n\nimport java.util.List;\n\nimport org.hamster.weixinmp.model.send.item.SendItemArticleJson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n *\n */\npublic class WxSendItemArticleWrapper {\n\n\tprivate List<SendItemArticleJson> articles;\n\n\tpublic List<SendItemArticleJson> getArticles() {\n\t\treturn articles;\n\t}\n\n\tpublic void setArticles(List<SendItemArticleJson> articles) {\n\t\tthis.articles = articles;\n\t}\n\n\tpublic WxSendItemArticleWrapper() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxSendItemArticleWrapper(List<SendItemArticleJson> articles) {\n\t\tsuper();\n\t\tthis.articles = articles;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/user/WxOpenIdListJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.user;\n\nimport java.util.List;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxOpenIdListJson {\n\tprivate List<String> openid;\n\n\tpublic List<String> getOpenid() {\n\t\treturn openid;\n\t}\n\n\tpublic void setOpenid(List<String> openid) {\n\t\tthis.openid = openid;\n\t}\n\n\tpublic WxOpenIdListJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\n\tpublic WxOpenIdListJson(List<String> openid) {\n\t\tsuper();\n\t\tthis.openid = openid;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/model/user/WxUserGetJson.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.model.user;\n\n\n/**\n * {\"total\":2,\"count\":2,\"data\":{\"openid\":[\"\",\"OPENID1\",\"OPENID2\"]},\"next_openid\":\"NEXT_OPENID\"}\n * \n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxUserGetJson {\n\tprivate Long total;\n\tprivate Long count;\n\tWxOpenIdListJson data;\n\tprivate String next_openid;\n\tpublic Long getTotal() {\n\t\treturn total;\n\t}\n\tpublic void setTotal(Long total) {\n\t\tthis.total = total;\n\t}\n\tpublic Long getCount() {\n\t\treturn count;\n\t}\n\tpublic void setCount(Long count) {\n\t\tthis.count = count;\n\t}\n\tpublic WxOpenIdListJson getData() {\n\t\treturn data;\n\t}\n\tpublic void setData(WxOpenIdListJson data) {\n\t\tthis.data = data;\n\t}\n\tpublic String getNext_openid() {\n\t\treturn next_openid;\n\t}\n\tpublic void setNext_openid(String next_openid) {\n\t\tthis.next_openid = next_openid;\n\t}\n\tpublic WxUserGetJson() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic WxUserGetJson(Long total, Long count, WxOpenIdListJson data,\n\t\t\tString next_openid) {\n\t\tsuper();\n\t\tthis.total = total;\n\t\tthis.count = count;\n\t\tthis.data = data;\n\t\tthis.next_openid = next_openid;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxAuthService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.auth.WxAuth;\nimport org.hamster.weixinmp.dao.entity.auth.WxAuthReq;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.util.WxUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 1, 2014\n * \n */\n@Service\npublic class WxAuthService {\n\t\n\tprivate static final Logger log = LoggerFactory.getLogger(WxAuthService.class);\n\t\n\t@Autowired\n\tprotected WxConfig config;\n\n\tpublic WxAuth getAccessToken(String appid, String appsecret)\n\t\t\tthrows WxException {\n\t\tMap<String, String> paramsJson = new HashMap<String, String>();\n\t\tparamsJson.put(\"grant_type\", \"client_credential\");\n\t\tparamsJson.put(\"appid\", appid);\n\t\tparamsJson.put(\"secret\", appsecret);\n\n\t\tWxAuth result = WxUtil.sendRequest(config.getAccessTokenCreateUrl(),\n\t\t\t\tHttpMethod.GET, paramsJson, null, WxAuth.class);\n\t\tresult.setGrantType(\"client_credential\");\n\t\tresult.setAppid(appid);\n\t\tresult.setSecret(appsecret);\n\t\treturn result;\n\t}\n\n\tpublic boolean validateAuth(String signature, String timestamp,\n\t\t\tString nonce, String echostr) throws WxException {\n\t\tWxAuthReq authReq = new WxAuthReq();\n\t\tauthReq.setCreatedDate(new Date());\n\t\tauthReq.setSignature(signature);\n\t\tauthReq.setTimestamp(timestamp);\n\t\tauthReq.setNonce(nonce);\n\t\tauthReq.setEchostr(echostr);\n\n\t\tString excepted = hash(getStringToHash(timestamp, nonce,\n\t\t\t\tconfig.getToken()));\n\n\t\tif (signature == null || !signature.equals(excepted)) {\n\t\t\tlog.error(\"Authentication failed! excepted echostr ->\" + excepted);\n\t\t\tlog.error(\"                                 actual ->\" + signature);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprotected static String getStringToHash(String timestamp, String nonce,\n\t\t\tString token) {\n\t\tList<String> list = new ArrayList<String>();\n\t\tlist.add(timestamp);\n\t\tlist.add(nonce);\n\t\tlist.add(token);\n\n\t\tString result = \"\";\n\t\tCollections.sort(list);\n\t\tfor (int i = 0; i < list.size(); i++) {\n\t\t\tSystem.out.println(list.get(i));\n\t\t\tresult += list.get(i);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprotected static String hash(String str) {\n\t\ttry {\n\t\t\tMessageDigest md = MessageDigest.getInstance(\"SHA-1\");\n\t\t\tbyte[] b = md.digest(str.getBytes());\n\t\t\tStringBuffer sb = new StringBuffer();\n\t\t\tfor (int i = 0; i < b.length; i++) {\n\t\t\t\tsb.append(Integer.toString((b[i] & 0xff) + 0x100, 16)\n\t\t\t\t\t\t.substring(1));\n\t\t\t}\n\t\t\treturn sb.toString();\n\t\t} catch (NoSuchAlgorithmException e) {\n\t\t\t// never happens\n\t\t}\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxMediaService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport java.util.Date;\nimport java.util.Map;\n\nimport org.apache.http.entity.ContentType;\nimport org.apache.http.entity.mime.MultipartEntityBuilder;\nimport org.apache.http.entity.mime.content.ByteArrayBody;\nimport org.apache.http.entity.mime.content.ContentBody;\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMediaTypeEnum;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseItemMediaEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.util.WxUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\n@Service\npublic class WxMediaService {\n\n\t@Autowired\n\tWxConfig config;\n\n\tpublic WxBaseItemMediaEntity remoteMediaUpload(String accessToken,\n\t\t\tWxMediaTypeEnum type, byte[] content) throws WxException {\n\t\tMultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();\n\t\tString typeString = null;\n\t\tswitch (type) {\n\t\tcase IMAGE:\n\t\tcase THUMB:\n\t\tcase VIDEO:\n\t\tcase VOICE:\n\t\t\ttypeString = type.toString().toLowerCase();\n\t\t\tbreak;\n\t\tcase MUSIC:\n\t\tcase DEFAULT:\n\t\tcase PIC_DESC:\n\t\t\tthrow new WxException(\"Not supported upload type : \"\n\t\t\t\t\t+ type.toString());\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tMap<String, String> params = WxUtil.getAccessTokenParams(accessToken);\n\t\tSystem.out.println(typeString);\n\t\tparams.put(\"type\", typeString);\n\t\tContentBody contentBody = new ByteArrayBody(content, ContentType.MULTIPART_FORM_DATA, \"name.jpg\");\n\t\tentityBuilder.addPart(\"media\", contentBody);\n\t\tMediaResultMapper result = WxUtil.sendRequest(\n\t\t\t\tconfig.getMediaUploadUrl(), HttpMethod.POST, params,\n\t\t\t\tentityBuilder.build(), MediaResultMapper.class);\n\n\t\tWxBaseItemMediaEntity resultEntity = null;\n\t\tswitch (type) {\n\t\tcase IMAGE:\n\t\t\tWxItemImageEntity imageEntity = new WxItemImageEntity();\n\t\t\timageEntity.setMediaId(result.getMedia_id());\n\t\t\timageEntity.setCreatedDate(new Date(result.getCreated_at() * 1000));\n\t\t\tresultEntity = imageEntity;\n\t\t\tbreak;\n\t\tcase THUMB:\n\t\t\tWxItemThumbEntity thumbEntity = new WxItemThumbEntity();\n\t\t\tthumbEntity.setMediaId(result.getMedia_id());\n\t\t\tthumbEntity.setCreatedDate(new Date(result.getCreated_at() * 1000));\n\t\t\tresultEntity = thumbEntity;\n\t\t\tbreak;\n\t\tcase VIDEO:\n\t\t\tWxItemVideoEntity videoEntity = new WxItemVideoEntity();\n\t\t\tvideoEntity.setMediaId(result.getMedia_id());\n\t\t\tvideoEntity.setCreatedDate(new Date(result.getCreated_at() * 1000));\n\t\t\tresultEntity = videoEntity;\n\t\t\tbreak;\n\t\tcase VOICE:\n\t\t\tWxItemVoiceEntity voiceEntity = new WxItemVoiceEntity();\n\t\t\tvoiceEntity.setMediaId(result.getMedia_id());\n\t\t\tvoiceEntity.setCreatedDate(new Date(result.getCreated_at() * 1000));\n\t\t\tresultEntity = voiceEntity;\n\t\t\tbreak;\n\t\tcase MUSIC:\n\t\tcase DEFAULT:\n\t\tcase PIC_DESC:\n\t\t\tthrow new WxException(\"Not supported upload type : \"\n\t\t\t\t\t+ type.toString());\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\treturn resultEntity;\n\t}\n\n}\n\nclass MediaResultMapper {\n\tprivate String type;\n\tprivate String media_id;\n\tprivate Long created_at;\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\tpublic String getMedia_id() {\n\t\treturn media_id;\n\t}\n\tpublic void setMedia_id(String media_id) {\n\t\tthis.media_id = media_id;\n\t}\n\tpublic Long getCreated_at() {\n\t\treturn created_at;\n\t}\n\tpublic void setCreated_at(Long created_at) {\n\t\tthis.created_at = created_at;\n\t}\n\tpublic MediaResultMapper() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic MediaResultMapper(String type, String media_id, Long created_at) {\n\t\tsuper();\n\t\tthis.type = type;\n\t\tthis.media_id = media_id;\n\t\tthis.created_at = created_at;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"MediaResultMapper [type=\" + type + \", media_id=\" + media_id\n\t\t\t\t+ \", created_at=\" + created_at + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result\n\t\t\t\t+ ((created_at == null) ? 0 : created_at.hashCode());\n\t\tresult = prime * result\n\t\t\t\t+ ((media_id == null) ? 0 : media_id.hashCode());\n\t\tresult = prime * result + ((type == null) ? 0 : type.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tMediaResultMapper other = (MediaResultMapper) obj;\n\t\tif (created_at == null) {\n\t\t\tif (other.created_at != null)\n\t\t\t\treturn false;\n\t\t} else if (!created_at.equals(other.created_at))\n\t\t\treturn false;\n\t\tif (media_id == null) {\n\t\t\tif (other.media_id != null)\n\t\t\t\treturn false;\n\t\t} else if (!media_id.equals(other.media_id))\n\t\t\treturn false;\n\t\tif (type == null) {\n\t\t\tif (other.type != null)\n\t\t\t\treturn false;\n\t\t} else if (!type.equals(other.type))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxMenuService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport static org.hamster.weixinmp.util.WxUtil.getAccessTokenParams;\nimport static org.hamster.weixinmp.util.WxUtil.sendRequest;\n\nimport java.io.UnsupportedEncodingException;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.http.entity.StringEntity;\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.menu.WxMenuBtnEntity;\nimport org.hamster.weixinmp.dao.entity.user.WxUserEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.gson.WxMenuBtnSerializer;\nimport org.hamster.weixinmp.model.WxRespCode;\nimport org.hamster.weixinmp.model.menu.WxMenuCreateJson;\nimport org.hamster.weixinmp.model.menu.WxMenuGetJson;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\n@Service\npublic class WxMenuService {\n\t@Autowired\n\tWxConfig config;\n\n\tpublic WxRespCode menuCreate(String accessToken, List<WxMenuBtnEntity> entities)\n\t\t\tthrows WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\n\t\tGsonBuilder gsonBuilder = new GsonBuilder();\n\t\tgsonBuilder.registerTypeAdapter(WxUserEntity.class,\n\t\t\t\tnew WxMenuBtnSerializer());\n\t\tGson gson = gsonBuilder.create();\n\t\t\n\t\tWxMenuCreateJson wrapper = new WxMenuCreateJson();\n\t\twrapper.setButton(entities);\n\n\t\ttry {\n\t\t\treturn sendRequest(config.getMenuCreateUrl(), HttpMethod.POST, params,\n\t\t\t\t\tnew StringEntity(gson.toJson(wrapper)),\n\t\t\t\t\tWxRespCode.class);\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tthrow new WxException(e);\n\t\t}\n\t}\n\t\n\tpublic List<WxMenuBtnEntity> menuGet(String accessToken) throws WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\n\t\treturn sendRequest(config.getMenuGetUrl(), HttpMethod.GET, params, null,\n\t\t\t\tWxMenuGetJson.class).getMenu().getButton();\n\t}\n\t\n\tpublic WxRespCode menuDelete(String accessToken) throws WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\t\treturn sendRequest(config.getMenuDeleteUrl(), HttpMethod.GET, params, null,\n\t\t\t\tWxRespCode.class);\n\t}\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxMessageService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.dom4j.DocumentException;\nimport org.dom4j.DocumentHelper;\nimport org.dom4j.Element;\nimport org.hamster.weixinmp.constant.WxMsgRespType;\nimport org.hamster.weixinmp.constant.WxMsgRespTypeEnum;\nimport org.hamster.weixinmp.constant.WxMsgTypeEnum;\nimport org.hamster.weixinmp.controller.util.WxXmlUtil;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespImageEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVideoEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespVoiceEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.handler.WxMessageHandlerIfc;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 30, 2013\n * \n */\n@Service\npublic class WxMessageService {\n\t\n\t@Autowired(required=false)\n\tList<WxMessageHandlerIfc> handlers;\n\t\n\tpublic WxBaseMsgEntity parseXML(String xml) throws DocumentException,\n\t\t\tWxException {\n\t\tElement ele = DocumentHelper.parseText(xml).getRootElement();\n\t\tString msgType = null;\n\t\tif ((msgType = ele.elementText(\"MsgType\")) == null) {\n\t\t\tthrow new WxException(\"cannot find MsgType Node!\\n\" + xml);\n\t\t}\n\t\tWxMsgTypeEnum msgTypeEnum = WxMsgTypeEnum.inst(msgType);\n\t\tswitch (msgTypeEnum) {\n\t\tcase EVENT:\n\t\t\treturn WxXmlUtil.getMsgEvent(ele);\n\t\tcase IMAGE:\n\t\t\treturn WxXmlUtil.getMsgImage(ele);\n\t\tcase LINK:\n\t\t\treturn WxXmlUtil.getMsgLink(ele);\n\t\tcase LOCATION:\n\t\t\treturn WxXmlUtil.getMsgLoc(ele);\n\t\tcase TEXT:\n\t\t\treturn WxXmlUtil.getMsgText(ele);\n\t\tcase VIDEO:\n\t\t\treturn WxXmlUtil.getMsgVideo(ele);\n\t\tcase VOICE:\n\t\t\treturn WxXmlUtil.getMsgVoice(ele);\n\t\tdefault:\n\t\t\t// never happens\n\t\t\tbreak;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic WxBaseRespEntity handleMessage(WxBaseMsgEntity msg) {\n\t\tList<WxMessageHandlerIfc> handlerList = new ArrayList<WxMessageHandlerIfc>();\n\t\tif(handlers!=null){\n\t\t\thandlerList.addAll(handlers);\n\t\t}\n\t\tCollections.sort(handlerList, new WxMessageHandlerComparator());\n\t\t\n\t\tMap<String, Object> context = new HashMap<String, Object>();\n\t\tWxBaseRespEntity result = null;\n\t\tfor (WxMessageHandlerIfc handler : handlerList) {\n\t\t\tresult = handler.handle(msg, context);\n\t\t}\n\t\t\n\t\tif (result == null) {\n\t\t\tresult = defaultResult(msg.getToUserName(), msg.getFromUserName());\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tpublic Element parseRespXML(WxBaseRespEntity resp) throws DocumentException {\n\t\tWxMsgRespTypeEnum type = WxMsgRespTypeEnum.inst(resp.getMsgType());\n\t\tswitch (type) {\n\t\tcase IMAGE:\n\t\t\treturn WxXmlUtil.getRespImage((WxRespImageEntity) resp);\n\t\tcase MUSIC:\n\t\t\treturn WxXmlUtil.getRespMusic((WxRespMusicEntity) resp, ((WxRespMusicEntity) resp).getThumb());\n\t\tcase NEWS:\n\t\t\treturn WxXmlUtil.getRespPicDesc((WxRespPicDescEntity) resp);\n\t\tcase TEXT:\n\t\t\treturn WxXmlUtil.getRespTextXML((WxRespTextEntity) resp);\n\t\tcase VIDEO:\n\t\t\treturn WxXmlUtil.getRespVideo((WxRespVideoEntity) resp);\n\t\tcase VOICE:\n\t\t\treturn WxXmlUtil.getRespVoice((WxRespVoiceEntity) resp);\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tprotected WxRespTextEntity defaultResult(String fromUserName, String toUserName) {\n\t\tWxRespTextEntity result = new WxRespTextEntity();\n\t\tresult.setContent(\"您好,您的消息已收到.\");\n\t\tresult.setCreatedDate(new Date());\n\t\tresult.setCreateTime(new Date().getTime() / 1000);\n\t\tresult.setFromUserName(fromUserName);\n\t\tresult.setMsgType(WxMsgRespType.TEXT);\n\t\tresult.setToUserName(toUserName);\n\t\treturn result;\n\t}\n\t\n\n}\n\nclass WxMessageHandlerComparator implements Comparator<WxMessageHandlerIfc> {\n\n\t/* (non-Javadoc)\n\t * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)\n\t */\n\tpublic int compare(WxMessageHandlerIfc o1, WxMessageHandlerIfc o2) {\n\t\tif (o1.priority() > o2.priority()) {\n\t\t\treturn -1;\n\t\t} else if (o1.priority() < o2.priority()) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxQrService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport static org.hamster.weixinmp.util.WxUtil.getAccessTokenParams;\nimport static org.hamster.weixinmp.util.WxUtil.sendRequest;\nimport static org.hamster.weixinmp.util.WxUtil.toJsonStringEntity;\n\nimport java.util.Map;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.qr.WxQrEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.qr.WxQrActionInfoJson;\nimport org.hamster.weixinmp.model.qr.WxQrCreateJson;\nimport org.hamster.weixinmp.model.qr.WxQrSceneJson;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\n@Service\npublic class WxQrService {\n\t@Autowired\n\tprivate WxConfig config;\n\n\tpublic WxQrEntity remoteQrcodeCreate(String accessToken,\n\t\t\tboolean isTemporary, Long sceneId, Long expire_seconds)\n\t\t\tthrows WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\n\t\tWxQrSceneJson scene = new WxQrSceneJson();\n\t\tscene.setScene_id(sceneId);\n\t\tWxQrActionInfoJson action = new WxQrActionInfoJson();\n\t\taction.setScene(scene);\n\t\tWxQrCreateJson requestJson = new WxQrCreateJson();\n\t\trequestJson.setAction_name(isTemporary ? \"QR_LIMIT_SCENE\" : \"QR_SCENE\");\n\t\trequestJson.setAction_info(action);\n\t\tif (isTemporary) {\n\t\t\trequestJson.setExpire_seconds(expire_seconds);\n\t\t}\n\n\t\tWxQrEntity result = sendRequest(config.getQrcodeCreateUrl(),\n\t\t\t\tHttpMethod.POST, params, toJsonStringEntity(requestJson),\n\t\t\t\tWxQrEntity.class);\n\t\tresult.setScene(sceneId);\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxStorageService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport org.apache.log4j.Logger;\nimport org.dom4j.DocumentException;\nimport org.dom4j.Element;\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.constant.WxMsgRespType;\nimport org.hamster.weixinmp.controller.util.WxXmlUtil;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemMusicEntity;\nimport org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity;\nimport org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity;\nimport org.hamster.weixinmp.dao.repository.auth.WxAuthDao;\nimport org.hamster.weixinmp.dao.repository.auth.WxAuthReqDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemImageDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemMusicDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemPicDescDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemThumbDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemVideoDao;\nimport org.hamster.weixinmp.dao.repository.item.WxItemVoiceDao;\nimport org.hamster.weixinmp.dao.repository.menu.WxMenuBtnDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgEventDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgImageDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgLinkDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgLocDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgTextDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgVideoDao;\nimport org.hamster.weixinmp.dao.repository.msg.WxMsgVoiceDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespImageDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespMusicDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespPicDescDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespTextDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespVideoDao;\nimport org.hamster.weixinmp.dao.repository.resp.WxRespVoiceDao;\nimport org.hamster.weixinmp.dao.repository.user.WxGroupDao;\nimport org.hamster.weixinmp.dao.repository.user.WxUserDao;\nimport org.hamster.weixinmp.util.WxUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\n@Service\n@Transactional(readOnly = true)\npublic class WxStorageService {\n\tpublic static final Logger log = Logger.getLogger(WxStorageService.class);\n\n\t@Autowired(required = false)\n\tprotected WxAuthDao authDao;\n\t@Autowired(required = false)\n\tprotected WxAuthReqDao authReqDao;\n\n\t@Autowired(required = false)\n\tprotected WxMsgTextDao msgTextDao;\n\t@Autowired(required = false)\n\tprotected WxMsgImageDao msgImgDao;\n\t@Autowired(required = false)\n\tprotected WxMsgLinkDao msgLinkDao;\n\t@Autowired(required = false)\n\tprotected WxMsgLocDao msgLocDao;\n\t@Autowired(required = false)\n\tprotected WxMsgEventDao msgEventDao;\n\t@Autowired(required = false)\n\tprotected WxMsgVideoDao msgVideoDao;\n\t@Autowired(required = false)\n\tprotected WxMsgVoiceDao msgVoiceDao;\n\n\t@Autowired(required = false)\n\tprotected WxRespTextDao respTextDao;\n\t@Autowired(required = false)\n\tprotected WxRespPicDescDao respPicDescDao;\n\t@Autowired(required = false)\n\tprotected WxRespMusicDao respMusicDao;\n\t@Autowired(required = false)\n\tprotected WxRespImageDao respImageDao;\n\t@Autowired(required = false)\n\tprotected WxRespVideoDao respVideoDao;\n\t@Autowired(required = false)\n\tprotected WxRespVoiceDao respVoiceDao;\n\t\n\t@Autowired(required = false)\n\tprotected WxItemImageDao itemImageDao;\n\t@Autowired(required = false)\n\tprotected WxItemMusicDao itemMusicDao;\n\t@Autowired(required = false)\n\tprotected WxItemPicDescDao wxItemPicDescDao;\n\t@Autowired(required = false)\n\tprotected WxItemThumbDao itemThumbDao;\n\t@Autowired(required = false)\n\tprotected WxItemVideoDao itemVideoDao;\n\t@Autowired(required = false)\n\tprotected WxItemVoiceDao itemVoiceDao;\n\n\t@Autowired(required = false)\n\tprotected WxMenuBtnDao wxMenuBtnDao;\n\t\n\t@Autowired(required = false)\n\tprotected WxGroupDao groupDao;\n\t@Autowired(required = false)\n\tprotected WxUserDao userDao;\n\n\tprotected String token;\n\n\t@Autowired(required = false)\n\tprotected WxConfig wxConfig;\n\n\tpublic WxMsgTextEntity saveMsgText(Element ele) throws DocumentException {\n\t\tWxMsgTextEntity msgText = WxXmlUtil.getMsgText(ele);\n\t\tif (msgTextDao != null) {\n\t\t\tmsgTextDao.save(msgText);\n\t\t} else {\n\n\t\t}\n\t\treturn msgText;\n\t}\n\n\tpublic WxMsgImageEntity saveMsgImg(Element ele) throws DocumentException {\n\t\tWxMsgImageEntity msgImg = WxXmlUtil.getMsgImage(ele);\n\t\tif (msgImgDao != null) {\n\t\t\tmsgImgDao.save(msgImg);\n\t\t} else {\n\n\t\t}\n\t\treturn msgImg;\n\t}\n\n\tpublic WxMsgLinkEntity saveMsgLink(Element ele) throws DocumentException {\n\t\tWxMsgLinkEntity msgLink = WxXmlUtil.getMsgLink(ele);\n\t\tif (msgLinkDao != null) {\n\t\t\tmsgLinkDao.save(msgLink);\n\t\t} else {\n\n\t\t}\n\t\treturn msgLink;\n\t}\n\n\tpublic WxMsgLocEntity saveMsgLoc(Element ele) throws DocumentException {\n\t\tWxMsgLocEntity msgLoc = WxXmlUtil.getMsgLoc(ele);\n\t\tif (msgLocDao != null) {\n\t\t\tmsgLocDao.save(msgLoc);\n\t\t} else {\n\n\t\t}\n\t\treturn msgLoc;\n\t}\n\n\tpublic WxMsgEventEntity saveMsgEvent(Element ele) throws DocumentException {\n\t\tWxMsgEventEntity msgEvent = WxXmlUtil.getMsgEvent(ele);\n\t\tif (msgEventDao != null) {\n\t\t\tmsgEventDao.save(msgEvent);\n\t\t} else {\n\n\t\t}\n\t\treturn msgEvent;\n\t}\n\n\tpublic WxRespTextEntity createRespText(String content, String fromUserName,\n\t\t\tString toUserName, Integer funcFlag) {\n\t\tWxRespTextEntity respText = new WxRespTextEntity();\n\t\trespText.setContent(content);\n\t\trespText.setCreatedDate(new Date());\n\t\trespText.setCreateTime(WxUtil.currentTimeInSec());\n\t\trespText.setFromUserName(fromUserName);\n\t\trespText.setToUserName(toUserName);\n\t\trespText.setFuncFlag(funcFlag);\n\t\trespText.setMsgType(WxMsgRespType.TEXT);\n\t\tif (respTextDao != null) {\n\t\t\trespTextDao.save(respText);\n\t\t} else {\n\n\t\t}\n\t\treturn respText;\n\t}\n\n\tpublic WxRespPicDescEntity createRespPicDesc(\n\t\t\tList<WxItemPicDescEntity> articles, String fromUserName,\n\t\t\tString toUserName, Integer funcFlag) {\n\t\tWxRespPicDescEntity respPicDesc = new WxRespPicDescEntity();\n\t\trespPicDesc.setCreatedDate(new Date());\n\t\trespPicDesc.setCreateTime(WxUtil.currentTimeInSec());\n\t\trespPicDesc.setFromUserName(fromUserName);\n\t\trespPicDesc.setToUserName(toUserName);\n\t\trespPicDesc.setFuncFlag(funcFlag);\n\t\trespPicDesc.setMsgType(WxMsgRespType.NEWS);\n\t\trespPicDesc.setArticles(articles);\n\t\tif (respPicDescDao != null) {\n\t\t\trespPicDescDao.save(respPicDesc);\n\t\t} else {\n\n\t\t}\n\t\treturn respPicDesc;\n\t}\n\n\tpublic WxRespPicDescEntity createRespPicDesc2(List<Long> articleIds,\n\t\t\tString fromUserName, String toUserName, Integer funcFlag) {\n\t\tWxRespPicDescEntity respPicDesc = new WxRespPicDescEntity();\n\t\trespPicDesc.setCreatedDate(new Date());\n\t\trespPicDesc.setCreateTime(WxUtil.currentTimeInSec());\n\t\trespPicDesc.setFromUserName(fromUserName);\n\t\trespPicDesc.setToUserName(toUserName);\n\t\trespPicDesc.setFuncFlag(funcFlag);\n\t\trespPicDesc.setMsgType(WxMsgRespType.NEWS);\n\t\trespPicDesc.setArticles(wxItemPicDescDao.findByIdIn(articleIds));\n\t\tif (respPicDescDao != null) {\n\t\t\trespPicDescDao.save(respPicDesc);\n\t\t} else {\n\n\t\t}\n\t\treturn respPicDesc;\n\t}\n\n\tpublic WxRespMusicEntity createRespMusic(String fromUserName,\n\t\t\tString toUserName, Integer funcFlag, WxItemMusicEntity itemMusic) {\n\t\tWxRespMusicEntity respMusic = new WxRespMusicEntity();\n\t\trespMusic.setCreatedDate(new Date());\n\t\trespMusic.setCreateTime(WxUtil.currentTimeInSec());\n\t\trespMusic.setFromUserName(fromUserName);\n\t\trespMusic.setToUserName(toUserName);\n\t\trespMusic.setFuncFlag(funcFlag);\n\t\trespMusic.setMsgType(WxMsgRespType.MUSIC);\n\t\t// respMusic.setMusic(itemMusic);\n\t\tif (respMusicDao != null) {\n\t\t\trespMusicDao.save(respMusic);\n\t\t} else {\n\n\t\t}\n\t\treturn respMusic;\n\t}\n\n\t// ///////////////\n\t// common parts //\n\t// ///////////////\n\tpublic WxBaseRespEntity handleMessage(WxBaseMsgEntity msg) {\n\t\tWxRespTextEntity respText = createRespText(\n\t\t\t\t\"Only test message, please ignore this.\", msg.getToUserName(),\n\t\t\t\tmsg.getFromUserName(), 1);\n\t\treturn respText;\n\t}\n\n\tpublic WxAuthDao getAuthDao() {\n\t\treturn authDao;\n\t}\n\n\tpublic void setAuthDao(WxAuthDao authDao) {\n\t\tthis.authDao = authDao;\n\t}\n\n\tpublic WxAuthReqDao getAuthReqDao() {\n\t\treturn authReqDao;\n\t}\n\n\tpublic void setAuthReqDao(WxAuthReqDao authReqDao) {\n\t\tthis.authReqDao = authReqDao;\n\t}\n\n\tpublic WxMsgTextDao getMsgTextDao() {\n\t\treturn msgTextDao;\n\t}\n\n\tpublic void setMsgTextDao(WxMsgTextDao msgTextDao) {\n\t\tthis.msgTextDao = msgTextDao;\n\t}\n\n\tpublic WxMsgImageDao getMsgImgDao() {\n\t\treturn msgImgDao;\n\t}\n\n\tpublic void setMsgImgDao(WxMsgImageDao msgImgDao) {\n\t\tthis.msgImgDao = msgImgDao;\n\t}\n\n\tpublic WxMsgLinkDao getMsgLinkDao() {\n\t\treturn msgLinkDao;\n\t}\n\n\tpublic void setMsgLinkDao(WxMsgLinkDao msgLinkDao) {\n\t\tthis.msgLinkDao = msgLinkDao;\n\t}\n\n\tpublic WxMsgLocDao getMsgLocDao() {\n\t\treturn msgLocDao;\n\t}\n\n\tpublic void setMsgLocDao(WxMsgLocDao msgLocDao) {\n\t\tthis.msgLocDao = msgLocDao;\n\t}\n\n\tpublic WxMsgEventDao getMsgEventDao() {\n\t\treturn msgEventDao;\n\t}\n\n\tpublic void setMsgEventDao(WxMsgEventDao msgEventDao) {\n\t\tthis.msgEventDao = msgEventDao;\n\t}\n\n\tpublic WxMsgVideoDao getMsgVideoDao() {\n\t\treturn msgVideoDao;\n\t}\n\n\tpublic void setMsgVideoDao(WxMsgVideoDao msgVideoDao) {\n\t\tthis.msgVideoDao = msgVideoDao;\n\t}\n\n\tpublic WxMsgVoiceDao getMsgVoiceDao() {\n\t\treturn msgVoiceDao;\n\t}\n\n\tpublic void setMsgVoiceDao(WxMsgVoiceDao msgVoiceDao) {\n\t\tthis.msgVoiceDao = msgVoiceDao;\n\t}\n\n\tpublic WxRespTextDao getRespTextDao() {\n\t\treturn respTextDao;\n\t}\n\n\tpublic void setRespTextDao(WxRespTextDao respTextDao) {\n\t\tthis.respTextDao = respTextDao;\n\t}\n\n\tpublic WxRespPicDescDao getRespPicDescDao() {\n\t\treturn respPicDescDao;\n\t}\n\n\tpublic void setRespPicDescDao(WxRespPicDescDao respPicDescDao) {\n\t\tthis.respPicDescDao = respPicDescDao;\n\t}\n\n\tpublic WxRespMusicDao getRespMusicDao() {\n\t\treturn respMusicDao;\n\t}\n\n\tpublic void setRespMusicDao(WxRespMusicDao respMusicDao) {\n\t\tthis.respMusicDao = respMusicDao;\n\t}\n\n\tpublic WxRespImageDao getRespImageDao() {\n\t\treturn respImageDao;\n\t}\n\n\tpublic void setRespImageDao(WxRespImageDao respImageDao) {\n\t\tthis.respImageDao = respImageDao;\n\t}\n\n\tpublic WxRespVideoDao getRespVideoDao() {\n\t\treturn respVideoDao;\n\t}\n\n\tpublic void setRespVideoDao(WxRespVideoDao respVideoDao) {\n\t\tthis.respVideoDao = respVideoDao;\n\t}\n\n\tpublic WxRespVoiceDao getRespVoiceDao() {\n\t\treturn respVoiceDao;\n\t}\n\n\tpublic void setRespVoiceDao(WxRespVoiceDao respVoiceDao) {\n\t\tthis.respVoiceDao = respVoiceDao;\n\t}\n\n\tpublic WxItemImageDao getItemImageDao() {\n\t\treturn itemImageDao;\n\t}\n\n\tpublic void setItemImageDao(WxItemImageDao itemImageDao) {\n\t\tthis.itemImageDao = itemImageDao;\n\t}\n\n\tpublic WxItemMusicDao getItemMusicDao() {\n\t\treturn itemMusicDao;\n\t}\n\n\tpublic void setItemMusicDao(WxItemMusicDao itemMusicDao) {\n\t\tthis.itemMusicDao = itemMusicDao;\n\t}\n\n\tpublic WxItemPicDescDao getWxItemPicDescDao() {\n\t\treturn wxItemPicDescDao;\n\t}\n\n\tpublic void setWxItemPicDescDao(WxItemPicDescDao wxItemPicDescDao) {\n\t\tthis.wxItemPicDescDao = wxItemPicDescDao;\n\t}\n\n\tpublic WxItemThumbDao getItemThumbDao() {\n\t\treturn itemThumbDao;\n\t}\n\n\tpublic void setItemThumbDao(WxItemThumbDao itemThumbDao) {\n\t\tthis.itemThumbDao = itemThumbDao;\n\t}\n\n\tpublic WxItemVideoDao getItemVideoDao() {\n\t\treturn itemVideoDao;\n\t}\n\n\tpublic void setItemVideoDao(WxItemVideoDao itemVideoDao) {\n\t\tthis.itemVideoDao = itemVideoDao;\n\t}\n\n\tpublic WxItemVoiceDao getItemVoiceDao() {\n\t\treturn itemVoiceDao;\n\t}\n\n\tpublic void setItemVoiceDao(WxItemVoiceDao itemVoiceDao) {\n\t\tthis.itemVoiceDao = itemVoiceDao;\n\t}\n\n\tpublic WxMenuBtnDao getWxMenuBtnDao() {\n\t\treturn wxMenuBtnDao;\n\t}\n\n\tpublic void setWxMenuBtnDao(WxMenuBtnDao wxMenuBtnDao) {\n\t\tthis.wxMenuBtnDao = wxMenuBtnDao;\n\t}\n\n\tpublic WxGroupDao getGroupDao() {\n\t\treturn groupDao;\n\t}\n\n\tpublic void setGroupDao(WxGroupDao groupDao) {\n\t\tthis.groupDao = groupDao;\n\t}\n\n\tpublic WxUserDao getUserDao() {\n\t\treturn userDao;\n\t}\n\n\tpublic void setUserDao(WxUserDao userDao) {\n\t\tthis.userDao = userDao;\n\t}\n\n\tpublic String getToken() {\n\t\treturn token;\n\t}\n\n\tpublic void setToken(String token) {\n\t\tthis.token = token;\n\t}\n\n\tpublic WxConfig getWxConfig() {\n\t\treturn wxConfig;\n\t}\n\n\tpublic void setWxConfig(WxConfig wxConfig) {\n\t\tthis.wxConfig = wxConfig;\n\t}\n\n\tpublic static Logger getLog() {\n\t\treturn log;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxUserGroupService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport static org.hamster.weixinmp.util.WxUtil.getAccessTokenParams;\nimport static org.hamster.weixinmp.util.WxUtil.sendRequest;\nimport static org.hamster.weixinmp.util.WxUtil.toJsonStringEntity;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.user.WxGroupEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.WxRespCode;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 1, 2014\n * \n */\n@Service\npublic class WxUserGroupService {\n\t@Autowired\n\tprivate WxConfig config;\n\n\t/**\n\t * http请求方式: POST（请使用https协议）<br />\n\t * https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN<br />\n\t * POST数据格式：json<br />\n\t * POST数据例子：{\"group\":{\"name\":\"test\"}}<br />\n\t * \n\t * { \"group\": { \"id\": 107, \"name\": \"test\" } } <br />\n\t * \n\t * @param groupName\n\t * @return\n\t * @throws WxException\n\t */\n\tpublic WxGroupEntity remoteGroupsCreate(String accessToken, String groupName)\n\t\t\tthrows WxException {\n\t\tMap<String, Object> requestJson = new HashMap<String, Object>();\n\t\tMap<String, Object> l1Json = new HashMap<String, Object>();\n\t\tl1Json.put(\"name\", groupName);\n\t\trequestJson.put(\"group\", l1Json);\n\n\t\tResultMapper result = sendRequest(config.getGroupsCreateUrl(),\n\t\t\t\tHttpMethod.POST, getAccessTokenParams(accessToken),\n\t\t\t\ttoJsonStringEntity(requestJson), ResultMapper.class);\n\t\treturn result.getGroup();\n\t}\n\n\t/**\n\t * http请求方式: GET（请使用https协议）<br />\n\t * https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN<br />\n\t * \n\t * { \"groups\": [ { \"id\": 0, \"name\": \"未分组\", \"count\": 72596 }, { \"id\": 1,\n\t * \"name\": \"黑名单\", \"count\": 36 }, { \"id\": 2, \"name\": \"星标组\", \"count\": 8 }, {\n\t * \"id\": 104, \"name\": \"华东媒\", \"count\": 4 }, { \"id\": 106, \"name\": \"★不测试组★\",\n\t * \"count\": 1 } ] }<br />\n\t * \n\t * @return\n\t * @throws WxException\n\t */\n\tpublic List<WxGroupEntity> remoteGroupsGet(String accessToken)\n\t\t\tthrows WxException {\n\t\treturn sendRequest(config.getGroupsGetUrl(), HttpMethod.GET,\n\t\t\t\tgetAccessTokenParams(accessToken), null, ResultMapper.class)\n\t\t\t\t.getGroups();\n\t}\n\n\t/**\n\t * http请求方式: POST（请使用https协议）<br />\n\t * https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN<br />\n\t * POST数据格式：json POST数据例子：{\"openid\":\"od8XIjsmk6QdVTETa9jLtGWA6KBc\"} <br />\n\t * {\"groupid\": 102 }<br />\n\t * \n\t * @param openId\n\t * @return\n\t * @throws WxException\n\t */\n\tpublic Long remoteGroupsGetId(String accessToken, String openId)\n\t\t\tthrows WxException {\n\t\tMap<String, Object> requestJson = new HashMap<String, Object>();\n\t\trequestJson.put(\"openid\", openId);\n\t\treturn sendRequest(config.getGroupsGetIdUrl(), HttpMethod.POST,\n\t\t\t\tgetAccessTokenParams(accessToken), toJsonStringEntity(requestJson),\n\t\t\t\tResultMapper.class).getGroupid();\n\t}\n\n\t/**\n\t * http请求方式: POST（请使用https协议）<br>\n\t * https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN<br>\n\t * POST数据格式：json<br>\n\t * POST数据例子：{\"group\":{\"id\":108,\"name\":\"test2_modify2\"}}<br>\n\t * \n\t * {\"errcode\": 0, \"errmsg\": \"ok\"}<br>\n\t * \n\t * @param id\n\t * @param name\n\t * @return\n\t * @throws WxException\n\t */\n\tpublic WxRespCode remoteGroupsUpdate(String accessToken, Long id,\n\t\t\tString name) throws WxException {\n\t\tMap<String, Object> requestJson = new HashMap<String, Object>();\n\t\tMap<String, Object> l1Json = new HashMap<String, Object>();\n\t\tl1Json.put(\"id\", id);\n\t\tl1Json.put(\"name\", name);\n\t\trequestJson.put(\"group\", l1Json);\n\t\treturn sendRequest(config.getGroupsUpdateUrl(), HttpMethod.POST,\n\t\t\t\tgetAccessTokenParams(accessToken), toJsonStringEntity(requestJson),\n\t\t\t\tWxRespCode.class);\n\t}\n\n\t/**\n\t * http请求方式: POST（请使用https协议）<br>\n\t * https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=\n\t * ACCESS_TOKEN<br>\n\t * POST数据格式：json<br>\n\t * POST数据例子：{\"openid\":\"oDF3iYx0ro3_7jD4HFRDfrjdCM58\",\"to_groupid\":108}<br>\n\t * {\"errcode\": 0, \"errmsg\": \"ok\"}<br>\n\t * \n\t * @param openid\n\t * @param to_groupid\n\t * @return\n\t * @throws WxException\n\t */\n\tpublic WxRespCode remoteGroupsMembersUpdate(String accessToken,\n\t\t\tString openid, Long to_groupid) throws WxException {\n\t\tMap<String, Object> requestJson = new HashMap<String, Object>();\n\t\trequestJson.put(\"openid\", openid);\n\t\trequestJson.put(\"to_groupid\", to_groupid);\n\t\treturn sendRequest(config.getGroupsMembersUpdateUrl(), HttpMethod.POST,\n\t\t\t\tgetAccessTokenParams(accessToken), toJsonStringEntity(requestJson),\n\t\t\t\tWxRespCode.class);\n\t}\n\n}\n\nfinal class ResultMapper {\n\tprivate WxGroupEntity group;\n\tprivate List<WxGroupEntity> groups;\n\tprivate Long groupid;\n\tpublic WxGroupEntity getGroup() {\n\t\treturn group;\n\t}\n\tpublic void setGroup(WxGroupEntity group) {\n\t\tthis.group = group;\n\t}\n\tpublic List<WxGroupEntity> getGroups() {\n\t\treturn groups;\n\t}\n\tpublic void setGroups(List<WxGroupEntity> groups) {\n\t\tthis.groups = groups;\n\t}\n\tpublic Long getGroupid() {\n\t\treturn groupid;\n\t}\n\tpublic void setGroupid(Long groupid) {\n\t\tthis.groupid = groupid;\n\t}\n\tpublic ResultMapper() {\n\t\tsuper();\n\t\t// TODO Auto-generated constructor stub\n\t}\n\tpublic ResultMapper(WxGroupEntity group, List<WxGroupEntity> groups,\n\t\t\tLong groupid) {\n\t\tsuper();\n\t\tthis.group = group;\n\t\tthis.groups = groups;\n\t\tthis.groupid = groupid;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"ResultMapper [group=\" + group + \", groups=\" + groups\n\t\t\t\t+ \", groupid=\" + groupid + \"]\";\n\t}\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result + ((group == null) ? 0 : group.hashCode());\n\t\tresult = prime * result + ((groupid == null) ? 0 : groupid.hashCode());\n\t\tresult = prime * result + ((groups == null) ? 0 : groups.hashCode());\n\t\treturn result;\n\t}\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tResultMapper other = (ResultMapper) obj;\n\t\tif (group == null) {\n\t\t\tif (other.group != null)\n\t\t\t\treturn false;\n\t\t} else if (!group.equals(other.group))\n\t\t\treturn false;\n\t\tif (groupid == null) {\n\t\t\tif (other.groupid != null)\n\t\t\t\treturn false;\n\t\t} else if (!groupid.equals(other.groupid))\n\t\t\treturn false;\n\t\tif (groups == null) {\n\t\t\tif (other.groups != null)\n\t\t\t\treturn false;\n\t\t} else if (!groups.equals(other.groups))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\t\n\t\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/WxUserService.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service;\n\nimport static org.hamster.weixinmp.util.WxUtil.getAccessTokenParams;\nimport static org.hamster.weixinmp.util.WxUtil.sendRequest;\n\nimport java.util.Map;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.user.WxUserEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.user.WxUserGetJson;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Dec 31, 2013\n * \n */\n@Service\npublic class WxUserService {\n\n\t@Autowired\n\tprivate WxConfig config;\n\n\tpublic WxUserEntity remoteUserInfo(String accessToken, String openId) throws WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\t\tparams.put(\"openid\", openId);\n\t\treturn sendRequest(config.getUserInfoUrl(), HttpMethod.GET,\n\t\t\t\tparams, null, WxUserEntity.class);\n \t}\n\t\n\tpublic WxUserGetJson remoteUserGet(String accessToken, String nextOpenId) throws WxException {\n\t\tMap<String, String> params = getAccessTokenParams(accessToken);\n\t\tif (!StringUtils.isBlank(nextOpenId)) {\n\t\t\tparams.put(\"next_openid\", nextOpenId);\n\t\t}\n\t\treturn sendRequest(config.getUserGetUrl(), HttpMethod.GET,\n\t\t\t\tparams, null, WxUserGetJson.class);\n\t}\n\t\n\tpublic WxUserGetJson remoteUserGet(String accessToken) throws WxException {\n\t\treturn remoteUserGet(accessToken, \"\");\n\t}\n}"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/service/handler/WxMessageHandlerIfc.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.service.handler;\n\nimport java.util.Map;\n\nimport org.hamster.weixinmp.constant.WxMsgTypeEnum;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic interface WxMessageHandlerIfc {\n\t\n\tWxMsgTypeEnum[] listIntetestedMessageType();\n\t\n\tWxBaseRespEntity handle(WxBaseMsgEntity msg, Map<String, Object> context);\n\t\n\tInteger priority();\n}\n"
  },
  {
    "path": "src/main/java/org/hamster/weixinmp/util/WxUtil.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.util;\n\nimport java.io.IOException;\nimport java.net.URISyntaxException;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.apache.http.Consts;\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.methods.HttpPost;\nimport org.apache.http.client.methods.HttpRequestBase;\nimport org.apache.http.client.utils.URIBuilder;\nimport org.apache.http.entity.StringEntity;\nimport org.apache.http.impl.client.HttpClientBuilder;\nimport org.apache.http.util.EntityUtils;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.WxRespCode;\nimport org.springframework.http.HttpMethod;\n\nimport com.google.gson.Gson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\npublic class WxUtil {\n\n\tprivate WxUtil() {\n\t}\n\n\tpublic static final Long currentTimeInSec() {\n\t\treturn Long.valueOf(new Date().getTime() / 1000);\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static final <T> T sendRequest(String url, HttpMethod method,\n\t\t\tMap<String, String> params, HttpEntity requestEntity,\n\t\t\tClass<T> resultClass) throws WxException {\n\t\tHttpClient client = HttpClientBuilder.create().build();\n\t\tHttpRequestBase request = null;\n\n\t\ttry {\n\t\t\tif (HttpMethod.GET.equals(method)) {\n\t\t\t\trequest = new HttpGet();\n\t\t\t} else if (HttpMethod.POST.equals(method)) {\n\t\t\t\trequest = new HttpPost();\n\t\t\t\tif (requestEntity != null) {\n\t\t\t\t\t((HttpPost) request).setEntity(requestEntity);\n\t\t\t\t}\n\t\t\t}\n\t\t\tURIBuilder builder = new URIBuilder(url);\n\n\t\t\tif (params != null) {\n\t\t\t\tfor (Map.Entry<String, String> entry : params.entrySet()) {\n\t\t\t\t\tbuilder.addParameter(entry.getKey(), entry.getValue());\n\t\t\t\t}\n\t\t\t}\n\t\t\trequest.setURI(builder.build());\n\n\t\t\tHttpResponse response = client.execute(request);\n\t\t\tHttpEntity entity = response.getEntity();\n\t\t\tString respBody = EntityUtils.toString(entity);\n\t\t\tif (entity != null) {\n\t\t\t\tEntityUtils.consume(entity);\n\t\t\t}\n\n\t\t\tif (String.class.isAssignableFrom(resultClass)) {\n\t\t\t\treturn (T) respBody;\n\t\t\t} else {\n\t\t\t\tGson gson = new Gson();\n\n\t\t\t\tif (respBody.indexOf(\"{\\\"errcode\\\"\") == 0\n\t\t\t\t\t\t|| respBody.indexOf(\"{\\\"errmsg\\\"\") == 0) {\n\t\t\t\t\tWxRespCode exJson = gson.fromJson(respBody,\n\t\t\t\t\t\t\tWxRespCode.class);\n\t\t\t\t\tif (WxRespCode.class.getName().equals(\n\t\t\t\t\t\t\tresultClass.getName())\n\t\t\t\t\t\t\t&& exJson.getErrcode() == 0) {\n\t\t\t\t\t\treturn (T) exJson;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new WxException(exJson);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tT result = gson.fromJson(respBody, resultClass);\n\t\t\t\tif (result instanceof WxBaseEntity) {\n\t\t\t\t\t((WxBaseEntity) result).setCreatedDate(new Date());\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t} catch (IOException e) {\n\t\t\tthrow new WxException(e);\n\t\t} catch (URISyntaxException e) {\n\t\t\tthrow new WxException(e);\n\t\t}\n\t}\n\n\tpublic static StringEntity toJsonStringEntity(Object obj) {\n\t\tGson gson = new Gson();\n\t\treturn new StringEntity(gson.toJson(obj), Consts.UTF_8);\n\t}\n\n\tpublic static Map<String, String> getAccessTokenParams(String accessToken) {\n\t\tMap<String, String> result = new HashMap<String, String>();\n\t\tresult.put(\"access_token\", accessToken);\n\t\treturn result;\n\t}\n\n\tpublic static String getParameterizedUrl(String url, String... args) {\n\t\tString result = url;\n\t\tfor (int i = 0; i < args.length; i += 2) {\n\t\t\tString p = args[i];\n\t\t\tString v = args[i + 1];\n\t\t\tresult = result.replaceAll(p, v);\n\t\t}\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/resources/applicationContext-weixinmp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txmlns:context=\"http://www.springframework.org/schema/context\" xmlns:jdbc=\"http://www.springframework.org/schema/jdbc\"  \r\n\txmlns:jee=\"http://www.springframework.org/schema/jee\" xmlns:tx=\"http://www.springframework.org/schema/tx\"\r\n\txmlns:jpa=\"http://www.springframework.org/schema/data/jpa\"\r\n\txmlns:util=\"http://www.springframework.org/schema/util\"\r\n\txsi:schemaLocation=\"\r\n\t\thttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd\"\r\n\tdefault-lazy-init=\"true\">\r\n\r\n\t<description>WX Service Configration</description>\r\n\t\r\n\t\t<util:properties id=\"wxProperties\"\r\n\t\tlocation=\"classpath:/wx.properties\" />\r\n\r\n\t<!-- scan service class with @components -->\r\n\t<context:component-scan base-package=\"org.hamster.weixinmp\" />\r\n</beans>"
  },
  {
    "path": "src/main/resources/wx.properties",
    "content": "#(optional)override jdbc url for local development\njdbc.driver=com.mysql.jdbc.Driver\njdbc.url=jdbc\\:mysql\\://localhost\\:3306/XXXXXX?useUnicode\\=true&characterEncoding\\=UTF-8\njdbc.username=\njdbc.password=\n\nwx_token=\nwx_appid=\nwx_appsecret=\n\nwx_menu_create_url=https://api.weixin.qq.com/cgi-bin/menu/create\nwx_menu_get_url=https://api.weixin.qq.com/cgi-bin/menu/get\n#?access_token=ACCESS_TOKEN\nwx_menu_delete_url=https://api.weixin.qq.com/cgi-bin/menu/delete\n#?access_token=ACCESS_TOKEN\n\nwx_media_upload_url=http://file.api.weixin.qq.com/cgi-bin/media/upload\n#?access_token=ACCESS_TOKEN&type=TYPE\n\nwx_qrcode_create_url=https://api.weixin.qq.com/cgi-bin/qrcode/create\n#?access_token=TOKEN\nwx_showqrcode_url=https://mp.weixin.qq.com/cgi-bin/showqrcode\n#?ticket=TICKET\n\nwx_user_info_url=https://api.weixin.qq.com/cgi-bin/user/info\n#?access_token=ACCESS_TOKEN&openid=OPENID\nwx_user_get_url=https://api.weixin.qq.com/cgi-bin/user/get\n#?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID\n\n\nwx_access_token_create_url=https://api.weixin.qq.com/cgi-bin/token\n#?grant_type=client_credential&appid=APPID&secret=APPSECRET\nwx_custom_send_url=https://api.weixin.qq.com/cgi-bin/message/custom/send\n#?access_token=ACCESS_TOKEN\n\nwx_groups_create_url=https://api.weixin.qq.com/cgi-bin/groups/create\n#?access_token=ACCESS_TOKEN\nwx_groups_get_url=https://api.weixin.qq.com/cgi-bin/groups/get\n#?access_token=ACCESS_TOKEN\nwx_groups_getid_url=https://api.weixin.qq.com/cgi-bin/groups/getid\n#?access_token=ACCESS_TOKEN\nwx_groups_update_url=https://api.weixin.qq.com/cgi-bin/groups/update\n#?access_token=ACCESS_TOKEN\nwx_groups_members_update_url=https://api.weixin.qq.com/cgi-bin/groups/members/update\n#?access_token=ACCESS_TOKEN\n"
  },
  {
    "path": "src/main/webapp/META-INF/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\r\nClass-Path: \r\n\r\n"
  },
  {
    "path": "src/main/webapp/MyHtml.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n  <head>\r\n    <title>MyHtml.html</title>\r\n\t\r\n    <meta name=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n    <meta name=\"description\" content=\"this is my page\">\r\n    <meta name=\"content-type\" content=\"text/html; charset=UTF-8\">\r\n    \r\n    <!--<link rel=\"stylesheet\" type=\"text/css\" href=\"./styles.css\">-->\r\n\r\n  </head>\r\n  \r\n  <body>\r\n    This is my HTML page. <br>\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "src/main/webapp/WEB-INF/classes/weixin/popular/example/pay_example.jsp.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\"  pageEncoding=\"UTF-8\"%>\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n<title>pay js example</title>\r\n<script type=\"text/javascript\">\r\n//json 数据\r\nvar x_json = ${json};\r\nfunction pay(){\r\n\tWeixinJSBridge.invoke('getBrandWCPayRequest',x_json,function(res){\r\n\t\tif(res.err_msg == 'get_brand_wcpay_request:ok'){\r\n\t\t\t//支付成功，可以做跳转到支付成功的提示页面\r\n\t\t}else{\r\n\t\t\t//支付失败\r\n\t\t\talert(res.err_msg);\r\n\t\t}\r\n\t});\r\n}\r\n</script>\r\n</head>\r\n<body>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app version=\"2.5\" xmlns=\"http://java.sun.com/xml/ns/javaee\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \n\thttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\">\n\t<!-- spring -->\n\t<listener>\n\t\t<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n\t</listener>\t\n\t<context-param>\n\t\t<param-name>contextConfigLocation</param-name>\n\t\t<param-value>classpath*:applicationContext*.xml</param-value>\n\t</context-param>\n\t<session-config>\n\t\t<session-timeout>30</session-timeout>\n\t</session-config>\n\t\n\t<!-- springmvc -->\n\t<servlet>\n\t\t<servlet-name>springmvc</servlet-name>\n\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n\t\t<init-param>\n\t\t\t<param-name>contextConfigLocation</param-name>\n\t\t\t<param-value>classpath*:applicationContext*.xml</param-value>\n\t\t</init-param>\n\t\t<load-on-startup>1</load-on-startup>\n\t</servlet>\t\n\t<servlet-mapping>\n\t\t<servlet-name>springmvc</servlet-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</servlet-mapping>\n\t<filter>\n\t\t<filter-name>encodingFilter</filter-name>\n\t\t<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n\t\t<init-param>\n\t\t\t<param-name>encoding</param-name>\n\t\t\t<param-value>UTF-8</param-value>\n\t\t</init-param>\n\t\t<init-param>\n\t\t\t<param-name>forceEncoding</param-name>\n\t\t\t<param-value>true</param-value>\n\t\t</init-param>\n\t</filter>\n\t<filter-mapping>\n\t\t<filter-name>encodingFilter</filter-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</filter-mapping>\n\t<welcome-file-list>\n\t\t<welcome-file>/default/index.html</welcome-file>\n\t</welcome-file-list>\n</web-app>"
  },
  {
    "path": "src/main/webapp/default/index.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n  <head>\r\n    <title>MyHtml.html</title>\r\n\t\r\n    <meta name=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n    <meta name=\"description\" content=\"this is my page\">\r\n    <meta name=\"content-type\" content=\"text/html; charset=UTF-8\">\r\n    \r\n    <!--<link rel=\"stylesheet\" type=\"text/css\" href=\"./styles.css\">-->\r\n\r\n  </head>\r\n  \r\n  <body>\r\n    This is my HTML page. <br>\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "src/main/webapp/index.jsp",
    "content": "<html>\n<body>\n<h2>Hello World!</h2>\n</body>\n</html>\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/base/AbstractServiceTest.java",
    "content": "package org.hamster.weixinmp.test.base;\n\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Mar 8, 2013 3:51:14 PM Change set\n */\n@ContextConfiguration(locations = { \"file:src/test/resources/applicationContext-test-weixinmp.xml\"})\npublic abstract class AbstractServiceTest extends AbstractJUnit4SpringContextTests {\n\n\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/base/AbstractWxServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.base;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.util.Date;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.hamster.weixinmp.config.WxConfig;\nimport org.hamster.weixinmp.dao.entity.auth.WxAuth;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.junit.Before;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n * \n */\npublic abstract class AbstractWxServiceTest extends AbstractServiceTest {\n\t\n\tpublic static final String TEST_FOLDER = \"src/test/resources/tmp\";\n\tpublic static final String ACCESS_TOKEN_FILE = TEST_FOLDER + \"/accessToken.txt\";\n\n\t\n\tprotected String accessToken;\n\t\n\t@Autowired\n\tWxConfig config;\n\t\n\t@Autowired\n\tWxAuthService authService;\n\t\n\t@Before\n\tpublic void setUp() throws WxException, IOException {\n\t\tif (StringUtils.isBlank(accessToken)) {\n\t\t\tFile testConfigFile = new File(ACCESS_TOKEN_FILE);\n\t\t\tDate currentDate = new Date();\n\t\t\tif (!testConfigFile.exists() || currentDate.getTime() - testConfigFile.lastModified() > 86400000) {\n\t\t\t\tWxAuth auth = authService.getAccessToken(config.getAppid(), config.getAppsecret());\n\t\t\t\tthis.accessToken = auth.getAccessToken();\n\t\t\t\tnew File(TEST_FOLDER).mkdirs();\n\t\t\t\tFileWriter writer = new FileWriter(ACCESS_TOKEN_FILE);\n\t\t\t\twriter.write(accessToken);\n\t\t\t\twriter.flush();\n\t\t\t\twriter.close();\n\t\t\t} else {\n\t\t\t\tBufferedReader reader = new BufferedReader(new FileReader(ACCESS_TOKEN_FILE));\n\t\t\t\tthis.accessToken = reader.readLine();\n\t\t\t\treader.close();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/controller/WxControllerManualTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.controller;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apache.commons.io.IOUtils;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.NameValuePair;\nimport org.apache.http.client.ClientProtocolException;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.StringEntity;\nimport org.apache.http.impl.client.HttpClientBuilder;\nimport org.apache.http.message.BasicNameValuePair;\nimport org.hamster.weixinmp.test.xml.WxXMLUtilTest;\nimport org.junit.Ignore;\nimport org.junit.Test;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 30, 2013\n */\npublic class WxControllerManualTest {\n\t\n\tpublic static final String WX_URL = \"http://localhost:8080/rest/weixinmp\";\n\t\n\t@Test \n\t@Ignore\n\tpublic void testPostMsgText() throws ClientProtocolException, IOException {\n\t\tHttpClient httpclient = HttpClientBuilder.create().build();\n\t\tHttpPost httppost = new HttpPost(WX_URL);\n\n\t\t// Request parameters and other properties.\n\t\tList<NameValuePair> params = new ArrayList<NameValuePair>(2);\n\t\tparams.add(new BasicNameValuePair(\"signature\", \"38f004a5f222473f3abd85fd8e4b1de2349119c6\"));\n\t\tparams.add(new BasicNameValuePair(\"timestamp\", \"1375192987\"));\n\t\tparams.add(new BasicNameValuePair(\"nonce\", \"1374785014\"));\n\t\t\n\t\thttppost.setEntity(new StringEntity(WxXMLUtilTest.MSG_TEXT_XML));\n\t\t\n\t\t//Execute and get the response.\n\t\tHttpResponse response = httpclient.execute(httppost);\n\t\tHttpEntity entity = response.getEntity();\n\n\t\tif (entity != null) {\n\t\t    InputStream instream = entity.getContent();\n\t\t    try {\n\t\t    \tString result = IOUtils.toString(instream);\n\t\t    \tSystem.out.println(result);\n\t\t    } finally {\n\t\t        instream.close();\n\t\t    } \n\t\t}\n\t}\n\t\n\tpublic static final void main(String[] args) {\n\t\ttry {\n\t\t\tnew WxControllerManualTest().testPostMsgText();\n\t\t} catch (ClientProtocolException e) {\n\t\t\te.printStackTrace();\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxGroupServceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport java.util.List;\n\nimport org.hamster.weixinmp.dao.entity.user.WxGroupEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxUserGroupService;\nimport org.hamster.weixinmp.test.base.AbstractWxServiceTest;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 1, 2014\n *\n */\npublic class WxGroupServceTest extends AbstractWxServiceTest {\n\n\t@Autowired\n\tWxAuthService authService;\n\t\n\t@Autowired\n\tWxUserGroupService userGroupService;\n\t\n\t@Test\n\tpublic void testAll() throws WxException {\n\t\tWxGroupEntity newgroup = userGroupService.remoteGroupsCreate(accessToken, \"API测试组\");\n\t\tList<WxGroupEntity> groups = userGroupService.remoteGroupsGet(accessToken);\n\t\t\n\t\tboolean found = false;\n\t\tfor (WxGroupEntity group : groups) {\n\t\t\tif (group.getName().equals(newgroup.getName())) {\n\t\t\t\tfound = true;\n\t\t\t}\n\t\t}\n\t\tif (found == false) {\n\t\t\tthrow new WxException(\"not found newly created group!\"); \n\t\t}\n\t\t\n\t\tuserGroupService.remoteGroupsUpdate(accessToken, newgroup.getWxId(), \"API测试组2\");\n\t}\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxMediaServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.FileReader;\nimport java.io.IOException;\n\nimport org.apache.commons.io.IOUtils;\nimport org.hamster.weixinmp.constant.WxMediaTypeEnum;\nimport org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxMediaService;\nimport org.hamster.weixinmp.test.base.AbstractWxServiceTest;\nimport org.junit.Ignore;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\npublic class WxMediaServiceTest extends AbstractWxServiceTest {\n\n\t@Autowired\n\tWxAuthService authService;\n\n\t@Autowired\n\tWxMediaService mediaService;\n\n\t@Test\n\t@Ignore\n\tpublic void testMedia() throws WxException, FileNotFoundException, IOException {\n\t\tFile imageFile = new File(\"src/test/resources/media/cat.jpg\");\n\t\tbyte[] content = IOUtils.toByteArray(new FileReader(imageFile));\n\t\tWxItemImageEntity imageMedia = (WxItemImageEntity) mediaService\n\t\t\t\t.remoteMediaUpload(accessToken, WxMediaTypeEnum.IMAGE, content);\n\t\tSystem.out.println(imageMedia);\n\t}\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxMenuServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.menu.WxMenuCreateJson;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxMenuService;\nimport org.hamster.weixinmp.test.base.AbstractWxServiceTest;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.google.gson.Gson;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n * \n */\npublic class WxMenuServiceTest extends AbstractWxServiceTest {\n\n\tpublic static final String MENU_CREATE_JSON = \" {\" + \"\\\"button\\\":[\" + \"{\t\"\n\t\t\t+ \"    \\\"type\\\":\\\"click\\\",\" + \"   \\\"name\\\":\\\"今日歌曲\\\",\"\n\t\t\t+ \"  \\\"key\\\":\\\"V1001_TODAY_MUSIC\\\"\" + \"},\" + \"{\"\n\t\t\t+ \"    \\\"type\\\":\\\"click\\\",\" + \"   \\\"name\\\":\\\"歌手简介\\\",\"\n\t\t\t+ \"   \\\"key\\\":\\\"V1001_TODAY_SINGER\\\"\" + \"  },\" + \"  {\"\n\t\t\t+ \"       \\\"name\\\":\\\"菜单\\\",\" + \"       \\\"sub_button\\\":[\"\n\t\t\t+ \"      {\t\" + \"          \\\"type\\\":\\\"view\\\",\"\n\t\t\t+ \"         \\\"name\\\":\\\"搜索\\\",\"\n\t\t\t+ \"        \\\"url\\\":\\\"http://www.soso.com/\\\"\" + \"    },\" + \"   {\"\n\t\t\t+ \"     \\\"type\\\":\\\"view\\\",\" + \"    \\\"name\\\":\\\"视频\\\",\"\n\t\t\t+ \"   \\\"url\\\":\\\"http://v.qq.com/\\\"\" + \"    },\" + \"   {\"\n\t\t\t+ \"     \\\"type\\\":\\\"click\\\",\" + \"    \\\"name\\\":\\\"赞一下我们\\\",\"\n\t\t\t+ \"   \\\"key\\\":\\\"V1001_GOOD\\\"\" + \" }]\" + \"}]\" + \"}\";\n\n\t@Autowired\n\tWxAuthService authService;\n\t@Autowired\n\tWxMenuService menuService;\n\n\t@Test\n\tpublic void testAll() throws WxException {\n\t\tGson gson = new Gson();\n\t\tWxMenuCreateJson dummyJson = gson.fromJson(MENU_CREATE_JSON,\n\t\t\t\tWxMenuCreateJson.class);\n\n\t\tmenuService.menuCreate(accessToken, dummyJson.getButton());\n\n\t\tSystem.out.println(menuService.menuGet(accessToken));\n\n\t\tmenuService.menuDelete(accessToken);\n\t}\n\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxQrServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxQrService;\nimport org.hamster.weixinmp.test.base.AbstractWxServiceTest;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 5, 2014\n *\n */\npublic class WxQrServiceTest extends AbstractWxServiceTest {\n\n\t@Autowired\n\tWxAuthService authService;\n\t\n\t@Autowired\n\tWxQrService qrService;\n\t\n\t@Test\n\tpublic void testAll() throws WxException {\n\t\tqrService.remoteQrcodeCreate(accessToken, true, 10000l, 1800l);\n\t\tqrService.remoteQrcodeCreate(accessToken, false, 500l, null);\n\t}\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport org.hamster.weixinmp.dao.repository.msg.WxBaseMsgDao;\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.test.base.AbstractServiceTest;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\npublic class WxServiceTest extends AbstractServiceTest {\n\n\t@Autowired\n\tWxAuthService authService;\n\t\n\t@Autowired\n\tWxBaseMsgDao wxBaseMsgDao;\n\n\t@Test\n\tpublic void testValidateAuth() throws WxException {\n\t\tAssert.assertTrue(authService.validateAuth(\n\t\t\t\t\"9d31490b4386ad3bb9bbb8ac5150fb3e6230c171\",\n\t\t\t\t\"1375112572\", \"1375102247\",\n\t\t\t\t\"5906019193781128573\"));\n\t}\n\t\n\tpublic static final String MSG_LOC_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[fromUser]]></FromUserName>\"\n\t\t\t+ \"<CreateTime>1351776360</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[location]]></MsgType>\"\n\t\t\t+ \"<Location_X>23.134521</Location_X>\"\n\t\t\t+ \"<Location_Y>113.358803</Location_Y>\" \n\t\t\t+ \"<Scale>20</Scale>\"\n\t\t\t+ \"<Label><![CDATA[位置信息]]></Label>\"\n\t\t\t+ \"<MsgId>1234567890123456</MsgId>\" + \"</xml> \";\n\t\n//\t@Test\n//\tpublic void testMessageStorage() throws WxException, DocumentException {\n//\t\twxService.saveMsgLoc(WxXmlUtil.toXML(MSG_LOC_XML));\n//\t\tIterable<WxBaseMsgEntity> msgs = wxBaseMsgDao.findAll();\n//\t\tfor (WxBaseMsgEntity msg : msgs) {\n//\t\t\tSystem.out.println(msg.toString());\n//\t\t}\n//\t}\n//\t\n//\t@Test\n//\tpublic void testCreateRespText() throws DocumentException {\n//\t\tWxRespTextEntity respText = wxService.createRespText(\"this is a content\", \"foo\", \"bar\", 0);\n//\t\tWxXmlUtil.getRespTextXML(respText);\n//\t}\n\t\n\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/service/WxUserServiceTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.service;\n\nimport org.hamster.weixinmp.exception.WxException;\nimport org.hamster.weixinmp.model.user.WxUserGetJson;\nimport org.hamster.weixinmp.service.WxAuthService;\nimport org.hamster.weixinmp.service.WxUserService;\nimport org.hamster.weixinmp.test.base.AbstractWxServiceTest;\nimport org.junit.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jan 4, 2014\n *\n */\npublic class WxUserServiceTest extends AbstractWxServiceTest {\n\n\t@Autowired\n\tWxAuthService authService;\n\t@Autowired\n\tWxUserService userService;\n\t\n\t@Test\n\tpublic void testAll() throws WxException {\n\t\tWxUserGetJson userGet = userService.remoteUserGet(accessToken);\n\t\tSystem.out.println(userGet);\n\t}\n}\n"
  },
  {
    "path": "src/test/java/org/hamster/weixinmp/test/xml/WxXMLUtilTest.java",
    "content": "/**\n * \n */\npackage org.hamster.weixinmp.test.xml;\n\nimport org.dom4j.DocumentException;\nimport org.hamster.weixinmp.controller.util.WxXmlUtil;\nimport org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;\nimport org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;\nimport org.junit.Assert;\nimport org.junit.Test;\n\n\n/**\n * @author honey.zhao@aliyun.com\n * @version Jul 28, 2013\n * \n */\npublic class WxXMLUtilTest {\n\n\tpublic static final String MSG_TEXT_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[fromUser]]></FromUserName> \"\n\t\t\t+ \"<CreateTime>1348831860</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[text]]></MsgType>\"\n\t\t\t+ \"<Content><![CDATA[this is a test]]></Content>\"\n\t\t\t+ \"<MsgId>1234567890123456</MsgId>\" + \"</xml>\";\n\t\n\t@Test\n\tpublic void testGetMsgText() throws DocumentException {\n\t\tWxMsgTextEntity msgText = WxXmlUtil.getMsgText(WxXmlUtil.toXML(MSG_TEXT_XML));\n\t\tassertBaseFieldsWithMsgId(msgText);\n\t\tAssert.assertEquals(\"this is a test\", msgText.getContent());\n\t}\n\t\n\tpublic static final String MSG_IMG_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[fromUser]]></FromUserName>\"\n\t\t\t+ \"<CreateTime>1348831860</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[image]]></MsgType>\"\n\t\t\t+ \"<PicUrl><![CDATA[this is a url]]></PicUrl>\"\n\t\t\t+ \"<MediaId><![CDATA[media_id]]></MediaId>\"\n\t\t\t+ \"<MsgId>1234567890123456</MsgId>\" + \"</xml>\";\n\t\n\t@Test\n\tpublic void testGetMsgImg() throws DocumentException {\n\t\tWxMsgImageEntity msgImg = WxXmlUtil.getMsgImage(WxXmlUtil.toXML(MSG_IMG_XML));\n\t\tassertBaseFieldsWithMsgId(msgImg);\n\t\t//Assert.assertEquals(\"this is a url\", msgImg.getImage().getPicUrl());\n\t}\n\t\n\tpublic static final String MSG_LOC_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[fromUser]]></FromUserName>\"\n\t\t\t+ \"<CreateTime>1351776360</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[location]]></MsgType>\"\n\t\t\t+ \"<Location_X>23.134521</Location_X>\"\n\t\t\t+ \"<Location_Y>113.358803</Location_Y>\" \n\t\t\t+ \"<Scale>20</Scale>\"\n\t\t\t+ \"<Label><![CDATA[位置信息]]></Label>\"\n\t\t\t+ \"<MsgId>1234567890123456</MsgId>\" + \"</xml> \";\n\t\n\t@Test\n\tpublic void testGetMsgLoc() throws DocumentException {\n\t\tWxMsgLocEntity msgLoc = WxXmlUtil.getMsgLoc(WxXmlUtil.toXML(MSG_LOC_XML));\n\t\tassertBaseFieldsWithMsgId(msgLoc);\n\t\tAssert.assertEquals(Double.valueOf(23.134521d), msgLoc.getLocationX());\n\t\tAssert.assertEquals(Double.valueOf(113.358803d), msgLoc.getLocationY());\n\t\tAssert.assertEquals(Double.valueOf(20), msgLoc.getScale());\n\t\tAssert.assertEquals(\"位置信息\", msgLoc.getLabel());\n\t}\n\t\n\tpublic static final String MSG_LINK_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[fromUser]]></FromUserName>\"\n\t\t\t+ \"<CreateTime>1351776360</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[link]]></MsgType>\"\n\t\t\t+ \"<Title><![CDATA[公众平台官网链接]]></Title>\"\n\t\t\t+ \"<Description><![CDATA[公众平台官网链接123]]></Description>\"\n\t\t\t+ \"<Url><![CDATA[url]]></Url>\" + \"<MsgId>1234567890123456</MsgId>\"\n\t\t\t+ \"</xml> \";\n\t\n\t@Test\n\tpublic void testGetMsgLink() throws DocumentException {\n\t\tWxMsgLinkEntity msgLink = WxXmlUtil.getMsgLink(WxXmlUtil.toXML(MSG_LINK_XML));\n\t\tassertBaseFieldsWithMsgId(msgLink);\n\t\tAssert.assertEquals(\"公众平台官网链接\", msgLink.getTitle());\n\t\tAssert.assertEquals(\"公众平台官网链接123\", msgLink.getDescription());\n\t\tAssert.assertEquals(\"url\", msgLink.getUrl());\n\t}\n\t\n\tpublic static final String MSG_EVENT_XML = \"<xml>\"\n\t\t\t+ \"<ToUserName><![CDATA[toUser]]></ToUserName>\"\n\t\t\t+ \"<FromUserName><![CDATA[FromUser]]></FromUserName>\"\n\t\t\t+ \"<CreateTime>123456789</CreateTime>\"\n\t\t\t+ \"<MsgType><![CDATA[event]]></MsgType>\"\n\t\t\t+ \"<Event><![CDATA[EVENT]]></Event>\"\n\t\t\t+ \"<EventKey><![CDATA[EVENTKEY]]></EventKey>\" + \"</xml>\";\n\t\n\t@Test\n\tpublic void testGetMsgEvent() throws DocumentException {\n\t\tWxMsgEventEntity msgEvent = WxXmlUtil.getMsgEvent(WxXmlUtil.toXML(MSG_EVENT_XML));\n\t\tassertBaseFields(msgEvent);\n\t\tAssert.assertEquals(\"EVENT\", msgEvent.getEvent());\n\t\tAssert.assertEquals(\"EVENTKEY\", msgEvent.getEventKey());\n\t}\n\t\n\tprivate void assertBaseFields(WxBaseMsgEntity entity) {\n\t\tAssert.assertNotNull(entity.getFromUserName()); \n\t\tAssert.assertNotNull(entity.getToUserName()); \n\t\tAssert.assertNotNull(entity.getCreateTime()); \n\t\tAssert.assertNotNull(entity.getMsgType()); \n\t}\n\t\n\tprivate void assertBaseFieldsWithMsgId(WxBaseMsgEntity entity) {\n\t\tassertBaseFields(entity);\n\t\tAssert.assertNotNull(entity.getMsgId()); \n\t}\n\n}\n"
  },
  {
    "path": "src/test/resources/.gitignore",
    "content": "/tmp\n"
  },
  {
    "path": "src/test/resources/application.development.properties",
    "content": "#(optional)override jdbc url for local development\njdbc.driver=com.mysql.jdbc.Driver\njdbc.url=\njdbc.username=\njdbc.password=\n\nwx_token=\nwx_appid=\nwx_appsecret=\n\nwx_menu_create_url=https://api.weixin.qq.com/cgi-bin/menu/create\nwx_menu_get_url=https://api.weixin.qq.com/cgi-bin/menu/get\n#?access_token=ACCESS_TOKEN\nwx_menu_delete_url=https://api.weixin.qq.com/cgi-bin/menu/delete\n#?access_token=ACCESS_TOKEN\n\nwx_media_upload_url=http://file.api.weixin.qq.com/cgi-bin/media/upload\n#?access_token=ACCESS_TOKEN&type=TYPE\n\nwx_qrcode_create_url=https://api.weixin.qq.com/cgi-bin/qrcode/create\n#?access_token=TOKEN\nwx_showqrcode_url=https://mp.weixin.qq.com/cgi-bin/showqrcode\n#?ticket=TICKET\n\nwx_user_info_url=https://api.weixin.qq.com/cgi-bin/user/info\n#?access_token=ACCESS_TOKEN&openid=OPENID\nwx_user_get_url=https://api.weixin.qq.com/cgi-bin/user/get\n#?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID\n\n\nwx_access_token_create_url=https://api.weixin.qq.com/cgi-bin/token\n#?grant_type=client_credential&appid=APPID&secret=APPSECRET\nwx_custom_send_url=https://api.weixin.qq.com/cgi-bin/message/custom/send\n#?access_token=ACCESS_TOKEN\n\nwx_groups_create_url=https://api.weixin.qq.com/cgi-bin/groups/create\n#?access_token=ACCESS_TOKEN\nwx_groups_get_url=https://api.weixin.qq.com/cgi-bin/groups/get\n#?access_token=ACCESS_TOKEN\nwx_groups_getid_url=https://api.weixin.qq.com/cgi-bin/groups/getid\n#?access_token=ACCESS_TOKEN\nwx_groups_update_url=https://api.weixin.qq.com/cgi-bin/groups/update\n#?access_token=ACCESS_TOKEN\nwx_groups_members_update_url=https://api.weixin.qq.com/cgi-bin/groups/members/update\n#?access_token=ACCESS_TOKEN\n"
  },
  {
    "path": "src/test/resources/applicationContext-test-weixinmp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:context=\"http://www.springframework.org/schema/context\"\r\n\txmlns:jdbc=\"http://www.springframework.org/schema/jdbc\" xmlns:jee=\"http://www.springframework.org/schema/jee\"\r\n\txmlns:tx=\"http://www.springframework.org/schema/tx\" xmlns:jpa=\"http://www.springframework.org/schema/data/jpa\"\r\n\txmlns:util=\"http://www.springframework.org/schema/util\"\r\n\txsi:schemaLocation=\"\r\n\t\thttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd\r\n\t\thttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd\">\r\n\r\n\t<description>Weixin-MP Testing Configuration</description>\r\n\r\n\t<util:properties id=\"wxProperties\"\r\n\t\tlocation=\"classpath:/application.development.properties\" />\r\n\r\n\t<bean\r\n\t\tclass=\"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer\">\r\n\t\t<property name=\"locations\">\r\n\t\t\t<list>\r\n\t\t\t\t<value>classpath:/application.development.properties</value>\r\n\t\t\t</list>\r\n\t\t</property>\r\n\t</bean>\r\n\r\n\t<!-- scan service class with @components -->\r\n\t<context:annotation-config />\r\n\t<context:component-scan base-package=\"org.hamster\" />\r\n\r\n\t<tx:annotation-driven transaction-manager=\"transactionManager\" />\r\n\t<bean id=\"transactionManager\" class=\"org.springframework.orm.jpa.JpaTransactionManager\">\r\n\t\t<property name=\"entityManagerFactory\" ref=\"entityManagerFactory\"></property>\r\n\t</bean>\r\n\r\n\t<bean id=\"entityManagerFactory\"\r\n\t\tclass=\"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean\">\r\n\t\t<property name=\"dataSource\" ref=\"dataSource\" />\r\n\t\t<property name=\"packagesToScan\" value=\"org.hamster.weixinmp.dao\" />\r\n\t\t<property name=\"jpaVendorAdapter\">\r\n\t\t\t<bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter\" />\r\n\t\t</property>\r\n\t\t<property name=\"jpaDialect\">\r\n\t\t\t<bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaDialect\" />\r\n\t\t</property>\r\n\t\t<property name=\"jpaProperties\">\r\n\t\t\t<props>\r\n\t\t\t\t<prop key=\"hibernate.ejb.naming_strategy\">org.hibernate.cfg.ImprovedNamingStrategy</prop>\r\n\t\t\t\t<prop key=\"hibernate.hbm2ddl.auto\">create</prop>\r\n\t\t\t\t<prop key=\"hibernate.show_sql\">false</prop>\r\n\t\t\t\t<prop key=\"hibernate.format_sql\">false</prop>\r\n\t\t\t</props>\r\n\t\t</property>\r\n\t</bean>\r\n\r\n\t<jpa:repositories base-package=\"org.hamster.weixinmp.dao\"\r\n\t\tentity-manager-factory-ref=\"entityManagerFactory\"\r\n\t\ttransaction-manager-ref=\"transactionManager\" repository-impl-postfix=\"Impl\" />\r\n\r\n\t<!-- datasource -->\r\n\t<bean id=\"dataSource\"\r\n\t\tclass=\"org.springframework.jdbc.datasource.SimpleDriverDataSource\">\r\n\t\t<property name=\"driverClass\" value=\"${jdbc.driver}\" />\r\n\t\t<property name=\"url\" value=\"${jdbc.url}\" />\r\n\t\t<property name=\"username\" value=\"${jdbc.username}\" />\r\n\t\t<property name=\"password\" value=\"${jdbc.password}\" />\r\n\t</bean>\r\n</beans>"
  },
  {
    "path": "src/test/resources/log4j.properties",
    "content": "# Output pattern : date [thread] priority category - message\r\nlog4j.rootLogger=INFO, Console, RollingFile\r\n\r\n#Console\r\nlog4j.appender.Console=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.Console.Target=System.out\r\nlog4j.appender.Console.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n\r\n\r\n#RollingFile\r\nlog4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender\r\nlog4j.appender.RollingFile.File=logs/candc.log\r\nlog4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n\r\n\r\n#Task Configuration\r\nlog4j.appender.Task=org.apache.log4j.DailyRollingFileAppender\r\nlog4j.appender.Task.File=logs/candc-task.log\r\nlog4j.appender.Task.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.Task.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n\r\n\r\n#Project default level\r\nlog4j.logger.com.hamster=INFO\r\n\r\n#Task level\r\nlog4j.logger.com.hamster.service.task=INFO, Task\r\nlog4j.logger.com.hamster.candc.task=INFO, Task\r\n\r\n#log4jdbc\r\n#log4j.logger.jdbc.sqltiming=INFO"
  },
  {
    "path": "src/test/resources/sql/import-data.sql",
    "content": ""
  }
]