Full Code of bupt1987/JgFramework for AI

master 1bf38c4d7f4b cached
76 files
258.7 KB
65.2k tokens
677 symbols
1 requests
Download .txt
Showing preview only (297K chars total). Download the full file or copy to clipboard to get everything.
Repository: bupt1987/JgFramework
Branch: master
Commit: 1bf38c4d7f4b
Files: 76
Total size: 258.7 KB

Directory structure:
gitextract_g4i9k2tv/

├── .gitignore
├── LICENSE
├── README.md
├── default_applicationContext.xml
├── default_jgframework.properties
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── zhaidaosi/
        │           └── game/
        │               └── jgframework/
        │                   ├── Boot.java
        │                   ├── Router.java
        │                   ├── common/
        │                   │   ├── BaseAvlTree.java
        │                   │   ├── BaseDate.java
        │                   │   ├── BaseFile.java
        │                   │   ├── BaseGeneratePassword.java
        │                   │   ├── BaseIp.java
        │                   │   ├── BaseJson.java
        │                   │   ├── BaseRunTimer.java
        │                   │   ├── BaseSocket.java
        │                   │   ├── BaseString.java
        │                   │   ├── cache/
        │                   │   │   ├── BaseLocalCached.java
        │                   │   │   └── BaseMemCached.java
        │                   │   ├── encrpt/
        │                   │   │   ├── BaseDes.java
        │                   │   │   ├── BaseMd5.java
        │                   │   │   └── BaseRsa.java
        │                   │   ├── excption/
        │                   │   │   ├── BaseException.java
        │                   │   │   ├── HttpException.java
        │                   │   │   ├── IBaseException.java
        │                   │   │   └── MessageException.java
        │                   │   ├── http/
        │                   │   │   ├── BaseCookie.java
        │                   │   │   └── BaseHttp.java
        │                   │   ├── queue/
        │                   │   │   ├── BaseQueue.java
        │                   │   │   └── BaseQueueElement.java
        │                   │   ├── sdm/
        │                   │   │   ├── BaseDao.java
        │                   │   │   ├── BaseModel.java
        │                   │   │   ├── BaseService.java
        │                   │   │   ├── IBaseDao.java
        │                   │   │   └── IBaseModel.java
        │                   │   └── spring/
        │                   │       ├── AnnotationSessionFactoryBeanEx.java
        │                   │       ├── DataSourceAdvice.java
        │                   │       ├── DataSourceSwitcher.java
        │                   │       ├── DynamicDataSource.java
        │                   │       └── ServiceManager.java
        │                   ├── connector/
        │                   │   ├── AuthConnector.java
        │                   │   ├── IBaseConnector.java
        │                   │   ├── ManagerConnector.java
        │                   │   └── ServiceConnector.java
        │                   ├── handler/
        │                   │   ├── BaseHandler.java
        │                   │   ├── BaseHandlerChannel.java
        │                   │   └── IBaseHandler.java
        │                   ├── message/
        │                   │   ├── IBaseMessage.java
        │                   │   ├── InMessage.java
        │                   │   ├── MessageDecode.java
        │                   │   ├── MessageEncode.java
        │                   │   ├── OutMessage.java
        │                   │   └── WebSocketEncode.java
        │                   ├── model/
        │                   │   ├── BasePosition.java
        │                   │   ├── action/
        │                   │   │   ├── ActionManager.java
        │                   │   │   ├── BaseAction.java
        │                   │   │   └── IBaseAction.java
        │                   │   ├── area/
        │                   │   │   ├── AreaManager.java
        │                   │   │   ├── BaseArea.java
        │                   │   │   ├── BaseZone.java
        │                   │   │   └── IBaseArea.java
        │                   │   ├── entity/
        │                   │   │   ├── BaseEntity.java
        │                   │   │   ├── BaseNpc.java
        │                   │   │   ├── BasePlayer.java
        │                   │   │   ├── BasePlayerFactory.java
        │                   │   │   ├── IBaseCharacter.java
        │                   │   │   ├── IBaseEntity.java
        │                   │   │   └── IBasePlayerFactory.java
        │                   │   └── map/
        │                   │       └── IBaseMap.java
        │                   ├── rsync/
        │                   │   ├── BaseRsync.java
        │                   │   ├── IBaseRsync.java
        │                   │   └── RsyncManager.java
        │                   └── session/
        │                       ├── BaseSecretFactory.java
        │                       ├── IBaseSecretFactory.java
        │                       └── SessionManager.java
        └── resources/
            └── errorCode.properties

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.class

# Package Files #
*.jar
*.war
*.ear
.svn
/target
*.svn-base
.myeclipse/
.idea/
JgFramework.iml


================================================
FILE: LICENSE
================================================
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.



================================================
FILE: README.md
================================================
JgFramework
===========

基于Netty的强大的游戏服务器框架

特点
===
~~~
1、使用netty作为底层,性能得到保障
2、支持socket和websocket2种连接模式,可以自由选择
3、简单实用的路由,方便handler开发
4、异步无锁的数据同步
5、spring+Hibernia的自动注入和事务管理
6、mysql数据库的读写分离以及对多数据库的读写支持
7、传输数据的多样化,可以自用实现接口来实现不同的传输数据类型,现在使用的是json
8、框架自带了认证服务和管理服务,有简单的管理命令,需要telnet连接到端口(默认38080)
9、方便的ip段限制功能
10、方便设置心跳检查
11、登录方和服务端之间的认证,可通过实际接口来完成,默认使用的rsa加密传输认证码
12、性能优良的排队系统
13、丰富的工具类:memcache、redis等
14、基本游戏模块的抽象
~~~

性能测试
======
##### *测试信息*
~~~
cpu : AMD A10
内存 : 8G
测试项目 : https://github.com/bupt1987/JgWeb   
测试脚本 : src/test/java/client/TestWebSocket.java
测试方式 : 自压
~~~
##### *测试结果*
~~~
在100个登录用户,每个用户在登录完成,再init操作之后,每个用户发送100000个请求,   
得到每秒处理请求数在3.5W左右。
~~~

欢迎加入
======
如果对该系统有兴趣可以发邮件至 bupt1987@gmail.com 一起探讨,欢迎加入


例子
===
见:https://github.com/bupt1987/JgWeb


