年前最后一个版本更新3.8.0

This commit is contained in:
远方夕阳 2020-01-17 14:48:49 +08:00
parent 91cde7abed
commit f3b7ec63e0
227 changed files with 12277 additions and 11596 deletions

12
.gitignore vendored
View File

@ -1,12 +0,0 @@
*.class
*.dex
*.bak
*.apk
.fatjar
bin/
build/
classes/

View File

@ -79,4 +79,18 @@ CIM是基于mina或者netty框架下的推送系统我们平常使用第三
1.android sdk 优化使用protobuf-lite版本替代较为臃肿的protobut-java版本
-------------------------------------------------------------------------------------------
版本:3.8.0/时间:2020-01-17
1.服务端sdk将websocket的服务端口和原生socket的端口分离可以禁用其中一个或者同时启用
2.web端的sdk简化流程不再需要心跳响应,修改了连接成功回调方法名称和创建连接方法名
3.andoid sdk修改几个广播action的名称以及回调方法名称详见cim-client-android工程
4.所有sdk均使用maven构建idea工具开发发现多处代码单词拼写错误使用阿里语法检测组件优化了部分代码
5.同步修改了文档

2
cim-boot-server/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
target/
.idea/

View File

@ -25,55 +25,56 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.9.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.22" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.22" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.22" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.28" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.29" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.29" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.2.RELEASE" level="project" />
<orderEntry type="module-library">
<library name="Maven: com.farsunset:cim-server-sdk:3.7.0">
<library name="Maven: com.farsunset:cim-server-sdk:3.8.0">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/cim-server-sdk-netty-3.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/libs/cim-server-sdk-netty-3.8.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="Maven: org.apache.mina:mina-core:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.29" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.35.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.35.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.35.Final" level="project" />
@ -81,7 +82,7 @@
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.35.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.35.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.35.Final" level="project" />
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.9.1" level="project" />
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.11.1" level="project" />
<orderEntry type="library" name="Maven: cn.teaey.apns4j:apns4j:1.1.4" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />

View File

@ -15,6 +15,7 @@
</component>
<component name="Encoding">
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="InspectionProjectProfileManager">
@ -110,92 +111,92 @@
<root url="jar://$MAVEN_REPOSITORY$/cn/teaey/apns4j/apns4j/1.1.4/apns4j-1.1.4-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0">
<library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.9">
<library name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.10.1/jackson-core-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.9">
<library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9/jackson-databind-2.9.9.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9/jackson-databind-2.9.9-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9/jackson-databind-2.9.9-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.10.1/jackson-databind-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.9">
<library name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.9/jackson-datatype-jdk8-2.9.9.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.9/jackson-datatype-jdk8-2.9.9-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.9/jackson-datatype-jdk8-2.9.9-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.10.1/jackson-datatype-jdk8-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.9">
<library name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.9/jackson-datatype-jsr310-2.9.9.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.9/jackson-datatype-jsr310-2.9.9-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.9/jackson-datatype-jsr310-2.9.9-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.10.1/jackson-datatype-jsr310-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.9">
<library name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.9/jackson-module-parameter-names-2.9.9.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.1/jackson-module-parameter-names-2.10.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.9/jackson-module-parameter-names-2.9.9-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.1/jackson-module-parameter-names-2.10.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.9.9/jackson-module-parameter-names-2.9.9-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-parameter-names/2.10.1/jackson-module-parameter-names-2.10.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml:classmate:1.4.0">
<library name="Maven: com.fasterxml:classmate:1.5.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.4.0/classmate-1.4.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.4.0/classmate-1.4.0-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.5.1/classmate-1.5.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.4.0/classmate-1.4.0-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/classmate/1.5.1/classmate-1.5.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.google.protobuf:protobuf-java:3.9.1">
<library name="Maven: com.google.protobuf:protobuf-java:3.11.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.9.1/protobuf-java-3.9.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.11.1/protobuf-java-3.11.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.9.1/protobuf-java-3.9.1-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.11.1/protobuf-java-3.11.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.9.1/protobuf-java-3.9.1-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/3.11.1/protobuf-java-3.11.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-io:commons-io:2.6">
@ -286,26 +287,26 @@
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.35.Final/netty-transport-4.1.35.Final-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: javax.annotation:javax.annotation-api:1.3.2">
<library name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: javax.validation:validation-api:2.0.1.Final">
<library name="Maven: jakarta.validation:jakarta.validation-api:2.0.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/validation/jakarta.validation-api/2.0.1/jakarta.validation-api-2.0.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/validation/jakarta.validation-api/2.0.1/jakarta.validation-api-2.0.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/jakarta/validation/jakarta.validation-api/2.0.1/jakarta.validation-api-2.0.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.commons:commons-lang3:3.8.1">
@ -319,26 +320,26 @@
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.logging.log4j:log4j-api:2.11.2">
<library name="Maven: org.apache.logging.log4j:log4j-api:2.12.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2">
<library name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.12.1/log4j-to-slf4j-2.12.1-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.mina:mina-core:2.1.3">
@ -352,290 +353,301 @@
<root url="jar://$MAVEN_REPOSITORY$/org/apache/mina/mina-core/2.1.3/mina-core-2.1.3-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.22">
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.22/tomcat-embed-core-9.0.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.29/tomcat-embed-core-9.0.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.22/tomcat-embed-core-9.0.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.29/tomcat-embed-core-9.0.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.22/tomcat-embed-core-9.0.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-core/9.0.29/tomcat-embed-core-9.0.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.22">
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.22/tomcat-embed-el-9.0.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.29/tomcat-embed-el-9.0.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.22/tomcat-embed-el-9.0.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.29/tomcat-embed-el-9.0.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.22/tomcat-embed-el-9.0.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-el/9.0.29/tomcat-embed-el-9.0.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.22">
<library name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.22/tomcat-embed-websocket-9.0.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.29/tomcat-embed-websocket-9.0.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.22/tomcat-embed-websocket-9.0.22-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.29/tomcat-embed-websocket-9.0.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.22/tomcat-embed-websocket-9.0.22-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.29/tomcat-embed-websocket-9.0.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.freemarker:freemarker:2.3.28">
<library name="Maven: org.freemarker:freemarker:2.3.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.28/freemarker-2.3.28.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.29/freemarker-2.3.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.28/freemarker-2.3.28-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.29/freemarker-2.3.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.28/freemarker-2.3.28-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/freemarker/freemarker/2.3.29/freemarker-2.3.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final">
<library name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.17.Final/hibernate-validator-6.0.17.Final.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.17.Final/hibernate-validator-6.0.17.Final-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.17.Final/hibernate-validator-6.0.17.Final-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/hibernate/validator/hibernate-validator/6.0.18.Final/hibernate-validator-6.0.18.Final-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final">
<library name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.slf4j:jul-to-slf4j:1.7.26">
<library name="Maven: org.slf4j:jul-to-slf4j:1.7.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.26/jul-to-slf4j-1.7.26.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.29/jul-to-slf4j-1.7.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.26/jul-to-slf4j-1.7.26-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.29/jul-to-slf4j-1.7.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.26/jul-to-slf4j-1.7.26-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.29/jul-to-slf4j-1.7.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.slf4j:slf4j-api:1.7.26">
<library name="Maven: org.slf4j:slf4j-api:1.7.29">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.29/slf4j-api-1.7.29.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.29/slf4j-api-1.7.29-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.29/slf4j-api-1.7.29-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.2.2.RELEASE/spring-boot-autoconfigure-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.2.2.RELEASE/spring-boot-autoconfigure-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.2.2.RELEASE/spring-boot-autoconfigure-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.1.7.RELEASE/spring-boot-starter-freemarker-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.2.2.RELEASE/spring-boot-starter-freemarker-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.1.7.RELEASE/spring-boot-starter-freemarker-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.2.2.RELEASE/spring-boot-starter-freemarker-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.1.7.RELEASE/spring-boot-starter-freemarker-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-freemarker/2.2.2.RELEASE/spring-boot-starter-freemarker-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.1.7.RELEASE/spring-boot-starter-json-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.2.2.RELEASE/spring-boot-starter-json-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.1.7.RELEASE/spring-boot-starter-json-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.2.2.RELEASE/spring-boot-starter-json-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.1.7.RELEASE/spring-boot-starter-json-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-json/2.2.2.RELEASE/spring-boot-starter-json-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.7.RELEASE/spring-boot-starter-logging-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.2.2.RELEASE/spring-boot-starter-logging-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.7.RELEASE/spring-boot-starter-logging-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.2.2.RELEASE/spring-boot-starter-logging-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.7.RELEASE/spring-boot-starter-logging-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.2.2.RELEASE/spring-boot-starter-logging-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.1.7.RELEASE/spring-boot-starter-tomcat-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.2.2.RELEASE/spring-boot-starter-tomcat-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.1.7.RELEASE/spring-boot-starter-tomcat-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.2.2.RELEASE/spring-boot-starter-tomcat-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.1.7.RELEASE/spring-boot-starter-tomcat-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-tomcat/2.2.2.RELEASE/spring-boot-starter-tomcat-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.1.7.RELEASE/spring-boot-starter-web-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/2.2.2.RELEASE/spring-boot-starter-validation-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.1.7.RELEASE/spring-boot-starter-web-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/2.2.2.RELEASE/spring-boot-starter-validation-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.1.7.RELEASE/spring-boot-starter-web-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-validation/2.2.2.RELEASE/spring-boot-starter-validation-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot-starter:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.7.RELEASE/spring-boot-starter-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.2.2.RELEASE/spring-boot-starter-web-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.7.RELEASE/spring-boot-starter-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.2.2.RELEASE/spring-boot-starter-web-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.7.RELEASE/spring-boot-starter-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-web/2.2.2.RELEASE/spring-boot-starter-web-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework.boot:spring-boot:2.1.7.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot-starter:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.7.RELEASE/spring-boot-2.1.7.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.2.2.RELEASE/spring-boot-starter-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.7.RELEASE/spring-boot-2.1.7.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.2.2.RELEASE/spring-boot-starter-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.7.RELEASE/spring-boot-2.1.7.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.2.2.RELEASE/spring-boot-starter-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-aop:5.1.9.RELEASE">
<library name="Maven: org.springframework.boot:spring-boot:2.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.9.RELEASE/spring-aop-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.2.2.RELEASE/spring-boot-2.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.9.RELEASE/spring-aop-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.2.2.RELEASE/spring-boot-2.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.9.RELEASE/spring-aop-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.2.2.RELEASE/spring-boot-2.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-beans:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-aop:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.9.RELEASE/spring-beans-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.2.2.RELEASE/spring-aop-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.9.RELEASE/spring-beans-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.2.2.RELEASE/spring-aop-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.9.RELEASE/spring-beans-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.2.2.RELEASE/spring-aop-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-context-support:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-beans:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.1.9.RELEASE/spring-context-support-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.2.2.RELEASE/spring-beans-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.1.9.RELEASE/spring-context-support-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.2.2.RELEASE/spring-beans-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.1.9.RELEASE/spring-context-support-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.2.2.RELEASE/spring-beans-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-context:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-context-support:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.9.RELEASE/spring-context-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.2.2.RELEASE/spring-context-support-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.9.RELEASE/spring-context-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.2.2.RELEASE/spring-context-support-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.9.RELEASE/spring-context-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context-support/5.2.2.RELEASE/spring-context-support-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-core:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-context:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.9.RELEASE/spring-core-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.2.2.RELEASE/spring-context-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.9.RELEASE/spring-core-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.2.2.RELEASE/spring-context-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.9.RELEASE/spring-core-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.2.2.RELEASE/spring-context-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-expression:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-core:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.9.RELEASE/spring-expression-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.2.2.RELEASE/spring-core-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.9.RELEASE/spring-expression-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.2.2.RELEASE/spring-core-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.9.RELEASE/spring-expression-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.2.2.RELEASE/spring-core-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-jcl:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-expression:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.9.RELEASE/spring-jcl-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.2.2.RELEASE/spring-expression-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.9.RELEASE/spring-jcl-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.2.2.RELEASE/spring-expression-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.9.RELEASE/spring-jcl-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.2.2.RELEASE/spring-expression-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-web:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-jcl:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.1.9.RELEASE/spring-web-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.2.2.RELEASE/spring-jcl-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.1.9.RELEASE/spring-web-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.2.2.RELEASE/spring-jcl-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.1.9.RELEASE/spring-web-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.2.2.RELEASE/spring-jcl-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.springframework:spring-webmvc:5.1.9.RELEASE">
<library name="Maven: org.springframework:spring-web:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.1.9.RELEASE/spring-webmvc-5.1.9.RELEASE.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.2.2.RELEASE/spring-web-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.1.9.RELEASE/spring-webmvc-5.1.9.RELEASE-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.2.2.RELEASE/spring-web-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.1.9.RELEASE/spring-webmvc-5.1.9.RELEASE-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-web/5.2.2.RELEASE/spring-web-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.yaml:snakeyaml:1.23">
<library name="Maven: org.springframework:spring-webmvc:5.2.2.RELEASE">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.2.RELEASE/spring-webmvc-5.2.2.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23-javadoc.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.2.RELEASE/spring-webmvc-5.2.2.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23-sources.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-webmvc/5.2.2.RELEASE/spring-webmvc-5.2.2.RELEASE-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.yaml:snakeyaml:1.25">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.25/snakeyaml-1.25-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.25/snakeyaml-1.25-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AnalysisUIOptions">
<option name="GROUP_BY_SEVERITY" value="true" />
</component>
<component name="ChangeListManager">
<list default="true" id="bed47126-03b3-4370-a6c1-08503492974f" name="Default Changelist" comment="" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@ -18,30 +20,21 @@
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>CIMWebBridge</find>
<find>cim-server-sdk-mina-3.7.0.jar</find>
<find>cim.server.port</find>
<find>memorySessionService</find>
<find>Logger</find>
</findStrings>
<replaceStrings>
<replace>CIMPushManager</replace>
</replaceStrings>
<dirStrings>
<dir>C:\Users\Administrator\Documents\cim\cim-boot-server\src\main\resources</dir>
</dirStrings>
</component>
<component name="ProjectId" id="1PxWQToGq56jcmMz176UjXWLSaU" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showExcludedFiles" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RequestMappingsPanelOrder0" value="0" />
<property name="RequestMappingsPanelOrder1" value="1" />
<property name="RequestMappingsPanelWidth0" value="75" />
<property name="RequestMappingsPanelWidth1" value="75" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/lib" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
@ -55,23 +48,12 @@
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\Administrator\Documents\gitee-cim\cim-boot-server\lib" />
<recent name="$PROJECT_DIR$/lib" />
<recent name="C:\Users\Administrator\Documents\cim\cim-boot-server\cim-boot-server\cim-boot-server" />
<recent name="C:\Users\Administrator\Documents\cim\cim-boot-server\cim-boot-server\cim-boot-server\src" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager">
<configuration name="ServerLauncher" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
<module name="cim-boot-server" />
@ -92,6 +74,18 @@
</list>
</recent_temporary>
</component>
<component name="ServiceViewManager">
<option name="viewStates">
<list>
<serviceView>
<treeState>
<expand />
<select />
</treeState>
</serviceView>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
@ -119,12 +113,84 @@
<workItem from="1566816214034" duration="698000" />
<workItem from="1567410257659" duration="115000" />
<workItem from="1568597528002" duration="523000" />
<workItem from="1579076046499" duration="14355000" />
<workItem from="1579226829168" duration="8852000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="WindowStateProjectService">
<state x="627" y="209" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1579149988674">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="627" y="209" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.1920.1040@0.0.1920.1040" timestamp="1579149988674" />
<state x="690" y="218" key="FileChooserDialogImpl" timestamp="1579230010253">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="690" y="218" key="FileChooserDialogImpl/0.0.1920.1040@0.0.1920.1040" timestamp="1579230010253" />
<state width="1867" height="615" key="GridCell.Tab.0.bottom" timestamp="1579243696749">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.0.bottom/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696749" />
<state width="1867" height="615" key="GridCell.Tab.0.center" timestamp="1579243696749">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.0.center/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696749" />
<state width="1867" height="615" key="GridCell.Tab.0.left" timestamp="1579243696749">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.0.left/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696749" />
<state width="1867" height="615" key="GridCell.Tab.0.right" timestamp="1579243696749">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.0.right/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696749" />
<state width="1867" height="615" key="GridCell.Tab.1.bottom" timestamp="1579243696751">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.1.bottom/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696751" />
<state width="1867" height="615" key="GridCell.Tab.1.center" timestamp="1579243696750">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.1.center/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696750" />
<state width="1867" height="615" key="GridCell.Tab.1.left" timestamp="1579243696749">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.1.left/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696749" />
<state width="1867" height="615" key="GridCell.Tab.1.right" timestamp="1579243696751">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="615" key="GridCell.Tab.1.right/0.0.1920.1040@0.0.1920.1040" timestamp="1579243696751" />
<state width="1867" height="386" key="GridCell.Tab.2.bottom" timestamp="1579156159339">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="386" key="GridCell.Tab.2.bottom/0.0.1920.1040@0.0.1920.1040" timestamp="1579156159339" />
<state width="1867" height="386" key="GridCell.Tab.2.center" timestamp="1579156159339">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="386" key="GridCell.Tab.2.center/0.0.1920.1040@0.0.1920.1040" timestamp="1579156159339" />
<state width="1867" height="386" key="GridCell.Tab.2.left" timestamp="1579156159339">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="386" key="GridCell.Tab.2.left/0.0.1920.1040@0.0.1920.1040" timestamp="1579156159339" />
<state width="1867" height="386" key="GridCell.Tab.2.right" timestamp="1579156159339">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state width="1867" height="386" key="GridCell.Tab.2.right/0.0.1920.1040@0.0.1920.1040" timestamp="1579156159339" />
<state x="574" y="193" width="771" height="654" key="find.popup" timestamp="1579242964438">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="574" y="193" width="771" height="654" key="find.popup/0.0.1920.1040@0.0.1920.1040" timestamp="1579242964438" />
<state x="161" y="163" key="new project wizard" timestamp="1579242569030">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="161" y="163" key="new project wizard/0.0.1920.1040@0.0.1920.1040" timestamp="1579242569030" />
<state x="539" y="5" width="840" height="1034" key="search.everywhere.popup" timestamp="1579235575382">
<screen x="0" y="0" width="1920" height="1040" />
</state>
<state x="539" y="5" width="840" height="1034" key="search.everywhere.popup/0.0.1920.1040@0.0.1920.1040" timestamp="1579235575382" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
@ -133,6 +199,11 @@
<line>72</line>
<option name="timeStamp" value="5" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>jar://$PROJECT_DIR$/lib/cim-server-sdk-netty-3.7.0.jar!/com/farsunset/cim/sdk/server/coder/WebMessageEncoder.class</url>
<line>22</line>
<option name="timeStamp" value="10" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>

Binary file not shown.

Binary file not shown.

View File

@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
@ -19,7 +19,7 @@
<java.version>1.8</java.version>
<netty.version>4.1.35.Final</netty.version>
<mina.version>2.1.3</mina.version>
<protobuf.version>3.9.1</protobuf.version>
<protobuf.version>3.11.1</protobuf.version>
</properties>
<dependencies>
<dependency>
@ -39,10 +39,10 @@
<dependency>
<groupId>com.farsunset</groupId>
<artifactId>cim-server-sdk</artifactId>
<version>3.7.0</version>
<version>3.8.0</version>
<scope>system</scope>
<!-- mina 、netty版本 sdk任选其一 -->
<systemPath>${project.basedir}/lib/cim-server-sdk-netty-3.7.0.jar</systemPath>
<systemPath>${project.basedir}/libs/cim-server-sdk-netty-3.8.0.jar</systemPath>
</dependency>
@ -128,13 +128,4 @@
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
</project>

View File