================================================
FILE: default_applicationContext.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
			http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
			http://www.springframework.org/schema/tx 
         	http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
          	http://www.springframework.org/schema/context 
          	http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          	http://www.springframework.org/schema/aop 
          	http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
          	
    <!-- 注解 -->
	<context:annotation-config/>
	<!-- 扫描包 -->
	<context:component-scan base-package="com.zhaidaosi.game.server.sdm"/>
	<!-- 代理 -->
	<aop:aspectj-autoproxy/>
	
	<context:property-placeholder location="classpath*:jdbc.properties" />

	<!-- bonecp连接池配置 -->
	<bean id="parentDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"/>


	<!-- jgframework 主数据源-->  
    <bean id="jgframeworkMasterDataSource" parent="parentDataSource">
        <property name="driverClass" value="${jgframework.master.jdbc.driverClassName}" />  
        <property name="jdbcUrl" value="${jgframework.master.jdbc.url}" />  
        <property name="username" value="${jgframework.master.jdbc.username}" />  
        <property name="password" value="${jgframework.master.jdbc.password}" />
        <property name="partitionCount" value="${jgframework.master.jdbc.partitionCount}"/>
		<property name="maxConnectionsPerPartition" value="${jgframework.master.jdbc.maxConnectionsPerPartition}"/>
		<property name="minConnectionsPerPartition" value="${jgframework.master.jdbc.minConnectionsPerPartition}"/>
		<property name="poolName" value="jgframework-master-pool"/>
		<property name="lazyInit" value="true"/>
    </bean>
    <!-- jgframework 从数据源-->  
    <bean id="jgframeworkSlaveDataSource" parent="parentDataSource">  
        <property name="driverClass" value="${jgframework.slave.jdbc.driverClassName}" />  
        <property name="jdbcUrl" value="${jgframework.slave.jdbc.url}" />  
        <property name="username" value="${jgframework.slave.jdbc.username}" />  
        <property name="password" value="${jgframework.slave.jdbc.password}"/>
        <property name="partitionCount" value="${jgframework.slave.jdbc.partitionCount}"/>
		<property name="maxConnectionsPerPartition" value="${jgframework.slave.jdbc.maxConnectionsPerPartition}"/>
		<property name="minConnectionsPerPartition" value="${jgframework.slave.jdbc.minConnectionsPerPartition}"/> 
		<property name="poolName" value="jgframework-slave-pool"/>
    </bean>	
    
    <!-- cronweb 主数据源-->  
    <bean id="cronwebMasterDataSource" parent="parentDataSource">
        <property name="driverClass" value="${cronweb.master.jdbc.driverClassName}" />  
        <property name="jdbcUrl" value="${cronweb.master.jdbc.url}" />  
        <property name="username" value="${cronweb.master.jdbc.username}" />  
        <property name="password" value="${cronweb.master.jdbc.password}" />
        <property name="partitionCount" value="${cronweb.master.jdbc.partitionCount}"/>
		<property name="maxConnectionsPerPartition" value="${cronweb.master.jdbc.maxConnectionsPerPartition}"/>
		<property name="minConnectionsPerPartition" value="${cronweb.master.jdbc.minConnectionsPerPartition}"/>
		<property name="poolName" value="cronweb-master-pool"/>
		<property name="lazyInit" value="true"/>
    </bean> 
    <!-- cronweb 从数据源-->  
    <bean id="cronwebSlaveDataSource" parent="parentDataSource">  
        <property name="driverClass" value="${cronweb.slave.jdbc.driverClassName}" />  
        <property name="jdbcUrl" value="${cronweb.slave.jdbc.url}" />  
        <property name="username" value="${cronweb.slave.jdbc.username}" />  
        <property name="password" value="${cronweb.slave.jdbc.password}"/>
        <property name="partitionCount" value="${cronweb.slave.jdbc.partitionCount}"/>
		<property name="maxConnectionsPerPartition" value="${cronweb.slave.jdbc.maxConnectionsPerPartition}"/>
		<property name="minConnectionsPerPartition" value="${cronweb.slave.jdbc.minConnectionsPerPartition}"/> 
		<property name="poolName" value="cronweb-slave-pool"/>
    </bean>

	<bean id="dataSource" class="com.zhaidaosi.game.jgframework.common.spring.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry key="cronweb-master" value-ref="cronwebMasterDataSource" />
                <entry key="cronweb-slave" value-ref="cronwebSlaveDataSource" /> 
                <entry key="jgframework-master" value-ref="jgframeworkMasterDataSource" />
                <entry key="jgframework-slave" value-ref="jgframeworkSlaveDataSource" /> 
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="jgframeworkSlaveDataSource" />  
        <property name="defaultDatabase" value="jgframework"/>
    </bean> 
    
	
	<!-- 自己定义的扫描模型类 -->
	<bean id="sessionFactory" class="com.zhaidaosi.game.jgframework.common.spring.AnnotationSessionFactoryBeanEx">
		<property name="dataSource" ref="dataSource"/>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
				<prop key="hibernate.show_sql">false</prop>
    			<prop key="hibernate.hbm2ddl.auto">none</prop><!-- update -->
			</props>
		</property>
		<property name="annotatedClassesLocations">  
            <list>  
                <value>classpath*:com/zhaidaosi/game/server/sdm/model/*.class</value>  
            </list>  
        </property>
	</bean>

	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

	<!-- 定义事务管理器 -->
	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 加载事务驱动 -->
	<tx:annotation-driven transaction-manager="txManager"/>
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="total*" read-only="true" propagation="SUPPORTS"/>
			<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
	
	<!-- 切换数据库 -->
	<bean id="dataSourceAdvice" class="com.zhaidaosi.game.jgframework.common.spring.DataSourceAdvice" />
	<aop:config>
		<aop:pointcut id="bussinessService" expression="execution(public * com.zhaidaosi.game.server.sdm.service..*.*(..))" />
		<aop:advisor pointcut-ref="bussinessService" advice-ref="dataSourceAdvice" />
		<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
	</aop:config>
	
	<aop:config>
		<aop:pointcut id="frameworkbussinessService" expression="execution(public * com.zhaidaosi.game.jgframework.common.sdm.BaseService.*(..))" />
		<aop:advisor pointcut-ref="frameworkbussinessService" advice-ref="dataSourceAdvice" />
		<aop:advisor pointcut-ref="frameworkbussinessService" advice-ref="txAdvice" />
	</aop:config>
	
	<!-- service beans -->
	<!-- scope="prototype"  -->
	<bean id="CronModelService" class="com.zhaidaosi.game.server.sdm.service.CronModelService"/>
	<bean id="UserService" class="com.zhaidaosi.game.server.sdm.service.UserService"/>
	
</beans>

================================================
FILE: default_jgframework.properties
================================================
#must input
base.package.name=com.zhaidaosi.game.server

#run mode : debug, product default : debug
run.mode=debug

#timezone
time.zone=Asia/Shanghai

#charset default : UTF-8
charset=UTF-8

#true or false default : true
useSpring=true

#memcache default : 127.0.0.1:11211,1
memcache.servers=127.0.0.1:11211,1
memcache.keyPrefix=jg-

#manager default : 38080
manager.port=38080
#default : 127.0.0.1
manager.allowIps=127.0.0.1;10.10.2.1-10.10.2.254
#default : admin
manager.user=admin
#default : admin
manager.password=admin

#service
#default : 127.0.0.1
service.ips=127.0.0.1
#default : 28080
service.port=28080
#syncPeriod need > 3 miao default : 60
service.syncPeriod=60
#default : 0
service.threadCount=0
#default : 60
service.heartbeatTime=60
#socket or websocket
#default : websocket
service.mode=websocket
#max login user default : 0 
service.maxLoginUser=0

#auth
#default : 18080
auth.port=18080
#default : 0
auth.threadCount=0
auth.handler=auth.


#des key
#default : 1234567890!@#$qweasd
des.key=1234567890!@#$qweasd

#rsa keys
rsa.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCifAl6RlbG1PVOowZJ2niVlijq9FC19jEIaA2WVm+En64roRsTjlWpAKOfYBHIwEYWvI7rObyobTIPyOkBOCx5Sbopq2ME7FUQEwI2IeEBGHwnIBPzkhTEt9kMT88g8hZRBV6D/p6J8Z1u2WU0q88Xpd4o7VDxFRmGUTSePOGcjQIDAQAB
rsa.privateKey=MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKJ8CXpGVsbU9U6jBknaeJWWKOr0ULX2MQhoDZZWb4SfriuhGxOOVakAo59gEcjARha8jus5vKhtMg/I6QE4LHlJuimrYwTsVRATAjYh4QEYfCcgE/OSFMS32QxPzyDyFlEFXoP+nonxnW7ZZTSrzxel3ijtUPEVGYZRNJ484ZyNAgMBAAECgYA3SHCJE8mOmQJloP4Qvq5sZszBNCMJ5hvEunJ1Bi+nNhUybvwhaTon6DnDjhI+9XxjXABcdCaGP7DawgbVDWHDzjgQG0xQle2ryrZFa0thgQDYM4iraMgxMN/5kTXD9DlZcf871N0DeI8dTpxJhVMcM5d95sml6pJxxqwyzABiAQJBAO1rvTpHS6OgDVRpHV4HksyEcKETEayVknAIbTGP3VH3L4X50CpwOwPsvaHi5sENkSEA2JtKj0qF0CbP3sAdDcECQQCvMxhuq2V+dRyMkFLot3YZbMffr2dJi6o4XwxDtI/nhHzS5bQIzKX7L1m8ZJ0GR6CSjZ6X+LBRW6h3tLTsNdnNAkANsK+5o5DN/5WlL2Z9HIyvdFeWQiY7wGgwQ5wgRn5pkopP/Gave8c7Y7RPmGjb6u9aatUSp0r57hthkYzzoPlBAkBG6sfZBEfxCDamL0VgLeMAJ6hAQx/sBTzB1LeCMHSPonFkbNaTOUN2iZQpThDBmfzFVc38dg3o4NEwo1UYyDOBAkAsfnopb+Msp8pMBw7mcX/CeCXNIVpBNWSLtT0AssDf9ofaQ+bIsFIsy2GaPt/UuZmltXgTP5J3iWqFIKQDRstH




================================================
FILE: pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>JgFramework</groupId>
    <artifactId>JgFramework</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>JgFramework</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <repositories>
        <repository>
            <id>jboss-releases</id>
            <url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.marshalling</groupId>
            <artifactId>jboss-marshalling</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.core</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>javax.servlet</artifactId>
                    <groupId>org.apache.felix</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>org.osgi.foundation</artifactId>
                    <groupId>org.apache.felix</groupId>
                </exclusion>
            </exclusions>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging-spi</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>mail</artifactId>
                    <groupId>javax.mail</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jms</artifactId>
                    <groupId>javax.jms</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jmxtools</artifactId>
                    <groupId>com.sun.jdmk</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jmxri</artifactId>
                    <groupId>com.sun.jmx</groupId>
                </exclusion>
            </exclusions>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
        </dependency>
        <!--<dependency>-->
        <!--<groupId>org.hibernate</groupId>-->
        <!--<artifactId>hibernate</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
        </dependency>
        <dependency>
            <groupId>jboss</groupId>
            <artifactId>jboss-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jboss.cache</groupId>
            <artifactId>jbosscache-core</artifactId>
        </dependency>
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>oscache</artifactId>
        </dependency>
        <dependency>
            <groupId>proxool</groupId>
            <artifactId>proxool</artifactId>
        </dependency>
        <dependency>
            <groupId>swarmcache</groupId>
            <artifactId>swarmcache</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-asm</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-instrument</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
        </dependency>
        <dependency>
            <groupId>com.jolbox</groupId>
            <artifactId>bonecp-provider</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </dependency>
        <dependency>
            <groupId>com.whalin</groupId>
            <artifactId>Memcached-Java-Client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>4.0.33.Final</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.marshalling</groupId>
                <artifactId>jboss-marshalling</artifactId>
                <version>1.4.0.Final</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.5.0</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.felix</groupId>
                <artifactId>org.osgi.core</artifactId>
                <version>1.4.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.felix</groupId>
                <artifactId>org.osgi.compendium</artifactId>
                <version>1.4.0</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.6.4</version>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.logging</groupId>
                <artifactId>jboss-logging-spi</artifactId>
                <version>2.1.2.GA</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-annotations</artifactId>
                <version>3.4.0.GA</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-commons-annotations</artifactId>
                <version>3.1.0.GA</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>3.4.0.GA</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>3.1.0.GA</version>
            </dependency>
            <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>persistence-api</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
                <version>3.9.0.GA</version>
            </dependency>
            <dependency>
                <groupId>antlr</groupId>
                <artifactId>antlr</artifactId>
                <version>2.7.6</version>
            </dependency>
            <!--<dependency>-->
            <!--<groupId>org.hibernate</groupId>-->
            <!--<artifactId>hibernate</artifactId>-->
            <!--<version>3.3.2.GA</version>-->
            <!--</dependency>-->
            <dependency>
                <groupId>javax.transaction</groupId>
                <artifactId>jta</artifactId>
                <version>1.1</version>
            </dependency>
            <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.4</version>
            </dependency>
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
            <dependency>
                <groupId>c3p0</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.1</version>
            </dependency>
            <dependency>
                <groupId>jboss</groupId>
                <artifactId>jboss-cache</artifactId>
                <version>1.4.1.GA</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.cache</groupId>
                <artifactId>jbosscache-core</artifactId>
                <version>3.1.0.GA</version>
            </dependency>
            <dependency>
                <groupId>opensymphony</groupId>
                <artifactId>oscache</artifactId>
                <version>2.1</version>
            </dependency>
            <dependency>
                <groupId>proxool</groupId>
                <artifactId>proxool</artifactId>
                <version>0.8.3</version>
            </dependency>
            <dependency>
                <groupId>swarmcache</groupId>
                <artifactId>swarmcache</artifactId>
                <version>1.0RC2</version>
            </dependency>
            <dependency>
                <groupId>commons-httpclient</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-asm</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-instrument</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>aopalliance</groupId>
                <artifactId>aopalliance</artifactId>
                <version>1.0</version>
            </dependency>
            <dependency>
                <groupId>asm</groupId>
                <artifactId>asm</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.6.9</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib-nodep</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.8</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
            <dependency>
                <groupId>commons-pool</groupId>
                <artifactId>commons-pool</artifactId>
                <version>1.5.3</version>
            </dependency>
            <dependency>
                <groupId>com.jolbox</groupId>
                <artifactId>bonecp-provider</artifactId>
                <version>0.7.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.26</version>
            </dependency>
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.7.0</version>
            </dependency>
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>com.whalin</groupId>
                <artifactId>Memcached-Java-Client</artifactId>
                <version>3.0.2</version>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>r09</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.12</version>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.0.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/Boot.java
================================================
package com.zhaidaosi.game.jgframework;

import com.zhaidaosi.game.jgframework.common.BaseIp;
import com.zhaidaosi.game.jgframework.common.BaseRunTimer;
import com.zhaidaosi.game.jgframework.common.BaseString;
import com.zhaidaosi.game.jgframework.common.cache.BaseLocalCached;
import com.zhaidaosi.game.jgframework.common.encrpt.BaseDes;
import com.zhaidaosi.game.jgframework.common.encrpt.BaseRsa;
import com.zhaidaosi.game.jgframework.common.spring.ServiceManager;
import com.zhaidaosi.game.jgframework.connector.AuthConnector;
import com.zhaidaosi.game.jgframework.connector.ManagerConnector;
import com.zhaidaosi.game.jgframework.connector.ServiceConnector;
import com.zhaidaosi.game.jgframework.model.action.ActionManager;
import com.zhaidaosi.game.jgframework.model.area.AreaManager;
import com.zhaidaosi.game.jgframework.model.entity.BasePlayerFactory;
import com.zhaidaosi.game.jgframework.model.entity.IBasePlayerFactory;
import com.zhaidaosi.game.jgframework.session.SessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.TimeZone;

public class Boot {

    public static String BASE_PACKAGE_NAME;
    public static String SDM_BASE_PACKAGE_NAME;
    public static String SERVER_RSYNC_PACKAGE_PATH;
    public static String SERVER_HANDLER_PACKAGE_PATH;

    private static final Logger log = LoggerFactory.getLogger(Boot.class);
    private final static String SERVER_PROPERTIES = "jgframework.properties";
    private final static String ALL_STRING = "all";
    private final static String SERVICE_STRING = "service";
    private final static String AUTH_STRING = "auth";
    private static String actionPackage;
    private static String areaPackage;
    private static int servicePort = 28080;
    private static String serviceMode = ServiceConnector.MODE_WEB_SOCKET;
    private static long serviceSyncPeriod = 60000;
    private static int serviceThreadCount = 0;
    private static int serviceHeartbeatTime = 60;
    private static int serviceMaxLoginUser = 0;
    private static ArrayList<String> serviceIps = new ArrayList<>();
    private static int authPort = 18080;
    private static int authThreadCount = 0;
    private static String authHandler;
    private static boolean debug = true;
    private static ArrayList<String> memcacheServers = new ArrayList<>();
    private static String memcacheKeyPrefix = "jg-";
    private static Charset charset = Charset.forName("UTF-8");
    private static int managerPort = 38080;
    private static ArrayList<Long[]> managerAllowIps = new ArrayList<>();
    private static String managerUser = "admin";
    private static String managerPassword = "admin";
    private static ServiceConnector serviceConnector = null;
    private static ManagerConnector managerConnector = null;
    private static AuthConnector authConnector = null;
    private static String args = null;
    private static IBasePlayerFactory playerFactory = new BasePlayerFactory();
    private static boolean useSpring = true;

    private static boolean init = false;

    /**
     * 初始化参数
     * @return
     */
    private static boolean init() {
        if (init) {
            return true;
        }
        boolean error = false;
        try {
            Properties pps = new Properties();
            pps.load(Boot.class.getClassLoader().getResourceAsStream(SERVER_PROPERTIES));

            BASE_PACKAGE_NAME = pps.getProperty("base.package.name");
            if (BaseString.isEmpty(BASE_PACKAGE_NAME)) {
                error = true;
                log.error("base.package.name 必须填写");
            }
            SDM_BASE_PACKAGE_NAME = BASE_PACKAGE_NAME + ".sdm";
            SERVER_RSYNC_PACKAGE_PATH = BASE_PACKAGE_NAME + ".rsync";
            SERVER_HANDLER_PACKAGE_PATH = BASE_PACKAGE_NAME + ".handler";

            //设置默认时间
            if (!BaseString.isEmpty(pps.getProperty("time.zone"))) {
                TimeZone.setDefault(TimeZone.getTimeZone(pps.getProperty("time.zone")));
            }

            //是否使用spring
            if (!BaseString.isEmpty(pps.getProperty("useSpring"))) {
                useSpring = pps.getProperty("useSpring").equals("true");
            }

            //设置运行模式
            debug = "debug".equals(pps.getProperty("run.mode"));

            if (debug) {
                BaseRunTimer.toActive();
            }
            if (ALL_STRING.equals(args) || SERVICE_STRING.equals(args)) {
                //service端
                if (!BaseString.isEmpty(pps.getProperty("service.port"))) {
                    servicePort = Integer.valueOf(pps.getProperty("service.port"));
                }
                if (!BaseString.isEmpty(pps.getProperty("service.mode"))) {
                    serviceMode = pps.getProperty("service.mode");
                }
                if (!BaseString.isEmpty(pps.getProperty("service.threadCount"))) {
                    serviceThreadCount = Integer.valueOf(pps.getProperty("service.threadCount"));
                }
                if (!BaseString.isEmpty(pps.getProperty("service.syncPeriod"))) {
                    serviceSyncPeriod = Integer.valueOf(pps.getProperty("service.syncPeriod"));
                    if (serviceSyncPeriod < 3) {
                        error = true;
                        log.error("service.syncPeriod 必须大于3秒");
                    }
                    serviceSyncPeriod = serviceSyncPeriod * 1000;
                }
                if (!BaseString.isEmpty(pps.getProperty("service.heartbeatTime"))) {
                    serviceHeartbeatTime = Integer.valueOf(pps.getProperty("service.heartbeatTime"));
                }
                if (!BaseString.isEmpty(pps.getProperty("service.maxLoginUser"))) {
                    serviceMaxLoginUser = Integer.valueOf(pps.getProperty("service.maxLoginUser"));
                }
            }

            if (ALL_STRING.equals(args) || AUTH_STRING.equals(args)) {
                //auth端
                if (!BaseString.isEmpty(pps.getProperty("service.ips"))) {
                    Collections.addAll(serviceIps, pps.getProperty("service.ips").split(";"));
                } else {
                    error = true;
                    log.error("service.ips 必须填写");
                }
                if (!BaseString.isEmpty(pps.getProperty("auth.port"))) {
                    authPort = Integer.valueOf(pps.getProperty("auth.port"));
                }
                if (!BaseString.isEmpty(pps.getProperty("auth.threadCount"))) {
                    authThreadCount = Integer.valueOf(pps.getProperty("auth.threadCount"));
                }
                if (!BaseString.isEmpty(pps.getProperty("auth.handler"))) {
                    authHandler = pps.getProperty("auth.handler");
                } else {
                    error = true;
                    log.error("auth.handler 必须填写");
                }
            }

            //manager端
            if (!BaseString.isEmpty(pps.getProperty("manager.port"))) {
                managerPort = Integer.valueOf(pps.getProperty("manager.port"));
            }
            if (!BaseString.isEmpty(pps.getProperty("manager.user"))) {
                managerUser = pps.getProperty("manager.user");
            }
            if (!BaseString.isEmpty(pps.getProperty("manager.password"))) {
                managerPassword = pps.getProperty("manager.password");
            }
            String[] ips;
            if (!BaseString.isEmpty(pps.getProperty("manager.allowIps"))) {
                ips = pps.getProperty("manager.allowIps").split(";");
            } else {
                ips = new String[]{"127.0.0.1"};
            }
            setManagerAllowIps(ips);

            //memcache
            if (!BaseString.isEmpty(pps.getProperty("memcache.servers"))) {
                Collections.addAll(memcacheServers, pps.getProperty("memcache.servers").split(";"));
            } else {
                memcacheServers.add("127.0.0.1:11211,1");
            }
            if (!BaseString.isEmpty(pps.getProperty("memcache.keyPrefix"))) {
                memcacheKeyPrefix = pps.getProperty("memcache.keyPrefix");
            }

            //des密钥
            if (!BaseString.isEmpty(pps.getProperty("des.key"))) {
                BaseDes.setDesKey(pps.getProperty("des.key"));
            }
            //rsa密钥
            if (!BaseString.isEmpty(pps.getProperty("rsa.publicKey")) && !BaseString.isEmpty(pps.getProperty("rsa.privateKey"))) {
                BaseRsa.init(pps.getProperty("rsa.publicKey"), pps.getProperty("rsa.privateKey"));
            }
            //系统字符集
            if (!BaseString.isEmpty(pps.getProperty("charset"))) {
                charset = Charset.forName(pps.getProperty("charset"));
            }

        } catch (Exception e) {
            error = true;
            log.error("系统启动失败", e);
        }
        if (!error) {
            init = true;
        }
        return init;
    }

    /**
     * 设置允许ip段
     * @param ips
     */
    private static void setManagerAllowIps(String[] ips) {
        for (String ip : ips) {
            managerAllowIps.add(BaseIp.stringToIp(ip));
        }
    }

    /**
     * 设置扫描action的包路径,例如:com.zhaidaosi.game.server.model.action
     * @param actionPackage
     */
    public static void setActionPackage(String actionPackage) {
        Boot.actionPackage = actionPackage;
    }

    /**
     * 设置扫描area的包路径,例如:com.zhaidaosi.game.server.model.area
     * @param areaPackage
     */
    public static void setAreaPackage(String areaPackage) {
        Boot.areaPackage = areaPackage;
    }

    /**
     * 获取player的工厂,默认是BasePlayerFactory
     * @return
     */
    public static IBasePlayerFactory getPlayerFactory() {
        return playerFactory;
    }

    /**
     * 设置player的工厂,默认是BasePlayerFactory
     * @param playerFactory
     */
    public static void setPlayerFactory(IBasePlayerFactory playerFactory) {
        Boot.playerFactory = playerFactory;
    }

    /**
     * 设置mc的前缀
     * @return
     */
    public static String getMemcacheKeyPrefix() {
        return memcacheKeyPrefix;
    }

    /**
     * 获取service的连接对象
     * @return
     */
    public static ServiceConnector getServiceConnector() {
        return serviceConnector;
    }

    /**
     * 获取auth的连接对象
     * @return
     */
    public static AuthConnector getAuthConnector() {
        return authConnector;
    }

    /**
     * 获取manager服务端口
     * @return
     */
    public static int getManagerPort() {
        return managerPort;
    }

    /**
     * 获取manager允许访问的ip段
     * @return
     */
    public static ArrayList<Long[]> getManagerAllowIps() {
        return managerAllowIps;
    }

    /**
     * 获取manager的登录用户
     * @return
     */
    public static String getManagerUser() {
        return managerUser;
    }

    /**
     * 获取manager的用户密码
     * @return
     */
    public static String getManagerPassword() {
        return managerPassword;
    }


    /**
     * 获取默认字符集
     * @return
     */
    public static Charset getCharset() {
        return charset;
    }

    /**
     * service服务器工作线程数
     * @return
     */
    public static int getServiceThreadCount() {
        return serviceThreadCount;
    }

    /**
     * 认证服务器工作线程数
     * @return
     */
    public static int getAuthThreadCount() {
        return authThreadCount;
    }

    /**
     * 返回所有的memcache配置
     * @return
     */
    public static ArrayList<String> getMemcacheServers() {
        return memcacheServers;
    }

    /**
     * 返回所有service服务器ip
     * @return
     */
    public static ArrayList<String> getServiceIps() {
        return serviceIps;
    }

    /**
     * 返回认证服务的所有handler
     * @return
     */
    public static String getAuthHandler() {
        return authHandler;
    }

    /**
     * 返回服务器端口
     * @return
     */
    public static int getServicePort() {
        return servicePort;
    }

    /**
     * 返回service服务器个数
     * @return
     */
    public static int getServiceCount() {
        return serviceIps.size();
    }

    /**
     * 返回service的同步间隔
     * @return
     */
    public static long getServiceSyncPeriod() {
        return serviceSyncPeriod;
    }

    /**
     * 获取心跳检查时间
     * @return
     */
    public static int getServiceHeartbeatTime() {
        return serviceHeartbeatTime;
    }

    /**
     * 通过ip返回service的连接地址
     * @param ip
     * @return
     */
    public static String getServiceAddress(String ip) {
        if (serviceMode.equals(ServiceConnector.MODE_SOCKET)) {
            return ip + ":" + servicePort;
        } else {
            return "ws://" + ip + ":" + servicePort + ServiceConnector.WEB_SOCKET_PATH;
        }
    }

    /**
     * 是否开启debug模式
     * @return
     */
    public static boolean getDebug() {
        return debug;
    }


    /**
     * 重启服务
     */
    public static void restart() {
        stop();
        start();
    }

    /**
     * 停止服务
     */
    public static void stop() {
        BaseLocalCached.cancelTimer();
        if (authConnector != null) {
            authConnector.stop();
        }
        if (serviceConnector != null) {
            serviceConnector.stop();
        }
        if (managerConnector != null) {
            managerConnector.stop();
        }
    }

    /**
     * 启动服务
     */
    public static void start() {
        start(Boot.args);
    }

    /**
     * 启动服务
     * @param args ALL_STRING,SERVICE_STRING,AUTH_STRING
     */
    public static void start(String args) {
        if (Boot.args == null) {
            Boot.args = args == null ? ALL_STRING : args;
        }
        if (!Boot.ALL_STRING.equals(Boot.args) && !Boot.SERVICE_STRING.equals(Boot.args) & !Boot.AUTH_STRING.equals(Boot.args)) {
            Boot.args = args = ALL_STRING;
        }

        //初始化参数
        if (init()) {
            //加载spring
            if (useSpring) {
                ServiceManager.init();
            }
            //开启本地缓存清理任务
            BaseLocalCached.startTimer();
            //加载路由
            Router.init();

            if (args == null || args.equals(ALL_STRING) || args.equals(SERVICE_STRING)) {
                //加载动作
                ActionManager.initAction(actionPackage);
                //加载区域
                AreaManager.initArea(areaPackage);

                if (serviceMaxLoginUser > 0) {
                    SessionManager.setMaxUser(serviceMaxLoginUser);
                } else {
                    serviceMaxLoginUser = 0;
                }

                if (serviceConnector == null) {
                    serviceConnector = new ServiceConnector(servicePort, serviceSyncPeriod, serviceMode);
                }
                serviceConnector.start();

                if (managerConnector == null) {
                    managerConnector = new ManagerConnector(managerPort);
                }
                managerConnector.start();

            }
            if (args == null || args.equals(ALL_STRING) || args.equals(AUTH_STRING)) {
                if (authConnector == null) {
                    authConnector = new AuthConnector(authPort);
                }
                authConnector.start();
            }
        }
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/Router.java
================================================
package com.zhaidaosi.game.jgframework;

import com.zhaidaosi.game.jgframework.common.BaseFile;
import com.zhaidaosi.game.jgframework.common.BaseRunTimer;
import com.zhaidaosi.game.jgframework.common.BaseString;
import com.zhaidaosi.game.jgframework.handler.BaseHandler;
import com.zhaidaosi.game.jgframework.handler.IBaseHandler;
import com.zhaidaosi.game.jgframework.message.IBaseMessage;
import com.zhaidaosi.game.jgframework.message.InMessage;
import com.zhaidaosi.game.jgframework.message.OutMessage;
import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Set;

public class Router {

    private static final Logger log = LoggerFactory.getLogger(Router.class);
    private static HashMap<String, IBaseHandler> handlers = new HashMap<>();
    private static final String classSuffix = "Handler";
    public static final String ERROR_HANDLERNAME = "_error_";
    public static final String HEART_HANDLERNAME = "_heart_";
    public static final String WAIT_HANDLERNAME = "_wait_";

    /**
     * 初始化handler
     */
    public static void init() {
        Set<Class<?>> classes = BaseFile.getClasses(Boot.SERVER_HANDLER_PACKAGE_PATH, classSuffix, true);

        for (Class<?> c : classes) {
            String className = c.getName();
            IBaseHandler handler;
            try {
                handler = (IBaseHandler) c.newInstance();
                // 只取Handler前面部分
                String handlerName = className.replace(Boot.SERVER_HANDLER_PACKAGE_PATH + ".", "").replace(classSuffix, "").toLowerCase();
                handler.setHandlerName(handlerName);
                handlers.put(handlerName, handler);
                log.info("handler类 : " + className + " 加载完成");
            } catch (InstantiationException | IllegalAccessException e) {
                log.error("handler类 : " + className + " 加载失败", e);
            }
        }
    }

    /**
     * 运行handler
     * @param im
     * @param ch
     * @return
     * @throws Exception
     */
    public static IBaseMessage run(InMessage im, Channel ch) throws Exception {
        long startTime = 0;
        if (BaseRunTimer.isActive()) {
            startTime = System.currentTimeMillis();
        }
        IBaseMessage rs = null;
        String handlerName = im.getH();
        if (!BaseString.isEmpty(handlerName)) {
            try {
                if (handlerName.equals(HEART_HANDLERNAME)) {
                    rs = BaseHandler.doHeart();
                    rs.setH(HEART_HANDLERNAME);
                } else {
                    IBaseHandler handler = handlers.get(handlerName);
                    if (handler == null) {
                        rs = OutMessage.showError("handler不存在", 21000);
                    } else {
                        rs = handler.run(im, ch);
                    }
                    if (rs != null) {
                        rs.setH(handlerName);
                    }
                }
            } finally {
                if (BaseRunTimer.isActive()) {
                    long runningTime = System.currentTimeMillis() - startTime;
                    BaseRunTimer.addTimer("Handler : " + handlerName + " run " + runningTime + " ms");
                }
            }
        } else {
            rs = OutMessage.showError("handler不能为空", 20000);
            rs.setH(ERROR_HANDLERNAME);
        }
        return rs;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseAvlTree.java
================================================
package com.zhaidaosi.game.jgframework.common;

import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Random;

/**
 * 平衡二叉搜索(排序)树
 */
public class BaseAvlTree<E extends Comparable<E>> extends AbstractSet<E> {
    private Entry<E> root;//根节点
    private int size;//树节点个数

    private static class Entry<E> {
        E elem;//数据域
        Entry<E> parent;//父节点
        Entry<E> left;//左节点
        Entry<E> right;//右节点
        /*
         * 树的平衡因子,等号表示左子树和右子树有同样的高度。如果L,左子树比右子树高1。如果为R,则意味着右
         * 子树比左高1。刚创建时是平衡的,所以为=
         *             50
         *             /R\
         *            20  80
         *            /L  /R\
         *           10  70 100
         *           =   =  /=\
         *                 92 103
         *                 =  =
         */
        char balanceFactor = '=';

        //构造函数只有两个参数,左右节点是调用add方法时设置
        public Entry(E elem, Entry<E> parent) {
            this.elem = elem;
            this.parent = parent;
        }
    }

    private class TreeIterator implements Iterator<E> {

        private Entry<E> lastReturned = null;
        private Entry<E> next;

        TreeIterator() {

            next = root;
            if (next != null)
                while (next.left != null)
                    next = next.left;

        }

        public boolean hasNext() {

            return next != null;

        }

        public E next() {

            lastReturned = next;
            next = successor(next);
            return lastReturned.elem;

        }

        public void remove() {

            if (lastReturned != null && lastReturned.left != null)
                next = lastReturned;
            deleteEntry(lastReturned);
            lastReturned = null;

        }
    }

    /**
     * 左旋转:结果就是将p移到它的左子节点的位置,而p的右子节点被移到该元素原来位置
     * @param p 旋转元素
     */
    private void rotateLeft(Entry<E> p) {
        /*
		* 围绕50左旋转:
		*p → 50                 90
		*     \                 /\
		* r → 90      →       50 100
		*      \
		*     100
		* 
		* 围绕80左旋转:r的左子树变成p的右子树。因为位于r的左子树上的任意一个元素值大于p且小于r,所以r的左子
		* 树可以成为p的右子树这是没有问题的。其实上面也发生了同样的现象,只是r的左子树为空罢了
		*  p → 80                  90
		*      /\                  /\ 
		*     60 90 ← r     →     80 120
		*        /\               /\   /
		*      85 120           60 85 100
		*          /
		*         100
		* 
		* 围绕80在更大范围内旋转:元素不是围绕树的根旋转。旋转前后的树都是二叉搜索树。且被旋转元素80上的所
		* 有元素在旋转中不移动(50、30、20、40这四个元素还是原来位置)
		*       50                         50
		*       / \                        / \
		*     30   80 ← p                 30  90
		*     /\   /\                     /\  / \
		*   20 40 60 90 ← r      →      20 40 80 120
		*            /\                       /\   /
		*           85 120                  60 85 100
		*              /
		*             100
		* 
		* 节点数据结构:
		*  +------------------+
		*  | elem | p | l | r |
		*  +------------------+
		*  
		*    +------------------+
		*    | 50 |NULL|NULL| r |
		*    +------------------+
		*                 ↖⑥ ↘④
		*         +---------------+
		*         |80| p | l  | r |   ← p 
		*         +---------------+
		*         ↗       ↙     ↖③ ↘①      
		*  +----------------+ +---------------+
		*  |60| p |NULL|NULL| |90| p |  l | r |   ← r
		*  +----------------+ +---------------+
		*                     ↗②       ↙⑤    ↖↘ 
		*              +----------------+ +---------------+
		*              |85| p |NULL|NULL| |90| p | l |NULL|
		*              +----------------+ +---------------+
		*                                  ↗      ↙  
		*                           +-----------------+
		*                           |100| p |NULL|NULL|
		*                           +-----------------+
		*/

        Entry<E> r = p.right;//旋转元素的右子节点
        //把旋转元素的右子节点的左子节点接到旋转元素的右子树
        p.right = r.left;//①
        //如果旋转元素的右子节点存在左子节点的话,同时修改该节点的父节指针指向
        if (r.left != null) {
            //把旋转元素的右子节点的左子节点的父设置成旋转元素
            r.left.parent = p;//②
        }
        //将旋转元素的右子节点的父设置成旋转元素的父,这里有可以p为根节点,那么旋转后p就成根节点
        r.parent = p.parent;//③

        //如果旋转元素为根元素,则旋转后,旋转元素的右子节点r将成为根节点
        if (p.parent == null) {
            root = r;
        }//否则p不是根节点,如果p是他父节点的左节点时
        else if (p.parent.left == p) {
            //让p的父节点的左指针指向r
            p.parent.left = r;
        }//否则如果p是他父节点的右节点时
        else {
            //让p的父节点的右指针指向r
            p.parent.right = r;//④
        }
        //让旋转元素的左节点指向旋转元素p
        r.left = p;//⑤
        //让旋转元素的父节点指向旋转元素右节点r
        p.parent = r;//⑥
    }

    /**
     * 右旋转:结果就是将p移到它的右子节点的位置,而p的左子节点被移到该元素原来位置
     * 与左旋转是完全对称的,将左旋转中的lef与rigth互换即可得到,这里就不详细解释了
     * @param p 旋转元素
     */
    private void rotateRight(Entry<E> p) {

		/*
		* 围绕100右旋转:
		*  p → 100              90
		*       /               /\
		* l → 90      →       50 100
		*     /
		*    50
		* 
		* 围绕80右旋转:l的右子树变成p的左子树。因为位于l的右子树上的任意一个元素值小于p且小于l,所以l的右
		* 子树可以成为p的左子树这是没有问题的。其实上面也发生了同样的现象,只是l的右子树为空罢了
		* 
		*  p → 80                  60
		*      /\                  /\ 
		* l → 60 90         →     50 80
		*     /\                   \  /\
		*    50 70                55 70 90   
		*     \   
		*     55
		*/

        Entry<E> l = p.left;
        p.left = l.right;
        if (l.right != null) {
            l.right.parent = p;
        }
        l.parent = p.parent;

        if (p.parent == null) {
            root = l;
        } else if (p.parent.right == p) {
            p.parent.right = l;
        } else {
            p.parent.left = l;
        }
        l.right = p;
        p.parent = l;
    }

    /**
     * BaseAVLTree类的add方法类似于BinSerrchTree类的add方法,但是沿着根向下前进到插入点时,需记录这样一个被插
     * 入Entry对象最近的祖先:该祖先的平衡因子balanceFactor值是L或R(即不歼),且让ancestor指向这个祖先节
     * 点,该祖先节有什么用呢,从ancestor的子开始到新增节点路径上的所有祖先节点都是平衡,这些祖先节点会因为
     * 新增节点而变得不平衡了,需要重新调整平衡因子,这个分界点在调整平衡因子时非常有用
     *
     * @param elem 要新增元素的数据域
     * @return boolean
     */
    public boolean add(E elem) {
        //如果树为空,则直接插入
        if (root == null) {
            root = new Entry<E>(elem, null);
            size++;
            return true;
        } else {
            Entry<E> tmp = root;//新增节点的父节点,从根节点下面开始找插入点
            Entry<E> ancestor = null;//平衡因子不为 = 的最近祖先节点
            int comp; //比较结果
            while (true) {//死循环,直接找到插入点退出循环
                comp = elem.compareTo(tmp.elem);
                //如果已存在该元素,则直接返回失败
                if (comp == 0) {
                    return false;
                }

                //记录不平衡的祖先节点
                if (tmp.balanceFactor != '=') {
                    //如果哪个祖先节点不平衡,则记录,当循环完后,ancestor指向的就是最近一个
                    //不平衡的祖先节点
                    ancestor = tmp;
                }

                //如果小于当前比较节点,则在其左边插入
                if (comp < 0) {

                    //如果左子树不为空,继续循环在左边找插入点
                    if (tmp.left != null) {
                        tmp = tmp.left;
                    } else {//否则插入
                        tmp.left = new Entry<E>(elem, tmp);
                        //插入后要进行平衡调整
                        fixAfterInsertion(ancestor, tmp.left);
                        size++;
                        return true;
                    }
                } else {//在右边插入

                    //如果右子树不为空,继续循环在右边找插入点
                    if (tmp.right != null) {
                        tmp = tmp.right;
                    } else {//否则插入
                        tmp.right = new Entry<E>(elem, tmp);
                        //插入后要进行平衡调整
                        fixAfterInsertion(ancestor, tmp.right);
                        size++;
                        return true;
                    }
                }

            }
        }
    }

    /**
     * 当新增节点后,会改变某些节点的平衡因子,所以添加节点后需重新调整平衡因子
     *
     * 根据前人们的分析与研究,可分为6种情况
     *
     * @param ancestor 新增元素的最近一个不平衡的祖先节点
     * @param inserted 新增元素
     */
    protected void fixAfterInsertion(Entry<E> ancestor, Entry<E> inserted) {
        E elem = inserted.elem;

        if (ancestor == null) {
			/*
			 * 情况1:ancestor的值为null,即被插入Entry对象的每个祖先的平衡因子都是 =,此时新增节点后
			 * ,树的高度不会发生变化,所以不需要旋转,我们要作的就是调整从根节点到插入节点的路径上的所有
			 * 节点的平衡因子罢了
			 * 
			 *                       新增55后调整
			 *             50            →           50
			 *             /=\                       /R\
			 *           25   70                   25   70
			 *          /=\   /=\                 /=\   /L\
			 *         15 30 60 90               15 30 60 90
			 *         =  =  =   =               =  =  /L =
			 *                                        55
			 *                                        =
			 */
            //根节点的平衡因子我们单独拿出来调整,因为adjustPath的参数好比是一个开区间,它不包括两头参数
            //本身,而是从nserted.paraent开始到to的子节点为止,所以需单独调整,其他分支也一样
            if (elem.compareTo(root.elem) < 0) {
                root.balanceFactor = 'L';
            } else {
                root.balanceFactor = 'R';
            }
            //再调用adjustPath方法调整新增节点的父节点到root的某子节点路径上的所有祖先节点的
            //平衡因子
            adjustPath(root, inserted);
        } else if ((ancestor.balanceFactor == 'L' && elem.compareTo(ancestor.elem) > 0)
                || (ancestor.balanceFactor == 'R' && elem.compareTo(ancestor.elem) < 0)) {
			/*
			 * 情况2:
			 * ancestor.balanceFactor的值为 L,且在ancestor对象的右子树插入,或ancestor.balanceFac
			 * tor的值为 R,且在ancestor对象的左子树插入,这两插入方式都不会引起树的高度发生变化,所以我们
			 * 也不需要旋转,直接调整平衡因子即可
			 *                      新增55后调整
			 *  ancestor → 50           →              50
			 *            /L\                         /=\
			 *          25   70                     25   70
			 *         /R\   /=\                   /R\   /L\
			 *        15 30 60 90                 15 30 60 90
			 *           /L                          /L /L
			 *          28                          28 55
			 *                      新增28后调整
			 *  ancestor → 50            →             50
			 *            /R\                         /=\
			 *          25   70                     25   70
			 *         /=\   /L\                   /R\   /L\
			 *        15 30 60 90                 15 30 60 90
			 *              /L                       /L /L
			 *             55                       28 55
			 */
            //先设置ancestor的平衡因子为 平衡
            ancestor.balanceFactor = '=';
            //然后按照一般策略对inserted与ancestor间的元素进行调整
            adjustPath(ancestor, inserted);
        } else if (ancestor.balanceFactor == 'R'
                && elem.compareTo(ancestor.right.elem) > 0) {
			/*
			 * 情况3:
			 * ancestor.balanceFactor的值为 R,并且被插入的Entry位于ancestor的右子树的右子树上, 此
			 * 种情况下会引起树的不平衡,所以先需绕ancestor进行旋转,再进行平衡因子的调整
			 *
			 * 新增93                          先调整因子再绕70左旋
			 *   →         50                    →           50
			 *            /R\                                /R\
			 *          25   70  ← ancestor                25  90
			 *         /L    /R\                          /L   /=\
			 *        15    60 90                        15  70   98
			 *        =     =  /=\                       =  /=\   /L
			 *                80  98                       60 80 93
			 *                =   /=                       =  =  =
			 *                   93
			 *                   =
			 */
            ancestor.balanceFactor = '=';
            //围绕ancestor执行一次左旋
            rotateLeft(ancestor);
            //再调整ancestor.paraent(90)到新增节点路径上祖先节点平衡
            adjustPath(ancestor.parent, inserted);
        } else if (ancestor.balanceFactor == 'L'
                && elem.compareTo(ancestor.left.elem) < 0) {
			/*
			 * 情况4:
			 * ancestor.balanceFactor的值为 L,并且被插入的Entry位于ancestor的左子树的左子树上,
			 * 此种情况下会引起树的不平衡,所以先需绕ancestor进行旋转,再进行平衡因子的调整
			 * 
			 * 新增13                         先调整因子再绕50右旋
			 *   →         50 ← ancestor        →            20
			 *            /L\                                /=\
			 *          20   70                            10   50
			 *         /=\   /=\                          /R\   /=\
			 *        10 30 60 90                        5  15 30  70
			 *       /=\ /=\=  =                         = /L /=\  /=\
			 *      5 15 25 35                            13 25 35 60 90
			 *      = /= = =                              =  =  =  =  = 
			 *       13         
			 *       =        
			 */
            ancestor.balanceFactor = '=';
            //围绕ancestor执行一次右旋
            rotateRight(ancestor);
            //再调整ancestor.paraent(20)到新增节点路径上祖先节点平衡
            adjustPath(ancestor.parent, inserted);
        } else if (ancestor.balanceFactor == 'L'
                && elem.compareTo(ancestor.left.elem) > 0) {
			/*
			 * 情况5:
			 * ancestor.balanceFactor的值为 L,并且被插入的Entry位于ancestor的左子树的右子树上。此
			 * 种情况也会导致树不平衡,此种与第6种一样都需要执行两次旋转(执行一次绕ancestor的左子节点左
			 * 旋,接着执行一次绕ancestor执行一次右旋)后,树才平衡,最后还需调用 左-右旋 专有方法进行平衡
			 * 因子的调整
			 */
            rotateLeft(ancestor.left);
            rotateRight(ancestor);
            //旋转后调用 左-右旋 专有方法进行平衡因子的调整
            adjustLeftRigth(ancestor, inserted);
        } else if (ancestor.balanceFactor == 'R'
                && elem.compareTo(ancestor.right.elem) < 0) {

			/*
			 * 情况6:
			 * ancestor.balanceFactor的值为 R,并且被插入的Entry位于ancestor的右子树的 左子树上,此
			 * 种情况也会导致树不平衡,此种与第5种一样都需要执行两次旋转(执行一次绕ancestor的右子节点右旋
			 * ,接着执行一次绕ancestor执行一次左旋)后,树才平衡,最后还需调用 右-左旋 专有方法进行平衡因
			 * 子的调整
			 */
            rotateRight(ancestor.right);
            rotateLeft(ancestor);
            //旋转后调用 右-左旋 专有方法进行平衡因子的调整
            adjustRigthLeft(ancestor, inserted);
        }
    }


    /**
     * 调整指定路径上的节点的平衡因子
     *
     * 注,指定的路径上的所有节点一定是平衡的,因此如果被插入元素小于某个祖先节点,
     * 则这个祖先节点新的平衡因子是 L,反之为 R。
     *
     * @param inserted 从哪里元素开始向上调整,但不包括该,即从父开始)
     * @param to 直到哪个元素结束,但不包括该元素,一般传进来的为ancestor
     */
    protected void adjustPath(Entry<E> to, Entry<E> inserted) {
        E elem = inserted.elem;
        Entry<E> tmp = inserted.parent;
        //从新增节点的父节点开始向上回溯调整,直到结尾节点to止
        while (tmp != to) {
			/*
			 * 插入30,则在25右边插入,这样父节点平衡会被打破,右子树就会比左子树高1,所以平衡因子为R;祖
			 * 先节点50的平衡因子也被打破,因为在50的左子树上插入的,所以对50来说,左子树会比右子树高1,所
			 * 以其平衡因子为L
			 *    50                      50
			 *    /=\       插入30        /L\
			 *   25  70       →         25  70
			 *   =   =                   R\  =
			 *                            30
			 *                            = 
			 */
            //如果新增元素比祖先节点小,则是在祖先节点的左边插入,则自然该祖先的左比右子树会高1
            if (elem.compareTo(tmp.elem) < 0) {

                tmp.balanceFactor = 'L';
            } else {
                //否则会插到右边,那么祖先节点的右就会比左子树高1
                tmp.balanceFactor = 'R';
            }
            tmp = tmp.parent;//再调整祖先的祖先
        }
    }

    /**
     * 进行 左-右旋转 后平衡因子调整
     * 分三种情况
     * @param ancestor
     * @param inserted
     */
    protected void adjustLeftRigth(Entry<E> ancestor, Entry<E> inserted) {
        E elem = inserted.elem;
        if (ancestor.parent == inserted) {
			/*
			 * 第1种,新增的节点在旋转完成后为ancestor父节点情况:
			 * 
			 * 新增40                          绕30左旋                绕50右旋
			 *   →      50 ← ancestor         →         50         →
			 *          /L                              /L         
			 *         30                              40  
			 *         =\                             /=
			 *          40                           30
			 *          =                            =
			 *          
			 *                    调整平衡因子
			 *          40            →            40
			 *          /=\                        /=\
			 *         30 50                      30 50
			 *         =  L                       =   =
			 *         
			 * 注,这里的 左-右旋 是在fixAfterInsertion方法中的第5种情况中完成的,在这里只是平衡因子的
			 * 调整,图是为了好说明问题而放在这个方法中的,下面的两个分支也是一样      
			 */
            ancestor.balanceFactor = '=';
        } else if (elem.compareTo(ancestor.parent.elem) < 0) {
			/*
			 * 第2种,新增的节点在旋转完成后为不为ancestor父节点,且新增节点比旋转后ancestor的父节点要小
			 * 的情况
			 * 
			 * 由于插入元素(35)比旋转后ancestor(50)的父节点(40)要小, 所以新增节点会在其左子树中
			 * 
			 * 新增35                         绕20左旋
			 *   →      50 ← ancestor        →                 50
			 *          /L\                                    /L\
			 *        20   90                                40   90
			 *       /=\   /=\                              /=\   /=\
			 *     10  40 70  100                          20 45 70 100
			 *    /=\  /=\=   =                            /=\    
			 *   5  15 30 45                              10  30   
			 *   =  =  =\ =                              /=\   =\
			 *          35                              5  15   35
			 *          =                               =  =    =
			 *          
			 *  绕50右旋                      调整平衡因子
			 *     →        40                →                40
			 *              /=\                                /=\
			 *             20  50                            20   50
			 *            /=\  /L\                          /=\   /R\
			 *          10 30 45 90                        10 30 45  90
			 *         /=\  =\   /=\                      /=\  R\    /=\
			 *        5  15  35 70 100                   5  15  35  70  100
			 *        =  =   =  =  =                     =  =   =   =   =
			 *          
			 */
            ancestor.balanceFactor = 'R';
            //调整ancestor兄弟节点到插入点路径上节点平衡因子
            adjustPath(ancestor.parent.left, inserted);
        } else {
			/*
			 * 第2种,新增的节点在旋转完成后为不为ancestor父节点,且新增节点比旋转后ancestor的父节点要大的
			 * 情况
			 * 
			 * 由于插入元素(42)比旋转后ancestor(50)的父节点(40)要大,所以新增节点会在其右子树中
			 * 
			 * 新增42                           绕20左旋
			 *   →      50 ← ancestor          →               50
			 *          /L\                                    /L\
			 *        20   90                                40   90
			 *       /=\   /=\                              /=\    /=\
			 *     10  40 70  100                          20  45 70 100
			 *    /=\  /=\=   =                           /=\  /=
			 *   5  15 30 45                             10 30 42  
			 *   =  =  =  /=                             /=\=  =
			 *           42                             5  15   
			 *           =                              =  =    
			 *          
			 * 绕50右旋                        调整平衡因子
			 *   →          40                 →               40
			 *              /=\                                /=\
			 *             20  50                            20   50
			 *            /=\  /L\                          /L\   /=\
			 *          10 30 45 90                        10 30 45  90
			 *         /=\   /=  /=\                      /=\    /L  /=\
			 *        5  15 42  70 100                    5 15  42  70 100
			 *        =  =  =   =  =                      =  =  =   =  =
			 *          
			 */
            ancestor.parent.left.balanceFactor = 'L';

            ancestor.balanceFactor = '=';
            //调整ancestor节点到插入点路径上节点平衡因子
            adjustPath(ancestor, inserted);
        }
    }

    /**
     * 进行 右-左旋转 后平衡因子调整
     *
     * 与adjustLeftRigth方法一样,也有三种情况,这两个方法是对称的
     * @param ancestor
     * @param inserted
     */
    protected void adjustRigthLeft(Entry<E> ancestor, Entry<E> inserted) {
        E elem = inserted.elem;
        if (ancestor.parent == inserted) {
			/*
			 * 第1种,新增的节点在旋转完成后为ancestor父节点情况: 
			 * 
			 * 新增40                          绕50右旋                绕30左旋 
			 *   →       30 ← ancestor        →        30          →
			 *           R\                            R\         
			 *            50                            40  
			 *           /=                              =\
			 *          40                                50
			 *          =                                 =
			 *          
			 *          40         调整平衡因子         40
			 *          /=\           →            /=\
			 *         30 50                      30  50
			 *         R  =                       =   =
			 *         
			 * 注,这里的 右-左旋 是在fixAfterInsertion方法中的第6种情况中完成的,这里只是 平衡因子的调
			 * 整,图是为了好说明问题而放在这个方法中的,下面的两个分支也是一样      
			 */
            ancestor.balanceFactor = '=';
        } else if (elem.compareTo(ancestor.parent.elem) > 0) {
			/*
			 * 第2种,新增的节点在旋转完成后为不为ancestor父节点,且新增节点比旋转后
			 * ancestor的父节点要大的情况
			 * 
			 * 由于插入元素(73)比旋转后ancestor(50)的父节点(70)要大, 所以新增节点会
			 * 在其右子树中
			 * 
			 * 新增73                          绕90右旋
			 *   →       50 ← ancestor       →                  50
			 *          /R\                                    /R\
			 *        20   90                                20   70
			 *       /=\   /=\                              /=\   /=\
			 *     10  40 70  95                          10  40 65 90
			 *     =   = /=\  /=\                         =   =  =  /=\ 
			 *          65 75 93 97                                75  95
			 *          =  /= =  =                                 /=  /=\
			 *            73                                      73  93 97
			 *            =    
			 *                          
			 * 绕50左旋                       调整平衡因子
			 *   →          70                →                70
			 *              /=\                                /=\
			 *            50   90                            50   90
			 *           /R\   /=\                          /L\   /=\
			 *          20 65 75  95                       20 65 75  95
			 *         /=\ =  /=  /=\                     /=\ =  /L  /=\
			 *        10  40 73  93 97                   10  40 73  93 97
			 *        =   =   =   =  =                   =   =  =   =   =
			 *          
			 */
            ancestor.balanceFactor = 'L';
            adjustPath(ancestor.parent.right, inserted);
        } else {
			/*
			 * 第2种,新增的节点在旋转完成后为不为ancestor父节点,且新增节点比旋转后ancestor的父节点要小
			 * 的情况
			 * 
			 * 由于插入元素(73)比旋转后ancestor(50)的父节点(70)要大, 所以新增节点会在其右子树中
			 * 
			 * 新增63                          绕90右旋
			 *   →       50 ← ancestor       →                 50
			 *          /R\                                    /R\
			 *        20   90                                20   70
			 *       /=\   /=\                              /=\   /=\
			 *     10  40 70  95                          10  40 65 90
			 *     =   = /=\  /=\                         =   =  /= /=\ 
			 *          65 75 93 97                             63 75 95
			 *          /= =  =  =                              =  =  /=\
			 *         63                                            93 97
			 *         =                                             =  =
			 *                          
			 * 绕50左旋                       调整平衡因子
			 *   →          70                →                70
			 *              /=\                                /=\
			 *            50   90                            50   90
			 *           /R\   /=\                          /=\   /R\
			 *         20  65 75 95                       20  65 75 95
			 *        /=\  /= =  /=\                     /=\  /L    /=\
			 *       10 40 63   93 97                   10 40 63   93 97
			 *       =  =  =    =  =                    =  =  =    =  =         
			 */
            ancestor.parent.right.balanceFactor = 'R';
            ancestor.balanceFactor = '=';
            adjustPath(ancestor, inserted);
        }
    }

    /**
     * 删除指定节点
     *
     * @param elem
     * @return boolean
     */
    public boolean remove(E elem) {
        Entry<E> e = getEntry(elem);
        if (e == null)
            return false;
        deleteEntry(e);
        return true;
    }

    private Entry<E> getEntry(E e) {
        Entry<E> tmp = root;
        int c;
        while (tmp != null) {
            c = e.compareTo(tmp.elem);
            if (c == 0) {
                return tmp;
            } else if (c < 0) {
                tmp = tmp.left;
            } else {
                tmp = tmp.right;
            }
        }
        return null;
    }

    private void deleteEntry(Entry<E> p) {
        if (p.left != null && p.right != null) {

            Entry<E> s = successor(p);

            p.elem = s.elem;

            p = s;
        }

        if (p.left == null && p.right == null) {

            if (p.parent == null) {
                root = null;
            } else if (p == p.parent.left) {
                p.parent.left = null;
            } else {
                p.parent.right = null;
            }

        } else {

            Entry<E> rep;
            if (p.left != null) {
                rep = p.left;
            } else {
                rep = p.right;
            }

            rep.parent = p.parent;

            if (p.parent == null) {
                root = rep;
            } else if (p == p.parent.left) {
                p.parent.left = rep;
            } else {
                p.parent.right = rep;
            }

        }
        fixAfterDeletion(p.elem, p.parent);

        p.parent = null;
        p.left = null;
        p.right = null;

        size--;
    }

    /**
     * 查找指定节点的中序遍历序列的直接后继节点,此方法的实现与二叉搜索树类(BinSearchTree.java)的此方法是
     * 一样的,具体的思路请参考二叉搜索树类中的相应方法
     *
     * @param e 需要查找哪个节点的直接后继节点
     * @return Entry<E> 直接后继节点
     */
    private Entry<E> successor(Entry<E> e) {
        if (e == null) {
            return null;
        }//如果待找的节点有右子树,则在右子树上查找
        else if (e.right != null) {
            //默认后继节点为右子节点(如果右子节点没有左子树时即为该节点)
            Entry<E> p = e.right;
            while (p.left != null) {
                //注,如果右子节点的左子树不为空,则在左子树中查找,且后面找时要一直向左拐
                p = p.left;
            }
            return p;
        }//如果待查节点没有右子树,则要在祖宗节点中查找后继节点
        else {

            //默认后继节点为父节点(如果待查节点为父节点的左子树,则后继为父节点)
            Entry<E> p = e.parent;
            Entry<E> c = e;//当前节点,如果其父不为后继,则下次指向父节点
            //如果待查节点为父节点的右节点时,继续向上找,一直要找到c为左子节点,则p才是后继
            while (p != null && c == p.right) {
                c = p;
                p = p.parent;
            }
            return p;
        }
    }


    /**
     * 删除节点后平衡调整实现
     *
     * @param elem 被删除节点的数据域
     * @param ancestor 被删除节点的祖先节点,从父节点向上迭代
     */
    protected void fixAfterDeletion(E elem, Entry<E> ancestor) {

        boolean heightHasDecreased = true;//树的高度是否还需要减小

		/*
		 * 1、如果删除的是根节点,则ancestor为空,此时不需调整了,直接退出
		 * 2、如果删除的不是根节点,且根节点都已调整,则退出
		 * 3、如果删除的不是根节点,且树的高度不需再减小(heightHasDecreased为false),退出
		 */
        while (ancestor != null && heightHasDecreased) {

            int comp = elem.compareTo(ancestor.elem);

			/*
			 * 当要删除的节点有左右子树时,comp就会等于0,比如下面要删除33这个节点,删除方法deleteEntry
			 * 会用36替换掉33节点中的数据的elem,删除后会调用fixAfterDeletion(p.elem, p.parent)方
			 * 法来调整平衡因子,p又是指向的36,所以p.elem与p.parent.elem是相等的,都是36
			 * 
			 *            82
			 *           /L\
			 *         42   95
			 *        /=\   R\
			 *       33 48   96
			 *      /=\  /=\
			 *     29 36 43 75
			 */

            //从ancestor的右子树中删除节点
            if (comp >= 0) {
                // ancestor 的平衡因子为 '='
                if (ancestor.balanceFactor == '=') {

					/* 删除15       调整因子
					 *      20       →           20
					 *      /L\                  /L\
					 *   → 10 50                10 50
					 *     /=\                  /L
					 *    5  15                5
					 */
                    ancestor.balanceFactor = 'L';
                    heightHasDecreased = false;

                } // ancestor 的平衡因子为 'R'
                else if (ancestor.balanceFactor == 'R') {
					/* 删除15       调整因子                    下次循环调整20的因子
					 *      20       →         → 20 ← ancestor   → ...
					 *      /L\                  /L\
					 *   → 10 50                10 50
					 *     /R\ R\               /=\ R\
					 *    5  15 60              5 18 60
					 *        R\
					 *         18
					 */
                    ancestor.balanceFactor = '=';
                    ancestor = ancestor.parent;

                }// ancestor 的平衡因子为 'L'
                else if (ancestor.balanceFactor == 'L') {
                    // ancestor 的左子节点平衡因子为 '='
                    if (ancestor.left.balanceFactor == '=') {

						/* 删除60       调整因子              绕50右旋
						 *      20       →     → 20         →        20
						 *      /R\              / \                 /R\
						 *     10 50 ← ancestor 10 50 ←             10 45
						 *     /L /L\           /  /L\              /L /R\
						 *    5  45 60         5  45 60            5  35 50 ← 
						 *      /=\              /R\                     /L
						 *     35 48            35 48                   48
						 */
                        ancestor.left.balanceFactor = 'R';
                        ancestor.balanceFactor = 'L';
                        rotateRight(ancestor);
                        heightHasDecreased = false;

                    }// ancestor 的左子节点平衡因子为 'L'
                    else if (ancestor.left.balanceFactor == 'L') {

						/* 删除60       调整因子           绕50右旋   下次循环调整20的因子
						 *      20       →     → 20     →    20 ← p     → ...
						 *      /R\              / \         /R\
						 *     10 50 ← ancestor 10 50 ←     10 45
						 *     /L /L\           /  /=\      /L /=\
						 *    5  45 60         5  45 60    5  35 50 ← ancestor
						 *      /L               /=              =
						 *     35               35                      
						 */
                        Entry<E> p = ancestor.parent;
                        ancestor.balanceFactor = '=';
                        ancestor.left.balanceFactor = '=';
                        rotateRight(ancestor);
                        ancestor = p;

                    } // ancestor 的左子节点平衡因子为 'R'
                    else if (ancestor.left.balanceFactor == 'R') {

                        Entry<E> p = ancestor.parent;

                        // ancestor 的左子节点的右子节点的平衡因子为 'L'
                        if (ancestor.left.right.balanceFactor == 'L') {

							/* 删除60        调整因子               
							 *      20        →       20             
							 *      /R\               / \
							 *    10   50 ← ancestor 10  50 ← ancestor
							 *    /L\   /L\          / \  /R\
							 *   5  12 45 60        5  12 45 70
							 *  /L    /R\  R\      /     /=\  
							 * 3     42 48  70    3     42 48  
							 *          /L                 /= 
							 *         46                 46
							 *         
							 *  绕45左旋         绕50右旋           下次循环调整20的因子
							 *    →     20       →         20 ← p      → ...
							 *          /R\                /R\
							 *         10  50 ←          10   48
							 *         /L\  /R\          /L\   /=\
							 *        5 12 48 70        5  12 45 50 ← ancestor
							 *       /L   /=           /L    /=\  R\
							 *      3    45           3     42 46  70
							 *          /=\
							 *         42 46
							 */
                            ancestor.balanceFactor = 'R';
                            ancestor.left.balanceFactor = '=';

                        }// ancestor 的左子节点的右子节点的平衡因子为 'R'
                        else if (ancestor.left.right.balanceFactor == 'R') {

							/* 删除60        调整因子               
							 *      20        →       20             
							 *      /R\               / \
							 *    10   50 ← ancestor 10  50 ← 
							 *    /L\   /L\          / \  /=\
							 *   5  12 45 60        5  12 45 70
							 *  /L    /R\  R\      /     /L\  
							 * 3     42 48  70    3     42 48  
							 *           R\                 =\ 
							 *            49                 49
							 *         
							 *  绕45左旋         绕50右旋           下次循环调整20的因子
							 *    →     20       →         20 ← p      → ...
							 *          /R\                /R\
							 *         10  50 ←          10   48
							 *         /L\  /=\          /L\   /=\
							 *        5 12 48 70        5  12 45 50 ← ancestor
							 *       /L   /=\          /L    /L  /=\
							 *      3    45 49        3     42  49 70
							 *          /L
							 *         42 
							 */
                            ancestor.balanceFactor = '=';
                            ancestor.left.balanceFactor = 'L';

                        }// ancestor 的左子节点的右子节点的平衡因子为 '='
                        else {
							/* 删除60        调整因子               
							 *      20        →       20             
							 *      /R\               / \
							 *    10   50 ← ancestor 10  50 ← 
							 *    /L\   /L\          / \  /=\
							 *   5  12 45 60        5  12 45 70
							 *  /L    /R\  R\      /     /=\  
							 * 3     42 48  70    3     42 48  
							 *          /=\                /=\ 
							 *         46 49              46 49
							 *         
							 *  绕45左旋         绕50右旋           下次循环调整20的因子
							 *    →     20       →         20 ← p      → ...
							 *          /R\                /R\
							 *         10  50 ←          10   48
							 *         /L\  /=\          /L\   /=\
							 *        5 12 48 70        5  12 45  50 ← ancestor
							 *       /L   /=\          /L    /=\   /=\
							 *      3    45 49        3     42 46 49 70
							 *          /=\
							 *         42 46
							 */
                            ancestor.balanceFactor = '=';
                            ancestor.left.balanceFactor = '=';

                        }
                        ancestor.left.right.balanceFactor = '=';
                        rotateLeft(ancestor.left);
                        rotateRight(ancestor);
                        ancestor = p;
                    }
                }

            }
            //从ancestor的左子树中删除节点,与上面是对称的
            else if (comp < 0) {

                if (ancestor.balanceFactor == '=') {

                    ancestor.balanceFactor = 'R';
                    heightHasDecreased = false;
                } else if (ancestor.balanceFactor == 'L') {

                    ancestor.balanceFactor = '=';
                    ancestor = ancestor.parent;

                } else if (ancestor.balanceFactor == 'R') {

                    if (ancestor.right.balanceFactor == '=') {

                        ancestor.balanceFactor = 'R';
                        ancestor.right.balanceFactor = 'L';
                        rotateLeft(ancestor);
                        heightHasDecreased = false;

                    } else if (ancestor.right.balanceFactor == 'R') {

                        Entry<E> p = ancestor.parent;
                        ancestor.balanceFactor = '=';
                        ancestor.right.balanceFactor = '=';
                        rotateLeft(ancestor);
                        ancestor = p;

                    } else if (ancestor.right.balanceFactor == 'L') {

                        Entry<E> p = ancestor.parent;
                        if (ancestor.right.left.balanceFactor == 'R') {

                            ancestor.balanceFactor = 'L';
                            ancestor.right.balanceFactor = '=';

                        } else if (ancestor.right.left.balanceFactor == 'L') {

                            ancestor.balanceFactor = '=';
                            ancestor.right.balanceFactor = 'R';

                        } else {

                            ancestor.balanceFactor = '=';
                            ancestor.right.balanceFactor = '=';

                        }
                        ancestor.right.left.balanceFactor = '=';
                        rotateRight(ancestor.right);
                        rotateLeft(ancestor);
                        ancestor = p;

                    }
                }
            }
        }
    }

    public boolean contains(E o) {

        Entry<E> e = root;

        int comp;

        while (e != null) {

            comp = o.compareTo(e.elem);
            if (comp == 0)
                return true;
            else if (comp < 0)
                e = e.left;
            else
                e = e.right;

        }
        return false;
    }

    //验证树是否是平衡二叉树
    public boolean isAVL() {

        return checkAVL(root);

    }

    /**
     * 验证指定的树是否是平衡二叉树
     * @param p
     * @return
     */
    public static <E extends Comparable<E>> boolean checkAVL(Entry<E> p) {

        if (p == null)
            return true;
        //左子树与右子树绝对值不能超过 1,并且左右子树也是平衡二叉树
        return (Math.abs(h(p.left) - h(p.right)) <= 1 && checkAVL(p.left) && checkAVL(p.right));

    }

    /**
     * 求指定节点的高度
     * @param <E>
     * @param p
     * @return
     */
    protected static <E extends Comparable<E>> int h(Entry<E> p) {

        if (p == null)
            return -1;
        return 1 + Math.max(h(p.left), h(p.right));
    }

    /**
     * 树的高度
     * @return
     */
    public int height() {

        return h(root);

    }

    //树的高度非递归求法
    public int heightIter() {

        int height = -1;
        for (Entry<E> temp = root; temp != null; height++)
            if (temp.balanceFactor == 'L')
                temp = temp.left;
            else
                temp = temp.right;
        return height;
    }

    @Override
    public Iterator<E> iterator() {
        return new TreeIterator();
    }

    @Override
    public int size() {
        return size;
    }

    public static void main(String[] args) {
        BaseAvlTree<Integer> myTree = new BaseAvlTree<Integer>();
        Random random = new Random();
        System.out.print("随机产生的节点为:");
        int num = 0;
        //直到树的节点数为n止  
        while (myTree.size() < 10) {
            num = new Integer(random.nextInt(100));
            myTree.add(num);
            System.out.print(num + " ");
        }
        System.out.println("");
        if (myTree.isAVL()) {
            System.out.println("这棵平衡二叉树的总节点数:" + myTree.size());
            System.out.println("这棵平衡二叉树的高度是:" + myTree.height());
            System.out.println("在树中查找 " + num + " 节点:"
                    + myTree.contains(new Integer(num)));
            System.out.println("在树中查找 100 节点:" + myTree.contains(new Integer(100)));
            System.out.print("中序遍历:");
            Iterator<Integer> itr = myTree.iterator();
            while (itr.hasNext()) {
                System.out.print(itr.next() + " ");
            }
            System.out.println("");

            myTree.remove(num);
            System.out.print("删除节点 " + num + " 后遍历:");
            itr = myTree.iterator();
            while (itr.hasNext()) {
                System.out.print(itr.next() + " ");
            }
            System.out.println("");

            System.out.println("使用迭代器删除所有节点");
            itr = myTree.iterator();
            while (itr.hasNext()) {
                itr.next();
                itr.remove();
            }
            System.out.println("删除后树的总节点数:" + myTree.size());
        } else {
            System.out.println("failure");
        }
    }

}

================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseDate.java
================================================
package com.zhaidaosi.game.jgframework.common;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class BaseDate {

    public static String FORMAT_YY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static String FORMAT_YY_MM_DD = "yyyy-MM-dd";

    /**
     * 转换时间to字符串
     * @param String format
     * @param long time
     * @return String
     */
    public static String time2String(String format, long time) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        Date curDate = new Date(time);
        return formatter.format(curDate);
    }

    /**
     * 转换时间to字符串
     * @param String format
     * @return String
     */
    public static String time2String(String format) {
        return time2String(format, System.currentTimeMillis());
    }

    /**
     * 字符时间到long
     * @param date
     * @return
     */
    public static long string2Time(String date) {
        if (date != null && !date.equals("")) {
            return Timestamp.valueOf(date).getTime();
        }
        return 0l;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseFile.java
================================================
package com.zhaidaosi.game.jgframework.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.URL;
import java.net.URLDecoder;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

@SuppressWarnings("resource")
public class BaseFile {

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


    public static Set<Class<?>> getClasses(String pack, boolean recursive) {
        return getClasses(pack, "", recursive);
    }

    /**
     * 从包package中获取所有的Class
     *
     * @param pack String
     * @param suffix String
     * @param recursive 是迭代
     * @return String
     */
    public static Set<Class<?>> getClasses(String pack, String suffix, boolean recursive) {
        // 第一个class类的集合
        Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
        // 获取包的名字 并进行替换
        String packageName = pack;
        String packageDirName = packageName.replace('.', '/');
        // 定义一个枚举的集合 并进行循环来处理这个目录下的things
        Enumeration<URL> dirs;
        try {
            dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
            // 循环迭代下去
            while (dirs.hasMoreElements()) {
                // 获取下一个元素
                URL url = dirs.nextElement();
                // 得到协议的名称
                String protocol = url.getProtocol();
                // 如果是以文件的形式保存在服务器上
                if ("file".equals(protocol)) {
                    // 获取包的物理路径
                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                    // 以文件的方式扫描整个包下的文件 并添加到集合中
                    findAndAddClassesInPackageByFile(packageName, filePath, suffix, recursive, classes);
                } else if ("jar".equals(protocol)) {
                    // 如果是jar包文件
                    // 定义一个JarFile
                    JarFile jar;
                    try {
                        String jarPath = url.getPath();
                        if (jarPath.indexOf("file:") == 0) {
                            jarPath = jarPath.substring(5);
                        }
                        int index = jarPath.lastIndexOf(".jar");
                        jarPath = jarPath.substring(0, index) + ".jar";
                        // 获取jar
                        jar = new JarFile(jarPath);
                        // 从此jar包 得到一个枚举类
                        Enumeration<JarEntry> entries = jar.entries();
                        // 同样的进行循环迭代
                        while (entries.hasMoreElements()) {
                            // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
                            JarEntry entry = entries.nextElement();
                            String name = entry.getName();
                            // 如果是以/开头的
                            if (name.charAt(0) == '/') {
                                // 获取后面的字符串
                                name = name.substring(1);
                            }
                            // 如果前半部分和定义的包名相同
                            if (name.startsWith(packageDirName)) {
                                int idx = name.lastIndexOf('/');
                                // 如果以"/"结尾 是一个包
                                if (idx != -1) {
                                    // 获取包名 把"/"替换成"."
                                    packageName = name.substring(0, idx).replace('/', '.');
                                }
                                // 如果可以迭代下去 并且是一个包
                                if ((idx != -1) || recursive) {
                                    // 如果是一个.class文件 而且不是目录
                                    if (name.endsWith(".class") && !entry.isDirectory()) {
                                        // 去掉后面的".class" 获取真正的类名
                                        String className = name.substring(packageName.length() + 1, name.length() - 6);
                                        try {
                                            // 添加到classes
                                            classes.add(Class.forName(packageName + '.' + className));
                                        } catch (ClassNotFoundException e) {
                                            log.error("添加用户自定义视图类错误 找不到此类的.class文件", e);
                                        }
                                    }
                                }
                            }
                        }
                    } catch (IOException e) {
                        log.error("在扫描用户定义视图时从jar包获取文件出错", e);
                    }
                }
            }
        } catch (IOException e) {
        }

        return classes;
    }

    /**
     * 以文件的形式来获取包下的所有Class
     *
     * @param packageName
     * @param packagePath
     * @param recursive
     * @param classes
     */
    private static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final String suffix, final boolean recursive, Set<Class<?>> classes) {
        // 获取此包的目录 建立一个File
        File dir = new File(packagePath);
        // 如果不存在或者 也不是目录就直接返回
        if (!dir.exists() || !dir.isDirectory()) {
            // log.warn("用户定义包名 " + packageName + " 下没有任何文件");
            return;
        }
        // 如果存在 就获取包下的所有文件 包括目录
        File[] dirfiles = dir.listFiles(new FileFilter() {
            // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
            public boolean accept(File file) {
                return (recursive && file.isDirectory()) || (file.getName().endsWith(suffix + ".class"));
            }
        });
        // 循环所有文件
        for (File file : dirfiles) {
            // 如果是目录 则继续扫描
            if (file.isDirectory()) {
                findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), suffix, recursive, classes);
            } else {
                // 如果是java类文件 去掉后面的.class 只留下类名
                String className = file.getName().substring(0, file.getName().length() - 6);
                try {
                    // 添加到集合中去
                    // classes.add(Class.forName(packageName + '.' +
                    // className));
                    // 经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净
                    classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
                } catch (ClassNotFoundException e) {
                    log.error("添加用户自定义视图类错误 找不到此类的.class文件", e);
                }
            }
        }
    }

    public static List<String> fileList(String path) {
        return fileList(path, false);
    }

    public static List<String> fileList(String path, boolean needDir) {
        List<String> list = new ArrayList<String>();
        File file = new File(path);
        if (file.isDirectory()) {
            String[] filelist = file.list();
            for (int i = 0; i < filelist.length; i++) {
                file = new File(path + "/" + filelist[i]);
                if (!file.isDirectory()) {
                    list.add(file.getName());
                } else {
                    if (needDir) {
                        list = fileList(list, path, file.getName());
                    }
                }
            }
        }
        return list;
    }

    private static List<String> fileList(List<String> list, String path, String dir) {
        File file = new File(path + "/" + dir);
        if (file.isDirectory()) {
            String[] filelist = file.list();
            for (int i = 0; i < filelist.length; i++) {
                file = new File(path + "/" + dir + "/" + filelist[i]);
                if (!file.isDirectory()) {
                    list.add(dir + "/" + file.getName());
                } else {
                    list = fileList(list, path, dir + "/" + file.getName());
                }
            }
        }
        return list;
    }

    public static String readResourceByLines(String resourcePath) {
        // 返回读取指定资源的输入流
        InputStream is = BaseFile.class.getClassLoader().getResourceAsStream(resourcePath);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuffer buffer = new StringBuffer("");
        try {
            String tempString = null;
            while ((tempString = reader.readLine()) != null) {
                buffer.append(tempString);
                buffer.append("\n");
            }
        } catch (IOException e) {
            log.error("读取文件失败", e);
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        return buffer.toString();
    }

    /**
     * 以行为单位读取文件,常用于读面向行的格式化文件
     */
    public static String readFileByLines(String fileName) {
        File file = new File(fileName);
        return readFileByLines(file);
    }

    /**
     * 以行为单位读取文件,常用于读面向行的格式化文件
     */
    public static String readFileByLines(File file) {
        BufferedReader reader = null;
        StringBuffer buffer = new StringBuffer("");
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                buffer.append(tempString);
                buffer.append("\n");
            }
            reader.close();
        } catch (IOException e) {
            log.error("读取文件失败", e);
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        return buffer.toString();
    }

    public static String readFileLastByLine(String filePath, int lastStart, int limit) {
        File file = new File(filePath);
        String buffer = "";
        if (!file.exists()) {
            return buffer;
        }
        RandomAccessFile raf;
        try {
            raf = new RandomAccessFile(file, "r");
            long len = raf.length();
            int line = 0;
            if (len != 0L) {
                long pos = len - 1;
                while (pos > 0) {
                    raf.seek(pos);
                    if (raf.readByte() == '\n') {
                        if (lastStart <= line && line < lastStart + limit) {
                            String temp = "";
                            // Windows下有乱码问题
                            String tempLine = raf.readLine();
                            if (tempLine == null) {
                                pos--;
                                continue;
                            }
                            temp += tempLine;
                            temp += "\n";
                            buffer += temp;
                            pos--;
                        }
                        line++;
                    } else {
                        pos--;
                    }
                    if (line >= lastStart + limit) {
                        break;
                    }
                }
            }
            raf.close();
        } catch (IOException e) {
            log.error("读取文件失败", e);
        }
        return buffer;
    }

    /**
     * 判断文件的编码格式
     *
     * @param fileName
     *            :file
     * @return 文件编码格式
     * @throws Exception
     */
    public static String codeString(String fileName) throws Exception {
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));
        int p = (bin.read() << 8) + bin.read();
        String code = null;
        // 其中的 0xefbb、0xfffe、0xfeff、0x5c75这些都是这个文件的前面两个字节的16进制数
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            case 0x5c75:
                code = "ANSI|ASCII";
                break;
            default:
                code = "GBK";
        }

        return code;
    }

}

================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseGeneratePassword.java
================================================
package com.zhaidaosi.game.jgframework.common;

import java.util.Random;

public class BaseGeneratePassword {

    private static char arrayString[] = new char[62]; // 候选字符数组

    static {
        int j = 0;
        for (int i = 48; i <= 57; i++) { // 0-9
            arrayString[j] = (char) i;
            j++;
        }
        for (int i = 65; i <= 90; i++) { // A-Z
            arrayString[j] = (char) i;
            j++;
        }
        for (int i = 97; i <= 122; i++) { // a-z
            arrayString[j] = (char) i;
            j++;
        }
    }

    /**
     * 生成密码
     * @param intPassLength 密码长度
     * @return String
     */
    public static String doGenerate(final int intPassLength) {
        int intTemp;
        String strPassword = "";
        Random rand = new Random();
        for (int i = 0; i < intPassLength; i++) {
            intTemp = rand.nextInt(62);
            strPassword += arrayString[intTemp];
        }
        return strPassword;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseIp.java
================================================
package com.zhaidaosi.game.jgframework.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BaseIp {

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

    public static Long[] stringToIp(String ips) {
        Long[] longArr;
        String[] ipArr = ips.split("-");
        if (ipArr.length == 2) {
            longArr = new Long[2];
            longArr[0] = ipToLong(ipArr[0]);
            longArr[1] = ipToLong(ipArr[1]);
        } else {
            longArr = new Long[1];
            longArr[0] = ipToLong(ipArr[0]);
        }
        return longArr;
    }

    public static long ipToLong(String ip) {
        String[] ipArr = ip.split("\\.");
        if (ipArr.length != 4) {
            log.error("ip格式错误:" + ip);
            return 0L;
        }
        long s = 0;
        for (int i = 0; i < ipArr.length; i++) {
            s += (long) (Long.parseLong(ipArr[i]) * Math.pow(1000, 3 - i));
        }
        return s;
    }

    public static boolean checkIp(String ip, Long[] ipArr) {
        long ipLong = ipToLong(ip);
        if (ipArr.length == 1) {
            if (ipLong == ipArr[0]) {
                return true;
            }
        } else {
            if (ipArr[0] <= ipLong && ipLong <= ipArr[1]) {
                return true;
            }
        }
        return false;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseJson.java
================================================
package com.zhaidaosi.game.jgframework.common;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BaseJson {

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

    public static <T> T JsonToObject(String jsonStr, Class<T> c) {
        return JSON.parseObject(jsonStr, c);
    }

    public static String ObjectToJson(Object obj) {
        return JSON.toJSONString(obj, SerializerFeature.WriteNonStringKeyAsString, SerializerFeature.BrowserCompatible);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseRunTimer.java
================================================
package com.zhaidaosi.game.jgframework.common;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;

/**
 * Copyright (c) 2013, zhidaosi.com
 *
 * @description: 记录运行时间
 * @author: 俊杰Jerry
 * @date: 2013-7-5
 */
public class BaseRunTimer {

    private static ThreadLocal<List<String>> timerHolder = new ThreadLocal<List<String>>();

    private static final Log log = LogFactory.getLog(BaseRunTimer.class);

    private static boolean active = false;

    public static void addTimer(String msg) {
        if (active) {
            Assert.notNull(msg, "msg cannot be null");
            List<String> timer = getTimer();
            timer.add(msg);
            timerHolder.set(timer);
        }
    }

    private static List<String> getTimer() {
        List<String> timer = (List<String>) timerHolder.get();
        if (timer == null) {
            timer = new ArrayList<String>();
        }
        return timer;
    }

    public static void showTimer() {
        if (active && log.isInfoEnabled()) {
            List<String> timer = getTimer();
            if (timer.size() > 0) {
                String line = "**********************************************************************";
                String message = "\n" + line + "\n";
                for (String msg : timer) {
                    message += "********** ";
                    message += msg;
                    message += "\n";
                }
                message += line;
                log.info(message);
            }
        }
        timerHolder.remove();
    }

    public static boolean isActive() {
        return active;
    }

    public static void toActive() {
        BaseRunTimer.active = true;
    }


}




================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseSocket.java
================================================
package com.zhaidaosi.game.jgframework.common;

import com.zhaidaosi.game.jgframework.common.excption.MessageException;
import com.zhaidaosi.game.jgframework.message.InMessage;
import com.zhaidaosi.game.jgframework.message.OutMessage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;

public class BaseSocket {

    private String host;
    private int port;
    private Socket socket;

    private static HashMap<String, BaseSocket> socketMap = new HashMap<String, BaseSocket>();

    private BaseSocket(String host, int port) throws UnknownHostException, IOException {
        this.socket = new Socket(host, port);
        this.host = host;
        this.port = port;
    }

    public static BaseSocket getNewInstance(String host, int port)
            throws UnknownHostException, IOException {
        return new BaseSocket(host, port);
    }

    public static BaseSocket getInstance(String host, int port)
            throws UnknownHostException, IOException {
        BaseSocket mySocket = socketMap.get(host + ":" + port);
        if (mySocket == null || mySocket.socket.isClosed()) {
            mySocket = new BaseSocket(host, port);
            socketMap.put(host + ":" + port, mySocket);
        }
        return mySocket;
    }

    public void reconnect() throws IOException {
        if (!socket.isClosed()) {
            socket.close();
        }
        socket = new Socket(host, port);
        socketMap.put(host + ":" + port, this);
    }

    public OutMessage request(InMessage msg) throws IOException, MessageException {
        send(msg);
        OutMessage om = receive();
        if (om == null) {
            throw new IOException("连接已被强制中断");
        }
        return om;
    }

    public void heartBeat() throws IOException {
        send(new InMessage());
    }

    public void send(InMessage msg) throws IOException {
        String out = msg.toString();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        printWriter.write(out);
        printWriter.flush();
    }

    private OutMessage receive() throws IOException, MessageException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        return OutMessage.getMessage(bufferedReader.readLine());
    }

    public void close() throws IOException {
        socketMap.remove(socket.getLocalAddress() + ":" + socket.getPort());
        if (!socket.isClosed()) {
            socket.close();
        }
    }

    public void closeNew() throws IOException {
        if (!socket.isClosed()) {
            socket.close();
        }
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseString.java
================================================
package com.zhaidaosi.game.jgframework.common;

public class BaseString {

    public static boolean isEmpty(String str) {
        if (str == null) {
            return true;
        }
        str = str.trim();
        return str.equals("");
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseLocalCached.java
================================================
package com.zhaidaosi.game.jgframework.common.cache;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * 用户保持不会垮服务器的数据
 * @author Jerry
 */
public class BaseLocalCached {

    public static final String INVALID = "%IT IS INVALID!!%";

    private class BaseCacheElement {
        private Object value;
        private long failureTime;

        private BaseCacheElement(Object value, long failureTime) {
            this.value = value;
            this.failureTime = failureTime;
        }
    }

    private ConcurrentMap<String, BaseCacheElement> cache = new ConcurrentHashMap<String, BaseCacheElement>();

    private static Timer timer = null;
    private static List<BaseLocalCached> list = Collections.synchronizedList(new ArrayList<BaseLocalCached>());
    private static final long period = 600000;


    public BaseLocalCached() {
        if (!list.contains(this)) {
            list.add(this);
            startTimer();
        }
    }

    /**
     * 设置缓存
     * @param key
     * @param value
     * @param time 单位秒
     */
    public void set(String key, Object value, int time) {
        cache.put(key, new BaseCacheElement(value, System.currentTimeMillis() + time * 1000));
    }

    public void set(String key, Object value) {
        cache.put(key, new BaseCacheElement(value, 0L));
    }

    public void delete(String key) {
        cache.remove(key);
    }

    /**
     * 判断是否过期,过期返回true
     * @param value
     * @return
     */
    public boolean checkInvalid(Object value) {
        return INVALID.equals(value);
    }

    public Object get(String key) {
        BaseCacheElement element = cache.get(key);
        if (checkTime(element)) {
            return element.value;
        } else {
            if (element != null) {
                cache.remove(key);
            }
            return INVALID;
        }
    }

    private boolean checkTime(BaseCacheElement element) {
        if (element == null) {
            return false;
        }
        if (element.failureTime == 0L || element.failureTime > System.currentTimeMillis()) {
            return true;
        }
        return false;
    }

    public static void startTimer() {
        if (timer == null && list.size() > 0) {
            timer = new Timer("BaseLocalCachedTimer");
            timer.schedule(new InvalidTask(), period, period);
        }
    }

    public static void cancelTimer() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

    private static void invalid() {
        for (BaseLocalCached localCached : list) {
            for (Map.Entry<String, BaseCacheElement> entry : localCached.cache.entrySet()) {
                String key = entry.getKey();
                BaseCacheElement element = entry.getValue();
                if (!localCached.checkTime(element)) {
                    localCached.delete(key);
                }
            }
        }
    }

    private static class InvalidTask extends TimerTask {
        @Override
        public void run() {
            BaseLocalCached.invalid();
        }
    }

}



================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseMemCached.java
================================================
package com.zhaidaosi.game.jgframework.common.cache;

import com.whalin.MemCached.MemCachedClient;
import com.whalin.MemCached.SockIOPool;
import com.zhaidaosi.game.jgframework.Boot;

import java.util.ArrayList;

public class BaseMemCached extends MemCachedClient {

    // 创建全局的唯一实例
    private static BaseMemCached mc = new BaseMemCached();
    private final static String KEYPREFIX;

    // 设置与缓存服务器的连接池
    static {
        String[] servers;
        Integer[] weights;
        ArrayList<String> confServers = Boot.getMemcacheServers();
        KEYPREFIX = Boot.getMemcacheKeyPrefix();
        int size = confServers.size();
        if (size > 1) {
            servers = new String[size];
            weights = new Integer[size];
            for (int i = 0; i < size; i++) {
                String[] temp2 = confServers.get(i).split(",");
                servers[i] = temp2[0];
                if (temp2.length > 1) {
                    weights[i] = new Integer(temp2[1]);
                } else {
                    weights[i] = 1;
                }
            }
        } else {
            // 服务器列表和其权重
            servers = new String[]{"127.0.0.1:11211"};
            weights = new Integer[]{1};
        }
        // 获取socke连接池的实例对象
        SockIOPool pool = SockIOPool.getInstance();
        // 设置服务器信息
        pool.setServers(servers);
        pool.setWeights(weights);
        // 设置初始连接数、最小和最大连接数以及最大处理时间
        pool.setInitConn(100);
        pool.setMinConn(100);
        pool.setMaxConn(2000);
        pool.setMaxIdle(1000 * 60 * 60 * 6);
        // 设置主线程的睡眠时间
        pool.setMaintSleep(30);
        // 设置TCP的参数,连接超时等
        pool.setNagle(false);
        //连接建立后的超时时间
        pool.setSocketTO(3000);
        //连接建立时的超时时间
        pool.setSocketConnectTO(0);
        pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);
        // 初始化连接池
        pool.initialize();
    }

    /**
     * 保护型构造方法,不允许实例化!
     *
     */
    private BaseMemCached() {

    }


    /**
     * 获取唯一实例.
     */
    public static BaseMemCached getInstance() {
        return mc;
    }

    public static String getMcKey(String key) {
        return KEYPREFIX + key;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseDes.java
================================================
package com.zhaidaosi.game.jgframework.common.encrpt;

import com.zhaidaosi.game.jgframework.Boot;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.SecureRandom;


public class BaseDes {


    private final static String DES = "DES";
    private static byte[] keyBytes = "1234567890!@#$qweasd".getBytes();

    public static void setDesKey(String key) {
        keyBytes = key.getBytes();
    }

    /**
     * Description 根据键值进行加密
     * @param data
     * @return
     */
    public static String encrypt(String data) {
        byte[] bt;
        try {
            bt = encrypt(data.getBytes(Boot.getCharset()), keyBytes);
        } catch (Exception e) {
            return null;
        }
        return DatatypeConverter.printBase64Binary(bt);
    }

    /**
     * Description 根据键值进行解密
     * @param data
     * @return
     */
    public static String decrypt(String data) {
        if (data == null)
            return null;
        byte[] buf;
        byte[] bt;
        try {
            buf = DatatypeConverter.parseBase64Binary(data);
            bt = decrypt(buf, keyBytes);
        } catch (Exception e) {
//			e.printStackTrace();
            return null;
        }
        return new String(bt, Boot.getCharset());
    }

    /**
     * Description 根据键值进行加密
     * @param data
     * @param key 加密键byte数组
     * @return
     * @throws Exception
     */
    private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        // 生成一个可信任的随机数源
        SecureRandom sr = new SecureRandom();

        // 从原始密钥数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(key);

        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
        SecretKey secretKey = keyFactory.generateSecret(dks);

        // Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance(DES);

        // 用密钥初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);

        return cipher.doFinal(data);
    }

    /**
     * Description 根据键值进行解密
     * @param data
     * @param key 加密键byte数组
     * @return
     * @throws Exception
     */
    private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
        // 生成一个可信任的随机数源
        SecureRandom sr = new SecureRandom();

        // 从原始密钥数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(key);

        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
        SecretKey secretKey = keyFactory.generateSecret(dks);

        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance(DES);

        // 用密钥初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);

        return cipher.doFinal(data);
    }
}

================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseMd5.java
================================================
package com.zhaidaosi.game.jgframework.common.encrpt;

import com.zhaidaosi.game.jgframework.Boot;

import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;

public class BaseMd5 {

    /**
     * 进行MD5加密
     *
     * @param text 原始的SPKEY
     * @return String 指定加密方式为md5后的String
     */
    public static String encrypt(String text) {
        byte[] returnByte;
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            returnByte = md5.digest(text.getBytes(Boot.getCharset()));
        } catch (Exception e) {
            return null;
        }
        return DatatypeConverter.printBase64Binary(returnByte);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseRsa.java
================================================
package com.zhaidaosi.game.jgframework.common.encrpt;

import com.zhaidaosi.game.jgframework.Boot;

import javax.crypto.Cipher;
import javax.xml.bind.DatatypeConverter;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class BaseRsa {

    private static PublicKey publicKey;
    private static PrivateKey privateKey;

    static {
        if (publicKey == null) {
            publicKey = getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCifAl6RlbG1PVOowZJ2niVlijq9FC19jEIaA2WVm+En64roRsTjlWpAKOfYBHIwEYWvI7rObyobTIPyOkBOCx5Sbopq2ME7FUQEwI2IeEBGHwnIBPzkhTEt9kMT88g8hZRBV6D/p6J8Z1u2WU0q88Xpd4o7VDxFRmGUTSePOGcjQIDAQAB");
        }
        if (privateKey == null) {
            privateKey = getPrivateKey("MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKJ8CXpGVsbU9U6jBknaeJWWKOr0ULX2MQhoDZZWb4SfriuhGxOOVakAo59gEcjARha8jus5vKhtMg/I6QE4LHlJuimrYwTsVRATAjYh4QEYfCcgE/OSFMS32QxPzyDyFlEFXoP+nonxnW7ZZTSrzxel3ijtUPEVGYZRNJ484ZyNAgMBAAECgYA3SHCJE8mOmQJloP4Qvq5sZszBNCMJ5hvEunJ1Bi+nNhUybvwhaTon6DnDjhI+9XxjXABcdCaGP7DawgbVDWHDzjgQG0xQle2ryrZFa0thgQDYM4iraMgxMN/5kTXD9DlZcf871N0DeI8dTpxJhVMcM5d95sml6pJxxqwyzABiAQJBAO1rvTpHS6OgDVRpHV4HksyEcKETEayVknAIbTGP3VH3L4X50CpwOwPsvaHi5sENkSEA2JtKj0qF0CbP3sAdDcECQQCvMxhuq2V+dRyMkFLot3YZbMffr2dJi6o4XwxDtI/nhHzS5bQIzKX7L1m8ZJ0GR6CSjZ6X+LBRW6h3tLTsNdnNAkANsK+5o5DN/5WlL2Z9HIyvdFeWQiY7wGgwQ5wgRn5pkopP/Gave8c7Y7RPmGjb6u9aatUSp0r57hthkYzzoPlBAkBG6sfZBEfxCDamL0VgLeMAJ6hAQx/sBTzB1LeCMHSPonFkbNaTOUN2iZQpThDBmfzFVc38dg3o4NEwo1UYyDOBAkAsfnopb+Msp8pMBw7mcX/CeCXNIVpBNWSLtT0AssDf9ofaQ+bIsFIsy2GaPt/UuZmltXgTP5J3iWqFIKQDRstH");
        }
    }

    public static void init(String publicKeyString, String privateKeyString) {
        publicKey = getPublicKey(publicKeyString);
        privateKey = getPrivateKey(privateKeyString);
    }

    public static String encrypt(String data) {
        if (data == null) {
            return null;
        }
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return DatatypeConverter.printBase64Binary(cipher.doFinal(data.getBytes(Boot.getCharset())));
        } catch (Exception e) {
            return null;
        }
    }

    public static String decrypt(String data) {
        if (data == null) {
            return null;
        }
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return new String(cipher.doFinal(DatatypeConverter.parseBase64Binary(data)), Boot.getCharset());
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 得到公钥
     *
     * @param key 密钥字符串(经过base64编码)
     * @throws Exception
     */
    private static PublicKey getPublicKey(String key) {
        byte[] keyBytes;
        PublicKey publicKey = null;
        try {
            keyBytes = DatatypeConverter.parseBase64Binary(key);

            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(keySpec);
        } catch (Exception e) {
            return null;
        }
        return publicKey;
    }

    /**
     * 得到私钥
     *
     * @param key 密钥字符串(经过base64编码)
     * @throws Exception
     */
    private static PrivateKey getPrivateKey(String key) {
        byte[] keyBytes;
        PrivateKey privateKey = null;
        try {
            keyBytes = DatatypeConverter.parseBase64Binary(key);

            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            privateKey = keyFactory.generatePrivate(keySpec);
        } catch (Exception e) {
            return null;
        }
        return privateKey;
    }

    /**
     * 得到密钥字符串(经过base64编码)
     *
     * @return
     */
    private static String getKeyString(Key key) throws Exception {
        byte[] keyBytes = key.getEncoded();
        return DatatypeConverter.printBase64Binary(keyBytes);
    }

    public static void main(String[] args) throws Exception {

        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 密钥位数
        keyPairGen.initialize(1024);
        // 密钥对
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 公钥
        PublicKey publicKey = keyPair.getPublic();
        // 私钥
        PrivateKey privateKey = keyPair.getPrivate();

        String publicKeyString = getKeyString(publicKey);
        System.out.println("public:\n" + publicKeyString);

        String privateKeyString = getKeyString(privateKey);
        System.out.println("private:\n" + privateKeyString);

        BaseRsa.init(publicKeyString, privateKeyString);
        String test = "1231232123_2013-01-01 00:00:00";

        String t = BaseRsa.encrypt(test);
        System.out.println(t);

        String a = BaseRsa.decrypt(t);
        System.out.println(a);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/BaseException.java
================================================
package com.zhaidaosi.game.jgframework.common.excption;


@SuppressWarnings("serial")
public class BaseException extends Exception implements IBaseException {

    protected int code = 0;

    public BaseException(String msg, int code) {
        super(msg);
        this.code = code;
    }

    public int getCode() {
        return code;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/HttpException.java
================================================
package com.zhaidaosi.game.jgframework.common.excption;

@SuppressWarnings("serial")
public class HttpException extends BaseException {

    public HttpException(String message) {
        super(message, 60000);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/IBaseException.java
================================================
package com.zhaidaosi.game.jgframework.common.excption;

public interface IBaseException {

    public int getCode();
}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/MessageException.java
================================================
package com.zhaidaosi.game.jgframework.common.excption;

@SuppressWarnings("serial")
public class MessageException extends BaseException {

    public MessageException(String msg) {
        super(msg, 50000);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseCookie.java
================================================
package com.zhaidaosi.game.jgframework.common.http;

public class BaseCookie {

    private String key;
    private String value;

    public BaseCookie(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseHttp.java
================================================
package com.zhaidaosi.game.jgframework.common.http;

import com.zhaidaosi.game.jgframework.common.excption.HttpException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.*;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

@SuppressWarnings("unchecked")
public class BaseHttp {

    public static String GBK = "GBK";
    public static String GB2312 = "GB2312";
    public static String UTF8 = "UTF-8";
    public static String HEADER_HOST = "Host";
    public static String HEADER_REFERER = "Referer";

    private static final Logger log = LoggerFactory.getLogger(BaseHttp.class);
    private static int DEFAULT_TIMEOUT = 3000;
    private static String DEFAULT_CHARSET = "UTF-8";
    private static int DEFAULT_MAX_REDIRECT = 2;
    private static String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/22.0 zhaidaosi.com";

    public static int header(String url) throws Exception {
        return header(url, null, null, null, DEFAULT_TIMEOUT);
    }

    public static String get(String url) throws Exception {
        return get(url, null, null, DEFAULT_CHARSET, DEFAULT_MAX_REDIRECT, DEFAULT_TIMEOUT);
    }

    public static String get(String url, Map<String, String> header) throws Exception {
        return get(url, header, null, DEFAULT_CHARSET, DEFAULT_MAX_REDIRECT, DEFAULT_TIMEOUT);
    }

    public static String get(String url, String charset) throws Exception {
        return get(url, null, null, charset, DEFAULT_MAX_REDIRECT, DEFAULT_TIMEOUT);
    }

    public static String post(String url, Map<String, Object> params) throws Exception {
        return post(url, params, null, null, DEFAULT_CHARSET, DEFAULT_TIMEOUT);
    }

    public static String post(String url, Map<String, Object> params, int timeout) throws Exception {
        return post(url, params, null, null, DEFAULT_CHARSET, timeout);
    }

    public static String post(String url, Map<String, Object> params, Map<String, String> header) throws Exception {
        return post(url, params, header, null, DEFAULT_CHARSET, DEFAULT_TIMEOUT);
    }

    public static void sendRequest(String url) throws Exception {
        sendRequest(url, null, null, null, DEFAULT_CHARSET);
    }

    public static void sendRequest(String url, Map<String, Object> params) throws Exception {
        sendRequest(url, params, null, null, DEFAULT_CHARSET);
    }

    /**
     * 返回状态码
     *
     * @param url
     * @param header
     * @param cookie
     * @return
     * @throws HttpException
     */
    public static int header(String url, HashMap<String, String> header, BaseCookie[] cookie, String charset, int timeout) throws Exception {
        check(url);
        if (charset == null) {
            charset = DEFAULT_CHARSET;
        }
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("url", url);
        args.put("header", header);
        args.put("cookie", cookie);
        args.put("charset", charset);
        args.put("timeout", timeout);
        return doHeader(args);
    }

    /**
     * 模拟get
     *
     * @param url
     * @param header
     * @param cookie
     * @param charset
     * @param maxRedirect
     * @return
     * @throws HttpException
     */
    public static String get(String url, Map<String, String> header, BaseCookie[] cookie, String charset, int maxRedirect, int timeout) throws Exception {
        check(url);
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("url", url);
        args.put("header", header);
        args.put("cookie", cookie);
        args.put("charset", charset);
        args.put("maxRedirect", maxRedirect);
        args.put("timeout", timeout);
        return doGet(args, 0);
    }

    /**
     * 模拟post
     *
     * @param url
     * @param params
     *            可以是String和String[]
     * @param header
     * @param cookie
     * @param charset
     * @return
     * @throws HttpException
     */
    public static String post(String url, Map<String, Object> params, Map<String, String> header, BaseCookie[] cookie, String charset, int timeout) throws Exception {
        check(url);
        if (charset == null) {
            charset = DEFAULT_CHARSET;
        }
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("url", url);
        args.put("header", header);
        args.put("cookie", cookie);
        args.put("charset", charset);
        args.put("params", params);
        args.put("timeout", timeout);
        return doPost(args);
    }

    /**
     * 模拟http请求,不接受返回信息
     *
     * @param url
     * @param params
     *            可以是String和String[]
     * @param header
     * @param cookie
     * @param charset
     * @throws Exception
     */
    public static void sendRequest(String url, Map<String, Object> params, Map<String, String> header, BaseCookie[] cookie, String charset) throws Exception {
        check(url);
        if (charset == null) {
            charset = DEFAULT_CHARSET;
        }
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("url", url);
        args.put("header", header);
        args.put("cookie", cookie);
        args.put("charset", charset);
        args.put("params", params);
        doSendRequest(args);
    }

    private static void doSendRequest(Map<String, Object> args) throws URISyntaxException, UnknownHostException, IOException {
        String url = (String) args.get("url");
        HashMap<String, Object> params = (HashMap<String, Object>) args.get("params");
        HashMap<String, String> header = (HashMap<String, String>) args.get("header");
        BaseCookie[] cookie = (BaseCookie[]) args.get("cookie");
        String charset = (String) args.get("charset");
        URI uri = new URI(url);
        int port = uri.getPort();
        @SuppressWarnings("resource")
        Socket s = new Socket(uri.getHost(), port == -1 ? 80 : port);
        OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
        StringBuffer sb = new StringBuffer();
        String postStr = null;
        if (params != null) {
            postStr = "";
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                String key = entry.getKey();
                Object val = entry.getValue();
                if (val instanceof String) {
                    postStr += (URLEncoder.encode(key, charset) + "=" + URLEncoder.encode((String) val, charset) + "&");
                } else if (entry.getValue() instanceof String[]) {
                    for (String value : (String[]) val) {
                        postStr += (URLEncoder.encode(key, charset) + "=" + URLEncoder.encode(value, charset) + "&");
                    }
                }
            }
            postStr = postStr.substring(0, postStr.length() - 1);
            sb.append("POST ");
        } else {
            sb.append("GET ");
        }
        String fullPath = uri.getQuery() == null ? uri.getPath() : uri.getPath() + "?" + uri.getQuery();
        sb.append(fullPath + " HTTP/1.1\r\n");
        sb.append("Host: " + uri.getHost() + "\r\n");
        sb.append("User-Agent: " + DEFAULT_USER_AGENT + "\r\n");
        sb.append("Connection: keep-alive\r\n");
        if (header != null) {
            for (Map.Entry<String, String> h : header.entrySet()) {
                sb.append(h.getKey() + ": " + h.getValue() + "\r\n");
            }
        }
        if (postStr != null) {
            sb.append("Content-type: application/x-www-form-urlencoded\r\n");
            sb.append("Content-Length: " + postStr.length() + "\r\n");
        }
        if (cookie != null) {
            int size = cookie.length;
            for (int i = 0; i < size; i++) {
                sb.append("Cookie: " + URLEncoder.encode(cookie[i].getKey(), charset) + "=" + URLEncoder.encode(cookie[i].getValue(), charset));
                if (i < size - 1) {
                    sb.append("; ");
                }
            }
        }
        sb.append("\r\nConnection: Close\r\n\r\n");
        if (postStr != null) {
            sb.append(postStr + "\r\n");
        }
        osw.write(sb.toString());
        osw.flush();
        osw.close();
    }

    /**
     * 模拟get
     *
     * @param args
     * @param retry
     *            重试第几次了
     * @return
     * @throws HttpException
     */
    private static String doGet(HashMap<String, Object> args, int retry) throws HttpException {
        int maxRedirect = (Integer) args.get("maxRedirect");
        String result = null;
        if (retry > maxRedirect) {
            return result;
        }
        String url = (String) args.get("url");
        HashMap<String, String> header = (HashMap<String, String>) args.get("header");
        BaseCookie[] cookie = (BaseCookie[]) args.get("cookie");
        String charset = (String) args.get("charset");
        Integer timeout = (Integer) args.get("timeout");
        HttpClient client = new HttpClient();
        GetMethod method = new GetMethod(url);
        BaseHttp.init(client, method, header, cookie, charset, timeout);
        try {
            int statusCode = client.executeMethod(method);
            if (statusCode == HttpStatus.SC_OK) {
                result = getResponse(method, charset);
            } else if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_SEE_OTHER
                    || statusCode == HttpStatus.SC_TEMPORARY_REDIRECT) {
                // 301, 302, 303, 307 跳转
                Header locationHeader = method.getResponseHeader("location");
                String location = null;
                if (locationHeader != null) {
                    location = locationHeader.getValue();
                    retry++;
                    args.put("url", location);
                    result = BaseHttp.doGet(args, retry);
                }
            }
        } catch (IOException e) {
            throw new HttpException("执行HTTP Get请求" + url + "时,发生异常! => " + e.getMessage());
        } finally {
            method.releaseConnection();
        }
        return result;
    }

    /**
     * 模拟post
     *
     * @param args
     * @return
     * @throws HttpException
     */
    private static String doPost(HashMap<String, Object> args) throws HttpException {
        String result = null;
        String url = (String) args.get("url");
        HashMap<String, String> header = (HashMap<String, String>) args.get("header");
        BaseCookie[] cookie = (BaseCookie[]) args.get("cookie");
        String charset = (String) args.get("charset");
        Integer timeout = (Integer) args.get("timeout");
        HashMap<String, Object> params = (HashMap<String, Object>) args.get("params");
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);
        BaseHttp.init(client, method, header, cookie, charset, timeout);
        if (params != null) {
            NameValuePair[] data = new NameValuePair[params.size()];
            int i = 0;
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                String key = entry.getKey();
                Object val = entry.getValue();
                if (val instanceof String) {
                    data[i] = new NameValuePair(key, (String) val);
                } else if (val instanceof String[]) {
                    for (String value : (String[]) val) {
                        data[i] = new NameValuePair(key, value);
                    }
                } else {
                    throw new HttpException("post 参数类型必须为 String 或 String[]");
                }
                i++;
            }
            method.setRequestBody(data);
        }
        try {
            if (client.executeMethod(method) == HttpStatus.SC_OK) {
                result = getResponse(method, charset);
            }
        } catch (IOException e) {
            throw new HttpException("执行HTTP Post请求" + url + "时,发生异常! => " + e.getMessage());
        } finally {
            method.releaseConnection();
        }
        return result;
    }

    /**
     * 获取状态码
     *
     * @param args
     * @return
     * @throws HttpException
     */
    private static int doHeader(HashMap<String, Object> args) throws HttpException {
        int statusCode = 0;
        String url = (String) args.get("url");
        HashMap<String, String> header = (HashMap<String, String>) args.get("header");
        String charset = (String) args.get("charset");
        BaseCookie[] cookie = (BaseCookie[]) args.get("cookie");
        Integer timeout = (Integer) args.get("timeout");
        HttpClient client = new HttpClient();
        HttpMethod method = new GetMethod(url);
        BaseHttp.init(client, method, header, cookie, charset, timeout);
        try {
            statusCode = client.executeMethod(method);
        } catch (IOException e) {
            throw new HttpException("执行HTTP Header请求" + url + "时,发生异常! => " + e.getMessage());
        } finally {
            method.releaseConnection();
        }
        return statusCode;
    }

    /**
     * 初始化
     *
     * @param client
     * @param method
     * @param headers
     * @param cookie
     * @throws UnsupportedEncodingException
     */
    private static void init(HttpClient client, HttpMethod method, HashMap<String, String> header, BaseCookie[] cookie, String charset, int timeout) {
        client.getParams().setParameter(HttpMethodParams.HTTP_URI_CHARSET, charset);
        client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, charset);
        client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
        client.getHttpConnectionManager().getParams().setSoTimeout(timeout);
        method.setFollowRedirects(false);
        method.setRequestHeader("User-Agent", BaseHttp.DEFAULT_USER_AGENT);
        method.setRequestHeader("Cache-Control", "no-cache");
        method.setRequestHeader("Connection", "keep-alive");
        if (cookie != null) {
            String cookieString = "";
            for (BaseCookie ci : cookie) {
                try {
                    cookieString += URLEncoder.encode(ci.getKey(), charset) + "=" + URLEncoder.encode(ci.getValue(), charset) + "; ";
                } catch (UnsupportedEncodingException e) {
                    log.error(e.getMessage(), e);
                }
            }
            method.setRequestHeader("Cookie", cookieString);
        } else {
            method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
        }
        if (header != null) {
            for (Entry<String, String> h : header.entrySet()) {
                method.setRequestHeader(h.getKey(), h.getValue());
            }
        }
    }

    /**
     * 获取http请求结果
     *
     * @param method
     * @param charset
     * @return
     * @throws IOException
     */
    private static String getResponse(HttpMethod method, String charset) {
        StringBuffer response = new StringBuffer();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return response.toString();
    }

    /**
     * 检查url是否为空
     *
     * @param url
     * @throws HttpException
     */
    private static void check(String url) throws HttpException {
        if (url == null || url.trim().equals("")) {
            throw new HttpException("url不能为空");
        }
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueue.java
================================================
package com.zhaidaosi.game.jgframework.common.queue;

/**
 * 可快速定位的FIFO队列
 */
public class BaseQueue<E> {

    private BaseQueueElement<E> start = null;
    private BaseQueueElement<E> end = null;
    private final Object lock = new Object();
    private long putCount = 0;
    private long takeCount = 0;
    private long size = 0;

    /**
     * 获取队列头
     */
    public BaseQueueElement<E> getStart() {
        return start;
    }

    /**
     * 从队列尾插入元素
     */
    public BaseQueueElement<E> put(E value) {
        if (value == null) {
            return null;
        }
        BaseQueueElement<E> element = new BaseQueueElement<E>(value);
        synchronized (lock) {
            if (start == null) {
                start = element;
                end = element;
            } else {
                element.setBefore(end);
                end.setNext(element);
                end = element;
            }
            putCount++;
            size++;
            element.setNo(putCount);
        }
        return element;
    }

    /**
     * 从队列头弹出元素
     */
    public BaseQueueElement<E> take() {
        if (start == null) {
            return null;
        }
        BaseQueueElement<E> element;
        synchronized (lock) {
            element = start;
            if (start == end) {
                start = null;
                end = null;
                putCount = 0;
                takeCount = 0;
            } else {
                start = start.getNext();
                start.setBefore(null);
                takeCount++;
            }
            size--;
            element.reset();
        }
        return element;
    }

    /**
     * 删除一个元素
     */
    public boolean remove(BaseQueueElement<E> element) {
        BaseQueueElement<E> after = null;
        synchronized (lock) {
            if (element == start && element == end) {
                start = null;
                end = null;
                putCount = 0;
                takeCount = 0;
            } else if (element == start) {
                start = start.getNext();
                start.setBefore(null);
                takeCount++;
            } else if (element == end) {
                end = element.getBefore();
                end.setNext(null);
            } else {
                // 判断是否在队列中
                if (element.getBefore().getNext() != element || element.getNext().getBefore() != element) {
                    return false;
                }
                after = element.getNext();
                after.setBefore(element.getBefore());
                element.getBefore().setNext(after);
            }
            size--;
            element.reset();
            if (after != null) {
                do {
                    after.setNo(after.getNo() - 1);
                    after = after.getNext();
                } while (after != null);
            }
        }
        return true;
    }

    /**
     * 查找元素所在的位置
     */
    public long findIndex(BaseQueueElement<E> element) {
        if (element == null) {
            return -1;
        }
        synchronized (lock) {
            return element.getNo() - takeCount;
        }
    }

    /**
     * 返回队列长度
     */
    public long size() {
        synchronized (lock) {
            return size;
        }
    }

    /**
     * 删除队列所有元素
     */
    public void clear() {
        synchronized (lock) {
            while (start != null) {
                BaseQueueElement<E> element = start;
                start = start.getNext();
                element.reset();
                element = null;
            }
            start = null;
            end = null;
            putCount = 0;
            takeCount = 0;
            size = 0;
        }
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueueElement.java
================================================
package com.zhaidaosi.game.jgframework.common.queue;

public class BaseQueueElement<E> {

    private E value;
    private BaseQueueElement<E> before;
    private BaseQueueElement<E> next;
    private long No;

    public BaseQueueElement(E value) {
        this.value = value;
    }

    public void setValue(E value) {
        this.value = value;
    }

    public E getValue() {
        return value;
    }

    public BaseQueueElement<E> getBefore() {
        return before;
    }

    public void setBefore(BaseQueueElement<E> before) {
        this.before = before;
    }

    public BaseQueueElement<E> getNext() {
        return next;
    }

    public void setNext(BaseQueueElement<E> next) {
        this.next = next;
    }

    public void setNo(long No) {
        this.No = No;
    }

    public long getNo() {
        return No;
    }

    public void reset() {
        before = null;
        next = null;
        No = 0;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseDao.java
================================================
package com.zhaidaosi.game.jgframework.common.sdm;

import com.zhaidaosi.game.jgframework.Boot;
import org.hibernate.LockMode;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class BaseDao extends HibernateDaoSupport implements IBaseDao {
    private static final Logger log = LoggerFactory
            .getLogger(BaseDao.class);

    protected String tableName = "";
    protected String modelName = "";
    protected String entityPackage = Boot.SDM_BASE_PACKAGE_NAME + ".model.";

    @Override
    public List<?> find(String queryString) {
        return this.getQuery(queryString, null).list();
    }

    @Override
    public List<?> find(String queryString, Map<String, Object> data) {
        return this.getQuery(queryString, data).list();
    }

    @Override
    public List<?> find(String queryString, Map<String, Object> data, int start, int limit) {
        return this.getQuery(queryString, data, start, limit).list();
    }

    @Override
    public int total() {
        return this.total(null, null);
    }

    @Override
    public int total(String queryString) {
        return this.total(queryString, null);
    }

    @Override
    public int total(Map<String, Object> where) {
        return this.total(null, where);
    }


    @Override
    public int total(String queryString, Map<String, Object> where) {
        if (queryString == null) {
            queryString = "select count(1) from " + this.tableName;
            if (where != null) {
                queryString += " where " + this.formateWhereSql(where, "and");
                ;
            }
        }

        return ((Number) getQuery(queryString, where, false).uniqueResult()).intValue();
    }

    @Override
    public int update(String queryString) {
        return this.execute(queryString);
    }

    @Override
    public int update(Map<String, Object> where) {
        String queryString = "update " + this.tableName + " set " + this.formateWhereSql(where, ",");
        return this.execute(queryString, where);
    }

    @Override
    public int delete(String queryString) {
        return this.execute(queryString);
    }

    @Override
    public int delete(String queryString, Map<String, Object> where) {
        return this.execute(queryString, where);
    }

    @Override
    public int execute(String queryString) {
        return this.execute(queryString, null);
    }

    @Override
    public int execute(String queryString, Map<String, Object> where) {
        int result = this.getQuery(queryString, where, false).executeUpdate();
        return result;
    }

    @Override
    public List<IBaseModel> findByProperty(String propertyName, Object value) {
        log.debug("finding Object instance with property: " + propertyName
                + ", value: " + value);
        try {
            String queryString = "from " + this.modelName + " as model where model."
                    + propertyName + "= ?";
            return getHibernateTemplate().find(queryString, value);
        } catch (RuntimeException re) {
            log.error("find by property name failed", re);
            throw re;
        }
    }

    @Override
    public IBaseModel findOneByProperty(String propertyName, Object value) {
        log.debug("finding Object instance with property: " + propertyName
                + ", value: " + value);
        try {
            String queryString = "from " + this.modelName + " as model where model."
                    + propertyName + "= ?";
            return (IBaseModel) getHibernateTemplate().find(queryString, value).get(0);
        } catch (RuntimeException re) {
            log.error("find by property name failed", re);
            throw re;
        }
    }

    @Override
    public IBaseModel findById(int id) {
        log.debug("getting Object instance with id: " + id);
        try {
            IBaseModel instance = (IBaseModel) getHibernateTemplate().get(
                    this.entityPackage + this.modelName, id);
            return instance;
        } catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }

    @Override
    public void update(IBaseModel persistentInstance) {
        log.debug("update Object instance");
        try {
            getHibernateTemplate().update(persistentInstance);
            log.debug("update successful");
        } catch (RuntimeException re) {
            log.error("update failed", re);
            throw re;
        }
    }

    @Override
    public void save(IBaseModel transientInstance) {
        log.debug("saving CronModel instance");
        try {
            getHibernateTemplate().save(transientInstance);
            log.debug("save successful");
        } catch (RuntimeException re) {
            log.error("save failed", re);
            throw re;
        }
    }

    @Override
    public void delete(IBaseModel persistentInstance) {
        log.debug("deleting Object instance");
        try {
            getHibernateTemplate().delete(persistentInstance);
            log.debug("delete successful");
        } catch (RuntimeException re) {
            log.error("delete failed", re);
            throw re;
        }
    }

    @Override
    public List<IBaseModel> findAll() {
        log.debug("finding all Object instances");
        try {
            String queryString = "from " + this.modelName;
            return getHibernateTemplate().find(queryString);
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
    }

    @Override
    public List<IBaseModel> findAll(int start, int limit) {
        log.debug("finding all Object instances");
        try {
            HibernateTemplate ht = getHibernateTemplate();
            int PRE_MAX_RESULT = ht.getMaxResults();
            int PRE_LIMIT = ht.getFetchSize();
            ht.setMaxResults(limit);
            ht.setFetchSize(start);
            String queryString = "from " + this.modelName;
            List<IBaseModel> list = ht.find(queryString);
            ht.setMaxResults(PRE_MAX_RESULT);
            ht.setFetchSize(PRE_LIMIT);
            return list;
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw re;
        }
    }

    @Override
    public IBaseModel merge(IBaseModel detachedInstance) {
        log.debug("merging BaseModel instance");
        try {
            IBaseModel result = (IBaseModel) getSession().merge(detachedInstance);
            log.debug("merge successful");
            return result;
        } catch (RuntimeException re) {
            log.error("merge failed", re);
            throw re;
        }
    }

    @Override
    public void saveOrUpdate(IBaseModel instance) {
        log.debug("attaching dirty BaseModel instance");
        try {
            getSession().saveOrUpdate(instance);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

    @Override
    public void attachClean(IBaseModel instance) {
        log.debug("attaching clean Article instance");
        try {
            getSession().lock(instance, LockMode.NONE);
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

    protected SQLQuery getQuery(String queryString, Map<String, Object> where) {
        return this.getQuery(queryString, where, true);
    }

    protected SQLQuery getQuery(String queryString, Map<String, Object> where, boolean returnMap) {
        return this.getQuery(queryString, where, -1, -1, returnMap);
    }

    protected SQLQuery getQuery(String queryString, Map<String, Object> where, int start, int limit) {
        return this.getQuery(queryString, where, start, limit, true);
    }

    protected String formateWhereSql(Map<String, Object> where, String middleString) {
        String queryString = "";
        Iterator<String> iterator = where.keySet().iterator();
        boolean hasNext = iterator.hasNext();
        while (hasNext) {
            String key = iterator.next();
            queryString += key + " = :" + key;
            hasNext = iterator.hasNext();
            if (hasNext) {
                queryString += " " + middleString + " ";
            }
        }
        return queryString;
    }

    protected SQLQuery getQuery(String queryString, Map<String, Object> where, int start, int limit, boolean returnMap) {
        Session session = this.getSession();
        SQLQuery query = null;
        if (start > -1 && limit > 0) {
            query = session.createSQLQuery(queryString);
            query.setFirstResult(start);
            query.setMaxResults(limit);
        } else {
            query = session.createSQLQuery(queryString);
        }
        if (where != null) {
            for (Entry<String, Object> entry : where.entrySet()) {
                Object value = entry.getValue();
                String key = entry.getKey();
                if (value instanceof Collection) {
                    query.setParameterList(key, (Collection) value);
                } else if (value instanceof Object[]) {
                    query.setParameterList(key, (Object[]) value);
                } else {
                    query.setParameter(key, value);
                }
            }
        }
        if (returnMap) {
            query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        }
        return query;
    }

    @Autowired
    public void setSessionFactoryOverride(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getModelName() {
        return modelName;
    }

    public void setModelName(String modelName) {
        this.modelName = modelName;
    }
}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseModel.java
================================================
package com.zhaidaosi.game.jgframework.common.sdm;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;

@SuppressWarnings("serial")
public abstract class BaseModel implements IBaseModel, Cloneable, java.io.Serializable {

    protected static final Logger log = LoggerFactory.getLogger(BaseModel.class);

    public String toString() {
        Field[] fields = this.getClass().getDeclaredFields();
        StringBuffer strBuf = new StringBuffer();
        strBuf.append(this.getClass().getName());
        strBuf.append(" { ");
        for (int i = 0; i < fields.length; i++) {
            Field fd = fields[i];
            fd.setAccessible(true);
            strBuf.append("[" + fd.getName() + ": ");
            try {
                strBuf.append(fd.get(this) + "]");
            } catch (IllegalArgumentException | IllegalAccessException e) {
//					e.printStackTrace();
            }
            if (i != fields.length - 1)
                strBuf.append(", ");
        }

        strBuf.append(" }");
        return strBuf.toString();
    }

    public IBaseModel clone() {
        IBaseModel o = null;
        try {
            o = (IBaseModel) super.clone();
        } catch (CloneNotSupportedException e) {
            log.error(e.getMessage(), e);
        }
        return o;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseService.java
================================================
package com.zhaidaosi.game.jgframework.common.sdm;

import java.util.List;

public abstract class BaseService {

    protected IBaseDao dao;

    protected abstract void setDao();

    public IBaseModel findById(int id) {
        return dao.findById(id);
    }

    public List<?> findAll(int start, int limit) {
        return dao.findAll(start, limit);
    }

    public List<?> findByProperty(String propertyName, Object value) {
        return dao.findByProperty(propertyName, value);
    }

    public IBaseModel findOneByProperty(String propertyName, Object value) {
        return dao.findOneByProperty(propertyName, value);
    }

    public int total() {
        return dao.total();
    }

    public void save(IBaseModel obj) {
        dao.save(obj);
    }

    public void update(IBaseModel obj) {
        dao.update(obj);
    }

    public List<?> findAll() {
        return dao.findAll();
    }

    public void delete(IBaseModel obj) {
        dao.delete(obj);
    }

    public String getDatabase() {
        return null;
    }

    protected void setDao(IBaseDao dao) {
        this.dao = dao;
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseDao.java
================================================
package com.zhaidaosi.game.jgframework.common.sdm;

import java.util.List;
import java.util.Map;

public interface IBaseDao {

    public List<?> find(String queryString);

    public List<?> find(String queryString, Map<String, Object> data);

    public List<?> find(String queryString, Map<String, Object> data, int start, int limit);

    public int total();

    public int total(String queryString);

    public int total(Map<String, Object> where);

    public int total(String queryString, Map<String, Object> where);

    public int update(String queryString);

    public int update(Map<String, Object> where);

    public int delete(String queryString);

    public int delete(String queryString, Map<String, Object> where);

    public int execute(String queryString);

    public int execute(String queryString, Map<String, Object> where);

    public List<IBaseModel> findByProperty(String propertyName, Object value);

    public IBaseModel findOneByProperty(String propertyName, Object value);

    public IBaseModel findById(int id);

    public void update(IBaseModel persistentInstance);

    public void save(IBaseModel transientInstance);

    public void delete(IBaseModel persistentInstance);

    public List<IBaseModel> findAll();

    public List<IBaseModel> findAll(int start, int limit);

    public IBaseModel merge(IBaseModel detachedInstance);

    public void saveOrUpdate(IBaseModel instance);

    public void attachClean(IBaseModel instance);

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseModel.java
================================================
package com.zhaidaosi.game.jgframework.common.sdm;

public interface IBaseModel {

    public String toString();

    public IBaseModel clone();

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/AnnotationSessionFactoryBeanEx.java
================================================
package com.zhaidaosi.game.jgframework.common.spring;

import org.hibernate.HibernateException;
import org.hibernate.cfg.AnnotationConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
import org.springframework.util.CollectionUtils;

import javax.persistence.Entity;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 该类扩展了Spring的AnnotationSessionFactoryBean类,增加了对AnnotatedClass的批量导入功能。
 * 通过使用setAnnotatedClassesLocations(String[])方法(其中的参数,是导入文件的路径数组),
 * 添加所有需要导入的AnnotatedClass,支持Spring的ResourceLoader对资源的加载方式。
 * 通过使用setExcludedClasses(String[])方法(其中参数,是待去除的类的全路径名),
 * 来去除在上述包路径中不需要导入的AnnotatedClass。
 */
public class AnnotationSessionFactoryBeanEx extends
        AnnotationSessionFactoryBean {
    private static final Logger logger = LoggerFactory
            .getLogger(AnnotationSessionFactoryBeanEx.class);

    /**
     * The locations of the hibernate enity class files. They are often some of
     * the string with Sping-style resource. A ".class" subfix can make the
     * scaning more precise.
     * example:
     * classpath*:com/systop/** /model/*.class
     */
    private String[] annotatedClassesLocations;

    /**
     * Which classes are not included in the session. They are some of the
     * regular expression.
     */
    private Set<String> excludedClasseses = new HashSet<String>(0);

    /**
     * @param annotatedClassesLocations
     *            the annotatedClassesLocations to set
     */
    public void setAnnotatedClassesLocations(String[] annotatedClassesLocations) {
        this.annotatedClassesLocations = annotatedClassesLocations;
    }

    /**
     * @see AnnotationSessionFactoryBean#postProcessAnnotationConfiguration(org.hibernate.cfg.AnnotationConfiguration)
     */
    @Override
    protected void postProcessAnnotationConfiguration(
            AnnotationConfiguration config) throws HibernateException {
        Set<Class<?>> annClasses = scanAnnotatedClasses(); // Scan enity
        // classes.
        // Add entity classes to the configuration.
        if (!CollectionUtils.isEmpty(annClasses)) {
            for (Class<?> annClass : annClasses) {
                config.addAnnotatedClass(annClass);
            }
        }
    }

    /**
     * Scan annotated hibernate classes in the locations.
     *
     * @return Set of the annotated classes, if no matched class, return empty
     *         Set.
     */
    private Set<Class<?>> scanAnnotatedClasses() {
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(
                resourcePatternResolver);
        Set<Class<?>> annotatedClasses = new HashSet<Class<?>>();
        if (annotatedClassesLocations != null) {
            try {
                for (String annClassesLocation : annotatedClassesLocations) {
                    // Resolve the resources
                    Resource[] resources = resourcePatternResolver
                            .getResources(annClassesLocation);
                    for (Resource resource : resources) {
                        MetadataReader metadataReader = metadataReaderFactory
                                .getMetadataReader(resource);
                        String className = metadataReader.getClassMetadata()
                                .getClassName();
                        // If the class is hibernate enity class, and it does
                        // not match the excluded class patterns.
                        if (isEntityClass(metadataReader)
                                && !isExcludedClass(className)) {
                            Class<?> clazz = Class.forName(className);
                            annotatedClasses.add(clazz);
                            logger.debug("A entity class has been found. ({})",
                                    clazz.getName());
                        }
                    }

                }
            } catch (IOException e) {
                logger.error("I/O failure during classpath scanning, ({})", e
                        .getMessage());
                throw new HibernateException(e);
            } catch (ClassNotFoundException e) {
                logger.error("Class not found, ({})", e.getMessage());
                throw new HibernateException(e);
            } catch (LinkageError e) {
                logger.error("LinkageError ({})", e.getMessage());
                throw new HibernateException(e);
            }
        }

        return annotatedClasses;
    }

    /**
     * @return True if the given MetadataReader shows that the class is
     *         annotated by <code>javax.persistence.Enity</code>
     */
    private boolean isEntityClass(MetadataReader metadataReader) {
        Set<String> annTypes = metadataReader.getAnnotationMetadata()
                .getAnnotationTypes();
        if (CollectionUtils.isEmpty(annTypes)) {
            return false;
        }

        return annTypes.contains(Entity.class.getName());
    }

    /**
     *
     * @return True if the given class name match the excluded class patterns.
     */
    private boolean isExcludedClass(String className) {
        return excludedClasseses.contains(className);
    }

    /**
     * @param exculdePatterns
     *            the exculdePatterns to set
     */
    public void setExcludedClasses(String[] excludedClasses) {
        for (String cls : excludedClasses) {
            this.excludedClasseses.add(cls);
        }
    }

}

================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceAdvice.java
================================================
package com.zhaidaosi.game.jgframework.common.spring;

import com.zhaidaosi.game.jgframework.common.BaseRunTimer;
import com.zhaidaosi.game.jgframework.common.sdm.BaseService;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

import java.lang.reflect.Method;

public class DataSourceAdvice implements MethodBeforeAdvice,
        AfterReturningAdvice, ThrowsAdvice {

    private long startTime;

    public void before(Method method, Object[] args, Object target) {
        if (BaseRunTimer.isActive()) {
            startTime = System.currentTimeMillis();
        }
        String database = null;
        if (target instanceof BaseService) {
            database = ((BaseService) target).getDatabase();
        }
        if (method.getName().startsWith("save")
                || method.getName().startsWith("add")
                || method.getName().startsWith("update")
                || method.getName().startsWith("delete")) {
            DataSourceSwitcher.setMaster(database);
        } else {
            DataSourceSwitcher.setSlave(database);
        }
    }

    public void afterReturning(Object arg0, Method method, Object[] args,
                               Object target) {
        DataSourceSwitcher.clearDataSource();
        this.setRunTime(method, target);
    }

    public void afterThrowing(Method method, Object[] args, Object target,
                              Exception ex) {
        DataSourceSwitcher.clearDataSource();
        this.setRunTime(method, target);
    }

    private void setRunTime(Method method, Object target) {
        if (BaseRunTimer.isActive()) {
            long runningTime = System.currentTimeMillis() - startTime;
            BaseRunTimer.addTimer(target.getClass().getName() + "."
                    + method.getName() + " run " + runningTime + " ms");
        }
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceSwitcher.java
================================================
package com.zhaidaosi.game.jgframework.common.spring;

import org.springframework.util.Assert;

public class DataSourceSwitcher {

    private static ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    private static String defaultDatabase;


    public static void setDataSource(String dataSource) {
        Assert.notNull(dataSource, "dataSource cannot be null");
        contextHolder.set(dataSource);
    }

    public static void setMaster(String database) {
        if (database == null) {
            database = defaultDatabase;
        }
        setDataSource(database + "-master");
    }

    public static void setSlave(String database) {
        if (database == null) {
            database = defaultDatabase;
        }
        setDataSource(database + "-slave");
    }

    public static String getDataSource() {
        return (String) contextHolder.get();
    }

    public static void clearDataSource() {
        contextHolder.remove();
    }

    public static void setDefaultDatabase(String database) {
        defaultDatabase = database;
    }

}




================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DynamicDataSource.java
================================================
package com.zhaidaosi.game.jgframework.common.spring;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

    private String defaultDatabase;

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceSwitcher.getDataSource();
    }

    public void setDefaultDatabase(String defaultDatabase) {
        this.defaultDatabase = defaultDatabase;
        DataSourceSwitcher.setDefaultDatabase(this.defaultDatabase);
    }

}




================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/ServiceManager.java
================================================
package com.zhaidaosi.game.jgframework.common.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServiceManager {

    private static ClassPathXmlApplicationContext context = null;

    public static void init() {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    public static <T> Object getService(String id) {
        return context.getBean(id);
    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/AuthConnector.java
================================================
package com.zhaidaosi.game.jgframework.connector;

import com.zhaidaosi.game.jgframework.Boot;
import com.zhaidaosi.game.jgframework.Router;
import com.zhaidaosi.game.jgframework.common.BaseRunTimer;
import com.zhaidaosi.game.jgframework.message.IBaseMessage;
import com.zhaidaosi.game.jgframework.message.InMessage;
import com.zhaidaosi.game.jgframework.message.OutMessage;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.*;
import io.netty.handler.codec.http.cors.CorsConfig;
import io.netty.handler.codec.http.cors.CorsHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
import static io.netty.handler.codec.http.HttpMethod.POST;
import static io.netty.handler.codec.http.HttpResponseStatus.FORBIDDEN;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;

public class AuthConnector implements IBaseConnector {

    private static final Logger log = LoggerFactory.getLogger(AuthConnector.class);
    private final InetSocketAddress localAddress;
    private ServerBootstrap bootstrap;
    private NioEventLoopGroup bossGroup;
    private NioEventLoopGroup workerGroup;
    private String charset = Boot.getCharset().name();
    private boolean isPause = false;

    public AuthConnector(int port) {
        this.localAddress = new InetSocketAddress(port);
    }

    @Override
    public void start() {
        if (bootstrap != null) {
            return;
        }

        bootstrap = new ServerBootstrap();
        bossGroup = new NioEventLoopGroup(1);

        if (Boot.getAuthThreadCount() > 0) {
            workerGroup = new NioEventLoopGroup(Boot.getAuthThreadCount());
        } else {
            workerGroup = new NioEventLoopGroup();
        }

        try {
            bootstrap.group(bossGroup, workerGroup)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .channel(NioServerSocketChannel.class)
                    .childOption(ChannelOption.TCP_NODELAY, true)
                    .childOption(ChannelOption.SO_REUSEADDR, true)
                    .childHandler(new HttpServerInitializer())
                    .bind(localAddress);
            log.info("Auth Service is running! port : " + localAddress.getPort());
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

    void pause() {
        isPause = true;
    }

    void resume() {
        isPause = false;
    }

    @Override
    public void stop() {
        if (bootstrap == null) {
            return;
        }
        workerGroup.shutdownGracefully();
        bossGroup.shutdownGracefully();
    }

    private class HttpServerInitializer extends ChannelInitializer<SocketChannel> {

        @Override
        public void initChannel(SocketChannel ch) {
            CorsConfig corsConfig = CorsConfig.withAnyOrigin().build();
            ChannelPipeline p = ch.pipeline();
            p.addLast(new HttpResponseEncoder());
            p.addLast(new HttpRequestDecoder());
            p.addLast(new HttpObjectAggregator(65536));
            p.addLast(new ChunkedWriteHandler());
            p.addLast(new CorsHandler(corsConfig));
            p.addLast(new HttpHandler());
        }

    }

    private class HttpHandler extends ChannelInboundHandlerAdapter {

        private InMessage inMsg;

        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            if (isPause) {
                sendHttpResponse(ctx, OutMessage.showError("系统已关闭", 11000).toString(), true);
            }
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) throws Exception {
            String error = t.getMessage();
            log.error(error, t);
            sendHttpResponse(ctx, OutMessage.showError("系统错误:" + error, 10000).toString(), true);
            ctx.close();
        }

        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            BaseRunTimer.showTimer();
        }

        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            ctx.flush();
        }

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

            if (msg instanceof HttpRequest) {
                HttpRequest request = (HttpRequest) msg;
                if (request.getMethod() != POST) {
                    sendErrorHttpResponse(ctx, new DefaultFullHttpResponse(HTTP_1_1, FORBIDDEN));
                    return;
                }
                inMsg = new InMessage(Boot.getAuthHandler() + request.getUri().substring(1).replace("/", "\\.").toLowerCase());
            }

            long startTime = 0;
            if (BaseRunTimer.isActive()) {
                startTime = System.currentTimeMillis();
            }

            if (msg instanceof HttpContent) {

                HttpContent httpContent = (HttpContent) msg;
                ByteBuf content = httpContent.content();
                String post = content.toString(Boot.getCharset());
                content.release();

                QueryStringDecoder queryStringDecoder = new QueryStringDecoder(post, Boot.getCharset(), false);
                Map<String, List<String>> params = queryStringDecoder.parameters();
                if (!params.isEmpty()) {
                    for (Entry<String, List<String>> p : params.entrySet()) {
                        String key = p.getKey();
                        List<String> vals = p.getValue();
                        inMsg.putMember(key, vals.get(0));
                    }
                }
                IBaseMessage rs = Router.run(inMsg, ctx.channel());

                if (BaseRunTimer.isActive()) {
                    long runningTime = System.currentTimeMillis() - startTime;
                    BaseRunTimer.addTimer("AuthConnector messageReceived run " + runningTime + " ms");
                }
                if (rs == null) {
                    sendErrorHttpResponse(ctx, new DefaultFullHttpResponse(HTTP_1_1, FORBIDDEN));
                } else {
                    sendHttpResponse(ctx, rs.toString(), true);
                }
            }
        }

        private void sendHttpResponse(ChannelHandlerContext ctx, String res, boolean isJson) {
            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(res.getBytes()));
            response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
//            response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
            if (isJson) {
                response.headers().set(CONTENT_TYPE, "application/json; charset=" + charset);
            } else {
                response.headers().set(CONTENT_TYPE, "text/html; charset=" + charset);
            }
            ctx.channel().write(response).addListener(ChannelFutureListener.CLOSE);
        }

        private void sendErrorHttpResponse(ChannelHandlerContext ctx, DefaultFullHttpResponse response) {
            response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
            ctx.channel().write(response).addListener(ChannelFutureListener.CLOSE);
        }

    }

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/IBaseConnector.java
================================================
package com.zhaidaosi.game.jgframework.connector;

import com.zhaidaosi.game.jgframework.model.entity.IBaseCharacter;
import io.netty.util.AttributeKey;

public interface IBaseConnector {

    AttributeKey<IBaseCharacter> PLAYER = AttributeKey.valueOf("player");

    void start();

    void stop();

}


================================================
FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/ManagerConnector.java
================================================
package com.zhaidaosi.game.jgframework.connector;

import com.zhaidaosi.game.jgframework.Boot;
import com.zhaidaosi.game.jgframework.common.BaseDate;
import com.zhaidaosi.game.jgframework.common.BaseIp;
import com.zhaidaosi.game.jgframework.message.OutMessage;
import com.zhaidaosi.game.jgframework.session.SessionManager;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


public class ManagerConnector implements IBaseConnector {

    private static final Logger log = LoggerFactory.getLogger(ManagerConnector.class);
    private final InetSocketAddress localAddress;
    private ServerBootstrap bootstrap;
    private NioEventLoopGroup bossGroup;
    private NioEventLoopGroup workerGroup;

    public ManagerConnector(int port) {
 
Download .txt
gitextract_g4i9k2tv/

├── .gitignore
├── LICENSE
├── README.md
├── default_applicationContext.xml
├── default_jgframework.properties
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── zhaidaosi/
        │           └── game/
        │               └── jgframework/
        │                   ├── Boot.java
        │                   ├── Router.java
        │                   ├── common/
        │                   │   ├── BaseAvlTree.java
        │                   │   ├── BaseDate.java
        │                   │   ├── BaseFile.java
        │                   │   ├── BaseGeneratePassword.java
        │                   │   ├── BaseIp.java
        │                   │   ├── BaseJson.java
        │                   │   ├── BaseRunTimer.java
        │                   │   ├── BaseSocket.java
        │                   │   ├── BaseString.java
        │                   │   ├── cache/
        │                   │   │   ├── BaseLocalCached.java
        │                   │   │   └── BaseMemCached.java
        │                   │   ├── encrpt/
        │                   │   │   ├── BaseDes.java
        │                   │   │   ├── BaseMd5.java
        │                   │   │   └── BaseRsa.java
        │                   │   ├── excption/
        │                   │   │   ├── BaseException.java
        │                   │   │   ├── HttpException.java
        │                   │   │   ├── IBaseException.java
        │                   │   │   └── MessageException.java
        │                   │   ├── http/
        │                   │   │   ├── BaseCookie.java
        │                   │   │   └── BaseHttp.java
        │                   │   ├── queue/
        │                   │   │   ├── BaseQueue.java
        │                   │   │   └── BaseQueueElement.java
        │                   │   ├── sdm/
        │                   │   │   ├── BaseDao.java
        │                   │   │   ├── BaseModel.java
        │                   │   │   ├── BaseService.java
        │                   │   │   ├── IBaseDao.java
        │                   │   │   └── IBaseModel.java
        │                   │   └── spring/
        │                   │       ├── AnnotationSessionFactoryBeanEx.java
        │                   │       ├── DataSourceAdvice.java
        │                   │       ├── DataSourceSwitcher.java
        │                   │       ├── DynamicDataSource.java
        │                   │       └── ServiceManager.java
        │                   ├── connector/
        │                   │   ├── AuthConnector.java
        │                   │   ├── IBaseConnector.java
        │                   │   ├── ManagerConnector.java
        │                   │   └── ServiceConnector.java
        │                   ├── handler/
        │                   │   ├── BaseHandler.java
        │                   │   ├── BaseHandlerChannel.java
        │                   │   └── IBaseHandler.java
        │                   ├── message/
        │                   │   ├── IBaseMessage.java
        │                   │   ├── InMessage.java
        │                   │   ├── MessageDecode.java
        │                   │   ├── MessageEncode.java
        │                   │   ├── OutMessage.java
        │                   │   └── WebSocketEncode.java
        │                   ├── model/
        │                   │   ├── BasePosition.java
        │                   │   ├── action/
        │                   │   │   ├── ActionManager.java
        │                   │   │   ├── BaseAction.java
        │                   │   │   └── IBaseAction.java
        │                   │   ├── area/
        │                   │   │   ├── AreaManager.java
        │                   │   │   ├── BaseArea.java
        │                   │   │   ├── BaseZone.java
        │                   │   │   └── IBaseArea.java
        │                   │   ├── entity/
        │                   │   │   ├── BaseEntity.java
        │                   │   │   ├── BaseNpc.java
        │                   │   │   ├── BasePlayer.java
        │                   │   │   ├── BasePlayerFactory.java
        │                   │   │   ├── IBaseCharacter.java
        │                   │   │   ├── IBaseEntity.java
        │                   │   │   └── IBasePlayerFactory.java
        │                   │   └── map/
        │                   │       └── IBaseMap.java
        │                   ├── rsync/
        │                   │   ├── BaseRsync.java
        │                   │   ├── IBaseRsync.java
        │                   │   └── RsyncManager.java
        │                   └── session/
        │                       ├── BaseSecretFactory.java
        │                       ├── IBaseSecretFactory.java
        │                       └── SessionManager.java
        └── resources/
            └── errorCode.properties
Download .txt
SYMBOL INDEX (677 symbols across 69 files)

FILE: src/main/java/com/zhaidaosi/game/jgframework/Boot.java
  class Boot (line 27) | public class Boot {
    method init (line 72) | private static boolean init() {
    method setManagerAllowIps (line 210) | private static void setManagerAllowIps(String[] ips) {
    method setActionPackage (line 220) | public static void setActionPackage(String actionPackage) {
    method setAreaPackage (line 228) | public static void setAreaPackage(String areaPackage) {
    method getPlayerFactory (line 236) | public static IBasePlayerFactory getPlayerFactory() {
    method setPlayerFactory (line 244) | public static void setPlayerFactory(IBasePlayerFactory playerFactory) {
    method getMemcacheKeyPrefix (line 252) | public static String getMemcacheKeyPrefix() {
    method getServiceConnector (line 260) | public static ServiceConnector getServiceConnector() {
    method getAuthConnector (line 268) | public static AuthConnector getAuthConnector() {
    method getManagerPort (line 276) | public static int getManagerPort() {
    method getManagerAllowIps (line 284) | public static ArrayList<Long[]> getManagerAllowIps() {
    method getManagerUser (line 292) | public static String getManagerUser() {
    method getManagerPassword (line 300) | public static String getManagerPassword() {
    method getCharset (line 309) | public static Charset getCharset() {
    method getServiceThreadCount (line 317) | public static int getServiceThreadCount() {
    method getAuthThreadCount (line 325) | public static int getAuthThreadCount() {
    method getMemcacheServers (line 333) | public static ArrayList<String> getMemcacheServers() {
    method getServiceIps (line 341) | public static ArrayList<String> getServiceIps() {
    method getAuthHandler (line 349) | public static String getAuthHandler() {
    method getServicePort (line 357) | public static int getServicePort() {
    method getServiceCount (line 365) | public static int getServiceCount() {
    method getServiceSyncPeriod (line 373) | public static long getServiceSyncPeriod() {
    method getServiceHeartbeatTime (line 381) | public static int getServiceHeartbeatTime() {
    method getServiceAddress (line 390) | public static String getServiceAddress(String ip) {
    method getDebug (line 402) | public static boolean getDebug() {
    method restart (line 410) | public static void restart() {
    method stop (line 418) | public static void stop() {
    method start (line 434) | public static void start() {
    method start (line 442) | public static void start(String args) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/Router.java
  class Router (line 18) | public class Router {
    method init (line 30) | public static void init() {
    method run (line 56) | public static IBaseMessage run(InMessage im, Channel ch) throws Except...

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseAvlTree.java
  class BaseAvlTree (line 10) | public class BaseAvlTree<E extends Comparable<E>> extends AbstractSet<E> {
    class Entry (line 14) | private static class Entry<E> {
      method Entry (line 34) | public Entry(E elem, Entry<E> parent) {
    class TreeIterator (line 40) | private class TreeIterator implements Iterator<E> {
      method TreeIterator (line 45) | TreeIterator() {
      method hasNext (line 54) | public boolean hasNext() {
      method next (line 60) | public E next() {
      method remove (line 68) | public void remove() {
    method rotateLeft (line 82) | private void rotateLeft(Entry<E> p) {
    method rotateRight (line 173) | private void rotateRight(Entry<E> p) {
    method add (line 222) | public boolean add(E elem) {
    method fixAfterInsertion (line 285) | protected void fixAfterInsertion(Entry<E> ancestor, Entry<E> inserted) {
    method adjustPath (line 430) | protected void adjustPath(Entry<E> to, Entry<E> inserted) {
    method adjustLeftRigth (line 464) | protected void adjustLeftRigth(Entry<E> ancestor, Entry<E> inserted) {
    method adjustRigthLeft (line 566) | protected void adjustRigthLeft(Entry<E> ancestor, Entry<E> inserted) {
    method remove (line 663) | public boolean remove(E elem) {
    method getEntry (line 671) | private Entry<E> getEntry(E e) {
    method deleteEntry (line 687) | private void deleteEntry(Entry<E> p) {
    method successor (line 743) | private Entry<E> successor(Entry<E> e) {
    method fixAfterDeletion (line 777) | protected void fixAfterDeletion(E elem, Entry<E> ancestor) {
    method contains (line 1026) | public boolean contains(E o) {
    method isAVL (line 1047) | public boolean isAVL() {
    method checkAVL (line 1058) | public static <E extends Comparable<E>> boolean checkAVL(Entry<E> p) {
    method h (line 1073) | protected static <E extends Comparable<E>> int h(Entry<E> p) {
    method height (line 1084) | public int height() {
    method heightIter (line 1091) | public int heightIter() {
    method iterator (line 1102) | @Override
    method size (line 1107) | @Override
    method main (line 1112) | public static void main(String[] args) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseDate.java
  class BaseDate (line 7) | public class BaseDate {
    method time2String (line 18) | public static String time2String(String format, long time) {
    method time2String (line 29) | public static String time2String(String format) {
    method string2Time (line 38) | public static long string2Time(String date) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseFile.java
  class BaseFile (line 13) | @SuppressWarnings("resource")
    method getClasses (line 19) | public static Set<Class<?>> getClasses(String pack, boolean recursive) {
    method getClasses (line 31) | public static Set<Class<?>> getClasses(String pack, String suffix, boo...
    method findAndAddClassesInPackageByFile (line 121) | private static void findAndAddClassesInPackageByFile(String packageNam...
    method fileList (line 157) | public static List<String> fileList(String path) {
    method fileList (line 161) | public static List<String> fileList(String path, boolean needDir) {
    method fileList (line 180) | private static List<String> fileList(List<String> list, String path, S...
    method readResourceByLines (line 196) | public static String readResourceByLines(String resourcePath) {
    method readFileByLines (line 223) | public static String readFileByLines(String fileName) {
    method readFileByLines (line 231) | public static String readFileByLines(File file) {
    method readFileLastByLine (line 256) | public static String readFileLastByLine(String filePath, int lastStart...
    method codeString (line 309) | public static String codeString(String fileName) throws Exception {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseGeneratePassword.java
  class BaseGeneratePassword (line 5) | public class BaseGeneratePassword {
    method doGenerate (line 30) | public static String doGenerate(final int intPassLength) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseIp.java
  class BaseIp (line 6) | public class BaseIp {
    method stringToIp (line 10) | public static Long[] stringToIp(String ips) {
    method ipToLong (line 24) | public static long ipToLong(String ip) {
    method checkIp (line 37) | public static boolean checkIp(String ip, Long[] ipArr) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseJson.java
  class BaseJson (line 8) | public class BaseJson {
    method JsonToObject (line 12) | public static <T> T JsonToObject(String jsonStr, Class<T> c) {
    method ObjectToJson (line 16) | public static String ObjectToJson(Object obj) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseRunTimer.java
  class BaseRunTimer (line 17) | public class BaseRunTimer {
    method addTimer (line 25) | public static void addTimer(String msg) {
    method getTimer (line 34) | private static List<String> getTimer() {
    method showTimer (line 42) | public static void showTimer() {
    method isActive (line 60) | public static boolean isActive() {
    method toActive (line 64) | public static void toActive() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseSocket.java
  class BaseSocket (line 15) | public class BaseSocket {
    method BaseSocket (line 23) | private BaseSocket(String host, int port) throws UnknownHostException,...
    method getNewInstance (line 29) | public static BaseSocket getNewInstance(String host, int port)
    method getInstance (line 34) | public static BaseSocket getInstance(String host, int port)
    method reconnect (line 44) | public void reconnect() throws IOException {
    method request (line 52) | public OutMessage request(InMessage msg) throws IOException, MessageEx...
    method heartBeat (line 61) | public void heartBeat() throws IOException {
    method send (line 65) | public void send(InMessage msg) throws IOException {
    method receive (line 72) | private OutMessage receive() throws IOException, MessageException {
    method close (line 77) | public void close() throws IOException {
    method closeNew (line 84) | public void closeNew() throws IOException {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/BaseString.java
  class BaseString (line 3) | public class BaseString {
    method isEmpty (line 5) | public static boolean isEmpty(String str) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseLocalCached.java
  class BaseLocalCached (line 11) | public class BaseLocalCached {
    class BaseCacheElement (line 15) | private class BaseCacheElement {
      method BaseCacheElement (line 19) | private BaseCacheElement(Object value, long failureTime) {
    method BaseLocalCached (line 32) | public BaseLocalCached() {
    method set (line 45) | public void set(String key, Object value, int time) {
    method set (line 49) | public void set(String key, Object value) {
    method delete (line 53) | public void delete(String key) {
    method checkInvalid (line 62) | public boolean checkInvalid(Object value) {
    method get (line 66) | public Object get(String key) {
    method checkTime (line 78) | private boolean checkTime(BaseCacheElement element) {
    method startTimer (line 88) | public static void startTimer() {
    method cancelTimer (line 95) | public static void cancelTimer() {
    method invalid (line 102) | private static void invalid() {
    class InvalidTask (line 114) | private static class InvalidTask extends TimerTask {
      method run (line 115) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseMemCached.java
  class BaseMemCached (line 9) | public class BaseMemCached extends MemCachedClient {
    method BaseMemCached (line 66) | private BaseMemCached() {
    method getInstance (line 74) | public static BaseMemCached getInstance() {
    method getMcKey (line 78) | public static String getMcKey(String key) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseDes.java
  class BaseDes (line 13) | public class BaseDes {
    method setDesKey (line 19) | public static void setDesKey(String key) {
    method encrypt (line 28) | public static String encrypt(String data) {
    method decrypt (line 43) | public static String decrypt(String data) {
    method encrypt (line 65) | private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    method decrypt (line 92) | private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseMd5.java
  class BaseMd5 (line 8) | public class BaseMd5 {
    method encrypt (line 16) | public static String encrypt(String text) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseRsa.java
  class BaseRsa (line 13) | public class BaseRsa {
    method init (line 27) | public static void init(String publicKeyString, String privateKeyStrin...
    method encrypt (line 32) | public static String encrypt(String data) {
    method decrypt (line 45) | public static String decrypt(String data) {
    method getPublicKey (line 64) | private static PublicKey getPublicKey(String key) {
    method getPrivateKey (line 85) | private static PrivateKey getPrivateKey(String key) {
    method getKeyString (line 105) | private static String getKeyString(Key key) throws Exception {
    method main (line 110) | public static void main(String[] args) throws Exception {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/BaseException.java
  class BaseException (line 4) | @SuppressWarnings("serial")
    method BaseException (line 9) | public BaseException(String msg, int code) {
    method getCode (line 14) | public int getCode() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/HttpException.java
  class HttpException (line 3) | @SuppressWarnings("serial")
    method HttpException (line 6) | public HttpException(String message) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/IBaseException.java
  type IBaseException (line 3) | public interface IBaseException {
    method getCode (line 5) | public int getCode();

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/excption/MessageException.java
  class MessageException (line 3) | @SuppressWarnings("serial")
    method MessageException (line 6) | public MessageException(String msg) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseCookie.java
  class BaseCookie (line 3) | public class BaseCookie {
    method BaseCookie (line 8) | public BaseCookie(String key, String value) {
    method getKey (line 13) | public String getKey() {
    method getValue (line 17) | public String getValue() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseHttp.java
  class BaseHttp (line 19) | @SuppressWarnings("unchecked")
    method header (line 34) | public static int header(String url) throws Exception {
    method get (line 38) | public static String get(String url) throws Exception {
    method get (line 42) | public static String get(String url, Map<String, String> header) throw...
    method get (line 46) | public static String get(String url, String charset) throws Exception {
    method post (line 50) | public static String post(String url, Map<String, Object> params) thro...
    method post (line 54) | public static String post(String url, Map<String, Object> params, int ...
    method post (line 58) | public static String post(String url, Map<String, Object> params, Map<...
    method sendRequest (line 62) | public static void sendRequest(String url) throws Exception {
    method sendRequest (line 66) | public static void sendRequest(String url, Map<String, Object> params)...
    method header (line 79) | public static int header(String url, HashMap<String, String> header, B...
    method get (line 104) | public static String get(String url, Map<String, String> header, BaseC...
    method post (line 128) | public static String post(String url, Map<String, Object> params, Map<...
    method sendRequest (line 154) | public static void sendRequest(String url, Map<String, Object> params,...
    method doSendRequest (line 168) | private static void doSendRequest(Map<String, Object> args) throws URI...
    method doGet (line 240) | private static String doGet(HashMap<String, Object> args, int retry) t...
    method doPost (line 285) | private static String doPost(HashMap<String, Object> args) throws Http...
    method doHeader (line 334) | private static int doHeader(HashMap<String, Object> args) throws HttpE...
    method init (line 363) | private static void init(HttpClient client, HttpMethod method, HashMap...
    method getResponse (line 400) | private static String getResponse(HttpMethod method, String charset) {
    method check (line 421) | private static void check(String url) throws HttpException {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueue.java
  class BaseQueue (line 6) | public class BaseQueue<E> {
    method getStart (line 18) | public BaseQueueElement<E> getStart() {
    method put (line 25) | public BaseQueueElement<E> put(E value) {
    method take (line 49) | public BaseQueueElement<E> take() {
    method remove (line 75) | public boolean remove(BaseQueueElement<E> element) {
    method findIndex (line 114) | public long findIndex(BaseQueueElement<E> element) {
    method size (line 126) | public long size() {
    method clear (line 135) | public void clear() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueueElement.java
  class BaseQueueElement (line 3) | public class BaseQueueElement<E> {
    method BaseQueueElement (line 10) | public BaseQueueElement(E value) {
    method setValue (line 14) | public void setValue(E value) {
    method getValue (line 18) | public E getValue() {
    method getBefore (line 22) | public BaseQueueElement<E> getBefore() {
    method setBefore (line 26) | public void setBefore(BaseQueueElement<E> before) {
    method getNext (line 30) | public BaseQueueElement<E> getNext() {
    method setNext (line 34) | public void setNext(BaseQueueElement<E> next) {
    method setNo (line 38) | public void setNo(long No) {
    method getNo (line 42) | public long getNo() {
    method reset (line 46) | public void reset() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseDao.java
  class BaseDao (line 21) | @SuppressWarnings({"rawtypes", "unchecked"})
    method find (line 30) | @Override
    method find (line 35) | @Override
    method find (line 40) | @Override
    method total (line 45) | @Override
    method total (line 50) | @Override
    method total (line 55) | @Override
    method total (line 61) | @Override
    method update (line 74) | @Override
    method update (line 79) | @Override
    method delete (line 85) | @Override
    method delete (line 90) | @Override
    method execute (line 95) | @Override
    method execute (line 100) | @Override
    method findByProperty (line 106) | @Override
    method findOneByProperty (line 120) | @Override
    method findById (line 134) | @Override
    method update (line 147) | @Override
    method save (line 159) | @Override
    method delete (line 171) | @Override
    method findAll (line 183) | @Override
    method findAll (line 195) | @Override
    method merge (line 215) | @Override
    method saveOrUpdate (line 228) | @Override
    method attachClean (line 240) | @Override
    method getQuery (line 252) | protected SQLQuery getQuery(String queryString, Map<String, Object> wh...
    method getQuery (line 256) | protected SQLQuery getQuery(String queryString, Map<String, Object> wh...
    method getQuery (line 260) | protected SQLQuery getQuery(String queryString, Map<String, Object> wh...
    method formateWhereSql (line 264) | protected String formateWhereSql(Map<String, Object> where, String mid...
    method getQuery (line 279) | protected SQLQuery getQuery(String queryString, Map<String, Object> wh...
    method setSessionFactoryOverride (line 308) | @Autowired
    method getTableName (line 313) | public String getTableName() {
    method setTableName (line 317) | public void setTableName(String tableName) {
    method getModelName (line 321) | public String getModelName() {
    method setModelName (line 325) | public void setModelName(String modelName) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseModel.java
  class BaseModel (line 8) | @SuppressWarnings("serial")
    method toString (line 13) | public String toString() {
    method clone (line 35) | public IBaseModel clone() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseService.java
  class BaseService (line 5) | public abstract class BaseService {
    method setDao (line 9) | protected abstract void setDao();
    method findById (line 11) | public IBaseModel findById(int id) {
    method findAll (line 15) | public List<?> findAll(int start, int limit) {
    method findByProperty (line 19) | public List<?> findByProperty(String propertyName, Object value) {
    method findOneByProperty (line 23) | public IBaseModel findOneByProperty(String propertyName, Object value) {
    method total (line 27) | public int total() {
    method save (line 31) | public void save(IBaseModel obj) {
    method update (line 35) | public void update(IBaseModel obj) {
    method findAll (line 39) | public List<?> findAll() {
    method delete (line 43) | public void delete(IBaseModel obj) {
    method getDatabase (line 47) | public String getDatabase() {
    method setDao (line 51) | protected void setDao(IBaseDao dao) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseDao.java
  type IBaseDao (line 6) | public interface IBaseDao {
    method find (line 8) | public List<?> find(String queryString);
    method find (line 10) | public List<?> find(String queryString, Map<String, Object> data);
    method find (line 12) | public List<?> find(String queryString, Map<String, Object> data, int ...
    method total (line 14) | public int total();
    method total (line 16) | public int total(String queryString);
    method total (line 18) | public int total(Map<String, Object> where);
    method total (line 20) | public int total(String queryString, Map<String, Object> where);
    method update (line 22) | public int update(String queryString);
    method update (line 24) | public int update(Map<String, Object> where);
    method delete (line 26) | public int delete(String queryString);
    method delete (line 28) | public int delete(String queryString, Map<String, Object> where);
    method execute (line 30) | public int execute(String queryString);
    method execute (line 32) | public int execute(String queryString, Map<String, Object> where);
    method findByProperty (line 34) | public List<IBaseModel> findByProperty(String propertyName, Object val...
    method findOneByProperty (line 36) | public IBaseModel findOneByProperty(String propertyName, Object value);
    method findById (line 38) | public IBaseModel findById(int id);
    method update (line 40) | public void update(IBaseModel persistentInstance);
    method save (line 42) | public void save(IBaseModel transientInstance);
    method delete (line 44) | public void delete(IBaseModel persistentInstance);
    method findAll (line 46) | public List<IBaseModel> findAll();
    method findAll (line 48) | public List<IBaseModel> findAll(int start, int limit);
    method merge (line 50) | public IBaseModel merge(IBaseModel detachedInstance);
    method saveOrUpdate (line 52) | public void saveOrUpdate(IBaseModel instance);
    method attachClean (line 54) | public void attachClean(IBaseModel instance);

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseModel.java
  type IBaseModel (line 3) | public interface IBaseModel {
    method toString (line 5) | public String toString();
    method clone (line 7) | public IBaseModel clone();

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/AnnotationSessionFactoryBeanEx.java
  class AnnotationSessionFactoryBeanEx (line 28) | public class AnnotationSessionFactoryBeanEx extends
    method setAnnotatedClassesLocations (line 52) | public void setAnnotatedClassesLocations(String[] annotatedClassesLoca...
    method postProcessAnnotationConfiguration (line 59) | @Override
    method scanAnnotatedClasses (line 78) | private Set<Class<?>> scanAnnotatedClasses() {
    method isEntityClass (line 126) | private boolean isEntityClass(MetadataReader metadataReader) {
    method isExcludedClass (line 140) | private boolean isExcludedClass(String className) {
    method setExcludedClasses (line 148) | public void setExcludedClasses(String[] excludedClasses) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceAdvice.java
  class DataSourceAdvice (line 11) | public class DataSourceAdvice implements MethodBeforeAdvice,
    method before (line 16) | public void before(Method method, Object[] args, Object target) {
    method afterReturning (line 34) | public void afterReturning(Object arg0, Method method, Object[] args,
    method afterThrowing (line 40) | public void afterThrowing(Method method, Object[] args, Object target,
    method setRunTime (line 46) | private void setRunTime(Method method, Object target) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceSwitcher.java
  class DataSourceSwitcher (line 5) | public class DataSourceSwitcher {
    method setDataSource (line 11) | public static void setDataSource(String dataSource) {
    method setMaster (line 16) | public static void setMaster(String database) {
    method setSlave (line 23) | public static void setSlave(String database) {
    method getDataSource (line 30) | public static String getDataSource() {
    method clearDataSource (line 34) | public static void clearDataSource() {
    method setDefaultDatabase (line 38) | public static void setDefaultDatabase(String database) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/DynamicDataSource.java
  class DynamicDataSource (line 5) | public class DynamicDataSource extends AbstractRoutingDataSource {
    method determineCurrentLookupKey (line 9) | @Override
    method setDefaultDatabase (line 14) | public void setDefaultDatabase(String defaultDatabase) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/common/spring/ServiceManager.java
  class ServiceManager (line 5) | public class ServiceManager {
    method init (line 9) | public static void init() {
    method getService (line 13) | public static <T> Object getService(String id) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/AuthConnector.java
  class AuthConnector (line 35) | public class AuthConnector implements IBaseConnector {
    method AuthConnector (line 45) | public AuthConnector(int port) {
    method start (line 49) | @Override
    method pause (line 78) | void pause() {
    method resume (line 82) | void resume() {
    method stop (line 86) | @Override
    class HttpServerInitializer (line 95) | private class HttpServerInitializer extends ChannelInitializer<SocketC...
      method initChannel (line 97) | @Override
    class HttpHandler (line 111) | private class HttpHandler extends ChannelInboundHandlerAdapter {
      method channelActive (line 115) | @Override
      method exceptionCaught (line 122) | @Override
      method channelInactive (line 130) | @Override
      method channelReadComplete (line 135) | @Override
      method channelRead (line 140) | @Override
      method sendHttpResponse (line 187) | private void sendHttpResponse(ChannelHandlerContext ctx, String res,...
      method sendErrorHttpResponse (line 199) | private void sendErrorHttpResponse(ChannelHandlerContext ctx, Defaul...

FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/IBaseConnector.java
  type IBaseConnector (line 6) | public interface IBaseConnector {
    method start (line 10) | void start();
    method stop (line 12) | void stop();

FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/ManagerConnector.java
  class ManagerConnector (line 28) | public class ManagerConnector implements IBaseConnector {
    method ManagerConnector (line 36) | public ManagerConnector(int port) {
    method start (line 40) | @Override
    method stop (line 61) | @Override
    class TelnetServerInitializer (line 73) | class TelnetServerInitializer extends ChannelInitializer<SocketChannel> {
      method initChannel (line 75) | @Override
    class ManagerHandler (line 87) | class ManagerHandler extends ChannelInboundHandlerAdapter {
      method exceptionCaught (line 92) | @Override
      method channelActive (line 97) | @Override
      method channelInactive (line 113) | @Override
      method channelRead (line 120) | @Override
      method handler (line 140) | private String handler(String request) {
      method channelReadComplete (line 240) | @Override
      method sendMsg (line 245) | private String sendMsg(String msg) {
      method login (line 256) | private String login(String request, Integer step, Integer cid) {
    class ManagerService (line 279) | static class ManagerService {
      method checkIp (line 285) | static boolean checkIp(String ip) {
      method getStep (line 295) | static Integer getStep(Integer cid) {
      method goNextSetp (line 304) | static void goNextSetp(Integer cid) {
      method clear (line 313) | static void clear(Integer cid) {
      method getPid (line 317) | static int getPid() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/connector/ServiceConnector.java
  class ServiceConnector (line 48) | public class ServiceConnector implements IBaseConnector {
    method getStartTime (line 67) | long getStartTime() {
    method getConnectCount (line 71) | public int getConnectCount() {
    method ServiceConnector (line 75) | public ServiceConnector(int port, long period, String mode) {
    method start (line 81) | public void start() {
    method stop (line 126) | @Override
    class SocketServerInitializer (line 140) | private class SocketServerInitializer extends ChannelInitializer<Socke...
      method initChannel (line 142) | @Override
    class WebSocketServerInitializer (line 157) | private class WebSocketServerInitializer extends ChannelInitializer<So...
      method initChannel (line 159) | @Override
    class MyTimerTask (line 175) | private class MyTimerTask extends TimerTask {
      method run (line 176) | @Override
    class ServiceChannelHandler (line 183) | private class ServiceChannelHandler extends ChannelInboundHandlerAdapt...
      method exceptionCaught (line 188) | @Override
      method userEventTriggered (line 204) | @Override
      method channelActive (line 220) | @Override
      method channelInactive (line 230) | @Override
      method channelRead (line 239) | @Override
      method channelReadComplete (line 261) | @Override
      method handleWebSocketRequest (line 266) | private void handleWebSocketRequest(ChannelHandlerContext ctx, Objec...
      method handleHttpRequest (line 311) | private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRe...
      method sendHttpResponse (line 336) | private void sendHttpResponse(ChannelHandlerContext ctx, FullHttpReq...
      method getWebSocketLocation (line 352) | private String getWebSocketLocation(HttpRequest req) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/handler/BaseHandler.java
  class BaseHandler (line 8) | public abstract class BaseHandler implements IBaseHandler {
    method run (line 12) | @Override
    method getHandlerName (line 15) | @Override
    method setHandlerName (line 20) | @Override
    method doHeart (line 25) | public static IBaseMessage doHeart() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/handler/BaseHandlerChannel.java
  class BaseHandlerChannel (line 9) | public class BaseHandlerChannel {
    method BaseHandlerChannel (line 15) | public BaseHandlerChannel(String handlerName, Channel chanel) {
    method BaseHandlerChannel (line 20) | public BaseHandlerChannel(String handlerName, ChannelGroup chanelGroup) {
    method getChanel (line 25) | public Channel getChanel() {
    method getChannelGroup (line 29) | public ChannelGroup getChannelGroup() {
    method getHandlerName (line 33) | public String getHandlerName() {
    method write (line 37) | public ChannelFuture write(OutMessage message) {
    method writeGroup (line 45) | public ChannelGroupFuture writeGroup(OutMessage message) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/handler/IBaseHandler.java
  type IBaseHandler (line 7) | public interface IBaseHandler {
    method run (line 9) | IBaseMessage run(InMessage im, Channel ch) throws Exception;
    method getHandlerName (line 11) | String getHandlerName();
    method setHandlerName (line 13) | void setHandlerName(String handlerName);

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/IBaseMessage.java
  type IBaseMessage (line 3) | public interface IBaseMessage {
    method toString (line 5) | String toString();
    method getH (line 7) | String getH();
    method setH (line 9) | void setH(String h);

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/InMessage.java
  class InMessage (line 9) | public class InMessage implements IBaseMessage {
    method InMessage (line 19) | public InMessage() {
    method InMessage (line 22) | public InMessage(String h) {
    method InMessage (line 26) | public InMessage(String h, HashMap<String, Object> p) {
    method getMessage (line 31) | public static InMessage getMessage(String msg) throws MessageException {
    method toString (line 39) | public String toString() {
    method getH (line 43) | public String getH() {
    method getP (line 47) | public HashMap<String, Object> getP() {
    method setH (line 51) | public void setH(String h) {
    method setP (line 56) | public void setP(HashMap<String, Object> p) {
    method putMember (line 60) | public void putMember(String key, Object value) {
    method getMember (line 64) | public Object getMember(String key) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/MessageDecode.java
  class MessageDecode (line 8) | public class MessageDecode extends MessageToMessageDecoder<Object> {
    method decode (line 10) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/MessageEncode.java
  class MessageEncode (line 9) | public class MessageEncode extends MessageToMessageEncoder<Object> {
    method encode (line 11) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/OutMessage.java
  class OutMessage (line 9) | public class OutMessage implements IBaseMessage {
    method OutMessage (line 17) | public OutMessage() {
    method OutMessage (line 20) | public OutMessage(Object result, int code) {
    method OutMessage (line 25) | public OutMessage(Object result, int code, String h) {
    method toString (line 31) | public String toString() {
    method getMessage (line 35) | public static OutMessage getMessage(String om) throws MessageException {
    method showError (line 43) | public static OutMessage showError(String result) {
    method showError (line 47) | public static OutMessage showError(String result, String h) {
    method showError (line 51) | public static OutMessage showError(String result, int code) {
    method showSucc (line 55) | public static OutMessage showSucc(Object result, String h) {
    method showSucc (line 59) | public static OutMessage showSucc(Object result) {
    method showMessage (line 63) | private static OutMessage showMessage(Object result, int code) {
    method showMessage (line 67) | private static OutMessage showMessage(Object result, int code, String ...
    method getCode (line 71) | public int getCode() {
    method setCode (line 75) | public void setCode(int code) {
    method getResult (line 79) | public Object getResult() {
    method setResult (line 83) | public void setResult(Object result) {
    method getResultValue (line 87) | public Object getResultValue(String key) {
    method getH (line 97) | public String getH() {
    method setH (line 101) | public void setH(String h) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/message/WebSocketEncode.java
  class WebSocketEncode (line 10) | public class WebSocketEncode extends MessageToMessageEncoder<Object> {
    method encode (line 12) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/BasePosition.java
  class BasePosition (line 5) | public class BasePosition {
    method BasePosition (line 12) | public BasePosition(IBaseArea area) {
    method BasePosition (line 16) | public BasePosition(int x, int y, int z, IBaseArea area) {
    method BasePosition (line 23) | public BasePosition(int x, int y, IBaseArea area) {
    method getX (line 29) | public int getX() {
    method setX (line 33) | public void setX(int x) {
    method getY (line 37) | public int getY() {
    method setY (line 41) | public void setY(int y) {
    method getZ (line 45) | public int getZ() {
    method setZ (line 49) | public void setZ(int z) {
    method getArea (line 53) | public IBaseArea getArea() {
    method setArea (line 57) | public void setArea(IBaseArea area) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/action/ActionManager.java
  class ActionManager (line 11) | public class ActionManager {
    method initAction (line 17) | public static void initAction(String packagePath) {
    method getAction (line 34) | public static IBaseAction getAction(int id) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/action/BaseAction.java
  class BaseAction (line 6) | public abstract class BaseAction implements IBaseAction, Cloneable {
    method BaseAction (line 12) | public BaseAction(int id, String name) {
    method getId (line 17) | @Override
    method doAction (line 22) | @Override
    method getName (line 25) | @Override
    method setName (line 30) | @Override
    method clone (line 35) | public IBaseAction clone() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/action/IBaseAction.java
  type IBaseAction (line 6) | public interface IBaseAction {
    method getId (line 8) | int getId();
    method doAction (line 10) | void doAction(Object self, Object target, BaseHandlerChannel ch);
    method getName (line 12) | String getName();
    method setName (line 14) | void setName(String name);
    method clone (line 16) | IBaseAction clone();

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/area/AreaManager.java
  class AreaManager (line 12) | public class AreaManager {
    method initArea (line 18) | public static void initArea(String packagePath) {
    method getArea (line 38) | public static IBaseArea getArea(int id) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/area/BaseArea.java
  class BaseArea (line 22) | public abstract class BaseArea implements IBaseArea {
    method BaseArea (line 35) | public BaseArea(String name) {
    method BaseArea (line 41) | public BaseArea(int id, String name) {
    method BaseArea (line 47) | public BaseArea(String name, BasePosition entrancePosition) {
    method BaseArea (line 54) | public BaseArea(int id, String name, BasePosition entrancePosition) {
    method BaseArea (line 61) | public BaseArea(String name, IBaseMap map) {
    method BaseArea (line 68) | public BaseArea(int id, String name, IBaseMap map) {
    method BaseArea (line 75) | public BaseArea(String name, BasePosition entrancePosition, IBaseMap m...
    method BaseArea (line 83) | public BaseArea(int id, String name, BasePosition entrancePosition, IB...
    method init (line 91) | @Override
    method isOpen (line 94) | @Override
    method open (line 99) | @Override
    method close (line 105) | @Override
    method getId (line 115) | @Override
    method getName (line 120) | @Override
    method setName (line 125) | @Override
    method getMap (line 130) | @Override
    method getEntity (line 135) | @Override
    method getEntities (line 140) | @Override
    method addEntity (line 145) | @Override
    method removeEntity (line 150) | @Override
    method getPlayer (line 155) | @Override
    method getPlayers (line 160) | @Override
    method addPlayer (line 165) | @Override
    method removePlayer (line 179) | @Override
    method getNpc (line 190) | @Override
    method addNpc (line 195) | @Override
    method removeNpc (line 200) | @Override
    method getChannelGroup (line 205) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/area/BaseZone.java
  class BaseZone (line 10) | public abstract class BaseZone extends BaseArea {
    method BaseZone (line 12) | public BaseZone(String name) {
    method BaseZone (line 16) | public BaseZone(String name, BasePosition entrancePosition) {
    method BaseZone (line 20) | public BaseZone(String name, IBaseMap map) {
    method BaseZone (line 24) | public BaseZone(String name, BasePosition entrancePosition, IBaseMap m...
    method init (line 28) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/area/IBaseArea.java
  type IBaseArea (line 13) | public interface IBaseArea {
    method init (line 15) | void init();
    method isOpen (line 17) | boolean isOpen();
    method open (line 19) | void open();
    method close (line 21) | void close();
    method getId (line 23) | int getId();
    method getName (line 25) | String getName();
    method setName (line 27) | void setName(String name);
    method getMap (line 29) | IBaseMap getMap();
    method getEntity (line 31) | IBaseEntity getEntity(int id);
    method getEntities (line 33) | Map<Integer, IBaseEntity> getEntities();
    method addEntity (line 35) | void addEntity(IBaseEntity entity);
    method removeEntity (line 37) | void removeEntity(int id);
    method getPlayer (line 39) | IBaseCharacter getPlayer(int id);
    method getPlayers (line 41) | Collection<IBaseCharacter> getPlayers();
    method addPlayer (line 43) | void addPlayer(BasePlayer player);
    method removePlayer (line 45) | void removePlayer(int id);
    method getNpc (line 47) | IBaseEntity getNpc(int id);
    method addNpc (line 49) | void addNpc(BaseNpc npc);
    method removeNpc (line 51) | void removeNpc(int id);
    method getChannelGroup (line 53) | ChannelGroup getChannelGroup();

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/BaseEntity.java
  class BaseEntity (line 9) | public class BaseEntity implements IBaseEntity {
    method getId (line 17) | @Override
    method setId (line 22) | @Override
    method getRoll (line 27) | @Override
    method setRoll (line 32) | @Override
    method getPosition (line 37) | @Override
    method setPosition (line 42) | @Override
    method getName (line 47) | @Override
    method setName (line 52) | @Override
    method addAction (line 57) | @Override
    method removeAction (line 62) | @Override
    method getAction (line 67) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/BaseNpc.java
  class BaseNpc (line 9) | public class BaseNpc implements IBaseEntity {
    method getId (line 17) | @Override
    method setId (line 22) | @Override
    method getRoll (line 27) | @Override
    method setRoll (line 32) | @Override
    method getPosition (line 37) | @Override
    method setPosition (line 42) | @Override
    method getName (line 47) | @Override
    method setName (line 52) | @Override
    method getAction (line 57) | @Override
    method addAction (line 62) | @Override
    method removeAction (line 67) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/BasePlayer.java
  class BasePlayer (line 11) | public class BasePlayer implements IBaseCharacter {
    method loginHook (line 27) | @Override
    method logoutHook (line 39) | @Override
    method getId (line 51) | @Override
    method setId (line 56) | @Override
    method getRoll (line 61) | @Override
    method setRoll (line 66) | @Override
    method gArea (line 71) | @Override
    method gPosition (line 79) | @Override
    method sPosition (line 84) | @Override
    method getName (line 89) | @Override
    method setName (line 94) | @Override
    method getActions (line 99) | @Override
    method setActions (line 104) | @Override
    method findActionById (line 109) | @Override
    method addAction (line 114) | @Override
    method removeAction (line 119) | @Override
    method gChannel (line 124) | @Override
    method sChannel (line 129) | @Override
    method getLevel (line 134) | @Override
    method setLevel (line 139) | @Override
    method getExperience (line 144) | @Override
    method setExperience (line 149) | @Override
    method getTotalHp (line 154) | @Override
    method setTotalHp (line 159) | @Override
    method getTotalMp (line 164) | @Override
    method setTotalMp (line 169) | @Override
    method getHp (line 174) | @Override
    method setHp (line 179) | @Override
    method getMp (line 184) | @Override
    method setMp (line 189) | @Override
    method isInQueue (line 194) | @Override
    method setIsInQueue (line 199) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/BasePlayerFactory.java
  class BasePlayerFactory (line 4) | public class BasePlayerFactory implements IBasePlayerFactory {
    method getPlayer (line 6) | public IBaseCharacter getPlayer() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBaseCharacter.java
  type IBaseCharacter (line 10) | public interface IBaseCharacter {
    method getId (line 12) | int getId();
    method setId (line 14) | void setId(int id);
    method getRoll (line 16) | String getRoll();
    method setRoll (line 18) | void setRoll(String roll);
    method gPosition (line 20) | BasePosition gPosition();
    method sPosition (line 22) | void sPosition(BasePosition position);
    method gArea (line 24) | IBaseArea gArea();
    method getName (line 26) | String getName();
    method setName (line 28) | void setName(String name);
    method findActionById (line 30) | IBaseAction findActionById(int id);
    method addAction (line 32) | void addAction(IBaseAction action);
    method setActions (line 34) | void setActions(Map<Integer, IBaseAction> actions);
    method getActions (line 36) | Map<Integer, IBaseAction> getActions();
    method removeAction (line 38) | void removeAction(int id);
    method gChannel (line 40) | Channel gChannel();
    method sChannel (line 42) | void sChannel(Channel channel);
    method getLevel (line 44) | int getLevel();
    method setLevel (line 46) | void setLevel(int level);
    method getExperience (line 48) | int getExperience();
    method setExperience (line 50) | void setExperience(int experience);
    method getTotalHp (line 52) | int getTotalHp();
    method setTotalHp (line 54) | void setTotalHp(int totalHp);
    method getTotalMp (line 56) | int getTotalMp();
    method setTotalMp (line 58) | void setTotalMp(int totalMp);
    method getHp (line 60) | int getHp();
    method setHp (line 62) | void setHp(int hp);
    method getMp (line 64) | int getMp();
    method setMp (line 66) | void setMp(int mp);
    method logoutHook (line 68) | void logoutHook();
    method loginHook (line 70) | void loginHook();
    method isInQueue (line 72) | boolean isInQueue();
    method setIsInQueue (line 74) | void setIsInQueue(boolean isInQueue);

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBaseEntity.java
  type IBaseEntity (line 6) | public interface IBaseEntity {
    method getId (line 8) | int getId();
    method setId (line 10) | void setId(int id);
    method getRoll (line 12) | String getRoll();
    method setRoll (line 14) | void setRoll(String roll);
    method getPosition (line 16) | BasePosition getPosition();
    method setPosition (line 18) | void setPosition(BasePosition position);
    method getName (line 20) | String getName();
    method setName (line 22) | void setName(String name);
    method getAction (line 24) | IBaseAction getAction(int id);
    method addAction (line 26) | void addAction(IBaseAction action);
    method removeAction (line 28) | void removeAction(int id);

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBasePlayerFactory.java
  type IBasePlayerFactory (line 3) | public interface IBasePlayerFactory {
    method getPlayer (line 5) | IBaseCharacter getPlayer();

FILE: src/main/java/com/zhaidaosi/game/jgframework/model/map/IBaseMap.java
  type IBaseMap (line 3) | public interface IBaseMap {
    method init (line 5) | public void init();

FILE: src/main/java/com/zhaidaosi/game/jgframework/rsync/BaseRsync.java
  class BaseRsync (line 10) | public abstract class BaseRsync implements IBaseRsync {
    method runRsync (line 19) | @Override
    method addRsync (line 22) | @Override
    method setRsyncMap (line 27) | @Override
    method clearRsyncMap (line 32) | @Override
    method get (line 37) | @Override
    method getNeedRsync (line 46) | @Override
    method clearNeedRsync (line 51) | @Override
    method isRunning (line 56) | @Override
    method toRunning (line 61) | @Override
    method toStop (line 66) | @Override
    method getNowMap (line 75) | private ConcurrentMap<Integer, IBaseModel> getNowMap() {
    method getNeedRsyncMap (line 80) | private ConcurrentMap<Integer, IBaseModel> getNeedRsyncMap() {
    method getSelect (line 88) | private int getSelect(long now) {
    method selectMap (line 97) | private ConcurrentMap<Integer, IBaseModel> selectMap(int select) {

FILE: src/main/java/com/zhaidaosi/game/jgframework/rsync/IBaseRsync.java
  type IBaseRsync (line 7) | public interface IBaseRsync {
    method addRsync (line 9) | void addRsync(Integer id, IBaseModel obj);
    method runRsync (line 11) | void runRsync();
    method setRsyncMap (line 13) | void setRsyncMap(Map<Integer, IBaseModel> map);
    method clearRsyncMap (line 15) | void clearRsyncMap();
    method getNeedRsync (line 17) | Map<Integer, IBaseModel> getNeedRsync();
    method get (line 19) | IBaseModel get(Integer id);
    method clearNeedRsync (line 21) | void clearNeedRsync();
    method isRunning (line 23) | boolean isRunning();
    method toRunning (line 25) | void toRunning();
    method toStop (line 27) | void toStop();

FILE: src/main/java/com/zhaidaosi/game/jgframework/rsync/RsyncManager.java
  class RsyncManager (line 14) | public class RsyncManager {
    method init (line 21) | public static void init() {
    method getSyncPeriod (line 37) | public static long getSyncPeriod() {
    method add (line 46) | public static void add(Integer userId, Class<?> c, IBaseModel obj) {
    method get (line 55) | public static IBaseModel get(Integer userId, Class<?> c) {
    method run (line 64) | public static void run() {
  class RsyncThread (line 97) | class RsyncThread extends Thread {
    method RsyncThread (line 102) | public RsyncThread(IBaseRsync rsync, Map<Integer, IBaseModel> map) {
    method run (line 107) | public void run() {

FILE: src/main/java/com/zhaidaosi/game/jgframework/session/BaseSecretFactory.java
  class BaseSecretFactory (line 6) | public class BaseSecretFactory implements IBaseSecretFactory {
    method createSecret (line 8) | @Override
    method checkSecret (line 18) | @Override

FILE: src/main/java/com/zhaidaosi/game/jgframework/session/IBaseSecretFactory.java
  type IBaseSecretFactory (line 3) | public interface IBaseSecretFactory {
    method createSecret (line 5) | String createSecret(int userId) throws Exception;
    method checkSecret (line 7) | int checkSecret(String secret) throws Exception;

FILE: src/main/java/com/zhaidaosi/game/jgframework/session/SessionManager.java
  class SessionManager (line 23) | public class SessionManager {
    method checkSession (line 38) | public static int checkSession(InMessage msg, Channel ch) {
    method addSession (line 71) | private static int addSession(IBaseCharacter player, Channel ch) {
    method removeSession (line 122) | public static void removeSession(Channel ch) {
    method getOnlineUser (line 141) | public static List<IBaseCharacter> getOnlineUser() {
    method getPlayerByUserId (line 152) | public static IBaseCharacter getPlayerByUserId(Integer uid) {
    method isAuthHandler (line 158) | public static boolean isAuthHandler(InMessage msg) {
    method getServerIp (line 162) | public static String getServerIp(int userId) {
    method createSecret (line 168) | public static String createSecret(int userId) throws Exception {
    method checkSecret (line 172) | private static int checkSecret(String secret) throws Exception {
    method init (line 176) | public static void init() {
    method destroy (line 182) | public static void destroy() {
    method getWaitCount (line 194) | public static long getWaitCount() {
    method getUserCount (line 198) | public static int getUserCount() {
    method getChannels (line 202) | public static ConcurrentMap<Integer, Channel> getChannels() {
    method setSercretFactory (line 206) | public static void setSercretFactory(IBaseSecretFactory secretFactory) {
    method setMaxUser (line 210) | public static void setMaxUser(int max) {
    method initTimer (line 216) | private static void initTimer() {
    method getWaitMessage (line 223) | public static IBaseMessage getWaitMessage(IBaseCharacter player) {
    class QueueTimerTask (line 232) | private static class QueueTimerTask extends TimerTask {
      method run (line 233) | @Override
Condensed preview — 76 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (296K chars).
[
  {
    "path": ".gitignore",
    "chars": 104,
    "preview": "*.class\n\n# Package Files #\n*.jar\n*.war\n*.ear\n.svn\n/target\n*.svn-base\n.myeclipse/\n.idea/\nJgFramework.iml\n"
  },
  {
    "path": "LICENSE",
    "chars": 11325,
    "preview": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licens"
  },
  {
    "path": "README.md",
    "chars": 766,
    "preview": "JgFramework\n===========\n\n基于Netty的强大的游戏服务器框架\n\n特点\n===\n~~~\n1、使用netty作为底层,性能得到保障\n2、支持socket和websocket2种连接模式,可以自由选择\n3、简单实用的路由"
  },
  {
    "path": "default_applicationContext.xml",
    "chars": 7878,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www"
  },
  {
    "path": "default_jgframework.properties",
    "chars": 2132,
    "preview": "#must input\nbase.package.name=com.zhaidaosi.game.server\n\n#run mode : debug, product default : debug\nrun.mode=debug\n\n#tim"
  },
  {
    "path": "pom.xml",
    "chars": 22315,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:sc"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/Boot.java",
    "chars": 15259,
    "preview": "package com.zhaidaosi.game.jgframework;\n\nimport com.zhaidaosi.game.jgframework.common.BaseIp;\nimport com.zhaidaosi.game."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/Router.java",
    "chars": 3428,
    "preview": "package com.zhaidaosi.game.jgframework;\n\nimport com.zhaidaosi.game.jgframework.common.BaseFile;\nimport com.zhaidaosi.gam"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseAvlTree.java",
    "chars": 38032,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport java.util.AbstractSet;\nimport java.util.Iterator;\nimport java.uti"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseDate.java",
    "chars": 1084,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport java.sql.Timestamp;\nimport java.text.SimpleDateFormat;\nimport jav"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseFile.java",
    "chars": 12169,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.io"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseGeneratePassword.java",
    "chars": 980,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport java.util.Random;\n\npublic class BaseGeneratePassword {\n\n    priva"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseIp.java",
    "chars": 1362,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class B"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseJson.java",
    "chars": 604,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.serializer"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseRunTimer.java",
    "chars": 1829,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseSocket.java",
    "chars": 2781,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\nimport com.zhaidaosi.game.jgframework.common.excption.MessageException;\n"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/BaseString.java",
    "chars": 251,
    "preview": "package com.zhaidaosi.game.jgframework.common;\n\npublic class BaseString {\n\n    public static boolean isEmpty(String str)"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseLocalCached.java",
    "chars": 3153,
    "preview": "package com.zhaidaosi.game.jgframework.common.cache;\n\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/cache/BaseMemCached.java",
    "chars": 2163,
    "preview": "package com.zhaidaosi.game.jgframework.common.cache;\n\nimport com.whalin.MemCached.MemCachedClient;\nimport com.whalin.Mem"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseDes.java",
    "chars": 2889,
    "preview": "package com.zhaidaosi.game.jgframework.common.encrpt;\n\nimport com.zhaidaosi.game.jgframework.Boot;\n\nimport javax.crypto."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseMd5.java",
    "chars": 675,
    "preview": "package com.zhaidaosi.game.jgframework.common.encrpt;\n\nimport com.zhaidaosi.game.jgframework.Boot;\n\nimport javax.xml.bin"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/encrpt/BaseRsa.java",
    "chars": 5116,
    "preview": "package com.zhaidaosi.game.jgframework.common.encrpt;\n\nimport com.zhaidaosi.game.jgframework.Boot;\n\nimport javax.crypto."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/excption/BaseException.java",
    "chars": 348,
    "preview": "package com.zhaidaosi.game.jgframework.common.excption;\n\n\n@SuppressWarnings(\"serial\")\npublic class BaseException extends"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/excption/HttpException.java",
    "chars": 220,
    "preview": "package com.zhaidaosi.game.jgframework.common.excption;\n\n@SuppressWarnings(\"serial\")\npublic class HttpException extends "
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/excption/IBaseException.java",
    "chars": 120,
    "preview": "package com.zhaidaosi.game.jgframework.common.excption;\n\npublic interface IBaseException {\n\n    public int getCode();\n}\n"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/excption/MessageException.java",
    "chars": 218,
    "preview": "package com.zhaidaosi.game.jgframework.common.excption;\n\n@SuppressWarnings(\"serial\")\npublic class MessageException exten"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseCookie.java",
    "chars": 358,
    "preview": "package com.zhaidaosi.game.jgframework.common.http;\n\npublic class BaseCookie {\n\n    private String key;\n    private Stri"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/http/BaseHttp.java",
    "chars": 16106,
    "preview": "package com.zhaidaosi.game.jgframework.common.http;\n\nimport com.zhaidaosi.game.jgframework.common.excption.HttpException"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueue.java",
    "chars": 3743,
    "preview": "package com.zhaidaosi.game.jgframework.common.queue;\n\n/**\n * 可快速定位的FIFO队列\n */\npublic class BaseQueue<E> {\n\n    private B"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/queue/BaseQueueElement.java",
    "chars": 944,
    "preview": "package com.zhaidaosi.game.jgframework.common.queue;\n\npublic class BaseQueueElement<E> {\n\n    private E value;\n    priva"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseDao.java",
    "chars": 10586,
    "preview": "package com.zhaidaosi.game.jgframework.common.sdm;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport org.hibernate.Loc"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseModel.java",
    "chars": 1333,
    "preview": "package com.zhaidaosi.game.jgframework.common.sdm;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport jav"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/sdm/BaseService.java",
    "chars": 1119,
    "preview": "package com.zhaidaosi.game.jgframework.common.sdm;\n\nimport java.util.List;\n\npublic abstract class BaseService {\n\n    pro"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseDao.java",
    "chars": 1481,
    "preview": "package com.zhaidaosi.game.jgframework.common.sdm;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface IBase"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/sdm/IBaseModel.java",
    "chars": 148,
    "preview": "package com.zhaidaosi.game.jgframework.common.sdm;\n\npublic interface IBaseModel {\n\n    public String toString();\n\n    pu"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/spring/AnnotationSessionFactoryBeanEx.java",
    "chars": 6066,
    "preview": "package com.zhaidaosi.game.jgframework.common.spring;\n\nimport org.hibernate.HibernateException;\nimport org.hibernate.cfg"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceAdvice.java",
    "chars": 1932,
    "preview": "package com.zhaidaosi.game.jgframework.common.spring;\n\nimport com.zhaidaosi.game.jgframework.common.BaseRunTimer;\nimport"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/spring/DataSourceSwitcher.java",
    "chars": 1082,
    "preview": "package com.zhaidaosi.game.jgframework.common.spring;\n\nimport org.springframework.util.Assert;\n\npublic class DataSourceS"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/spring/DynamicDataSource.java",
    "chars": 550,
    "preview": "package com.zhaidaosi.game.jgframework.common.spring;\n\nimport org.springframework.jdbc.datasource.lookup.AbstractRouting"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/common/spring/ServiceManager.java",
    "chars": 446,
    "preview": "package com.zhaidaosi.game.jgframework.common.spring;\n\nimport org.springframework.context.support.ClassPathXmlApplicatio"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/connector/AuthConnector.java",
    "chars": 7834,
    "preview": "package com.zhaidaosi.game.jgframework.connector;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport com.zhaidaosi.game"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/connector/IBaseConnector.java",
    "chars": 303,
    "preview": "package com.zhaidaosi.game.jgframework.connector;\n\nimport com.zhaidaosi.game.jgframework.model.entity.IBaseCharacter;\nim"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/connector/ManagerConnector.java",
    "chars": 12338,
    "preview": "package com.zhaidaosi.game.jgframework.connector;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport com.zhaidaosi.game"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/connector/ServiceConnector.java",
    "chars": 13980,
    "preview": "package com.zhaidaosi.game.jgframework.connector;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport com.zhaidaosi.game"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/handler/BaseHandler.java",
    "chars": 742,
    "preview": "package com.zhaidaosi.game.jgframework.handler;\n\nimport com.zhaidaosi.game.jgframework.message.IBaseMessage;\nimport com."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/handler/BaseHandlerChannel.java",
    "chars": 1373,
    "preview": "package com.zhaidaosi.game.jgframework.handler;\n\nimport com.zhaidaosi.game.jgframework.message.OutMessage;\nimport io.net"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/handler/IBaseHandler.java",
    "chars": 377,
    "preview": "package com.zhaidaosi.game.jgframework.handler;\n\nimport com.zhaidaosi.game.jgframework.message.IBaseMessage;\nimport com."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/IBaseMessage.java",
    "chars": 154,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\npublic interface IBaseMessage {\n\n    String toString();\n\n    String get"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/InMessage.java",
    "chars": 1389,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\nimport com.zhaidaosi.game.jgframework.common.BaseJson;\nimport com.zhaid"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/MessageDecode.java",
    "chars": 494,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/MessageEncode.java",
    "chars": 629,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/OutMessage.java",
    "chars": 2578,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\nimport com.zhaidaosi.game.jgframework.common.BaseJson;\nimport com.zhaid"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/message/WebSocketEncode.java",
    "chars": 763,
    "preview": "package com.zhaidaosi.game.jgframework.message;\n\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/BasePosition.java",
    "chars": 1039,
    "preview": "package com.zhaidaosi.game.jgframework.model;\n\nimport com.zhaidaosi.game.jgframework.model.area.IBaseArea;\n\npublic class"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/action/ActionManager.java",
    "chars": 1226,
    "preview": "package com.zhaidaosi.game.jgframework.model.action;\n\nimport com.zhaidaosi.game.jgframework.common.BaseFile;\nimport org."
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/action/BaseAction.java",
    "chars": 901,
    "preview": "package com.zhaidaosi.game.jgframework.model.action;\n\nimport com.zhaidaosi.game.jgframework.handler.BaseHandlerChannel;\n"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/action/IBaseAction.java",
    "chars": 326,
    "preview": "package com.zhaidaosi.game.jgframework.model.action;\n\nimport com.zhaidaosi.game.jgframework.handler.BaseHandlerChannel;\n"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/area/AreaManager.java",
    "chars": 1305,
    "preview": "package com.zhaidaosi.game.jgframework.model.area;\n\nimport com.zhaidaosi.game.jgframework.common.BaseFile;\nimport org.sl"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/area/BaseArea.java",
    "chars": 5578,
    "preview": "package com.zhaidaosi.game.jgframework.model.area;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport com"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/area/BaseZone.java",
    "chars": 696,
    "preview": "package com.zhaidaosi.game.jgframework.model.area;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport com"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/area/IBaseArea.java",
    "chars": 1110,
    "preview": "package com.zhaidaosi.game.jgframework.model.area;\n\nimport com.zhaidaosi.game.jgframework.model.entity.BaseNpc;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/BaseEntity.java",
    "chars": 1427,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/BaseNpc.java",
    "chars": 1424,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/BasePlayer.java",
    "chars": 3976,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/BasePlayerFactory.java",
    "chars": 201,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\n\npublic class BasePlayerFactory implements IBasePlayerFactory {\n\n "
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBaseCharacter.java",
    "chars": 1297,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBaseEntity.java",
    "chars": 552,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\nimport com.zhaidaosi.game.jgframework.model.BasePosition;\nimport c"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/entity/IBasePlayerFactory.java",
    "chars": 128,
    "preview": "package com.zhaidaosi.game.jgframework.model.entity;\n\npublic interface IBasePlayerFactory {\n\n    IBaseCharacter getPlaye"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/model/map/IBaseMap.java",
    "chars": 107,
    "preview": "package com.zhaidaosi.game.jgframework.model.map;\n\npublic interface IBaseMap {\n\n    public void init();\n\n}\n"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/rsync/BaseRsync.java",
    "chars": 2566,
    "preview": "package com.zhaidaosi.game.jgframework.rsync;\n\nimport com.zhaidaosi.game.jgframework.common.sdm.IBaseModel;\n\nimport java"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/rsync/IBaseRsync.java",
    "chars": 491,
    "preview": "package com.zhaidaosi.game.jgframework.rsync;\n\nimport com.zhaidaosi.game.jgframework.common.sdm.IBaseModel;\n\nimport java"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/rsync/RsyncManager.java",
    "chars": 3621,
    "preview": "package com.zhaidaosi.game.jgframework.rsync;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport com.zhaidaosi.game.jgf"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/session/BaseSecretFactory.java",
    "chars": 1218,
    "preview": "package com.zhaidaosi.game.jgframework.session;\n\nimport com.zhaidaosi.game.jgframework.common.encrpt.BaseRsa;\nimport com"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/session/IBaseSecretFactory.java",
    "chars": 199,
    "preview": "package com.zhaidaosi.game.jgframework.session;\n\npublic interface IBaseSecretFactory {\n\n    String createSecret(int user"
  },
  {
    "path": "src/main/java/com/zhaidaosi/game/jgframework/session/SessionManager.java",
    "chars": 9248,
    "preview": "package com.zhaidaosi.game.jgframework.session;\n\nimport com.zhaidaosi.game.jgframework.Boot;\nimport com.zhaidaosi.game.j"
  },
  {
    "path": "src/main/resources/errorCode.properties",
    "chars": 270,
    "preview": "10000=\\u7CFB\\u7EDF\\u9519\\u8BEF\n11000=\\u7CFB\\u7EDF\\u7EF4\\u62A4\\u4E2D\\uFF0C\\u6682\\u505C\\u4F7F\\u7528\n20000=handler\\u4E0D\\u8"
  }
]

About this extraction

This page contains the full source code of the bupt1987/JgFramework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 76 files (258.7 KB), approximately 65.2k tokens, and a symbol index with 677 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!