@ -34,22 +34,7 @@ import org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReacti
import org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration;
import org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration;
/**
*
* 其中@SpringBootApplication申明让spring boot自动给程序进行必要的配置
* 等价于以默认属性使用@Configuration@EnableAutoConfiguration和@ComponentScan
*/
@SpringBootApplication
@EnableAutoConfiguration(exclude = { WebSocketMessagingAutoConfiguration.class,
WebSocketReactiveAutoConfiguration.class,
WebSocketServletAutoConfiguration.class,
WebServicesAutoConfiguration.class,
JmxAutoConfiguration.class,
DataSourceAutoConfiguration.class,
ValidationAutoConfiguration.class,
WebClientAutoConfiguration.class,
JacksonAutoConfiguration.class })
public class ServerLauncher {
public static void main(String[] args) {
SpringApplication.run(ServerLauncher.class, args);

View File

@ -22,6 +22,7 @@
package com.farsunset.cim.admin.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@ -29,13 +30,13 @@ import org.springframework.web.servlet.ModelAndView;
@Controller
public class NavigationController {
@RequestMapping(value = "/", method = RequestMethod.GET)
@GetMapping(value = "/")
public ModelAndView index(ModelAndView model) {
model.setViewName("console/index");
return model;
}
@RequestMapping(value = "/webclient", method = RequestMethod.GET)
@GetMapping(value = "/webclient")
public ModelAndView webclient(ModelAndView model) {
model.setViewName("console/webclient/index");
return model;

View File

@ -24,6 +24,7 @@ package com.farsunset.cim.admin.controller;
import com.farsunset.cim.service.CIMSessionService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
@ -35,7 +36,7 @@ public class SessionController {
@Resource
private CIMSessionService cimSessionService;
@RequestMapping(value = "/list")
@GetMapping(value = "/list")
public String list(Model model) {
model.addAttribute("sessionList", cimSessionService.list());
return "console/session/manage";

View File

@ -24,6 +24,7 @@ package com.farsunset.cim.api.controller;
import com.farsunset.cim.api.controller.dto.MessageResult;
import com.farsunset.cim.push.DefaultMessagePusher;
import com.farsunset.cim.sdk.server.model.Message;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@ -44,13 +45,13 @@ public class MessageController {
* @param message
* @return
*/
@RequestMapping(value = "/dispatch",method=RequestMethod.POST)
@PostMapping(value = "/dispatch")
public MessageResult dispatchSend(Message message) {
return send(message);
}
@RequestMapping(value = "/send",method=RequestMethod.POST)
@PostMapping(value = "/send")
public MessageResult send(Message message) {
MessageResult result = new MessageResult();

View File

@ -38,11 +38,15 @@ public class CIMConfig implements CIMRequestHandler, ApplicationListener<Applica
}
@Bean(destroyMethod = "destroy")
public CIMNioSocketAcceptor getNioSocketAcceptor(@Value("${cim.server.port}") int port) {
CIMNioSocketAcceptor nioSocketAcceptor = new CIMNioSocketAcceptor();
nioSocketAcceptor.setPort(port);
nioSocketAcceptor.setAppSentBodyHandler(this);
return nioSocketAcceptor;
public CIMNioSocketAcceptor getNioSocketAcceptor(@Value("${cim.app.port}") int port,
@Value("${cim.websocket.port}") int websocketPort) {
return new CIMNioSocketAcceptor.Builder()
.setAppPort(port)
.setWebsocketPort(websocketPort)
.setOuterRequestHandler(this)
.build();
}
@Override

View File

@ -32,6 +32,7 @@ import com.farsunset.cim.service.CIMSessionService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -57,11 +58,12 @@ public class BindHandler implements CIMRequestHandler {
@Resource
private CIMMessagePusher defaultMessagePusher;
@Override
public void process(CIMSession newSession, SentBody body) {
ReplyBody reply = new ReplyBody();
reply.setKey(body.getKey());
reply.setCode(CIMConstant.ReturnCode.CODE_200);
reply.setCode(HttpStatus.OK.value());
reply.setTimestamp(System.currentTimeMillis());
try {
@ -72,7 +74,7 @@ public class BindHandler implements CIMRequestHandler {
newSession.setHost(host);
newSession.setChannel(body.get("channel"));
newSession.setDeviceModel(body.get("device"));
newSession.setClientVersion(body.get("version"));
newSession.setClientVersion(body.get("appVersion"));
newSession.setSystemVersion(body.get("osVersion"));
newSession.setBindTime(System.currentTimeMillis());
/*
@ -102,7 +104,7 @@ public class BindHandler implements CIMRequestHandler {
} catch (Exception exception) {
reply.setCode(CIMConstant.ReturnCode.CODE_500);
reply.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
logger.error("Bind has error",exception);
}
@ -117,7 +119,7 @@ public class BindHandler implements CIMRequestHandler {
private void sendForceOfflineMessage(CIMSession oldSession, String account, String deviceModel) {
Message msg = new Message();
msg.setAction(CIMConstant.MessageAction.ACTION_999);// 强行下线消息类型
msg.setAction(CIMConstant.MessageAction.ACTION_OFFLINE);
msg.setReceiver(account);
msg.setSender("system");
msg.setContent(deviceModel);
@ -129,7 +131,6 @@ public class BindHandler implements CIMRequestHandler {
}
// 不同设备同一账号登录时关闭旧的连接
private void closeQuietly(CIMSession oldSession) {
if (oldSession.isConnected() && Objects.equals(host, oldSession.getHost())) {
oldSession.setAttribute(CIMConstant.KEY_QUIETLY_CLOSE,true);

View File

@ -44,6 +44,7 @@ public class SessionClosedHandler implements CIMRequestHandler {
@Resource
private CIMSessionService cimSessionService;
@Override
public void process(CIMSession ios, SentBody message) {
Object quietly = ios.getAttribute(CIMConstant.KEY_QUIETLY_CLOSE);
if (Objects.equals(quietly, true)) {
@ -57,7 +58,7 @@ public class SessionClosedHandler implements CIMRequestHandler {
CIMSession oldSession = cimSessionService.get(account.toString());
if (oldSession == null || oldSession.isApnsOpend()) {
if (oldSession == null || oldSession.isApnsEnable()) {
return;
}

View File

@ -55,6 +55,7 @@ public class DefaultMessagePusher implements CIMMessagePusher {
*
* @param message
*/
@Override
public void push(Message message) {
CIMSession session = cimSessionService.get(message.getReceiver());
@ -65,7 +66,7 @@ public class DefaultMessagePusher implements CIMMessagePusher {
/*
* IOS设备如果开启了apns则使用apns推送
*/
if (session.isIOSChannel() && session.isApnsOpend()) {
if (session.isIOSChannel() && session.isApnsEnable()) {
apnsService.push(message, session.getDeviceId());
return;
}

View File

@ -18,7 +18,9 @@ spring.messages.basename=i18n/messages
##################################################################
# CIM Config #
##################################################################
cim.server.port=23456
cim.app.port=23456
cim.websocket.port=34567
apple.apns.debug=false
apple.apns.p12.password= your p12 password
apple.apns.p12.file= /apns/lvxin.p12

View File

@ -21,7 +21,7 @@
/***********************************推送配置开始**************************/
/** 当socket连接成功回调 **/
function onConnectionSuccessed(){
function onConnectFinished(){
CIMPushManager.bindAccount($('#account').val());
}
@ -75,7 +75,7 @@
}
showProcess('正在接入请稍后......');
/**登录成功后创建连接****/
CIMPushManager.connection();
CIMPushManager.connect();
}

View File

@ -1,216 +1,181 @@
/*CIM服务器IP*/
var CIM_HOST = "127.0.0.1";
/*CIM服务端口*/
var CIM_PORT = 23456;
var CIM_URI="ws://"+CIM_HOST+":"+CIM_PORT;
const CIM_HOST = "127.0.0.1";
/*
*服务端 websocket端口
*/
const CIM_PORT = 34567;
const CIM_URI = "ws://" + CIM_HOST + ":" + CIM_PORT;
var CMD_HEARTBEAT_RESPONSE = new Uint8Array([67,82]);
var SDK_VERSION = "1.0.0";
var SDK_CHANNEL = "browser";
var APP_PACKAGE = "com.farsunset.cim";
var ACTION_999 = "999";//特殊的消息类型,代表被服务端强制下线
var DATA_HEADER_LENGTH = 3;
const APP_VERSION = "1.0.0";
const APP_CHANNEL = "browser";
const APP_PACKAGE = "com.farsunset.cim";
var C_H_RS = 0;
var S_H_RQ = 1;
var MESSAGE = 2;
var SENTBODY = 3;
var REPLYBODY = 4;
/*
*特殊的消息类型代表被服务端强制下线
*/
const ACTION_999 = "999";
const DATA_HEADER_LENGTH = 1;
var socket;
var manualStop = false;
var CIMPushManager = {};
CIMPushManager.connection = function(){
manualStop = false;
window.localStorage.account = '';
socket = new WebSocket(CIM_URI);
socket.cookieEnabled=false;
socket.binaryType = 'arraybuffer';
socket.onopen = CIMPushManager.innerOnConnectionSuccessed;
socket.onmessage = CIMPushManager.innerOnMessageReceived;
const MESSAGE = 2;
const REPLY_BODY = 4;
let socket;
let manualStop = false;
const CIMPushManager = {};
CIMPushManager.connect = function () {
manualStop = false;
window.localStorage.account = '';
socket = new WebSocket(CIM_URI);
socket.cookieEnabled = false;
socket.binaryType = 'arraybuffer';
socket.onopen = CIMPushManager.innerOnConnectFinished;
socket.onmessage = CIMPushManager.innerOnMessageReceived;
socket.onclose = CIMPushManager.innerOnConnectionClosed;
};
CIMPushManager.bindAccount = function(account){
window.localStorage.account = account;
var deviceId = window.localStorage.deviceIddeviceId;
if(deviceId == '' || deviceId == undefined){
deviceId = generateUUID();
window.localStorage.deviceId = deviceId;
}
CIMPushManager.bindAccount = function (account) {
var browser = getBrowser();
var body = new proto.com.farsunset.cim.sdk.web.model.SentBody();
body.setKey("client_bind");
body.getDataMap().set("account",account);
body.getDataMap().set("channel",SDK_CHANNEL);
body.getDataMap().set("version",SDK_VERSION);
body.getDataMap().set("osVersion", browser.version);
body.getDataMap().set("packageName", APP_PACKAGE);
body.getDataMap().set("deviceId", deviceId);
body.getDataMap().set("device", browser.name);
CIMPushManager.sendRequest(body);
window.localStorage.account = account;
let deviceId = window.localStorage.deviceIddeviceId;
if (deviceId == '' || deviceId == undefined) {
deviceId = generateUUID();
window.localStorage.deviceId = deviceId;
}
let browser = getBrowser();
let body = new proto.com.farsunset.cim.sdk.web.model.SentBody();
body.setKey("client_bind");
body.setTimestamp(new Date().getTime());
body.getDataMap().set("account", account);
body.getDataMap().set("channel", APP_CHANNEL);
body.getDataMap().set("appVersion", APP_VERSION);
body.getDataMap().set("osVersion", browser.version);
body.getDataMap().set("packageName", APP_PACKAGE);
body.getDataMap().set("deviceId", deviceId);
body.getDataMap().set("device", browser.name);
CIMPushManager.sendRequest(body);
};
CIMPushManager.stop = function(){
manualStop = true;
socket.close();
CIMPushManager.stop = function () {
manualStop = true;
socket.close();
};
CIMPushManager.resume = function(){
CIMPushManager.resume = function () {
manualStop = false;
CIMPushManager.connection();
CIMPushManager.connect();
};
CIMPushManager.innerOnConnectionSuccessed = function(){
var account = window.localStorage.account;
if(account == '' || account == undefined){
onConnectionSuccessed();
}else{
CIMPushManager.bindAccount(account);
}
};
CIMPushManager.innerOnMessageReceived = function(e){
var data = new Uint8Array(e.data);
var type = data[0];
/**
* 收到服务端发来的心跳请求立即回复响应否则服务端会在10秒后断开连接
*/
if(type == S_H_RQ){
CIMPushManager.sendHeartbeatResponse();
return;
}
if(type == MESSAGE){
var length = getContentLength(data[1],data[2]);
var data = proto.com.farsunset.cim.sdk.web.model.Message.deserializeBinary(data.subarray(DATA_HEADER_LENGTH,DATA_HEADER_LENGTH+length));
onInterceptMessageReceived(data.toObject(false));
return;
}
if(type == REPLYBODY){
var length = getContentLength(data[1],data[2]);
var data = proto.com.farsunset.cim.sdk.web.model.ReplyBody.deserializeBinary(data.subarray(DATA_HEADER_LENGTH,DATA_HEADER_LENGTH+length));
/**
* 将proto对象转换成json对象去除无用信息
*/
var reply = {};
reply.code = data.getCode();
reply.key = data.getKey();
reply.message = data.getMessage();
reply.timestamp = data.getTimestamp();
reply.data = {};
/**
* 注意遍历map这里的参数 value在前key在后
*/
data.getDataMap().forEach(function (v,k){
reply.data[k] = v;
});
onReplyReceived(reply);
}
CIMPushManager.innerOnConnectFinished = function () {
let account = window.localStorage.account;
if (account === '' || account === undefined) {
onConnectFinished();
} else {
CIMPushManager.bindAccount(account);
}
};
CIMPushManager.innerOnConnectionClosed = function(e){
if(!manualStop){
var time = Math.floor(Math.random()*(30-15+1)+15);
setTimeout(function(){
CIMPushManager.connection();
},time);
}
CIMPushManager.innerOnMessageReceived = function (e) {
let data = new Uint8Array(e.data);
let type = data[0];
let body = data.subarray(DATA_HEADER_LENGTH, data.length);
if (type == MESSAGE) {
let message = proto.com.farsunset.cim.sdk.web.model.Message.deserializeBinary(body);
onInterceptMessageReceived(message.toObject(false));
return;
}
if (type == REPLY_BODY) {
let message = proto.com.farsunset.cim.sdk.web.model.ReplyBody.deserializeBinary(body);
/**
* 将proto对象转换成json对象去除无用信息
*/
let reply = {};
reply.code = message.getCode();
reply.key = message.getKey();
reply.message = message.getMessage();
reply.timestamp = message.getTimestamp();
reply.data = {};
/**
* 注意遍历map这里的参数 value在前key在后
*/
message.getDataMap().forEach(function (v, k) {
reply.data[k] = v;
});
onReplyReceived(reply);
}
};
CIMPushManager.sendRequest = function(body){
var data = body.serializeBinary();
var header = buildHeader(SENTBODY,data.length);
var protubuf = new Uint8Array(data.length + header.length);
protubuf.set(header,0);
protubuf.set(data,header.length);
socket.send(protubuf);
CIMPushManager.innerOnConnectionClosed = function (e) {
if (!manualStop) {
let time = Math.floor(Math.random() * (30 - 15 + 1) + 15);
setTimeout(function () {
CIMPushManager.connect();
}, time);
}
};
CIMPushManager.sendHeartbeatResponse = function(){
var data = CMD_HEARTBEAT_RESPONSE;
var header = buildHeader(C_H_RS,data.length);
var protubuf = new Uint8Array(data.length + header.length);
protubuf.set(header,0);
protubuf.set(data,header.length);
socket.send(protubuf);
CIMPushManager.sendRequest = function (body) {
let data = body.serializeBinary();
let protobuf = new Uint8Array(data.length);
protobuf.set(data, 0);
socket.send(protobuf);
};
function getContentLength( lv, hv) {
var l = (lv & 0xff);
var h = (hv & 0xff);
return (l | (h <<= 8));
}
function buildHeader(type,length){
var header = new Uint8Array(DATA_HEADER_LENGTH);
header[0] = type;
header[1] = (length & 0xff);
header[2] = ((length >> 8) & 0xff);
return header;
}
function onInterceptMessageReceived(message){
//被强制下线之后,不再继续连接服务端
if(message.action == ACTION_999){
manualStop = true;
}
//收到消息后,将消息发送给页面
if(onMessageReceived instanceof Function){
onMessageReceived(message);
}
function onInterceptMessageReceived(message) {
/*
*被强制下线之后不再继续连接服务端
*/
if (message.action == ACTION_999) {
manualStop = true;
}
/*
*收到消息后将消息发送给页面
*/
if (onMessageReceived instanceof Function) {
onMessageReceived(message);
}
}
function getBrowser() {
var explorer = window.navigator.userAgent.toLowerCase() ;
// ie
if (explorer.indexOf("msie") >= 0) {
var ver=explorer.match(/msie ([\d.]+)/)[1];
return {name:"IE",version:ver};
}
// firefox
else if (explorer.indexOf("firefox") >= 0) {
var ver=explorer.match(/firefox\/([\d.]+)/)[1];
return {name:"Firefox",version:ver};
}
// Chrome
else if(explorer.indexOf("chrome") >= 0){
var ver=explorer.match(/chrome\/([\d.]+)/)[1];
return {name:"Chrome",version:ver};
}
// Opera
else if(explorer.indexOf("opera") >= 0){
var ver=explorer.match(/opera.([\d.]+)/)[1];
return {name:"Opera",version:ver};
}
// Safari
else if(explorer.indexOf("Safari") >= 0){
var ver=explorer.match(/version\/([\d.]+)/)[1];
return {name:"Safari",version:ver};
}
return {name:"Other",version:"1.0.0"};
let explorer = window.navigator.userAgent.toLowerCase();
if (explorer.indexOf("msie") >= 0) {
let ver = explorer.match(/msie ([\d.]+)/)[1];
return {name: "IE", version: ver};
}
else if (explorer.indexOf("firefox") >= 0) {
let ver = explorer.match(/firefox\/([\d.]+)/)[1];
return {name: "Firefox", version: ver};
}
else if (explorer.indexOf("chrome") >= 0) {
let ver = explorer.match(/chrome\/([\d.]+)/)[1];
return {name: "Chrome", version: ver};
}
else if (explorer.indexOf("opera") >= 0) {
let ver = explorer.match(/opera.([\d.]+)/)[1];
return {name: "Opera", version: ver};
}
else if (explorer.indexOf("Safari") >= 0) {
let ver = explorer.match(/version\/([\d.]+)/)[1];
return {name: "Safari", version: ver};
}
return {name: "Other", version: "1.0.0"};
}
function generateUUID() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid.replace(/-/g,'');
let d = new Date().getTime();
let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
let r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid.replace(/-/g, '');
}

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="libs/android.jar"/>
<classpathentry kind="lib" path="libs/protobuf-lite-3.0.0.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -0,0 +1,2 @@
target/
.idea/

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>cim-android-sdk</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.genuitec.eclipse.ast.deploy.core.deploymentnature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,3 +0,0 @@
#Wed Oct 15 09:31:41 CST 2014
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -1,12 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

View File

@ -0,0 +1 @@
mvn clean package

View File

@ -0,0 +1 @@
mvn clean package

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>com.farsunset</groupId>
<artifactId>cim-android-sdk</artifactId>
<version>3.8.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<protobuf.lite.version>3.0.1</protobuf.lite.version>
<netty.version>4.1.44.Final</netty.version>
<slf4j.version>1.7.30</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-lite</artifactId>
<version>${protobuf.lite.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>android</groupId>
<artifactId>android</artifactId>
<scope>system</scope>
<version>8.0.0</version>
<systemPath>${project.basedir}/libs/android.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -39,9 +39,9 @@ class CIMCacheManager {
public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED";
public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST";
public static final String KEY_CIM_SERVER_HOST = "KEY_CIM_SERVER_HOST";
public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT";
public static final String KEY_CIM_SERVER_PORT = "KEY_CIM_SERVER_PORT";
public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE";
@ -76,8 +76,9 @@ class CIMCacheManager {
private static void closeQuietly(Cursor cursor) {
try {
if (cursor != null)
if (cursor != null) {
cursor.close();
}
} catch (Exception ignore) {
}
}
@ -88,7 +89,7 @@ class CIMCacheManager {
public static boolean getBoolean(Context context, String key) {
String value = getString(context, key);
return value == null ? false : Boolean.parseBoolean(value);
return Boolean.parseBoolean(value);
}
public static void putInt(Context context, String key, int value) {

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,6 +21,17 @@
*/
package com.farsunset.cim.sdk.android;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import com.farsunset.cim.sdk.android.coder.CIMLogger;
import com.farsunset.cim.sdk.android.coder.ClientMessageDecoder;
import com.farsunset.cim.sdk.android.coder.ClientMessageEncoder;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.*;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
@ -31,26 +42,8 @@ import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
import com.farsunset.cim.sdk.android.coder.CIMLogger;
import com.farsunset.cim.sdk.android.coder.ClientMessageDecoder;
import com.farsunset.cim.sdk.android.coder.ClientMessageEncoder;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.HeartbeatRequest;
import com.farsunset.cim.sdk.android.model.HeartbeatResponse;
import com.farsunset.cim.sdk.android.model.Message;
import com.farsunset.cim.sdk.android.model.Protobufable;
import com.farsunset.cim.sdk.android.model.ReplyBody;
import com.farsunset.cim.sdk.android.model.SentBody;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
/**
* 连接服务端管理cim核心处理类管理连接以及消息处理
*
@ -60,19 +53,19 @@ class CIMConnectorManager{
private static CIMConnectorManager manager;
private final int READ_BUFFER_SIZE = 2048;
private final int WRITE_BUFFER_SIZE = 1024;
private static final int READ_BUFFER_SIZE = 2048;
private static final int WRITE_BUFFER_SIZE = 1024;
private final int READ_IDLE_TIME = 120 * 1000;
private static final int READ_IDLE_TIME = 120 * 1000;
private final int CONNECT_TIME_OUT = 10 * 1000;
private static final int CONNECT_TIME_OUT = 10 * 1000;
private final int CONNECT_ALIVE_TIME_OUT = 150 * 1000;
private static final int CONNECT_ALIVE_TIME_OUT = 150 * 1000;
private final AtomicLong LAST_READ_TIME = new AtomicLong(0);
private static final AtomicLong LAST_READ_TIME = new AtomicLong(0);
private final CIMLogger LOGGER = CIMLogger.getLogger();
private static final CIMLogger LOGGER = CIMLogger.getLogger();
private static final HandlerThread IDLE_HANDLER_THREAD = new HandlerThread("READ-IDLE", Process.THREAD_PRIORITY_BACKGROUND);
@ -85,19 +78,9 @@ class CIMConnectorManager{
private ByteBuffer readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE);
private ExecutorService workerExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"worker-");
}
});
private ExecutorService workerExecutor = Executors.newFixedThreadPool(1, r -> new Thread(r,"worker-"));
private ExecutorService bossExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"boss-");
}
});
private ExecutorService bossExecutor = Executors.newFixedThreadPool(1, r -> new Thread(r,"boss-"));
private ClientMessageEncoder messageEncoder = new ClientMessageEncoder();
private ClientMessageDecoder messageDecoder = new ClientMessageDecoder();
@ -126,7 +109,7 @@ class CIMConnectorManager{
Intent intent = new Intent();
intent.setPackage(context.getPackageName());
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FAILED);
context.sendBroadcast(intent);
return;
@ -136,62 +119,56 @@ class CIMConnectorManager{
return;
}
bossExecutor.execute(new Runnable() {
@Override
public void run() {
if (isConnected()) {
return;
}
LOGGER.startConnect(host, port);
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
try {
semaphore.acquire();
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
socketChannel.socket().setTcpNoDelay(true);
socketChannel.socket().setKeepAlive(true);
socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE);
socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE);
socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT);
semaphore.release();
handelConnectedEvent();
int result = -1;
while((result = socketChannel.read(readBuffer)) > 0) {
if(readBuffer.position() == readBuffer.capacity()) {
extendByteBuffer();
}
handelSocketReadEvent(result);
bossExecutor.execute(() -> {
if (isConnected()) {
return;
}
LOGGER.startConnect(host, port);
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
try {
semaphore.acquire();
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
socketChannel.socket().setTcpNoDelay(true);
socketChannel.socket().setKeepAlive(true);
socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE);
socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE);
socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT);
semaphore.release();
handelConnectedEvent();
int result = -1;
while((result = socketChannel.read(readBuffer)) > 0) {
if(readBuffer.position() == readBuffer.capacity()) {
extendByteBuffer();
}
handelSocketReadEvent(result);
}catch(ConnectException ignore){
semaphore.release();
handleConnectAbortedEvent();
}catch(SocketTimeoutException ignore){
semaphore.release();
handleConnectAbortedEvent();
}catch(IOException ignore) {
semaphore.release();
handelDisconnectedEvent();
}catch(InterruptedException ignore) {
semaphore.release();
}
handelSocketReadEvent(result);
}catch(ConnectException | SocketTimeoutException ignore){
semaphore.release();
handleConnectAbortedEvent();
} catch(IOException ignore) {
semaphore.release();
handelDisconnectedEvent();
}catch(InterruptedException ignore) {
semaphore.release();
}
});
}
@ -229,32 +206,28 @@ class CIMConnectorManager{
return;
}
workerExecutor.execute(new Runnable() {
@Override
public void run() {
int result = 0;
try {
semaphore.acquire();
ByteBuffer buffer = messageEncoder.encode(body);
while(buffer.hasRemaining()){
result += socketChannel.write(buffer);
}
} catch (Exception e) {
result = -1;
}finally {
semaphore.release();
if(result <= 0) {
closeSession();
}else {
messageSent(body);
}
}
workerExecutor.execute(() -> {
int result = 0;
try {
semaphore.acquire();
ByteBuffer buffer = messageEncoder.encode(body);
while(buffer.hasRemaining()){
result += socketChannel.write(buffer);
}
} catch (Exception e) {
result = -1;
}finally {
semaphore.release();
if(result <= 0) {
closeSession();
}else {
messageSent(body);
}
}
});
@ -268,7 +241,7 @@ class CIMConnectorManager{
Intent intent = new Intent();
intent.setPackage(context.getPackageName());
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FINISHED);
context.sendBroadcast(intent);
}
@ -298,9 +271,8 @@ class CIMConnectorManager{
LOGGER.sessionIdle(socketChannel);
/**
/*
* 用于解决wifi情况下偶而路由器与服务器断开连接时客户端并没及时收到关闭事件 导致这样的情况下当前连接无效也不会重连的问题
*
*/
if (System.currentTimeMillis() - LAST_READ_TIME.get() >= CONNECT_ALIVE_TIME_OUT) {
closeSession();
@ -337,13 +309,14 @@ class CIMConnectorManager{
if (message instanceof SentBody) {
Intent intent = new Intent();
intent.setPackage(context.getPackageName());
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
intent.setAction(CIMConstant.IntentAction.ACTION_SEND_FINISHED);
intent.putExtra(SentBody.class.getName(), (SentBody) message);
context.sendBroadcast(intent);
}
}
private Handler idleHandler = new Handler(IDLE_HANDLER_THREAD.getLooper()) {
@Override
public void handleMessage(android.os.Message m) {
sessionIdle();
}
@ -355,13 +328,13 @@ class CIMConnectorManager{
private void handleConnectAbortedEvent() {
long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
long interval = CIMConstant.RECONNECT_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
LOGGER.connectFailure(interval);
Intent intent = new Intent();
intent.setPackage(context.getPackageName());
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FAILED);
intent.putExtra("interval", interval);
context.sendBroadcast(intent);
@ -374,7 +347,7 @@ class CIMConnectorManager{
idleHandler.sendEmptyMessageDelayed(0, READ_IDLE_TIME);
}
private void handelSocketReadEvent(int result) throws IOException {
private void handelSocketReadEvent(int result) {
if(result == -1) {
closeSession();
@ -395,7 +368,7 @@ class CIMConnectorManager{
if(isHeartbeatRequest(message)) {
send(getHeartbeatResponse());
send(HeartbeatResponse.getInstance());
return;
}
@ -425,11 +398,7 @@ class CIMConnectorManager{
idleHandler.sendEmptyMessageDelayed(0, READ_IDLE_TIME);
}
private HeartbeatResponse getHeartbeatResponse() {
return HeartbeatResponse.getInstance();
}
private boolean isHeartbeatRequest(Object data) {
return data instanceof HeartbeatRequest;

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,16 +21,15 @@
*/
package com.farsunset.cim.sdk.android;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.Message;
import com.farsunset.cim.sdk.android.model.ReplyBody;
import com.farsunset.cim.sdk.android.model.SentBody;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Build;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.Message;
import com.farsunset.cim.sdk.android.model.ReplyBody;
import com.farsunset.cim.sdk.android.model.SentBody;
/**
* 消息入口所有消息都会经过这里
@ -45,20 +44,22 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
this.context = context;
String action = intent.getAction();
/*
* 操作事件广播用于提高service存活率
*/
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)
|| intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)
|| intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
if (Intent.ACTION_USER_PRESENT.equals(action)
|| Intent.ACTION_POWER_CONNECTED.equals(action)
|| Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
startPushService();
}
/*
* 设备网络状态变化事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED)
||intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
if (CIMConstant.IntentAction.ACTION_NETWORK_CHANGED.equals(action)
||ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
onDevicesNetworkChanged();
}
@ -66,51 +67,51 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
/*
* cim断开服务器事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED)) {
if (CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED.equals(action)) {
onInnerConnectionClosed();
}
/*
* cim连接服务器失败事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED)) {
long interval = intent.getLongExtra("interval", CIMConstant.RECONN_INTERVAL_TIME);
onConnectionFailed(interval);
if (CIMConstant.IntentAction.ACTION_CONNECT_FAILED.equals(action)) {
long interval = intent.getLongExtra("interval", CIMConstant.RECONNECT_INTERVAL_TIME);
onInnerConnectFailed(interval);
}
/*
* cim连接服务器成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED)) {
onInnerConnectionSuccessed();
if (CIMConstant.IntentAction.ACTION_CONNECT_FINISHED.equals(action)) {
onInnerConnectFinished();
}
/*
* 收到推送消息事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED)) {
if (CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED.equals(action)) {
onInnerMessageReceived((Message) intent.getSerializableExtra(Message.class.getName()), intent);
}
/*
* 获取收到replybody成功事件
* 获取收到replyBody成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED)) {
if (CIMConstant.IntentAction.ACTION_REPLY_RECEIVED.equals(action)) {
onReplyReceived((ReplyBody) intent.getSerializableExtra(ReplyBody.class.getName()));
}
/*
* 获取sendbody发送成功事件
* 获取sendBody发送成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED)) {
if (CIMConstant.IntentAction.ACTION_SEND_FINISHED.equals(action)) {
onSentSucceed((SentBody) intent.getSerializableExtra(SentBody.class.getName()));
}
/*
* 重新连接如果断开的话
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_RECOVERY)) {
if (CIMConstant.IntentAction.ACTION_CONNECTION_RECOVERY.equals(action)) {
connect(0);
}
}
@ -138,21 +139,21 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
onConnectionClosed();
}
private void onConnectionFailed(long reinterval) {
private void onInnerConnectFailed(long interval) {
if (CIMPushManager.isNetworkConnected(context)) {
onConnectionFailed();
onConnectFailed();
connect(reinterval);
connect(interval);
}
}
private void onInnerConnectionSuccessed() {
private void onInnerConnectFinished() {
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, true);
boolean autoBind = CIMPushManager.autoBindAccount(context);
onConnectionSuccessed(autoBind);
onConnectFinished(autoBind);
}
private void onDevicesNetworkChanged() {
@ -171,7 +172,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
CIMPushManager.startService(context,serviceIntent);
}
private void onInnerMessageReceived(com.farsunset.cim.sdk.android.model.Message message, Intent intent) {
private void onInnerMessageReceived(Message message, Intent intent) {
if (isForceOfflineMessage(message.getAction())) {
CIMPushManager.stop(context);
}
@ -182,31 +183,37 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
private boolean isForceOfflineMessage(String action) {
return CIMConstant.MessageAction.ACTION_999.equals(action);
}
public abstract void onMessageReceived(com.farsunset.cim.sdk.android.model.Message message, Intent intent);
/**
* 接收消息实现方法
* @param message
* @param intent
*/
public abstract void onMessageReceived(Message message, Intent intent);
public void onNetworkChanged() {
CIMListenerManager.notifyOnNetworkChanged(CIMPushManager.getNetworkInfo(context));
}
public void onConnectionSuccessed(boolean hasAutoBind) {
CIMListenerManager.notifyOnConnectionSuccessed(hasAutoBind);
public void onConnectFinished(boolean hasAutoBind) {
CIMListenerManager.notifyOnConnectFinished(hasAutoBind);
}
public void onConnectFailed() {
CIMListenerManager.notifyOnConnectFailed();
}
public void onConnectionClosed() {
CIMListenerManager.notifyOnConnectionClosed();
}
public void onConnectionFailed() {
CIMListenerManager.notifyOnConnectionFailed();
}
public void onReplyReceived(ReplyBody body) {
CIMListenerManager.notifyOnReplyReceived(body);
}
public void onSentSucceed(SentBody body) {
CIMListenerManager.notifyOnSentSucceed(body);
CIMListenerManager.notifyOnSendFinished(body);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -22,7 +22,6 @@
package com.farsunset.cim.sdk.android;
import android.net.NetworkInfo;
import com.farsunset.cim.sdk.android.model.Message;
import com.farsunset.cim.sdk.android.model.ReplyBody;
import com.farsunset.cim.sdk.android.model.SentBody;
@ -42,31 +41,31 @@ public interface CIMEventListener {
/**
* 当调用CIMPushManager.sendRequest()向服务端发送请求获得相应时调用
*
* @param replybody
* @param body
*/
void onReplyReceived(ReplyBody replybody);
void onReplyReceived(ReplyBody body);
/**
* 当调用CIMPushManager.sendRequest()向服务端发送请求成功时
*
*
* @param body
*/
void onSentSuccessed(SentBody body);
void onSendFinished(SentBody body);
/**
* 当手机网络发生变化时调用
*
* @param networkinfo
* @param info
*/
void onNetworkChanged(NetworkInfo networkinfo);
void onNetworkChanged(NetworkInfo info);
/**
* 当连接服务器成功时回调
*
* @param hasAutoBind
* : true 已经自动绑定账号到服务器了不需要再手动调用bindAccount
* true 已经自动绑定账号到服务器了不需要再手动调用bindAccount
*/
void onConnectionSuccessed(boolean hasAutoBind);
void onConnectFinished(boolean hasAutoBind);
/**
* 当断开服务器连接的时候回调
@ -78,10 +77,11 @@ public interface CIMEventListener {
* 当连接服务器失败的时候回调
*
*/
void onConnectionFailed();
void onConnectFailed();
/**
* 监听器在容器里面的排序值越大则越先接收
* @return 排序 值越大优先级越高
*/
int getEventDispatchOrder();
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,16 +21,16 @@
*/
package com.farsunset.cim.sdk.android;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import android.net.NetworkInfo;
import android.util.Log;
import com.farsunset.cim.sdk.android.model.Message;
import com.farsunset.cim.sdk.android.model.ReplyBody;
import com.farsunset.cim.sdk.android.model.SentBody;
import android.net.NetworkInfo;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
/**
* CIM 消息监听器管理
@ -38,20 +38,26 @@ import android.util.Log;
public class CIMListenerManager {
private static ArrayList<CIMEventListener> cimListeners = new ArrayList<CIMEventListener>();
private static CIMMessageReceiveComparator comparator = new CIMMessageReceiveComparator();
private static ReceiveComparator comparator = new ReceiveComparator();
private CIMListenerManager(){
}
public static void registerMessageListener(CIMEventListener listener) {
if (!cimListeners.contains(listener)) {
cimListeners.add(listener);
Collections.sort(cimListeners, comparator);
Collections.sort(cimListeners,comparator);
}
}
public static void removeMessageListener(CIMEventListener listener) {
for (int i = 0; i < cimListeners.size(); i++) {
if (listener.getClass() == cimListeners.get(i).getClass()) {
cimListeners.remove(i);
Iterator<CIMEventListener> iterable = cimListeners.iterator();
while (iterable.hasNext()){
CIMEventListener target = iterable.next();
if (listener.getClass() == target.getClass()) {
iterable.remove();
}
}
}
@ -62,9 +68,9 @@ public class CIMListenerManager {
}
}
public static void notifyOnConnectionSuccessed(boolean hasAutoBind) {
public static void notifyOnConnectFinished(boolean hasAutoBind) {
for (CIMEventListener listener : cimListeners) {
listener.onConnectionSuccessed(hasAutoBind);
listener.onConnectFinished(hasAutoBind);
}
}
@ -80,9 +86,9 @@ public class CIMListenerManager {
}
}
public static void notifyOnConnectionFailed() {
public static void notifyOnConnectFailed() {
for (CIMEventListener listener : cimListeners) {
listener.onConnectionFailed();
listener.onConnectFailed();
}
}
@ -92,13 +98,13 @@ public class CIMListenerManager {
}
}
public static void notifyOnSentSucceed(SentBody body) {
public static void notifyOnSendFinished(SentBody body) {
for (CIMEventListener listener : cimListeners) {
listener.onSentSuccessed(body);
listener.onSendFinished(body);
}
}
public static void destory() {
public static void destroy() {
cimListeners.clear();
}
@ -111,14 +117,14 @@ public class CIMListenerManager {
/**
* 消息接收activity的接收顺序排序CIM_RECEIVE_ORDER倒序
*/
private static class CIMMessageReceiveComparator implements Comparator<CIMEventListener> {
private static class ReceiveComparator implements Comparator<CIMEventListener> {
@Override
public int compare(CIMEventListener arg1, CIMEventListener arg2) {
int order1 = arg1.getEventDispatchOrder();
int order2 = arg2.getEventDispatchOrder();
return order2 - order1;
return Integer.compare(order2,order1);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,8 +21,6 @@
*/
package com.farsunset.cim.sdk.android;
import java.util.UUID;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
@ -31,11 +29,12 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.text.TextUtils;
import com.farsunset.cim.sdk.android.coder.CIMLogger;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.SentBody;
import java.util.UUID;
/**
* CIM 功能接口
*/
@ -49,18 +48,12 @@ public class CIMPushManager {
protected static String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION";
protected static String ACTION_SET_LOGGER_EANABLE = "ACTION_SET_LOGGER_EANABLE";
protected static String ACTION_SET_LOGGER_EATABLE = "ACTION_SET_LOGGER_EATABLE";
protected static String KEY_SEND_BODY = "KEY_SEND_BODY";
protected static String KEY_CIM_CONNECTION_STATUS = "KEY_CIM_CONNECTION_STATUS";
/**
* 初始化,连接服务端在程序启动页或者 在Application里调用
*
* @param context
* @param ip
* @param port
*/
public static void connect(Context context, String host, int port) {
@ -70,8 +63,8 @@ public class CIMPushManager {
}
CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST, host);
CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT, port);
CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVER_HOST, host);
CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVER_PORT, port);
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED, false);
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_MANUAL_STOP, false);
@ -88,20 +81,17 @@ public class CIMPushManager {
public static void setLoggerEnable(Context context,boolean enable) {
Intent serviceIntent = new Intent(context, CIMPushService.class);
serviceIntent.putExtra(CIMPushService.KEY_LOGGER_ENABLE, enable);
serviceIntent.setAction(ACTION_SET_LOGGER_EANABLE);
serviceIntent.setAction(ACTION_SET_LOGGER_EATABLE);
startService(context,serviceIntent);
}
/**
* 设置一个账号登录到服务端
*
* @param account
* 用户唯一ID
*/
public static void bindAccount(Context context, String account) {
if (isDestoryed(context) || account == null || account.trim().length() == 0) {
if (isDestroyed(context) || account == null || account.trim().length() == 0) {
return;
}
@ -114,28 +104,24 @@ public class CIMPushManager {
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_MANUAL_STOP, false);
CIMCacheManager.putString(context, CIMCacheManager.KEY_ACCOUNT, account);
String deviceId = CIMCacheManager.getString(context, CIMCacheManager.KEY_DEVICE_ID);
if (TextUtils.isEmpty(deviceId)) {
deviceId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
CIMCacheManager.putString(context, CIMCacheManager.KEY_DEVICE_ID, deviceId);
}
SentBody sent = new SentBody();
sent.setKey(CIMConstant.RequestKey.CLIENT_BIND);
sent.put("account", account);
sent.put("deviceId", deviceId);
sent.put("deviceId", getDeviceId(context));
sent.put("channel", "android");
sent.put("device", android.os.Build.MODEL);
sent.put("version", getVersionName(context));
sent.put("osVersion", android.os.Build.VERSION.RELEASE);
sent.put("device", Build.MODEL);
sent.put("appVersion", getVersionName(context));
sent.put("osVersion", Build.VERSION.RELEASE);
sent.put("packageName", context.getPackageName());
sent.setTimestamp(System.currentTimeMillis());
sendRequest(context, sent);
}
protected static boolean autoBindAccount(Context context) {
String account = CIMCacheManager.getString(context, CIMCacheManager.KEY_ACCOUNT);
if (account == null || account.trim().length() == 0 || isDestoryed(context)) {
if (account == null || account.trim().length() == 0 || isDestroyed(context)) {
return false;
}
@ -146,13 +132,10 @@ public class CIMPushManager {
/**
* 发送一个CIM请求
*
* @param context
* @body
*/
public static void sendRequest(Context context, SentBody body) {
if (isDestoryed(context) || isStoped(context)) {
if (isDestroyed(context) || isStopped(context)) {
return;
}
@ -165,12 +148,10 @@ public class CIMPushManager {
/**
* 停止接受推送将会退出当前账号登录端口与服务端的连接
*
* @param context
*/
public static void stop(Context context) {
if (isDestoryed(context)) {
if (isDestroyed(context)) {
return;
}
@ -184,8 +165,6 @@ public class CIMPushManager {
/**
* 完全销毁CIM一般用于完全退出程序调用resume将不能恢复
*
* @param context
*/
public static void destroy(Context context) {
@ -198,23 +177,21 @@ public class CIMPushManager {
/**
* 重新恢复接收推送重新连接服务端并登录当前账号
*
* @param context
*/
public static void resume(Context context) {
if (isDestoryed(context)) {
if (isDestroyed(context)) {
return;
}
autoBindAccount(context);
}
public static boolean isDestoryed(Context context) {
public static boolean isDestroyed(Context context) {
return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED);
}
public static boolean isStoped(Context context) {
public static boolean isStopped(Context context) {
return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_MANUAL_STOP);
}
@ -243,15 +220,28 @@ public class CIMPushManager {
private static String getVersionName(Context context) {
String versionName = null;
try {
PackageInfo mPackageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
versionName = mPackageInfo.versionName;
return mPackageInfo.versionName;
} catch (NameNotFoundException ignore) {
}
return versionName;
return null;
}
private static String getDeviceId(Context context){
String currDeviceId = CIMCacheManager.getString(context, CIMCacheManager.KEY_DEVICE_ID);
if (!TextUtils.isEmpty(currDeviceId)) {
return currDeviceId;
}
String deviceId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
CIMCacheManager.putString(context, CIMCacheManager.KEY_DEVICE_ID,deviceId);
return deviceId;
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -35,7 +35,6 @@ import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import com.farsunset.cim.sdk.android.coder.CIMLogger;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.SentBody;
@ -122,9 +121,7 @@ public class CIMPushService extends Service {
startForeground(NOTIFICATION_ID,notification);
}
intent = (intent == null ? new Intent(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE) : intent);
String action = intent.getAction();
String action = intent == null ? CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE : intent.getAction();
if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) {
connect(intent.getLongExtra(KEY_DELAYED_TIME, 0));
@ -142,7 +139,7 @@ public class CIMPushService extends Service {
handleKeepAlive();
}
if (CIMPushManager.ACTION_SET_LOGGER_EANABLE.equals(action)) {
if (CIMPushManager.ACTION_SET_LOGGER_EATABLE.equals(action)) {
boolean enable = intent.getBooleanExtra(KEY_LOGGER_ENABLE, true);
CIMLogger.getLogger().debugMode(enable);
}
@ -167,12 +164,12 @@ public class CIMPushService extends Service {
private void connect() {
if(CIMPushManager.isDestoryed(this) || CIMPushManager.isStoped(this)) {
if(CIMPushManager.isDestroyed(this) || CIMPushManager.isStopped(this)) {
return;
}
String host = CIMCacheManager.getString(this, CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInt(this, CIMCacheManager.KEY_CIM_SERVIER_PORT);
String host = CIMCacheManager.getString(this, CIMCacheManager.KEY_CIM_SERVER_HOST);
int port = CIMCacheManager.getInt(this, CIMCacheManager.KEY_CIM_SERVER_PORT);
if(host == null || host.trim().length() == 0 || port <= 0) {
Log.e(this.getClass().getSimpleName(), "Invalid hostname or port. host:" + host + " port:" + port);

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,10 +21,10 @@
*/
package com.farsunset.cim.sdk.android.coder;
import java.nio.channels.SocketChannel;
import android.util.Log;
import java.nio.channels.SocketChannel;
/**
* 日志打印添加session 的id和ip address
@ -105,7 +105,7 @@ public class CIMLogger {
public void connectState(boolean isConnected,boolean isManualStop,boolean isDestroyed) {
if(debug) {
Log.d(TAG,"CONNECTED:" + isConnected + " STOPED:"+isManualStop+ " DESTROYED:"+isDestroyed);
Log.d(TAG,"CONNECTED:" + isConnected + " STOPPED:"+isManualStop+ " DESTROYED:"+isDestroyed);
}
}
private String getSessionInfo(SocketChannel session) {
@ -118,7 +118,7 @@ public class CIMLogger {
try {
if (session.socket().getLocalAddress() != null) {
builder.append(" L:").append(session.socket().getLocalAddress()+":"+session.socket().getLocalPort());
builder.append(" L:").append(session.socket().getLocalAddress()).append(":").append(session.socket().getLocalPort());
}
} catch (Exception ignore) {
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -22,9 +22,6 @@
package com.farsunset.cim.sdk.android.coder;
import java.nio.ByteBuffer;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.HeartbeatRequest;
import com.farsunset.cim.sdk.android.model.Message;
@ -33,43 +30,47 @@ import com.farsunset.cim.sdk.android.model.proto.MessageProto;
import com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto;
import com.google.protobuf.InvalidProtocolBufferException;
import java.nio.ByteBuffer;
/**
* 客户端消息解码
*/
public class ClientMessageDecoder {
public Object doDecode(ByteBuffer iobuffer) {
public Object doDecode(ByteBuffer buffer) {
/**
/*
* 消息头3位
*/
if (iobuffer.remaining() < CIMConstant.DATA_HEADER_LENGTH) {
if (buffer.remaining() < CIMConstant.DATA_HEADER_LENGTH) {
return null;
}
iobuffer.mark();
buffer.mark();
byte conetnType = iobuffer.get();
byte type = buffer.get();
byte lv = iobuffer.get();// int 低位
byte hv = iobuffer.get();// int 高位
byte lv = buffer.get();
byte hv = buffer.get();
int conetnLength = getContentLength(lv, hv);
int length = getContentLength(lv, hv);
// 如果消息体没有接收完整则重置读取等待下一次重新读取
if (conetnLength > iobuffer.remaining()) {
iobuffer.reset();
/*
*如果消息体没有接收完整则重置读取等待下一次重新读取
*/
if (length > buffer.remaining()) {
buffer.reset();
return null;
}
byte[] dataBytes = new byte[conetnLength];
iobuffer.get(dataBytes, 0, conetnLength);
byte[] dataBytes = new byte[length];
buffer.get(dataBytes, 0, length);
iobuffer.position(0);
buffer.position(0);
try {
return mappingMessageObject(dataBytes, conetnType);
return mappingMessageObject(dataBytes, type);
} catch (InvalidProtocolBufferException e) {
return null;
}
@ -79,11 +80,10 @@ public class ClientMessageDecoder {
private Object mappingMessageObject(byte[] bytes, byte type) throws InvalidProtocolBufferException {
if (CIMConstant.ProtobufType.S_H_RQ == type) {
HeartbeatRequest request = HeartbeatRequest.getInstance();
return request;
return HeartbeatRequest.getInstance();
}
if (CIMConstant.ProtobufType.REPLYBODY == type) {
if (CIMConstant.ProtobufType.REPLY_BODY == type) {
ReplyBodyProto.Model bodyProto = ReplyBodyProto.Model.parseFrom(bytes);
ReplyBody body = new ReplyBody();
body.setKey(bodyProto.getKey());
@ -115,15 +115,11 @@ public class ClientMessageDecoder {
/**
* 解析消息体长度
*
* @param type
* @param length
* @return
*/
private int getContentLength(byte lv, byte hv) {
int l = (lv & 0xff);
int h = (hv & 0xff);
return (l | (h <<= 8));
return (l | h << 8);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,11 +21,11 @@
*/
package com.farsunset.cim.sdk.android.coder;
import java.nio.ByteBuffer;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.Protobufable;
import java.nio.ByteBuffer;
/**
* 客户端消息发送前进行编码
*/
@ -36,22 +36,18 @@ public class ClientMessageEncoder {
Protobufable data = (Protobufable) object;
byte[] byteArray = data.getByteArray();
ByteBuffer iobuffer = ByteBuffer.allocate(byteArray.length + CIMConstant.DATA_HEADER_LENGTH);
ByteBuffer buffer = ByteBuffer.allocate(byteArray.length + CIMConstant.DATA_HEADER_LENGTH);
iobuffer.put(createHeader(data.getType(), byteArray.length));
iobuffer.put(byteArray);
iobuffer.flip();
buffer.put(createHeader(data.getType(), byteArray.length));
buffer.put(byteArray);
buffer.flip();
return iobuffer;
return buffer;
}
/**
* 消息体最大为65535
*
* @param type
* @param length
* @return
*/
private byte[] createHeader(byte type, int length) {
byte[] header = new byte[CIMConstant.DATA_HEADER_LENGTH];

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -26,12 +26,14 @@ package com.farsunset.cim.sdk.android.constant;
*/
public interface CIMConstant {
long RECONN_INTERVAL_TIME = 30 * 1000;
long RECONNECT_INTERVAL_TIME = 30 * 1000;
// 消息头长度为3个字节第一个字节为消息类型第二第三字节 转换int后为消息长度
/**
消息头长度为3个字节第一个字节为消息类型第二第三字节 转换int后为消息长度
*/
int DATA_HEADER_LENGTH = 3;
public static interface ReturnCode {
interface ReturnCode {
String CODE_404 = "404";
@ -47,15 +49,15 @@ public interface CIMConstant {
}
public static interface ProtobufType {
interface ProtobufType {
byte C_H_RS = 0;
byte S_H_RQ = 1;
byte MESSAGE = 2;
byte SENTBODY = 3;
byte REPLYBODY = 4;
byte SENT_BODY = 3;
byte REPLY_BODY = 4;
}
public static interface RequestKey {
interface RequestKey {
String CLIENT_BIND = "client_bind";
@ -63,36 +65,54 @@ public interface CIMConstant {
}
public static interface MessageAction {
interface MessageAction {
// 被其他设备登录挤下线消息
/*
被其他设备登录挤下线消息
*/
String ACTION_999 = "999";
}
public static interface IntentAction {
interface IntentAction {
// 消息广播action
/*
消息广播action
*/
String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.MESSAGE_RECEIVED";
// 发送sendbody成功广播
String ACTION_SENT_SUCCESSED = "com.farsunset.cim.SENT_SUCCESSED";
/*
发送sendBody成功广播
*/
String ACTION_SEND_FINISHED = "com.farsunset.cim.SEND_FINISHED";
// 链接意外关闭广播
/*
链接意外关闭广播
*/
String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED";
// 链接失败广播
String ACTION_CONNECTION_FAILED = "com.farsunset.cim.CONNECTION_FAILED";
/*
链接失败广播
*/
String ACTION_CONNECT_FAILED = "com.farsunset.cim.CONNECT_FAILED";
// 链接成功广播
String ACTION_CONNECTION_SUCCESSED = "com.farsunset.cim.CONNECTION_SUCCESSED";
/*
链接成功广播
*/
String ACTION_CONNECT_FINISHED = "com.farsunset.cim.CONNECT_FINISHED";
// 发送sendbody成功后获得replaybody回应广播
/*
发送sendBody成功后获得replayBody回应广播
*/
String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED";
// 网络变化广播
/*
网络变化广播
*/
String ACTION_NETWORK_CHANGED = "com.farsunset.cim.NETWORK_CHANGED";
// 重试连接
/*
重试连接
*/
String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY";
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,10 +21,10 @@
*/
package com.farsunset.cim.sdk.android.model;
import java.io.Serializable;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import java.io.Serializable;
/**
* 服务端心跳请求
*
@ -50,6 +50,7 @@ public class HeartbeatRequest implements Serializable, Protobufable {
return CMD_HEARTBEAT_REQUEST.getBytes();
}
@Override
public String toString() {
return TAG;
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,10 +21,10 @@
*/
package com.farsunset.cim.sdk.android.model;
import java.io.Serializable;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import java.io.Serializable;
/**
* 客户端心跳响应
*/
@ -49,6 +49,7 @@ public class HeartbeatResponse implements Serializable, Protobufable {
return CMD_HEARTBEAT_RESPONSE.getBytes();
}
@Override
public String toString() {
return TAG;
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -137,6 +137,7 @@ public class Message implements Serializable {
this.extra = extra;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -108,6 +108,7 @@ public class ReplyBody implements Serializable {
this.code = code;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("#ReplyBody#").append("\n");
@ -115,13 +116,11 @@ public class ReplyBody implements Serializable {
buffer.append("timestamp:").append(timestamp).append("\n");
buffer.append("code:").append(code).append("\n");
if (!data.isEmpty()) {
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
return buffer.toString();
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,13 +21,13 @@
*/
package com.farsunset.cim.sdk.android.model;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.proto.SentBodyProto;
import java.io.Serializable;
import java.util.Hashtable;
import java.util.Set;
import com.farsunset.cim.sdk.android.constant.CIMConstant;
import com.farsunset.cim.sdk.android.model.proto.SentBodyProto;
/**
* java |android 客户端请求结构
*
@ -85,16 +85,13 @@ public class SentBody implements Serializable, Protobufable {
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("#SentBody#").append("\n");
;
buffer.append("key:").append(key).append("\n");
buffer.append("timestamp:").append(timestamp).append("\n");
if (!data.isEmpty()) {
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
return buffer.toString();
}
@ -111,7 +108,7 @@ public class SentBody implements Serializable, Protobufable {
@Override
public byte getType() {
return CIMConstant.ProtobufType.SENTBODY;
return CIMConstant.ProtobufType.SENT_BODY;
}
}

View File

@ -20,7 +20,7 @@ public final class MessageProto {
/**
* <code>optional string action = 2;</code>
*/
java.lang.String getAction();
String getAction();
/**
* <code>optional string action = 2;</code>
*/
@ -30,7 +30,7 @@ public final class MessageProto {
/**
* <code>optional string content = 3;</code>
*/
java.lang.String getContent();
String getContent();
/**
* <code>optional string content = 3;</code>
*/
@ -40,7 +40,7 @@ public final class MessageProto {
/**
* <code>optional string sender = 4;</code>
*/
java.lang.String getSender();
String getSender();
/**
* <code>optional string sender = 4;</code>
*/
@ -50,7 +50,7 @@ public final class MessageProto {
/**
* <code>optional string receiver = 5;</code>
*/
java.lang.String getReceiver();
String getReceiver();
/**
* <code>optional string receiver = 5;</code>
*/
@ -60,7 +60,7 @@ public final class MessageProto {
/**
* <code>optional string extra = 6;</code>
*/
java.lang.String getExtra();
String getExtra();
/**
* <code>optional string extra = 6;</code>
*/
@ -70,7 +70,7 @@ public final class MessageProto {
/**
* <code>optional string title = 7;</code>
*/
java.lang.String getTitle();
String getTitle();
/**
* <code>optional string title = 7;</code>
*/
@ -80,7 +80,7 @@ public final class MessageProto {
/**
* <code>optional string format = 8;</code>
*/
java.lang.String getFormat();
String getFormat();
/**
* <code>optional string format = 8;</code>
*/
@ -133,11 +133,11 @@ public final class MessageProto {
}
public static final int ACTION_FIELD_NUMBER = 2;
private java.lang.String action_;
private String action_;
/**
* <code>optional string action = 2;</code>
*/
public java.lang.String getAction() {
public String getAction() {
return action_;
}
/**
@ -151,7 +151,7 @@ public final class MessageProto {
* <code>optional string action = 2;</code>
*/
private void setAction(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -179,11 +179,11 @@ public final class MessageProto {
}
public static final int CONTENT_FIELD_NUMBER = 3;
private java.lang.String content_;
private String content_;
/**
* <code>optional string content = 3;</code>
*/
public java.lang.String getContent() {
public String getContent() {
return content_;
}
/**
@ -197,7 +197,7 @@ public final class MessageProto {
* <code>optional string content = 3;</code>
*/
private void setContent(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -225,11 +225,11 @@ public final class MessageProto {
}
public static final int SENDER_FIELD_NUMBER = 4;
private java.lang.String sender_;
private String sender_;
/**
* <code>optional string sender = 4;</code>
*/
public java.lang.String getSender() {
public String getSender() {
return sender_;
}
/**
@ -243,7 +243,7 @@ public final class MessageProto {
* <code>optional string sender = 4;</code>
*/
private void setSender(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -271,11 +271,11 @@ public final class MessageProto {
}
public static final int RECEIVER_FIELD_NUMBER = 5;
private java.lang.String receiver_;
private String receiver_;
/**
* <code>optional string receiver = 5;</code>
*/
public java.lang.String getReceiver() {
public String getReceiver() {
return receiver_;
}
/**
@ -289,7 +289,7 @@ public final class MessageProto {
* <code>optional string receiver = 5;</code>
*/
private void setReceiver(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -317,11 +317,11 @@ public final class MessageProto {
}
public static final int EXTRA_FIELD_NUMBER = 6;
private java.lang.String extra_;
private String extra_;
/**
* <code>optional string extra = 6;</code>
*/
public java.lang.String getExtra() {
public String getExtra() {
return extra_;
}
/**
@ -335,7 +335,7 @@ public final class MessageProto {
* <code>optional string extra = 6;</code>
*/
private void setExtra(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -363,11 +363,11 @@ public final class MessageProto {
}
public static final int TITLE_FIELD_NUMBER = 7;
private java.lang.String title_;
private String title_;
/**
* <code>optional string title = 7;</code>
*/
public java.lang.String getTitle() {
public String getTitle() {
return title_;
}
/**
@ -381,7 +381,7 @@ public final class MessageProto {
* <code>optional string title = 7;</code>
*/
private void setTitle(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -409,11 +409,11 @@ public final class MessageProto {
}
public static final int FORMAT_FIELD_NUMBER = 8;
private java.lang.String format_;
private String format_;
/**
* <code>optional string format = 8;</code>
*/
public java.lang.String getFormat() {
public String getFormat() {
return format_;
}
/**
@ -427,7 +427,7 @@ public final class MessageProto {
* <code>optional string format = 8;</code>
*/
private void setFormat(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -553,60 +553,60 @@ public final class MessageProto {
return size;
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(byte[] data)
public static Model parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(java.io.InputStream input)
public static Model parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseDelimitedFrom(java.io.InputStream input)
public static Model parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseDelimitedFrom(
public static Model parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@ -617,7 +617,7 @@ public final class MessageProto {
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(com.farsunset.cim.sdk.android.model.proto.MessageProto.Model prototype) {
public static Builder newBuilder(Model prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@ -626,9 +626,9 @@ public final class MessageProto {
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageLite.Builder<
com.farsunset.cim.sdk.android.model.proto.MessageProto.Model, Builder> implements
Model, Builder> implements
// @@protoc_insertion_point(builder_implements:com.farsunset.cim.sdk.android.model.proto.Model)
com.farsunset.cim.sdk.android.model.proto.MessageProto.ModelOrBuilder {
ModelOrBuilder {
// Construct using com.farsunset.cim.sdk.android.model.proto.MessageProto.Model.newBuilder()
private Builder() {
super(DEFAULT_INSTANCE);
@ -661,7 +661,7 @@ public final class MessageProto {
/**
* <code>optional string action = 2;</code>
*/
public java.lang.String getAction() {
public String getAction() {
return instance.getAction();
}
/**
@ -675,7 +675,7 @@ public final class MessageProto {
* <code>optional string action = 2;</code>
*/
public Builder setAction(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setAction(value);
return this;
@ -701,7 +701,7 @@ public final class MessageProto {
/**
* <code>optional string content = 3;</code>
*/
public java.lang.String getContent() {
public String getContent() {
return instance.getContent();
}
/**
@ -715,7 +715,7 @@ public final class MessageProto {
* <code>optional string content = 3;</code>
*/
public Builder setContent(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setContent(value);
return this;
@ -741,7 +741,7 @@ public final class MessageProto {
/**
* <code>optional string sender = 4;</code>
*/
public java.lang.String getSender() {
public String getSender() {
return instance.getSender();
}
/**
@ -755,7 +755,7 @@ public final class MessageProto {
* <code>optional string sender = 4;</code>
*/
public Builder setSender(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setSender(value);
return this;
@ -781,7 +781,7 @@ public final class MessageProto {
/**
* <code>optional string receiver = 5;</code>
*/
public java.lang.String getReceiver() {
public String getReceiver() {
return instance.getReceiver();
}
/**
@ -795,7 +795,7 @@ public final class MessageProto {
* <code>optional string receiver = 5;</code>
*/
public Builder setReceiver(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setReceiver(value);
return this;
@ -821,7 +821,7 @@ public final class MessageProto {
/**
* <code>optional string extra = 6;</code>
*/
public java.lang.String getExtra() {
public String getExtra() {
return instance.getExtra();
}
/**
@ -835,7 +835,7 @@ public final class MessageProto {
* <code>optional string extra = 6;</code>
*/
public Builder setExtra(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setExtra(value);
return this;
@ -861,7 +861,7 @@ public final class MessageProto {
/**
* <code>optional string title = 7;</code>
*/
public java.lang.String getTitle() {
public String getTitle() {
return instance.getTitle();
}
/**
@ -875,7 +875,7 @@ public final class MessageProto {
* <code>optional string title = 7;</code>
*/
public Builder setTitle(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setTitle(value);
return this;
@ -901,7 +901,7 @@ public final class MessageProto {
/**
* <code>optional string format = 8;</code>
*/
public java.lang.String getFormat() {
public String getFormat() {
return instance.getFormat();
}
/**
@ -915,7 +915,7 @@ public final class MessageProto {
* <code>optional string format = 8;</code>
*/
public Builder setFormat(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setFormat(value);
return this;
@ -964,11 +964,11 @@ public final class MessageProto {
// @@protoc_insertion_point(builder_scope:com.farsunset.cim.sdk.android.model.proto.Model)
}
protected final Object dynamicMethod(
com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
MethodToInvoke method,
Object arg0, Object arg1) {
switch (method) {
case NEW_MUTABLE_INSTANCE: {
return new com.farsunset.cim.sdk.android.model.proto.MessageProto.Model();
return new Model();
}
case IS_INITIALIZED: {
return DEFAULT_INSTANCE;
@ -981,7 +981,7 @@ public final class MessageProto {
}
case VISIT: {
Visitor visitor = (Visitor) arg0;
com.farsunset.cim.sdk.android.model.proto.MessageProto.Model other = (com.farsunset.cim.sdk.android.model.proto.MessageProto.Model) arg1;
Model other = (Model) arg1;
id_ = visitor.visitLong(id_ != 0L, id_,
other.id_ != 0L, other.id_);
action_ = visitor.visitString(!action_.isEmpty(), action_,
@ -1000,7 +1000,7 @@ public final class MessageProto {
!other.format_.isEmpty(), other.format_);
timestamp_ = visitor.visitLong(timestamp_ != 0L, timestamp_,
other.timestamp_ != 0L, other.timestamp_);
if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor
if (visitor == MergeFromVisitor
.INSTANCE) {
}
return this;
@ -1091,7 +1091,7 @@ public final class MessageProto {
return DEFAULT_INSTANCE;
}
case GET_PARSER: {
if (PARSER == null) { synchronized (com.farsunset.cim.sdk.android.model.proto.MessageProto.Model.class) {
if (PARSER == null) { synchronized (Model.class) {
if (PARSER == null) {
PARSER = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);
}
@ -1105,13 +1105,13 @@ public final class MessageProto {
// @@protoc_insertion_point(class_scope:com.farsunset.cim.sdk.android.model.proto.Model)
private static final com.farsunset.cim.sdk.android.model.proto.MessageProto.Model DEFAULT_INSTANCE;
private static final Model DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new Model();
DEFAULT_INSTANCE.makeImmutable();
}
public static com.farsunset.cim.sdk.android.model.proto.MessageProto.Model getDefaultInstance() {
public static Model getDefaultInstance() {
return DEFAULT_INSTANCE;
}

View File

@ -15,7 +15,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string key = 1;</code>
*/
java.lang.String getKey();
String getKey();
/**
* <code>optional string key = 1;</code>
*/
@ -25,7 +25,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string code = 2;</code>
*/
java.lang.String getCode();
String getCode();
/**
* <code>optional string code = 2;</code>
*/
@ -35,7 +35,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string message = 3;</code>
*/
java.lang.String getMessage();
String getMessage();
/**
* <code>optional string message = 3;</code>
*/
@ -55,31 +55,31 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
boolean containsData(
java.lang.String key);
String key);
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
java.util.Map<java.lang.String, java.lang.String>
@Deprecated
java.util.Map<String, String>
getData();
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<String, String>
getDataMap();
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue);
String getDataOrDefault(
String key,
String defaultValue);
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
java.lang.String getDataOrThrow(
java.lang.String key);
String getDataOrThrow(
String key);
}
/**
* Protobuf type {@code com.farsunset.cim.sdk.android.model.proto.Model}
@ -96,11 +96,11 @@ public final class ReplyBodyProto {
}
private int bitField0_;
public static final int KEY_FIELD_NUMBER = 1;
private java.lang.String key_;
private String key_;
/**
* <code>optional string key = 1;</code>
*/
public java.lang.String getKey() {
public String getKey() {
return key_;
}
/**
@ -114,7 +114,7 @@ public final class ReplyBodyProto {
* <code>optional string key = 1;</code>
*/
private void setKey(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -142,11 +142,11 @@ public final class ReplyBodyProto {
}
public static final int CODE_FIELD_NUMBER = 2;
private java.lang.String code_;
private String code_;
/**
* <code>optional string code = 2;</code>
*/
public java.lang.String getCode() {
public String getCode() {
return code_;
}
/**
@ -160,7 +160,7 @@ public final class ReplyBodyProto {
* <code>optional string code = 2;</code>
*/
private void setCode(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -188,11 +188,11 @@ public final class ReplyBodyProto {
}
public static final int MESSAGE_FIELD_NUMBER = 3;
private java.lang.String message_;
private String message_;
/**
* <code>optional string message = 3;</code>
*/
public java.lang.String getMessage() {
public String getMessage() {
return message_;
}
/**
@ -206,7 +206,7 @@ public final class ReplyBodyProto {
* <code>optional string message = 3;</code>
*/
private void setMessage(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -259,22 +259,22 @@ public final class ReplyBodyProto {
public static final int DATA_FIELD_NUMBER = 5;
private static final class DataDefaultEntryHolder {
static final com.google.protobuf.MapEntryLite<
java.lang.String, java.lang.String> defaultEntry =
String, String> defaultEntry =
com.google.protobuf.MapEntryLite
.<java.lang.String, java.lang.String>newDefaultInstance(
.<String, String>newDefaultInstance(
com.google.protobuf.WireFormat.FieldType.STRING,
"",
com.google.protobuf.WireFormat.FieldType.STRING,
"");
}
private com.google.protobuf.MapFieldLite<
java.lang.String, java.lang.String> data_ =
String, String> data_ =
com.google.protobuf.MapFieldLite.emptyMapField();
private com.google.protobuf.MapFieldLite<java.lang.String, java.lang.String>
private com.google.protobuf.MapFieldLite<String, String>
internalGetData() {
return data_;
}
private com.google.protobuf.MapFieldLite<java.lang.String, java.lang.String>
private com.google.protobuf.MapFieldLite<String, String>
internalGetMutableData() {
if (!data_.isMutable()) {
data_ = data_.mutableCopy();
@ -290,22 +290,22 @@ public final class ReplyBodyProto {
*/
public boolean containsData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
return internalGetData().containsKey(key);
}
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
@Deprecated
public java.util.Map<String, String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
public java.util.Map<String, String> getDataMap() {
return java.util.Collections.unmodifiableMap(
internalGetData());
}
@ -313,11 +313,11 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrDefault(
String key,
String defaultValue) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
internalGetData();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
@ -325,20 +325,20 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.lang.String getDataOrThrow(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrThrow(
String key) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
internalGetData();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
throw new IllegalArgumentException();
}
return map.get(key);
}
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
private java.util.Map<java.lang.String, java.lang.String>
private java.util.Map<String, String>
getMutableDataMap() {
return internalGetMutableData();
}
@ -357,7 +357,7 @@ public final class ReplyBodyProto {
if (timestamp_ != 0L) {
output.writeInt64(4, timestamp_);
}
for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
for (java.util.Map.Entry<String, String> entry
: internalGetData().entrySet()) {
DataDefaultEntryHolder.defaultEntry.serializeTo(
output, 5, entry.getKey(), entry.getValue());
@ -385,7 +385,7 @@ public final class ReplyBodyProto {
size += com.google.protobuf.CodedOutputStream
.computeInt64Size(4, timestamp_);
}
for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
for (java.util.Map.Entry<String, String> entry
: internalGetData().entrySet()) {
size += DataDefaultEntryHolder.defaultEntry.computeMessageSize(
5, entry.getKey(), entry.getValue());
@ -394,60 +394,60 @@ public final class ReplyBodyProto {
return size;
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(byte[] data)
public static Model parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(java.io.InputStream input)
public static Model parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseDelimitedFrom(java.io.InputStream input)
public static Model parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseDelimitedFrom(
public static Model parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@ -458,7 +458,7 @@ public final class ReplyBodyProto {
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model prototype) {
public static Builder newBuilder(Model prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@ -467,9 +467,9 @@ public final class ReplyBodyProto {
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageLite.Builder<
com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model, Builder> implements
Model, Builder> implements
// @@protoc_insertion_point(builder_implements:com.farsunset.cim.sdk.android.model.proto.Model)
com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.ModelOrBuilder {
ModelOrBuilder {
// Construct using com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model.newBuilder()
private Builder() {
super(DEFAULT_INSTANCE);
@ -479,7 +479,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string key = 1;</code>
*/
public java.lang.String getKey() {
public String getKey() {
return instance.getKey();
}
/**
@ -493,7 +493,7 @@ public final class ReplyBodyProto {
* <code>optional string key = 1;</code>
*/
public Builder setKey(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setKey(value);
return this;
@ -519,7 +519,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string code = 2;</code>
*/
public java.lang.String getCode() {
public String getCode() {
return instance.getCode();
}
/**
@ -533,7 +533,7 @@ public final class ReplyBodyProto {
* <code>optional string code = 2;</code>
*/
public Builder setCode(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setCode(value);
return this;
@ -559,7 +559,7 @@ public final class ReplyBodyProto {
/**
* <code>optional string message = 3;</code>
*/
public java.lang.String getMessage() {
public String getMessage() {
return instance.getMessage();
}
/**
@ -573,7 +573,7 @@ public final class ReplyBodyProto {
* <code>optional string message = 3;</code>
*/
public Builder setMessage(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setMessage(value);
return this;
@ -628,8 +628,8 @@ public final class ReplyBodyProto {
*/
public boolean containsData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
return instance.getDataMap().containsKey(key);
}
@ -643,8 +643,8 @@ public final class ReplyBodyProto {
*/
public Builder removeData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
copyOnWrite();
instance.getMutableDataMap().remove(key);
return this;
@ -652,14 +652,14 @@ public final class ReplyBodyProto {
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
@Deprecated
public java.util.Map<String, String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
public java.util.Map<String, String> getDataMap() {
return java.util.Collections.unmodifiableMap(
instance.getDataMap());
}
@ -667,11 +667,11 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrDefault(
String key,
String defaultValue) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
instance.getDataMap();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
@ -679,13 +679,13 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public java.lang.String getDataOrThrow(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrThrow(
String key) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
instance.getDataMap();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
throw new IllegalArgumentException();
}
return map.get(key);
}
@ -693,10 +693,10 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public Builder putData(
java.lang.String key,
java.lang.String value) {
if (key == null) { throw new java.lang.NullPointerException(); }
if (value == null) { throw new java.lang.NullPointerException(); }
String key,
String value) {
if (key == null) { throw new NullPointerException(); }
if (value == null) { throw new NullPointerException(); }
copyOnWrite();
instance.getMutableDataMap().put(key, value);
return this;
@ -705,7 +705,7 @@ public final class ReplyBodyProto {
* <code>map&lt;string, string&gt; data = 5;</code>
*/
public Builder putAllData(
java.util.Map<java.lang.String, java.lang.String> values) {
java.util.Map<String, String> values) {
copyOnWrite();
instance.getMutableDataMap().putAll(values);
return this;
@ -714,11 +714,11 @@ public final class ReplyBodyProto {
// @@protoc_insertion_point(builder_scope:com.farsunset.cim.sdk.android.model.proto.Model)
}
protected final Object dynamicMethod(
com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
MethodToInvoke method,
Object arg0, Object arg1) {
switch (method) {
case NEW_MUTABLE_INSTANCE: {
return new com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model();
return new Model();
}
case IS_INITIALIZED: {
return DEFAULT_INSTANCE;
@ -732,7 +732,7 @@ public final class ReplyBodyProto {
}
case VISIT: {
Visitor visitor = (Visitor) arg0;
com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model other = (com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model) arg1;
Model other = (Model) arg1;
key_ = visitor.visitString(!key_.isEmpty(), key_,
!other.key_.isEmpty(), other.key_);
code_ = visitor.visitString(!code_.isEmpty(), code_,
@ -743,7 +743,7 @@ public final class ReplyBodyProto {
other.timestamp_ != 0L, other.timestamp_);
data_ = visitor.visitMap(
data_, other.internalGetData());
if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor
if (visitor == MergeFromVisitor
.INSTANCE) {
bitField0_ |= other.bitField0_;
}
@ -812,7 +812,7 @@ public final class ReplyBodyProto {
return DEFAULT_INSTANCE;
}
case GET_PARSER: {
if (PARSER == null) { synchronized (com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model.class) {
if (PARSER == null) { synchronized (Model.class) {
if (PARSER == null) {
PARSER = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);
}
@ -826,13 +826,13 @@ public final class ReplyBodyProto {
// @@protoc_insertion_point(class_scope:com.farsunset.cim.sdk.android.model.proto.Model)
private static final com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model DEFAULT_INSTANCE;
private static final Model DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new Model();
DEFAULT_INSTANCE.makeImmutable();
}
public static com.farsunset.cim.sdk.android.model.proto.ReplyBodyProto.Model getDefaultInstance() {
public static Model getDefaultInstance() {
return DEFAULT_INSTANCE;
}

View File

@ -15,7 +15,7 @@ public final class SentBodyProto {
/**
* <code>optional string key = 1;</code>
*/
java.lang.String getKey();
String getKey();
/**
* <code>optional string key = 1;</code>
*/
@ -35,31 +35,31 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
boolean containsData(
java.lang.String key);
String key);
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
java.util.Map<java.lang.String, java.lang.String>
@Deprecated
java.util.Map<String, String>
getData();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<String, String>
getDataMap();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue);
String getDataOrDefault(
String key,
String defaultValue);
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.lang.String getDataOrThrow(
java.lang.String key);
String getDataOrThrow(
String key);
}
/**
* Protobuf type {@code com.farsunset.cim.sdk.android.model.proto.Model}
@ -74,11 +74,11 @@ public final class SentBodyProto {
}
private int bitField0_;
public static final int KEY_FIELD_NUMBER = 1;
private java.lang.String key_;
private String key_;
/**
* <code>optional string key = 1;</code>
*/
public java.lang.String getKey() {
public String getKey() {
return key_;
}
/**
@ -92,7 +92,7 @@ public final class SentBodyProto {
* <code>optional string key = 1;</code>
*/
private void setKey(
java.lang.String value) {
String value) {
if (value == null) {
throw new NullPointerException();
}
@ -145,22 +145,22 @@ public final class SentBodyProto {
public static final int DATA_FIELD_NUMBER = 3;
private static final class DataDefaultEntryHolder {
static final com.google.protobuf.MapEntryLite<
java.lang.String, java.lang.String> defaultEntry =
String, String> defaultEntry =
com.google.protobuf.MapEntryLite
.<java.lang.String, java.lang.String>newDefaultInstance(
.<String, String>newDefaultInstance(
com.google.protobuf.WireFormat.FieldType.STRING,
"",
com.google.protobuf.WireFormat.FieldType.STRING,
"");
}
private com.google.protobuf.MapFieldLite<
java.lang.String, java.lang.String> data_ =
String, String> data_ =
com.google.protobuf.MapFieldLite.emptyMapField();
private com.google.protobuf.MapFieldLite<java.lang.String, java.lang.String>
private com.google.protobuf.MapFieldLite<String, String>
internalGetData() {
return data_;
}
private com.google.protobuf.MapFieldLite<java.lang.String, java.lang.String>
private com.google.protobuf.MapFieldLite<String, String>
internalGetMutableData() {
if (!data_.isMutable()) {
data_ = data_.mutableCopy();
@ -176,22 +176,22 @@ public final class SentBodyProto {
*/
public boolean containsData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
return internalGetData().containsKey(key);
}
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
@Deprecated
public java.util.Map<String, String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
public java.util.Map<String, String> getDataMap() {
return java.util.Collections.unmodifiableMap(
internalGetData());
}
@ -199,11 +199,11 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrDefault(
String key,
String defaultValue) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
internalGetData();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
@ -211,20 +211,20 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrThrow(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrThrow(
String key) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
internalGetData();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
throw new IllegalArgumentException();
}
return map.get(key);
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
private java.util.Map<java.lang.String, java.lang.String>
private java.util.Map<String, String>
getMutableDataMap() {
return internalGetMutableData();
}
@ -237,7 +237,7 @@ public final class SentBodyProto {
if (timestamp_ != 0L) {
output.writeInt64(2, timestamp_);
}
for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
for (java.util.Map.Entry<String, String> entry
: internalGetData().entrySet()) {
DataDefaultEntryHolder.defaultEntry.serializeTo(
output, 3, entry.getKey(), entry.getValue());
@ -257,7 +257,7 @@ public final class SentBodyProto {
size += com.google.protobuf.CodedOutputStream
.computeInt64Size(2, timestamp_);
}
for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
for (java.util.Map.Entry<String, String> entry
: internalGetData().entrySet()) {
size += DataDefaultEntryHolder.defaultEntry.computeMessageSize(
3, entry.getKey(), entry.getValue());
@ -266,60 +266,60 @@ public final class SentBodyProto {
return size;
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(byte[] data)
public static Model parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, data, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(java.io.InputStream input)
public static Model parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseDelimitedFrom(java.io.InputStream input)
public static Model parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseDelimitedFrom(
public static Model parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageLite.parseFrom(
DEFAULT_INSTANCE, input);
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model parseFrom(
public static Model parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@ -330,7 +330,7 @@ public final class SentBodyProto {
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model prototype) {
public static Builder newBuilder(Model prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@ -339,9 +339,9 @@ public final class SentBodyProto {
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageLite.Builder<
com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model, Builder> implements
Model, Builder> implements
// @@protoc_insertion_point(builder_implements:com.farsunset.cim.sdk.android.model.proto.Model)
com.farsunset.cim.sdk.android.model.proto.SentBodyProto.ModelOrBuilder {
ModelOrBuilder {
// Construct using com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model.newBuilder()
private Builder() {
super(DEFAULT_INSTANCE);
@ -351,7 +351,7 @@ public final class SentBodyProto {
/**
* <code>optional string key = 1;</code>
*/
public java.lang.String getKey() {
public String getKey() {
return instance.getKey();
}
/**
@ -365,7 +365,7 @@ public final class SentBodyProto {
* <code>optional string key = 1;</code>
*/
public Builder setKey(
java.lang.String value) {
String value) {
copyOnWrite();
instance.setKey(value);
return this;
@ -420,8 +420,8 @@ public final class SentBodyProto {
*/
public boolean containsData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
return instance.getDataMap().containsKey(key);
}
@ -435,8 +435,8 @@ public final class SentBodyProto {
*/
public Builder removeData(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
String key) {
if (key == null) { throw new NullPointerException(); }
copyOnWrite();
instance.getMutableDataMap().remove(key);
return this;
@ -444,14 +444,14 @@ public final class SentBodyProto {
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
@Deprecated
public java.util.Map<String, String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
public java.util.Map<String, String> getDataMap() {
return java.util.Collections.unmodifiableMap(
instance.getDataMap());
}
@ -459,11 +459,11 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrDefault(
java.lang.String key,
java.lang.String defaultValue) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrDefault(
String key,
String defaultValue) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
instance.getDataMap();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
@ -471,13 +471,13 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrThrow(
java.lang.String key) {
if (key == null) { throw new java.lang.NullPointerException(); }
java.util.Map<java.lang.String, java.lang.String> map =
public String getDataOrThrow(
String key) {
if (key == null) { throw new NullPointerException(); }
java.util.Map<String, String> map =
instance.getDataMap();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
throw new IllegalArgumentException();
}
return map.get(key);
}
@ -485,10 +485,10 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public Builder putData(
java.lang.String key,
java.lang.String value) {
if (key == null) { throw new java.lang.NullPointerException(); }
if (value == null) { throw new java.lang.NullPointerException(); }
String key,
String value) {
if (key == null) { throw new NullPointerException(); }
if (value == null) { throw new NullPointerException(); }
copyOnWrite();
instance.getMutableDataMap().put(key, value);
return this;
@ -497,7 +497,7 @@ public final class SentBodyProto {
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public Builder putAllData(
java.util.Map<java.lang.String, java.lang.String> values) {
java.util.Map<String, String> values) {
copyOnWrite();
instance.getMutableDataMap().putAll(values);
return this;
@ -506,11 +506,11 @@ public final class SentBodyProto {
// @@protoc_insertion_point(builder_scope:com.farsunset.cim.sdk.android.model.proto.Model)
}
protected final Object dynamicMethod(
com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
MethodToInvoke method,
Object arg0, Object arg1) {
switch (method) {
case NEW_MUTABLE_INSTANCE: {
return new com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model();
return new Model();
}
case IS_INITIALIZED: {
return DEFAULT_INSTANCE;
@ -524,14 +524,14 @@ public final class SentBodyProto {
}
case VISIT: {
Visitor visitor = (Visitor) arg0;
com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model other = (com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model) arg1;
Model other = (Model) arg1;
key_ = visitor.visitString(!key_.isEmpty(), key_,
!other.key_.isEmpty(), other.key_);
timestamp_ = visitor.visitLong(timestamp_ != 0L, timestamp_,
other.timestamp_ != 0L, other.timestamp_);
data_ = visitor.visitMap(
data_, other.internalGetData());
if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor
if (visitor == MergeFromVisitor
.INSTANCE) {
bitField0_ |= other.bitField0_;
}
@ -588,7 +588,7 @@ public final class SentBodyProto {
return DEFAULT_INSTANCE;
}
case GET_PARSER: {
if (PARSER == null) { synchronized (com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model.class) {
if (PARSER == null) { synchronized (Model.class) {
if (PARSER == null) {
PARSER = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);
}
@ -602,13 +602,13 @@ public final class SentBodyProto {
// @@protoc_insertion_point(class_scope:com.farsunset.cim.sdk.android.model.proto.Model)
private static final com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model DEFAULT_INSTANCE;
private static final Model DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new Model();
DEFAULT_INSTANCE.makeImmutable();
}
public static com.farsunset.cim.sdk.android.model.proto.SentBodyProto.Model getDefaultInstance() {
public static Model getDefaultInstance() {
return DEFAULT_INSTANCE;
}

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="libs/slf4j-api-1.7.5.jar"/>
<classpathentry kind="lib" path="libs/slf4j-nop-1.7.5.jar"/>
<classpathentry kind="lib" path="libs/protobuf-java-3.7.0.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -0,0 +1,2 @@
target/
.idea/

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>cim-java-sdk</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.genuitec.eclipse.ast.deploy.core.deploymentnature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -1,3 +0,0 @@
#Wed Oct 15 09:31:41 CST 2014
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

View File

@ -0,0 +1 @@
mvn clean package

View File

@ -0,0 +1 @@
mvn clean package

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>com.farsunset</groupId>
<artifactId>cim-java-sdk</artifactId>
<version>3.8.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<protobuf.version>3.11.1</protobuf.version>
<slf4j.version>1.7.30</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>${protobuf.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,115 +0,0 @@
/**
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* 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.
*
***************************************************************************************
* *
* Website : http://www.farsunset.com *
* *
***************************************************************************************
*/
package com.farsunset.cim.sdk.client.constant;
/**
* 常量
*/
public interface CIMConstant {
long RECONN_INTERVAL_TIME = 30 * 1000;
// 消息头长度为3个字节第一个字节为消息类型第二第三字节 转换int后为消息长度
int DATA_HEADER_LENGTH = 3;
public static interface ReturnCode {
String CODE_404 = "404";
String CODE_403 = "403";
String CODE_405 = "405";
String CODE_200 = "200";
String CODE_206 = "206";
String CODE_500 = "500";
}
public static interface ConfigKey {
public static String DEVICE_MODEL = "client.model";
public static String CLIENT_VERSION = "client.version";
public static String CLIENT_ACCOUNT = "client.account";
public static String CLIENT_DEVICEID = "client.deviceid";
}
public static interface ProtobufType {
byte C_H_RS = 0;
byte S_H_RQ = 1;
byte MESSAGE = 2;
byte SENTBODY = 3;
byte REPLYBODY = 4;
}
public static interface RequestKey {
String CLIENT_BIND = "client_bind";
String CLIENT_LOGOUT = "client_logout";
@Deprecated
String CLIENT_PULL_MESSAGE = "client_pull_message";
}
public static interface MessageAction {
// 被其他设备登录挤下线消息
String ACTION_999 = "999";
// 被系统禁用消息
String ACTION_444 = "444";
}
public static interface IntentAction {
// 消息广播action
String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.MESSAGE_RECEIVED";
// 发送sendbody成功广播
String ACTION_SENT_SUCCESSED = "com.farsunset.cim.SENT_SUCCESSED";
// 链接意外关闭广播
String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED";
// 链接失败广播
String ACTION_CONNECTION_FAILED = "com.farsunset.cim.CONNECTION_FAILED";
// 链接成功广播
String ACTION_CONNECTION_SUCCESSED = "com.farsunset.cim.CONNECTION_SUCCESSED";
// 发送sendbody成功后获得replaybody回应广播
String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED";
// 网络变化广播
String ACTION_NETWORK_CHANGED = "android.net.conn.CONNECTIVITY_CHANGE";
// 未知异常
String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION";
// 重试连接
String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY";
}
}

View File

@ -1,35 +0,0 @@
/**
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* 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.
*
***************************************************************************************
* *
* Website : http://www.farsunset.com *
* *
***************************************************************************************
*/
package com.farsunset.cim.sdk.client.exception;
public class SessionClosedException extends Exception {
private static final long serialVersionUID = 1L;
public SessionClosedException() {
super();
}
public SessionClosedException(String s) {
super(s);
}
}

View File

@ -1,931 +0,0 @@
/**
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* 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.
*
***************************************************************************************
* *
* Website : http://www.farsunset.com *
* *
***************************************************************************************
*/
package com.farsunset.cim.sdk.model.proto;
public final class SentBodyProto {
private SentBodyProto() {
}
public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
}
public interface ModelOrBuilder extends
// @@protoc_insertion_point(interface_extends:com.farsunset.cim.sdk.model.proto.Model)
com.google.protobuf.MessageOrBuilder {
/**
* <code>string key = 1;</code>
*/
java.lang.String getKey();
/**
* <code>string key = 1;</code>
*/
com.google.protobuf.ByteString getKeyBytes();
/**
* <code>int64 timestamp = 2;</code>
*/
long getTimestamp();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
int getDataCount();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
boolean containsData(java.lang.String key);
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
java.util.Map<java.lang.String, java.lang.String> getData();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.util.Map<java.lang.String, java.lang.String> getDataMap();
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.lang.String getDataOrDefault(java.lang.String key, java.lang.String defaultValue);
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
java.lang.String getDataOrThrow(java.lang.String key);
}
/**
* Protobuf type {@code com.farsunset.cim.sdk.model.proto.Model}
*/
public static final class Model extends com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:com.farsunset.cim.sdk.model.proto.Model)
ModelOrBuilder {
// Use Model.newBuilder() to construct.
private Model(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private Model() {
key_ = "";
timestamp_ = 0L;
}
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
}
private Model(com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
int mutable_bitField0_ = 0;
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!input.skipField(tag)) {
done = true;
}
break;
}
case 10: {
java.lang.String s = input.readStringRequireUtf8();
key_ = s;
break;
}
case 16: {
timestamp_ = input.readInt64();
break;
}
case 26: {
if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
data_ = com.google.protobuf.MapField.newMapField(DataDefaultEntryHolder.defaultEntry);
mutable_bitField0_ |= 0x00000004;
}
com.google.protobuf.MapEntry<java.lang.String, java.lang.String> data__ = input
.readMessage(DataDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
data_.getMutableMap().put(data__.getKey(), data__.getValue());
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
} finally {
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor;
}
@SuppressWarnings({ "rawtypes" })
protected com.google.protobuf.MapField internalGetMapField(int number) {
switch (number) {
case 3:
return internalGetData();
default:
throw new RuntimeException("Invalid map field number: " + number);
}
}
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_fieldAccessorTable
.ensureFieldAccessorsInitialized(com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.class,
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.Builder.class);
}
private int bitField0_;
public static final int KEY_FIELD_NUMBER = 1;
private volatile java.lang.Object key_;
/**
* <code>string key = 1;</code>
*/
public java.lang.String getKey() {
java.lang.Object ref = key_;
if (ref instanceof java.lang.String) {
return (java.lang.String) ref;
} else {
com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
key_ = s;
return s;
}
}
/**
* <code>string key = 1;</code>
*/
public com.google.protobuf.ByteString getKeyBytes() {
java.lang.Object ref = key_;
if (ref instanceof java.lang.String) {
com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
key_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
public static final int TIMESTAMP_FIELD_NUMBER = 2;
private long timestamp_;
/**
* <code>int64 timestamp = 2;</code>
*/
public long getTimestamp() {
return timestamp_;
}
public static final int DATA_FIELD_NUMBER = 3;
private static final class DataDefaultEntryHolder {
static final com.google.protobuf.MapEntry<java.lang.String, java.lang.String> defaultEntry = com.google.protobuf.MapEntry.<java.lang.String, java.lang.String>newDefaultInstance(
com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_descriptor,
com.google.protobuf.WireFormat.FieldType.STRING, "",
com.google.protobuf.WireFormat.FieldType.STRING, "");
}
private com.google.protobuf.MapField<java.lang.String, java.lang.String> data_;
private com.google.protobuf.MapField<java.lang.String, java.lang.String> internalGetData() {
if (data_ == null) {
return com.google.protobuf.MapField.emptyMapField(DataDefaultEntryHolder.defaultEntry);
}
return data_;
}
public int getDataCount() {
return internalGetData().getMap().size();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public boolean containsData(java.lang.String key) {
if (key == null) {
throw new java.lang.NullPointerException();
}
return internalGetData().getMap().containsKey(key);
}
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
return internalGetData().getMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrDefault(java.lang.String key, java.lang.String defaultValue) {
if (key == null) {
throw new java.lang.NullPointerException();
}
java.util.Map<java.lang.String, java.lang.String> map = internalGetData().getMap();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrThrow(java.lang.String key) {
if (key == null) {
throw new java.lang.NullPointerException();
}
java.util.Map<java.lang.String, java.lang.String> map = internalGetData().getMap();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
}
return map.get(key);
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1)
return true;
if (isInitialized == 0)
return false;
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
if (!getKeyBytes().isEmpty()) {
com.google.protobuf.GeneratedMessageV3.writeString(output, 1, key_);
}
if (timestamp_ != 0L) {
output.writeInt64(2, timestamp_);
}
com.google.protobuf.GeneratedMessageV3.serializeStringMapTo(output, internalGetData(),
DataDefaultEntryHolder.defaultEntry, 3);
}
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1)
return size;
size = 0;
if (!getKeyBytes().isEmpty()) {
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, key_);
}
if (timestamp_ != 0L) {
size += com.google.protobuf.CodedOutputStream.computeInt64Size(2, timestamp_);
}
for (java.util.Map.Entry<java.lang.String, java.lang.String> entry : internalGetData().getMap()
.entrySet()) {
com.google.protobuf.MapEntry<java.lang.String, java.lang.String> data__ = DataDefaultEntryHolder.defaultEntry
.newBuilderForType().setKey(entry.getKey()).setValue(entry.getValue()).build();
size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, data__);
}
memoizedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
@java.lang.Override
public boolean equals(final java.lang.Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof com.farsunset.cim.sdk.model.proto.SentBodyProto.Model)) {
return super.equals(obj);
}
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model other = (com.farsunset.cim.sdk.model.proto.SentBodyProto.Model) obj;
boolean result = true;
result = result && getKey().equals(other.getKey());
result = result && (getTimestamp() == other.getTimestamp());
result = result && internalGetData().equals(other.internalGetData());
return result;
}
@java.lang.Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + KEY_FIELD_NUMBER;
hash = (53 * hash) + getKey().hashCode();
hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getTimestamp());
if (!internalGetData().getMap().isEmpty()) {
hash = (37 * hash) + DATA_FIELD_NUMBER;
hash = (53 * hash) + internalGetData().hashCode();
}
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(
com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(
com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseDelimitedFrom(
java.io.InputStream input) throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseDelimitedFrom(
java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input,
extensionRegistry);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(
com.google.protobuf.CodedInputStream input) throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parseFrom(
com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry);
}
public Builder newBuilderForType() {
return newBuilder();
}
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(com.farsunset.cim.sdk.model.proto.SentBodyProto.Model prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
public Builder toBuilder() {
return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
}
@java.lang.Override
protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code com.farsunset.cim.sdk.model.proto.Model}
*/
public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:com.farsunset.cim.sdk.model.proto.Model)
com.farsunset.cim.sdk.model.proto.SentBodyProto.ModelOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor;
}
@SuppressWarnings({ "rawtypes" })
protected com.google.protobuf.MapField internalGetMapField(int number) {
switch (number) {
case 3:
return internalGetData();
default:
throw new RuntimeException("Invalid map field number: " + number);
}
}
@SuppressWarnings({ "rawtypes" })
protected com.google.protobuf.MapField internalGetMutableMapField(int number) {
switch (number) {
case 3:
return internalGetMutableData();
default:
throw new RuntimeException("Invalid map field number: " + number);
}
}
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_fieldAccessorTable
.ensureFieldAccessorsInitialized(com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.class,
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.Builder.class);
}
// Construct using
// com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
}
}
public Builder clear() {
super.clear();
key_ = "";
timestamp_ = 0L;
internalGetMutableData().clear();
return this;
}
public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor;
}
public com.farsunset.cim.sdk.model.proto.SentBodyProto.Model getDefaultInstanceForType() {
return com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.getDefaultInstance();
}
public com.farsunset.cim.sdk.model.proto.SentBodyProto.Model build() {
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public com.farsunset.cim.sdk.model.proto.SentBodyProto.Model buildPartial() {
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model result = new com.farsunset.cim.sdk.model.proto.SentBodyProto.Model(
this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
result.key_ = key_;
result.timestamp_ = timestamp_;
result.data_ = internalGetData();
result.data_.makeImmutable();
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
}
public Builder clone() {
return (Builder) super.clone();
}
public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) {
return (Builder) super.setField(field, value);
}
public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
return (Builder) super.clearField(field);
}
public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return (Builder) super.clearOneof(oneof);
}
public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index,
Object value) {
return (Builder) super.setRepeatedField(field, index, value);
}
public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) {
return (Builder) super.addRepeatedField(field, value);
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof com.farsunset.cim.sdk.model.proto.SentBodyProto.Model) {
return mergeFrom((com.farsunset.cim.sdk.model.proto.SentBodyProto.Model) other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(com.farsunset.cim.sdk.model.proto.SentBodyProto.Model other) {
if (other == com.farsunset.cim.sdk.model.proto.SentBodyProto.Model.getDefaultInstance())
return this;
if (!other.getKey().isEmpty()) {
key_ = other.key_;
onChanged();
}
if (other.getTimestamp() != 0L) {
setTimestamp(other.getTimestamp());
}
internalGetMutableData().mergeFrom(other.internalGetData());
onChanged();
return this;
}
public final boolean isInitialized() {
return true;
}
public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
com.farsunset.cim.sdk.model.proto.SentBodyProto.Model parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (com.farsunset.cim.sdk.model.proto.SentBodyProto.Model) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private int bitField0_;
private java.lang.Object key_ = "";
/**
* <code>string key = 1;</code>
*/
public java.lang.String getKey() {
java.lang.Object ref = key_;
if (!(ref instanceof java.lang.String)) {
com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
key_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>string key = 1;</code>
*/
public com.google.protobuf.ByteString getKeyBytes() {
java.lang.Object ref = key_;
if (ref instanceof String) {
com.google.protobuf.ByteString b = com.google.protobuf.ByteString
.copyFromUtf8((java.lang.String) ref);
key_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>string key = 1;</code>
*/
public Builder setKey(java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
key_ = value;
onChanged();
return this;
}
/**
* <code>string key = 1;</code>
*/
public Builder clearKey() {
key_ = getDefaultInstance().getKey();
onChanged();
return this;
}
/**
* <code>string key = 1;</code>
*/
public Builder setKeyBytes(com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
checkByteStringIsUtf8(value);
key_ = value;
onChanged();
return this;
}
private long timestamp_;
/**
* <code>int64 timestamp = 2;</code>
*/
public long getTimestamp() {
return timestamp_;
}
/**
* <code>int64 timestamp = 2;</code>
*/
public Builder setTimestamp(long value) {
timestamp_ = value;
onChanged();
return this;
}
/**
* <code>int64 timestamp = 2;</code>
*/
public Builder clearTimestamp() {
timestamp_ = 0L;
onChanged();
return this;
}
private com.google.protobuf.MapField<java.lang.String, java.lang.String> data_;
private com.google.protobuf.MapField<java.lang.String, java.lang.String> internalGetData() {
if (data_ == null) {
return com.google.protobuf.MapField.emptyMapField(DataDefaultEntryHolder.defaultEntry);
}
return data_;
}
private com.google.protobuf.MapField<java.lang.String, java.lang.String> internalGetMutableData() {
onChanged();
;
if (data_ == null) {
data_ = com.google.protobuf.MapField.newMapField(DataDefaultEntryHolder.defaultEntry);
}
if (!data_.isMutable()) {
data_ = data_.copy();
}
return data_;
}
public int getDataCount() {
return internalGetData().getMap().size();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public boolean containsData(java.lang.String key) {
if (key == null) {
throw new java.lang.NullPointerException();
}
return internalGetData().getMap().containsKey(key);
}
/**
* Use {@link #getDataMap()} instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getData() {
return getDataMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.util.Map<java.lang.String, java.lang.String> getDataMap() {
return internalGetData().getMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrDefault(java.lang.String key, java.lang.String defaultValue) {
if (key == null) {
throw new java.lang.NullPointerException();
}
java.util.Map<java.lang.String, java.lang.String> map = internalGetData().getMap();
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public java.lang.String getDataOrThrow(java.lang.String key) {
if (key == null) {
throw new java.lang.NullPointerException();
}
java.util.Map<java.lang.String, java.lang.String> map = internalGetData().getMap();
if (!map.containsKey(key)) {
throw new java.lang.IllegalArgumentException();
}
return map.get(key);
}
public Builder clearData() {
internalGetMutableData().getMutableMap().clear();
return this;
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public Builder removeData(java.lang.String key) {
if (key == null) {
throw new java.lang.NullPointerException();
}
internalGetMutableData().getMutableMap().remove(key);
return this;
}
/**
* Use alternate mutation accessors instead.
*/
@java.lang.Deprecated
public java.util.Map<java.lang.String, java.lang.String> getMutableData() {
return internalGetMutableData().getMutableMap();
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public Builder putData(java.lang.String key, java.lang.String value) {
if (key == null) {
throw new java.lang.NullPointerException();
}
if (value == null) {
throw new java.lang.NullPointerException();
}
internalGetMutableData().getMutableMap().put(key, value);
return this;
}
/**
* <code>map&lt;string, string&gt; data = 3;</code>
*/
public Builder putAllData(java.util.Map<java.lang.String, java.lang.String> values) {
internalGetMutableData().getMutableMap().putAll(values);
return this;
}
public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
return this;
}
// @@protoc_insertion_point(builder_scope:com.farsunset.cim.sdk.model.proto.Model)
}
// @@protoc_insertion_point(class_scope:com.farsunset.cim.sdk.model.proto.Model)
private static final com.farsunset.cim.sdk.model.proto.SentBodyProto.Model DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new com.farsunset.cim.sdk.model.proto.SentBodyProto.Model();
}
public static com.farsunset.cim.sdk.model.proto.SentBodyProto.Model getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<Model> PARSER = new com.google.protobuf.AbstractParser<Model>() {
public Model parsePartialFrom(com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new Model(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<Model> parser() {
return PARSER;
}
@java.lang.Override
public com.google.protobuf.Parser<Model> getParserForType() {
return PARSER;
}
public com.farsunset.cim.sdk.model.proto.SentBodyProto.Model getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
private static final com.google.protobuf.Descriptors.Descriptor internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor;
private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_com_farsunset_cim_sdk_model_proto_Model_fieldAccessorTable;
private static final com.google.protobuf.Descriptors.Descriptor internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_descriptor;
private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
static {
java.lang.String[] descriptorData = { "\n\016SentBody.proto\022!com.farsunset.cim.sdk."
+ "model.proto\"\226\001\n\005Model\022\013\n\003key\030\001 \001(\t\022\021\n\tti"
+ "mestamp\030\002 \001(\003\022@\n\004data\030\003 \003(\01322.com.farsun"
+ "set.cim.sdk.model.proto.Model.DataEntry\032"
+ "+\n\tDataEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t"
+ ":\0028\001B\017B\rSentBodyProtob\006proto3" };
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {}, assigner);
internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor = getDescriptor().getMessageTypes().get(0);
internal_static_com_farsunset_cim_sdk_model_proto_Model_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor,
new java.lang.String[] { "Key", "Timestamp", "Data", });
internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_descriptor = internal_static_com_farsunset_cim_sdk_model_proto_Model_descriptor
.getNestedTypes().get(0);
internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_com_farsunset_cim_sdk_model_proto_Model_DataEntry_descriptor,
new java.lang.String[] { "Key", "Value", });
}
// @@protoc_insertion_point(outer_class_scope)
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -31,9 +31,9 @@ class CIMCacheManager {
public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED";
public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST";
public static final String KEY_CIM_SERVER_HOST = "KEY_CIM_SERVER_HOST";
public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT";
public static final String KEY_CIM_SERVER_PORT = "KEY_CIM_SERVER_PORT";
public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE";
@ -65,7 +65,7 @@ class CIMCacheManager {
public boolean getBoolean(String key) {
String value = getString(key);
return value == null ? false : Boolean.parseBoolean(value);
return Boolean.parseBoolean(value);
}
public void putInt(String key, int value) {

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -31,7 +31,6 @@ import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;
import com.farsunset.cim.sdk.client.coder.CIMLogger;
import com.farsunset.cim.sdk.client.coder.ClientMessageDecoder;
@ -65,24 +64,9 @@ class CIMConnectorManager {
private ByteBuffer readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE);
private ExecutorService workerExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"worker-");
}
});
private ExecutorService bossExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"boss-");
}
});
private ExecutorService eventExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"event-");
}
});
private ExecutorService workerExecutor = Executors.newFixedThreadPool(1, r -> new Thread(r,"worker-"));
private ExecutorService bossExecutor = Executors.newFixedThreadPool(1, r -> new Thread(r,"boss-"));
private ExecutorService eventExecutor = Executors.newFixedThreadPool(1, r -> new Thread(r,"event-"));
private Semaphore semaphore = new Semaphore(1, true);
@ -109,62 +93,56 @@ class CIMConnectorManager {
return;
}
bossExecutor.execute(new Runnable() {
@Override
public void run() {
bossExecutor.execute(() -> {
if (isConnected()) {
return;
}
LOGGER.startConnect(host, port);
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
try {
semaphore.acquire();
if (isConnected()) {
return;
}
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
socketChannel.socket().setTcpNoDelay(true);
socketChannel.socket().setKeepAlive(true);
socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE);
socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE);
socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT);
semaphore.release();
handelConnectedEvent();
int result = -1;
while((result = socketChannel.read(readBuffer)) > 0) {
if(readBuffer.position() == readBuffer.capacity()) {
extendByteBuffer();
}
handelSocketReadEvent(result);
LOGGER.startConnect(host, port);
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
try {
semaphore.acquire();
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
socketChannel.socket().setTcpNoDelay(true);
socketChannel.socket().setKeepAlive(true);
socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE);
socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE);
socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT);
semaphore.release();
handelConnectedEvent();
int result = -1;
while((result = socketChannel.read(readBuffer)) > 0) {
if(readBuffer.position() == readBuffer.capacity()) {
extendByteBuffer();
}
handelSocketReadEvent(result);
}catch(ConnectException ignore){
semaphore.release();
handleConnectAbortedEvent();
}catch(SocketTimeoutException ignore){
semaphore.release();
handleConnectAbortedEvent();
}catch(IOException ignore) {
semaphore.release();
handelDisconnectedEvent();
}catch (InterruptedException ignore) {
semaphore.release();
}
}
handelSocketReadEvent(result);
}catch(ConnectException | SocketTimeoutException ignore){
semaphore.release();
handleConnectAbortedEvent();
} catch(IOException ignore) {
semaphore.release();
handelDisconnectedEvent();
}catch (InterruptedException ignore) {
semaphore.release();
}
});
}
@ -177,23 +155,23 @@ class CIMConnectorManager {
private void handleConnectAbortedEvent() {
long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
long interval = CIMConstant.RECONNECT_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
LOGGER.connectFailure(interval);
Intent intent = new Intent();
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FAILED);
intent.putExtra("interval", interval);
sendBroadcast(intent);
}
private void handelConnectedEvent() throws IOException {
private void handelConnectedEvent() {
sessionCreated();
}
private void handelSocketReadEvent(int result) throws IOException {
private void handelSocketReadEvent(int result) {
if(result == -1) {
closeSession();
@ -239,32 +217,28 @@ class CIMConnectorManager {
return;
}
workerExecutor.execute(new Runnable() {
@Override
public void run() {
int result = 0;
try {
semaphore.acquire();
ByteBuffer buffer = messageEncoder.encode(body);
while(buffer.hasRemaining()){
result += socketChannel.write(buffer);
}
} catch (Exception e) {
result = -1;
}finally {
semaphore.release();
if(result <= 0) {
closeSession();
}else {
messageSent(body);
}
}
workerExecutor.execute(() -> {
int result = 0;
try {
semaphore.acquire();
ByteBuffer buffer = messageEncoder.encode(body);
while(buffer.hasRemaining()){
result += socketChannel.write(buffer);
}
} catch (Exception e) {
result = -1;
}finally {
semaphore.release();
if(result <= 0) {
closeSession();
}else {
messageSent(body);
}
}
});
}
@ -275,7 +249,7 @@ class CIMConnectorManager {
LOGGER.sessionCreated(socketChannel);
Intent intent = new Intent();
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FINISHED);
sendBroadcast(intent);
}
@ -296,34 +270,34 @@ class CIMConnectorManager {
}
public void messageReceived(Object obj) {
public void messageReceived(Object data) {
if (obj instanceof Message) {
if (data instanceof Message) {
Intent intent = new Intent();
intent.setAction(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED);
intent.putExtra(Message.class.getName(), (Message) obj);
intent.putExtra(Message.class.getName(), data);
sendBroadcast(intent);
}
if (obj instanceof ReplyBody) {
if (data instanceof ReplyBody) {
Intent intent = new Intent();
intent.setAction(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED);
intent.putExtra(ReplyBody.class.getName(), (ReplyBody) obj);
intent.putExtra(ReplyBody.class.getName(), data);
sendBroadcast(intent);
}
}
public void messageSent(Object message) {
public void messageSent(Object data) {
LOGGER.messageSent(socketChannel, message);
LOGGER.messageSent(socketChannel, data);
if (message instanceof SentBody) {
if (data instanceof SentBody) {
Intent intent = new Intent();
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
intent.putExtra(SentBody.class.getName(), (SentBody) message);
intent.setAction(CIMConstant.IntentAction.ACTION_SEND_FINISHED);
intent.putExtra(SentBody.class.getName(), data);
sendBroadcast(intent);
}
}
@ -360,12 +334,7 @@ class CIMConnectorManager {
private void sendBroadcast(final Intent intent) {
eventExecutor.execute(new Runnable() {
@Override
public void run() {
CIMEventBroadcastReceiver.getInstance().onReceive(intent);
}
});
eventExecutor.execute(() -> CIMEventBroadcastReceiver.getInstance().onReceive(intent));
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -21,9 +21,9 @@
*/
package com.farsunset.cim.sdk.client;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.farsunset.cim.sdk.client.constant.CIMConstant;
import com.farsunset.cim.sdk.client.model.Intent;
@ -35,16 +35,23 @@ import com.farsunset.cim.sdk.client.model.SentBody;
* 消息入口所有消息都会经过这里
*/
public class CIMEventBroadcastReceiver {
Random random = new Random();
private static CIMEventBroadcastReceiver recerver;
private static CIMEventBroadcastReceiver receiver;
private CIMEventListener listener;
private Timer connectionHandler = new Timer();;
private ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, r -> {
Thread thread = new Thread(r);
thread.setName("cim-reconnect-");
return thread;
});
private CIMEventBroadcastReceiver(){
}
public static CIMEventBroadcastReceiver getInstance() {
if (recerver == null) {
recerver = new CIMEventBroadcastReceiver();
if (receiver == null) {
receiver = new CIMEventBroadcastReceiver();
}
return recerver;
return receiver;
}
public void setGlobalCIMEventListener(CIMEventListener ls) {
@ -63,16 +70,16 @@ public class CIMEventBroadcastReceiver {
/*
* cim连接服务器失败事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED)) {
long interval = intent.getLongExtra("interval", CIMConstant.RECONN_INTERVAL_TIME);
onInnerConnectionFailed(interval);
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECT_FAILED)) {
long interval = intent.getLongExtra("interval", CIMConstant.RECONNECT_INTERVAL_TIME);
onInnerConnectFailed(interval);
}
/*
* cim连接服务器成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED)) {
onInnerConnectionSuccessed();
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECT_FINISHED)) {
onInnerConnectFinished();
}
/*
@ -83,24 +90,17 @@ public class CIMEventBroadcastReceiver {
}
/*
* 获取收到replybody成功事件
* 获取收到replyBody成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED)) {
listener.onReplyReceived((ReplyBody) intent.getExtra(ReplyBody.class.getName()));
}
/*
* 获取sendbody发送成功事件
* 获取sendBody发送成功事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED)) {
onSentSucceed((SentBody) intent.getExtra(SentBody.class.getName()));
}
/*
* 获取cim数据传输异常事件
*/
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_UNCAUGHT_EXCEPTION)) {
onUncaughtException((Exception) intent.getExtra(Exception.class.getName()));
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_SEND_FINISHED)) {
onInnerSendFinished((SentBody) intent.getExtra(SentBody.class.getName()));
}
/*
@ -120,25 +120,23 @@ public class CIMEventBroadcastReceiver {
}
private void onInnerConnectionFailed(long interval) {
private void onInnerConnectFailed(long interval) {
connectionHandler.schedule(new ConnectionTask(), interval);
executorService.schedule((Runnable) CIMPushManager::connect,interval, TimeUnit.MICROSECONDS);
listener.onConnectionFailed();
listener.onConnectFailed();
}
private void onInnerConnectionSuccessed() {
private void onInnerConnectFinished() {
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_CIM_CONNECTION_STATE, true);
boolean autoBind = CIMPushManager.autoBindDeviceId();
listener.onConnectionSuccessed(autoBind);
listener.onConnectFinished(autoBind);
}
private void onUncaughtException(Throwable arg0) {
}
private void onInnerMessageReceived(com.farsunset.cim.sdk.client.model.Message message) {
private void onInnerMessageReceived(Message message) {
if (isForceOfflineMessage(message.getAction())) {
CIMPushManager.stop();
}
@ -149,16 +147,9 @@ public class CIMEventBroadcastReceiver {
private boolean isForceOfflineMessage(String action) {
return CIMConstant.MessageAction.ACTION_999.equals(action);
}
private void onSentSucceed(SentBody body) {
}
class ConnectionTask extends TimerTask {
public void run() {
CIMPushManager.connect();
}
private void onInnerSendFinished(SentBody body) {
listener.onSendFinished(body);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -23,6 +23,7 @@ package com.farsunset.cim.sdk.client;
import com.farsunset.cim.sdk.client.model.Message;
import com.farsunset.cim.sdk.client.model.ReplyBody;
import com.farsunset.cim.sdk.client.model.SentBody;
/**
* CIM 主要事件接口
@ -39,9 +40,15 @@ public interface CIMEventListener {
/**
* 当调用CIMPushManager.sendRequest()向服务端发送请求获得相应时调用
*
* @param replybody
* @param body
*/
void onReplyReceived(ReplyBody replybody);
void onReplyReceived(ReplyBody body);
/**
* 当调用CIMPushManager.sendRequest()向服务端发送请求成功
* @param body
*/
void onSendFinished(SentBody body);
/**
* 当连接服务器成功时回调
@ -49,7 +56,7 @@ public interface CIMEventListener {
* @param hasAutoBind
* : true 已经自动绑定账号到服务器了不需要再手动调用bindAccount
*/
void onConnectionSuccessed(boolean hasAutoBind);
void onConnectFinished(boolean hasAutoBind);
/**
* 当断开服务器连接的时候回调
@ -60,10 +67,11 @@ public interface CIMEventListener {
* 当服务器连接失败的时候回调
*
*/
void onConnectionFailed();
void onConnectFailed();
/**
* 监听器在容器里面的排序值越大则越先接收
* @return 值越大优先级越高
*/
int getEventDispatchOrder();
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -58,7 +58,7 @@ public class CIMListenerManager {
public static void notifyOnConnectionSuccessed(boolean antoBind) {
for (CIMEventListener listener : cimListeners) {
listener.onConnectionSuccessed(antoBind);
listener.onConnectFinished(antoBind);
}
}
@ -82,7 +82,7 @@ public class CIMListenerManager {
public static void notifyOnConnectionFailed() {
for (CIMEventListener listener : cimListeners) {
listener.onConnectionFailed();
listener.onConnectFailed();
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -41,21 +41,26 @@ public class CIMPushManager {
static String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION";
static String ACTION_DESTORY = "ACTION_DESTORY";
static String ACTION_DESTROY = "ACTION_DESTROY";
static String KEY_CIM_CONNECTION_STATUS = "KEY_CIM_CONNECTION_STATUS";
// 被销毁的destroy()
/**
* 销毁的
*/
public static final int STATE_DESTROYED = 0x0000DE;
// 被销停止的 stop()
public static final int STATE_STOPED = 0x0000EE;
/**
* 停止推送
*/
public static final int STATE_STOPPED = 0x0000EE;
/**
* 正常
*/
public static final int STATE_NORMAL = 0x000000;
/**
* 初始化,连接服务端在程序启动页或者 在Application里调用
*
* @param context
* @param ip
* @param port
*/
@ -65,12 +70,12 @@ public class CIMPushManager {
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_CIM_DESTROYED, false);
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_MANUAL_STOP, false);
CIMCacheManager.getInstance().putString(CIMCacheManager.KEY_CIM_SERVIER_HOST, ip);
CIMCacheManager.getInstance().putInt(CIMCacheManager.KEY_CIM_SERVIER_PORT, port);
CIMCacheManager.getInstance().putString(CIMCacheManager.KEY_CIM_SERVER_HOST, ip);
CIMCacheManager.getInstance().putInt(CIMCacheManager.KEY_CIM_SERVER_PORT, port);
Intent serviceIntent = new Intent();
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST, ip);
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, port);
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVER_HOST, ip);
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVER_PORT, port);
serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION);
startService(serviceIntent);
@ -83,14 +88,14 @@ public class CIMPushManager {
protected static void connect() {
boolean isManualStop = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_MANUAL_STOP);
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualStop || isManualDestory) {
if (isManualStop || isManualDestroy) {
return;
}
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT);
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVER_PORT);
connect(host, port);
@ -106,7 +111,7 @@ public class CIMPushManager {
sent.put("deviceId", getDeviceId());
sent.put("channel", "java");
sent.put("device", sysPro.getProperty("os.name"));
sent.put("version", getClientVersion());
sent.put("appVersion", getClientVersion());
sent.put("osVersion", sysPro.getProperty("os.version"));
sendRequest(sent);
}
@ -119,8 +124,8 @@ public class CIMPushManager {
*/
public static void bindAccount(String account) {
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestory || account == null || account.trim().length() == 0) {
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestroy || account == null || account.trim().length() == 0) {
return;
}
sendBindRequest(account);
@ -145,15 +150,14 @@ public class CIMPushManager {
/**
* 发送一个CIM请求
*
* @param context
* @body
*/
public static void sendRequest(SentBody body) {
boolean isManualStop = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_MANUAL_STOP);
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualStop || isManualDestory) {
if (isManualStop || isManualDestroy) {
return;
}
@ -167,12 +171,11 @@ public class CIMPushManager {
/**
* 停止接受推送将会退出当前账号登录端口与服务端的连接
*
* @param context
*/
public static void stop() {
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestory) {
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestroy) {
return;
}
@ -184,29 +187,24 @@ public class CIMPushManager {
/**
* 完全销毁CIM一般用于完全退出程序调用resume将不能恢复
*
* @param context
*/
public static void destroy() {
CIMCacheManager.getInstance().putBoolean(CIMCacheManager.KEY_CIM_DESTROYED, true);
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_DESTORY);
serviceIntent.setAction(ACTION_DESTROY);
startService(serviceIntent);
}
/**
* 重新恢复接收推送重新连接服务端并登录当前账号如果aotuBind == true
*
* @param context
* @param aotuBind
*/
public static void resume() {
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestory) {
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestroy) {
return;
}
@ -218,14 +216,14 @@ public class CIMPushManager {
}
public static int getState() {
boolean isManualDestory = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestory) {
boolean isManualDestroy = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualDestroy) {
return STATE_DESTROYED;
}
boolean isManualStop = CIMCacheManager.getInstance().getBoolean(CIMCacheManager.KEY_MANUAL_STOP);
if (isManualStop) {
return STATE_STOPED;
return STATE_STOPPED;
}
return STATE_NORMAL;
@ -250,12 +248,12 @@ public class CIMPushManager {
private static String getDeviceId() {
String deviceId = System.getProperties().getProperty(CIMConstant.ConfigKey.CLIENT_DEVICEID);
if(deviceId == null) {
deviceId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
System.getProperties().put(CIMConstant.ConfigKey.CLIENT_DEVICEID, deviceId);
String currDeviceId = System.getProperties().getProperty(CIMConstant.ConfigKey.CLIENT_DEVICE_ID);
if(currDeviceId != null) {
return currDeviceId;
}
String deviceId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
System.getProperties().put(CIMConstant.ConfigKey.CLIENT_DEVICE_ID, deviceId);
return deviceId;
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -26,11 +26,9 @@ import com.farsunset.cim.sdk.client.model.SentBody;
/**
* 与服务端连接服务
*
*/
public class CIMPushService {
protected final static int DEF_CIM_PORT = 23456;
private CIMConnectorManager manager;
private static CIMPushService service;
@ -48,13 +46,11 @@ public class CIMPushService {
public void onStartCommand(Intent intent) {
intent = (intent == null ? new Intent(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE) : intent);
String action = intent.getAction();
String action = intent == null ? CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE : intent.getAction();
if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) {
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT);
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVER_PORT);
manager.connect(host, port);
}
@ -66,14 +62,14 @@ public class CIMPushService {
manager.closeSession();
}
if (CIMPushManager.ACTION_DESTORY.equals(action)) {
if (CIMPushManager.ACTION_DESTROY.equals(action)) {
manager.destroy();
}
if (CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action) && !manager.isConnected()) {
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT);
String host = CIMCacheManager.getInstance().getString(CIMCacheManager.KEY_CIM_SERVER_HOST);
int port = CIMCacheManager.getInstance().getInt(CIMCacheManager.KEY_CIM_SERVER_PORT);
manager.connect(host, port);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -80,7 +80,7 @@ public class CIMLogger {
}
public void connectState(boolean isConnected,boolean isManualStop,boolean isDestroyed) {
LOGGER.debug("CONNECTED:" + isConnected + " STOPED:"+isManualStop+ " DESTROYED:"+isDestroyed);
LOGGER.debug("CONNECTED:" + isConnected + " STOPPED:"+isManualStop+ " DESTROYED:"+isDestroyed);
}
private String getSessionInfo(SocketChannel session) {

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -40,7 +40,7 @@ public class ClientMessageDecoder {
public Object doDecode(ByteBuffer iobuffer) {
/**
/*
* 消息头3位
*/
if (iobuffer.remaining() < CIMConstant.DATA_HEADER_LENGTH) {
@ -49,26 +49,26 @@ public class ClientMessageDecoder {
iobuffer.mark();
byte conetnType = iobuffer.get();
byte type = iobuffer.get();
byte lv = iobuffer.get();// int 低位
byte hv = iobuffer.get();// int 高位
byte lv = iobuffer.get();
byte hv = iobuffer.get();
int conetnLength = getContentLength(lv, hv);
int length = getContentLength(lv, hv);
// 如果消息体没有接收完整则重置读取等待下一次重新读取
if (conetnLength > iobuffer.remaining()) {
if (length > iobuffer.remaining()) {
iobuffer.reset();
return null;
}
byte[] dataBytes = new byte[conetnLength];
iobuffer.get(dataBytes, 0, conetnLength);
byte[] dataBytes = new byte[length];
iobuffer.get(dataBytes, 0, length);
iobuffer.position(0);
try {
return mappingMessageObject(dataBytes, conetnType);
return mappingMessageObject(dataBytes, type);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
return null;
@ -79,11 +79,10 @@ public class ClientMessageDecoder {
private Object mappingMessageObject(byte[] bytes, byte type) throws InvalidProtocolBufferException {
if (CIMConstant.ProtobufType.S_H_RQ == type) {
HeartbeatRequest request = HeartbeatRequest.getInstance();
return request;
return HeartbeatRequest.getInstance();
}
if (CIMConstant.ProtobufType.REPLYBODY == type) {
if (CIMConstant.ProtobufType.REPLY_BODY == type) {
ReplyBodyProto.Model bodyProto = ReplyBodyProto.Model.parseFrom(bytes);
ReplyBody body = new ReplyBody();
body.setKey(bodyProto.getKey());
@ -116,14 +115,12 @@ public class ClientMessageDecoder {
/**
* 解析消息体长度
*
* @param type
* @param length
* @return
*/
private int getContentLength(byte lv, byte hv) {
int l = (lv & 0xff);
int h = (hv & 0xff);
return (l | (h <<= 8));
return (l | h << 8);
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -37,13 +37,13 @@ public class ClientMessageEncoder {
Protobufable data = (Protobufable) object;
byte[] byteArray = data.getByteArray();
ByteBuffer iobuffer = ByteBuffer.allocate(byteArray.length + CIMConstant.DATA_HEADER_LENGTH);
ByteBuffer ioBuffer = ByteBuffer.allocate(byteArray.length + CIMConstant.DATA_HEADER_LENGTH);
iobuffer.put(createHeader(data.getType(), byteArray.length));
iobuffer.put(byteArray);
iobuffer.flip();
ioBuffer.put(createHeader(data.getType(), byteArray.length));
ioBuffer.put(byteArray);
ioBuffer.flip();
return iobuffer;
return ioBuffer;
}

View File

@ -0,0 +1,119 @@
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* 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.
*
***************************************************************************************
* *
* Website : http://www.farsunset.com *
* *
***************************************************************************************
*/
package com.farsunset.cim.sdk.client.constant;
/**
* 常量
*/
public interface CIMConstant {
long RECONNECT_INTERVAL_TIME = 30 * 1000;
/**
* 消息头长度为3个字节第一个字节为消息类型第二第三字节 转换int后为消息长度
*/
int DATA_HEADER_LENGTH = 3;
interface ReturnCode {
String CODE_404 = "404";
String CODE_403 = "403";
String CODE_405 = "405";
String CODE_200 = "200";
String CODE_206 = "206";
String CODE_500 = "500";
}
interface ConfigKey {
String DEVICE_MODEL = "client.model";
String CLIENT_VERSION = "client.version";
String CLIENT_ACCOUNT = "client.account";
String CLIENT_DEVICE_ID = "client.deviceId";
}
interface ProtobufType {
byte C_H_RS = 0;
byte S_H_RQ = 1;
byte MESSAGE = 2;
byte SENT_BODY = 3;
byte REPLY_BODY = 4;
}
interface RequestKey {
String CLIENT_BIND = "client_bind";
}
interface MessageAction {
/*
被其他设备登录挤下线消息
*/
String ACTION_999 = "999";
}
interface IntentAction {
/*
消息广播action
*/
String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.ACTION_MESSAGE_RECEIVED";
/*
发送sendBody成功广播
*/
String ACTION_SEND_FINISHED = "com.farsunset.cim.ACTION_SEND_FINISHED";
/*
链接意外关闭广播
*/
String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.ACTION_CONNECTION_CLOSED";
/*
链接失败广播
*/
String ACTION_CONNECT_FAILED = "com.farsunset.cim.ACTION_CONNECT_FAILED";
/*
链接成功广播
*/
String ACTION_CONNECT_FINISHED = "com.farsunset.cim.ACTION_CONNECT_FINISHED";
/*
发送sendBody成功后获得replyBody回应广播
*/
String ACTION_REPLY_RECEIVED = "com.farsunset.cim.ACTION_REPLY_RECEIVED";
/*
重试连接
*/
String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY";
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -50,6 +50,7 @@ public class HeartbeatRequest implements Serializable, Protobufable {
return CMD_HEARTBEAT_RESPONSE.getBytes();
}
@Override
public String toString() {
return TAG;
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -49,6 +49,7 @@ public class HeartbeatResponse implements Serializable, Protobufable {
return CMD_HEARTBEAT_RESPONSE.getBytes();
}
@Override
public String toString() {
return TAG;
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -151,6 +151,7 @@ public class Message implements Serializable {
this.extra = extra;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -57,7 +57,7 @@ public class ReplyBody implements Serializable {
private long timestamp;
public ReplyBody() {
data = new HashMap<String, String>();
data = new HashMap<>();
timestamp = System.currentTimeMillis();
}
@ -115,20 +115,18 @@ public class ReplyBody implements Serializable {
this.code = code;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("#ReplyBody#").append("\n");
buffer.append("key:").append(this.getKey()).append("\n");
buffer.append("timestamp:").append(timestamp).append("\n");
buffer.append("code:").append(code).append("\n");
if (!data.isEmpty()) {
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
return buffer.toString();
}

View File

@ -1,4 +1,4 @@
/**
/*
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -39,7 +39,7 @@ public class SentBody implements Serializable, Protobufable {
private String key;
private HashMap<String, String> data = new HashMap<String, String>();;
private HashMap<String, String> data = new HashMap<>();;
private long timestamp;
@ -89,16 +89,13 @@ public class SentBody implements Serializable, Protobufable {
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("#SentBody#").append("\n");
;
buffer.append("key:").append(key).append("\n");
buffer.append("timestamp:").append(timestamp).append("\n");
if (!data.isEmpty()) {
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
buffer.append("data{").append("\n");
for (String key : getKeySet()) {
buffer.append(key).append(":").append(this.get(key)).append("\n");
}
buffer.append("}");
return buffer.toString();
}
@ -115,7 +112,7 @@ public class SentBody implements Serializable, Protobufable {
@Override
public byte getType() {
return CIMConstant.ProtobufType.SENTBODY;
return CIMConstant.ProtobufType.SENT_BODY;
}
}

View File

@ -1,216 +1,181 @@
/*CIM服务器IP*/
var CIM_HOST = "127.0.0.1";
/*CIM服务端口*/
var CIM_PORT = 23456;
var CIM_URI="ws://"+CIM_HOST+":"+CIM_PORT;
const CIM_HOST = "127.0.0.1";
/*
*服务端 websocket端口
*/
const CIM_PORT = 34567;
const CIM_URI = "ws://" + CIM_HOST + ":" + CIM_PORT;
var CMD_HEARTBEAT_RESPONSE = new Uint8Array([67,82]);
var SDK_VERSION = "1.0.0";
var SDK_CHANNEL = "browser";
var APP_PACKAGE = "com.farsunset.cim";
var ACTION_999 = "999";//特殊的消息类型,代表被服务端强制下线
var DATA_HEADER_LENGTH = 3;
const APP_VERSION = "1.0.0";
const APP_CHANNEL = "browser";
const APP_PACKAGE = "com.farsunset.cim";
var C_H_RS = 0;
var S_H_RQ = 1;
var MESSAGE = 2;
var SENTBODY = 3;
var REPLYBODY = 4;
/*
*特殊的消息类型代表被服务端强制下线
*/
const ACTION_999 = "999";
const DATA_HEADER_LENGTH = 1;
var socket;
var manualStop = false;
var CIMPushManager = {};
CIMPushManager.connection = function(){
manualStop = false;
window.localStorage.account = '';
socket = new WebSocket(CIM_URI);
socket.cookieEnabled = false;
socket.binaryType = 'arraybuffer';
socket.onopen = CIMPushManager.innerOnConnectionSuccessed;
socket.onmessage = CIMPushManager.innerOnMessageReceived;
const MESSAGE = 2;
const REPLY_BODY = 4;
let socket;
let manualStop = false;
const CIMPushManager = {};
CIMPushManager.connect = function () {
manualStop = false;
window.localStorage.account = '';
socket = new WebSocket(CIM_URI);
socket.cookieEnabled = false;
socket.binaryType = 'arraybuffer';
socket.onopen = CIMPushManager.innerOnConnectFinished;
socket.onmessage = CIMPushManager.innerOnMessageReceived;
socket.onclose = CIMPushManager.innerOnConnectionClosed;
};
CIMPushManager.bindAccount = function(account){
window.localStorage.account = account;
var deviceId = window.localStorage.deviceIddeviceId;
if(deviceId == '' || deviceId == undefined){
deviceId = generateUUID();
window.localStorage.deviceId = deviceId;
}
CIMPushManager.bindAccount = function (account) {
var browser = getBrowser();
var body = new proto.com.farsunset.cim.sdk.web.model.SentBody();
body.setKey("client_bind");
body.getDataMap().set("account",account);
body.getDataMap().set("channel",SDK_CHANNEL);
body.getDataMap().set("version",SDK_VERSION);
body.getDataMap().set("osVersion", browser.version);
body.getDataMap().set("packageName", APP_PACKAGE);
body.getDataMap().set("deviceId", deviceId);
body.getDataMap().set("device", browser.name);
CIMPushManager.sendRequest(body);
window.localStorage.account = account;
let deviceId = window.localStorage.deviceIddeviceId;
if (deviceId == '' || deviceId == undefined) {
deviceId = generateUUID();
window.localStorage.deviceId = deviceId;
}
let browser = getBrowser();
let body = new proto.com.farsunset.cim.sdk.web.model.SentBody();
body.setKey("client_bind");
body.setTimestamp(new Date().getTime());
body.getDataMap().set("account", account);
body.getDataMap().set("channel", APP_CHANNEL);
body.getDataMap().set("appVersion", APP_VERSION);
body.getDataMap().set("osVersion", browser.version);
body.getDataMap().set("packageName", APP_PACKAGE);
body.getDataMap().set("deviceId", deviceId);
body.getDataMap().set("device", browser.name);
CIMPushManager.sendRequest(body);
};
CIMPushManager.stop = function(){
manualStop = true;
socket.close();
CIMPushManager.stop = function () {
manualStop = true;
socket.close();
};
CIMPushManager.resume = function(){
CIMPushManager.resume = function () {
manualStop = false;
CIMPushManager.connection();
CIMPushManager.connect();
};
CIMPushManager.innerOnConnectionSuccessed = function(){
var account = window.localStorage.account;
if(account == '' || account == undefined){
onConnectionSuccessed();
}else{
CIMPushManager.bindAccount(account);
}
};
CIMPushManager.innerOnMessageReceived = function(e){
var data = new Uint8Array(e.data);
var type = data[0];
/**
* 收到服务端发来的心跳请求立即回复响应否则服务端会在10秒后断开连接
*/
if(type == S_H_RQ){
CIMPushManager.sendHeartbeatResponse();
return;
}
if(type == MESSAGE){
var length = getContentLength(data[1],data[2]);
var data = proto.com.farsunset.cim.sdk.web.model.Message.deserializeBinary(data.subarray(DATA_HEADER_LENGTH,DATA_HEADER_LENGTH+length));
onInterceptMessageReceived(data.toObject(false));
return;
}
if(type == REPLYBODY){
var length = getContentLength(data[1],data[2]);
var data = proto.com.farsunset.cim.sdk.web.model.ReplyBody.deserializeBinary(data.subarray(DATA_HEADER_LENGTH,DATA_HEADER_LENGTH+length));
/**
* 将proto对象转换成json对象去除无用信息
*/
var reply = {};
reply.code = data.getCode();
reply.key = data.getKey();
reply.message = data.getMessage();
reply.timestamp = data.getTimestamp();
reply.data = {};
/**
* 注意遍历map这里的参数 value在前key在后
*/
data.getDataMap().forEach(function (v,k){
reply.data[k] = v;
});
onReplyReceived(reply);
}
CIMPushManager.innerOnConnectFinished = function () {
let account = window.localStorage.account;
if (account === '' || account === undefined) {
onConnectFinished();
} else {
CIMPushManager.bindAccount(account);
}
};
CIMPushManager.innerOnConnectionClosed = function(e){
if(!manualStop){
var time = Math.floor(Math.random()*(30-15+1)+15);
setTimeout(function(){
CIMPushManager.connection();
},time);
}
CIMPushManager.innerOnMessageReceived = function (e) {
let data = new Uint8Array(e.data);
let type = data[0];
let body = data.subarray(DATA_HEADER_LENGTH, data.length);
if (type == MESSAGE) {
let message = proto.com.farsunset.cim.sdk.web.model.Message.deserializeBinary(body);
onInterceptMessageReceived(message.toObject(false));
return;
}
if (type == REPLY_BODY) {
let message = proto.com.farsunset.cim.sdk.web.model.ReplyBody.deserializeBinary(body);
/**
* 将proto对象转换成json对象去除无用信息
*/
let reply = {};
reply.code = message.getCode();
reply.key = message.getKey();
reply.message = message.getMessage();
reply.timestamp = message.getTimestamp();
reply.data = {};
/**
* 注意遍历map这里的参数 value在前key在后
*/
message.getDataMap().forEach(function (v, k) {
reply.data[k] = v;
});
onReplyReceived(reply);
}
};
CIMPushManager.sendRequest = function(body){
var data = body.serializeBinary();
var header = buildHeader(SENTBODY,data.length);
var protubuf = new Uint8Array(data.length + header.length);
protubuf.set(header,0);
protubuf.set(data,header.length);
socket.send(protubuf);
CIMPushManager.innerOnConnectionClosed = function (e) {
if (!manualStop) {
let time = Math.floor(Math.random() * (30 - 15 + 1) + 15);
setTimeout(function () {
CIMPushManager.connect();
}, time);
}
};
CIMPushManager.sendHeartbeatResponse = function(){
var data = CMD_HEARTBEAT_RESPONSE;
var header = buildHeader(C_H_RS,data.length);
var protubuf = new Uint8Array(data.length + header.length);
protubuf.set(header,0);
protubuf.set(data,header.length);
socket.send(protubuf);
CIMPushManager.sendRequest = function (body) {
let data = body.serializeBinary();
let protobuf = new Uint8Array(data.length);
protobuf.set(data, 0);
socket.send(protobuf);
};
function getContentLength( lv, hv) {
var l = (lv & 0xff);
var h = (hv & 0xff);
return (l | (h <<= 8));
}
function buildHeader(type,length){
var header = new Uint8Array(DATA_HEADER_LENGTH);
header[0] = type;
header[1] = (length & 0xff);
header[2] = ((length >> 8) & 0xff);
return header;
}
function onInterceptMessageReceived(message){
//被强制下线之后,不再继续连接服务端
if(message.action == ACTION_999){
manualStop = true;
}
//收到消息后,将消息发送给页面
if(onMessageReceived instanceof Function){
onMessageReceived(message);
}
function onInterceptMessageReceived(message) {
/*
*被强制下线之后不再继续连接服务端
*/
if (message.action == ACTION_999) {
manualStop = true;
}
/*
*收到消息后将消息发送给页面
*/
if (onMessageReceived instanceof Function) {
onMessageReceived(message);
}
}
function getBrowser() {
var explorer = window.navigator.userAgent.toLowerCase() ;
// ie
if (explorer.indexOf("msie") >= 0) {
var ver=explorer.match(/msie ([\d.]+)/)[1];
return {name:"IE",version:ver};
}
// firefox
else if (explorer.indexOf("firefox") >= 0) {
var ver=explorer.match(/firefox\/([\d.]+)/)[1];
return {name:"Firefox",version:ver};
}
// Chrome
else if(explorer.indexOf("chrome") >= 0){
var ver=explorer.match(/chrome\/([\d.]+)/)[1];
return {name:"Chrome",version:ver};
}
// Opera
else if(explorer.indexOf("opera") >= 0){
var ver=explorer.match(/opera.([\d.]+)/)[1];
return {name:"Opera",version:ver};
}
// Safari
else if(explorer.indexOf("Safari") >= 0){
var ver=explorer.match(/version\/([\d.]+)/)[1];
return {name:"Safari",version:ver};
}
return {name:"Other",version:"1.0.0"};
let explorer = window.navigator.userAgent.toLowerCase();
if (explorer.indexOf("msie") >= 0) {
let ver = explorer.match(/msie ([\d.]+)/)[1];
return {name: "IE", version: ver};
}
else if (explorer.indexOf("firefox") >= 0) {
let ver = explorer.match(/firefox\/([\d.]+)/)[1];
return {name: "Firefox", version: ver};
}
else if (explorer.indexOf("chrome") >= 0) {
let ver = explorer.match(/chrome\/([\d.]+)/)[1];
return {name: "Chrome", version: ver};
}
else if (explorer.indexOf("opera") >= 0) {
let ver = explorer.match(/opera.([\d.]+)/)[1];
return {name: "Opera", version: ver};
}
else if (explorer.indexOf("Safari") >= 0) {
let ver = explorer.match(/version\/([\d.]+)/)[1];
return {name: "Safari", version: ver};
}
return {name: "Other", version: "1.0.0"};
}
function generateUUID() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid.replace(/-/g,'');
let d = new Date().getTime();
let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
let r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid.replace(/-/g, '');
}

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="lib" path="libs/slf4j-api-1.7.25.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="libs/protobuf-java-3.9.1.jar"/>
<classpathentry kind="lib" path="libs/mina-core-2.1.3.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -0,0 +1,2 @@
target/
.idea/

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>cim-server-sdk-mina</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
</projectDescription>

Some files were not shown because too many files have changed in this diff Show More