Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dm_project
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
姚本章
dm_project
Commits
50e9202a
Commit
50e9202a
authored
Nov 30, 2020
by
zhangc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit gatway代码
parent
4bee7acb
Changes
74
Show whitespace changes
Inline
Side-by-side
Showing
74 changed files
with
19131 additions
and
23 deletions
+19131
-23
pom.xml
jz-dm-apigateway/pom.xml
+75
-10
ApiGatewayApplication.java
...rc/main/java/com/jz/dm/gateway/ApiGatewayApplication.java
+22
-0
Constants.java
...way/src/main/java/com/jz/dm/gateway/common/Constants.java
+85
-0
StringUtil.java
...ay/src/main/java/com/jz/dm/gateway/common/StringUtil.java
+4306
-0
GatewayException.java
.../com/jz/dm/gateway/common/exception/GatewayException.java
+76
-0
MessageDigestException.java
...z/dm/gateway/common/exception/MessageDigestException.java
+49
-0
NotifyException.java
...a/com/jz/dm/gateway/common/exception/NotifyException.java
+76
-0
OpenApiException.java
.../com/jz/dm/gateway/common/exception/OpenApiException.java
+131
-0
SecretException.java
...a/com/jz/dm/gateway/common/exception/SecretException.java
+49
-0
SignatureException.java
...om/jz/dm/gateway/common/exception/SignatureException.java
+51
-0
ArrayUtil.java
...rc/main/java/com/jz/dm/gateway/common/util/ArrayUtil.java
+5550
-0
Base64.java
...y/src/main/java/com/jz/dm/gateway/common/util/Base64.java
+535
-0
ClassUtil.java
...rc/main/java/com/jz/dm/gateway/common/util/ClassUtil.java
+1247
-0
Constants.java
...rc/main/java/com/jz/dm/gateway/common/util/Constants.java
+94
-0
HddHashMap.java
...c/main/java/com/jz/dm/gateway/common/util/HddHashMap.java
+38
-0
JSONWriter.java
...c/main/java/com/jz/dm/gateway/common/util/JSONWriter.java
+212
-0
JsonUtil.java
...src/main/java/com/jz/dm/gateway/common/util/JsonUtil.java
+116
-0
LogUtil.java
.../src/main/java/com/jz/dm/gateway/common/util/LogUtil.java
+160
-0
NotifyResultCode.java
.../java/com/jz/dm/gateway/common/util/NotifyResultCode.java
+153
-0
ObjectUtil.java
...c/main/java/com/jz/dm/gateway/common/util/ObjectUtil.java
+348
-0
OpenApiRequest.java
...in/java/com/jz/dm/gateway/common/util/OpenApiRequest.java
+193
-0
OpenApiResponse.java
...n/java/com/jz/dm/gateway/common/util/OpenApiResponse.java
+109
-0
OpenApiResultCode.java
...java/com/jz/dm/gateway/common/util/OpenApiResultCode.java
+127
-0
RSA.java
...eway/src/main/java/com/jz/dm/gateway/common/util/RSA.java
+335
-0
RSAUtils.java
...src/main/java/com/jz/dm/gateway/common/util/RSAUtils.java
+174
-0
ResultCode.java
...c/main/java/com/jz/dm/gateway/common/util/ResultCode.java
+22
-0
SignType.java
...src/main/java/com/jz/dm/gateway/common/util/SignType.java
+10
-0
SignatureUtil.java
...ain/java/com/jz/dm/gateway/common/util/SignatureUtil.java
+448
-0
StreamUtil.java
...c/main/java/com/jz/dm/gateway/common/util/StreamUtil.java
+125
-0
TtpayUtils.java
...c/main/java/com/jz/dm/gateway/common/util/TtpayUtils.java
+89
-0
WebUtils.java
...src/main/java/com/jz/dm/gateway/common/util/WebUtils.java
+391
-0
LoggingConstants.java
.../main/java/com/jz/dm/gateway/config/LoggingConstants.java
+47
-0
Property.java
...eway/src/main/java/com/jz/dm/gateway/config/Property.java
+34
-0
GatewayController.java
.../java/com/jz/dm/gateway/controller/GatewayController.java
+78
-0
AbstractFilter.java
...rc/main/java/com/jz/dm/gateway/filter/AbstractFilter.java
+37
-0
CheckArgsFilter.java
...c/main/java/com/jz/dm/gateway/filter/CheckArgsFilter.java
+65
-0
CheckPostSizeFilter.java
...in/java/com/jz/dm/gateway/filter/CheckPostSizeFilter.java
+49
-0
CheckTimestampFilter.java
...n/java/com/jz/dm/gateway/filter/CheckTimestampFilter.java
+58
-0
Filter.java
...ateway/src/main/java/com/jz/dm/gateway/filter/Filter.java
+28
-0
FilterChain.java
...y/src/main/java/com/jz/dm/gateway/filter/FilterChain.java
+19
-0
FilterChainFactory.java
...ain/java/com/jz/dm/gateway/filter/FilterChainFactory.java
+26
-0
FilterChainImpl.java
...c/main/java/com/jz/dm/gateway/filter/FilterChainImpl.java
+73
-0
FilterFactory.java
...src/main/java/com/jz/dm/gateway/filter/FilterFactory.java
+30
-0
InvokeRouteFilter.java
...main/java/com/jz/dm/gateway/filter/InvokeRouteFilter.java
+80
-0
SignatureFilter.java
...c/main/java/com/jz/dm/gateway/filter/SignatureFilter.java
+165
-0
VerifySignFilter.java
.../main/java/com/jz/dm/gateway/filter/VerifySignFilter.java
+92
-0
DefaultOpenApiDispatcher.java
...a/com/jz/dm/gateway/gateway/DefaultOpenApiDispatcher.java
+93
-0
GatewayService.java
...c/main/java/com/jz/dm/gateway/gateway/GatewayService.java
+13
-0
OpenApiDispatcher.java
...ain/java/com/jz/dm/gateway/gateway/OpenApiDispatcher.java
+20
-0
OpenApiService.java
...c/main/java/com/jz/dm/gateway/gateway/OpenApiService.java
+35
-0
Constants.java
...main/java/com/jz/dm/gateway/gateway/common/Constants.java
+85
-0
ApiWhiteServiceImpl.java
...a/com/jz/dm/gateway/gateway/impl/ApiWhiteServiceImpl.java
+80
-0
GatewayServiceImpl.java
...va/com/jz/dm/gateway/gateway/impl/GatewayServiceImpl.java
+30
-0
DispatchContext.java
...rc/main/java/com/jz/dm/gateway/model/DispatchContext.java
+176
-0
Format.java
...gateway/src/main/java/com/jz/dm/gateway/model/Format.java
+9
-0
GatewayRequest.java
...src/main/java/com/jz/dm/gateway/model/GatewayRequest.java
+358
-0
GatewayResponse.java
...rc/main/java/com/jz/dm/gateway/model/GatewayResponse.java
+123
-0
GatewayResultCode.java
.../main/java/com/jz/dm/gateway/model/GatewayResultCode.java
+138
-0
OpenApi.java
...ateway/src/main/java/com/jz/dm/gateway/model/OpenApi.java
+458
-0
RequestContext.java
...src/main/java/com/jz/dm/gateway/model/RequestContext.java
+134
-0
RouteType.java
...eway/src/main/java/com/jz/dm/gateway/model/RouteType.java
+8
-0
Test.java
...gateway/src/main/java/com/jz/dm/gateway/service/Test.java
+14
-0
TradeAddService.java
...java/com/jz/dm/gateway/service/trade/TradeAddService.java
+29
-0
Md5.java
...gateway/src/main/java/com/jz/dm/gateway/signtype/Md5.java
+159
-0
SHA1WithRSA.java
...src/main/java/com/jz/dm/gateway/signtype/SHA1WithRSA.java
+230
-0
SHA256WithRSA.java
...c/main/java/com/jz/dm/gateway/signtype/SHA256WithRSA.java
+113
-0
ParamName.java
...main/java/com/jz/dm/gateway/web/annotation/ParamName.java
+19
-0
ParamNameAnnotationBinder.java
...m/jz/dm/gateway/web/binder/ParamNameAnnotationBinder.java
+34
-0
ParamNameAnnotationResolver.java
...jz/dm/gateway/web/binder/ParamNameAnnotationResolver.java
+68
-0
application-dev.yml
jz-dm-apigateway/src/main/resources/application-dev.yml
+49
-0
application-pro.yml
jz-dm-apigateway/src/main/resources/application-pro.yml
+33
-0
application.yml
jz-dm-apigateway/src/main/resources/application.yml
+45
-13
logback.xml
jz-dm-apigateway/src/main/resources/logback.xml
+131
-0
PushSdkLocalhostTest1.java
...pigateway/src/test/java/domian/PushSdkLocalhostTest1.java
+170
-0
No files found.
jz-dm-apigateway/pom.xml
View file @
50e9202a
<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"
>
<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>
<parent>
<groupId>
com.jz.dm
</groupId>
...
...
@@ -8,4 +9,68 @@
<artifactId>
jz-dm-apigateway
</artifactId>
<name>
jz-dm-apigateway
</name>
<description>
jz-dm-apigateway
</description>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-autoconfigure
</artifactId>
<version>
1.5.2.RELEASE
</version>
<scope>
compile
</scope>
</dependency>
<!--<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.0.RELEASE</version>
<scope>compile</scope>
</dependency>-->
<dependency>
<groupId>
org.mybatis
</groupId>
<artifactId>
mybatis-spring
</artifactId>
<version>
1.2.2
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
druid
</artifactId>
</dependency>
<dependency>
<groupId>
org.mybatis
</groupId>
<artifactId>
mybatis
</artifactId>
<version>
3.2.7
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-jdbc
</artifactId>
<version>
4.3.2.RELEASE
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
<version>
1.5.2.RELEASE
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpcore
</artifactId>
<version>
4.4.10
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpclient
</artifactId>
<version>
4.5.6
</version>
</dependency>
<dependency>
<groupId>
com.jz.common
</groupId>
<artifactId>
jz-dm-common
</artifactId>
<version>
1.0.0-SNAPSHOT
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/ApiGatewayApplication.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
;
import
org.mybatis.spring.annotation.MapperScan
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.annotation.ComponentScan
;
/**
* @author key
*/
@SpringBootApplication
@ComponentScan
(
basePackages
=
{
"com.jz.dm"
})
@MapperScan
(
"com.jz.dm.mapper"
)
public
class
ApiGatewayApplication
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
ApiGatewayApplication
.
class
,
args
);
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/Constants.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
;
/**
* 常量
*
*/
public
class
Constants
{
public
static
final
String
SIGN_TYPE_RSA
=
"RSA"
;
/**
* sha256WithRsa 算法请求类型
*/
public
static
final
String
SIGN_TYPE_RSA2
=
"RSA2"
;
public
static
final
String
SIGN_ALGORITHMS
=
"SHA1WithRSA"
;
public
static
final
String
SIGN_SHA256RSA_ALGORITHMS
=
"SHA256WithRSA"
;
public
static
final
String
ENCRYPT_TYPE_AES
=
"AES"
;
public
static
final
String
APP_ID
=
"app_id"
;
public
static
final
String
FORMAT
=
"format"
;
public
static
final
String
METHOD
=
"method"
;
public
static
final
String
TIMESTAMP
=
"timestamp"
;
public
static
final
String
VERSION
=
"version"
;
public
static
final
String
SIGN_TYPE
=
"sign_type"
;
public
static
final
String
SIGN
=
"sign"
;
public
static
final
String
CHARSET
=
"charset"
;
public
static
final
String
NOTIFY_URL
=
"notify_url"
;
public
static
final
String
RETURN_URL
=
"return_url"
;
public
static
final
String
ENCRYPT_TYPE
=
"encrypt_type"
;
public
static
final
String
PARAMS
=
"params"
;
public
static
final
String
RESPONSE
=
"response"
;
public
static
final
String
SUCCESS
=
"SUCCESS"
;
public
static
final
String
BUSINESS_ID
=
"business_id"
;
public
static
final
String
NOTIFY_TYPE
=
"notify_type"
;
public
static
final
String
NOTIFY_TIME
=
"notify_time"
;
/** 默认时间格式 **/
public
static
final
String
DATE_TIME_FORMAT
=
"yyyy-MM-dd HH:mm:ss"
;
/** Date默认时区 **/
public
static
final
String
DATE_TIMEZONE
=
"GMT+8"
;
/** UTF-8字符集 **/
public
static
final
String
CHARSET_UTF8
=
"UTF-8"
;
/** GBK字符集 **/
public
static
final
String
CHARSET_GBK
=
"GBK"
;
/** JSON 应格式 */
public
static
final
String
FORMAT_JSON
=
"JSON"
;
/** XML 应格式 */
public
static
final
String
FORMAT_XML
=
"XML"
;
/** 默认版本 */
public
static
final
String
DEFAULT_VERSION
=
"1.0.0"
;
public
static
final
int
FILTER_ORDER_0
=
0
;
public
static
final
int
FILTER_ORDER_1
=
1
;
public
static
final
int
FILTER_ORDER_2
=
2
;
public
static
final
int
FILTER_ORDER_3
=
3
;
public
static
final
int
FILTER_ORDER_4
=
4
;
public
static
final
int
FILTER_ORDER_5
=
5
;
public
static
final
int
FILTER_ORDER_6
=
6
;
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/StringUtil.java
0 → 100644
View file @
50e9202a
This source diff could not be displayed because it is too large. You can
view the blob
instead.
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/GatewayException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* 网关异常
*
*/
public
class
GatewayException
extends
OpenApiException
{
/** 序列号 */
private
static
final
long
serialVersionUID
=
3391018902219700916L
;
/**
* 构造函数
*
* @param resultCode
*/
public
GatewayException
(
ResultCode
resultCode
)
{
super
(
resultCode
);
}
/**
* 构造函数
*
* @param resultCode
* @param cause
*/
public
GatewayException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
resultCode
,
cause
);
}
/**
* 构造函数
*
* @param resultCode
* @param detailMessage
*/
public
GatewayException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
resultCode
,
detailMessage
);
}
/**
* 构造函数
*
* @param code
* @param msg
*/
public
GatewayException
(
String
code
,
String
msg
)
{
this
(
code
,
msg
,
(
Throwable
)
null
);
}
/**
* 构造函数
*
* @param code
* @param msg
* @param cause
*/
public
GatewayException
(
String
code
,
String
msg
,
Throwable
cause
)
{
super
(
code
,
msg
,
cause
);
}
/**
* 构造函数
*
* @param code
* @param msg
* @param detailMessage
*/
public
GatewayException
(
String
code
,
String
msg
,
String
detailMessage
)
{
super
(
code
,
msg
,
detailMessage
);
}
}
\ No newline at end of file
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/MessageDigestException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* 信息摘要异常
*
*/
public
class
MessageDigestException
extends
OpenApiException
{
private
static
final
long
serialVersionUID
=
477249046784548217L
;
/**
* 构造函数
* @param resultCode
*/
public
MessageDigestException
(
ResultCode
resultCode
)
{
super
(
resultCode
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
*/
public
MessageDigestException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
resultCode
,
detailMessage
);
}
/**
* 构造函数
* @param resultCode
* @param cause
*/
public
MessageDigestException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
resultCode
,
cause
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
* @param cause
*/
public
MessageDigestException
(
ResultCode
resultCode
,
String
detailMessage
,
Throwable
cause
)
{
super
(
resultCode
,
detailMessage
,
cause
);
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/NotifyException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* 通知异常
*
*/
public
class
NotifyException
extends
OpenApiException
{
/** 序列号 */
private
static
final
long
serialVersionUID
=
3391018902219700916L
;
/**
* 构造函数
*
* @param resultCode
*/
public
NotifyException
(
ResultCode
resultCode
)
{
super
(
resultCode
);
}
/**
* 构造函数
*
* @param resultCode
* @param cause
*/
public
NotifyException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
resultCode
,
cause
);
}
/**
* 构造函数
*
* @param resultCode
* @param detailMessage
*/
public
NotifyException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
resultCode
,
detailMessage
);
}
/**
* 构造函数
*
* @param code
* @param msg
*/
public
NotifyException
(
String
code
,
String
msg
)
{
this
(
code
,
msg
,
(
Throwable
)
null
);
}
/**
* 构造函数
*
* @param code
* @param msg
* @param cause
*/
public
NotifyException
(
String
code
,
String
msg
,
Throwable
cause
)
{
super
(
code
,
msg
,
cause
);
}
/**
* 构造函数
*
* @param code
* @param msg
* @param detailMessage
*/
public
NotifyException
(
String
code
,
String
msg
,
String
detailMessage
)
{
super
(
code
,
msg
,
detailMessage
);
}
}
\ No newline at end of file
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/OpenApiException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* openapi异常
*
*/
public
class
OpenApiException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
-
3963657380514719229L
;
/**
* 结果码
*/
private
ResultCode
resultCode
;
/**
* 构造函数
*
* @param resultCode
*/
public
OpenApiException
(
ResultCode
resultCode
)
{
this
.
resultCode
=
new
ResultCodeImpl
(
resultCode
);
}
/**
* 构造函数
*
* @param resultCode
* @param cause
*/
public
OpenApiException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
cause
);
this
.
resultCode
=
new
ResultCodeImpl
(
resultCode
);
}
/**
* 构造函数
*
* @param resultCode
* @param detailMessage
*/
public
OpenApiException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
detailMessage
);
this
.
resultCode
=
new
ResultCodeImpl
(
resultCode
);
}
/**
* 构造函数
*
* @param resultCode
* @param detailMessage
* @param cause
*/
public
OpenApiException
(
ResultCode
resultCode
,
String
detailMessage
,
Throwable
cause
)
{
super
(
detailMessage
,
cause
);
this
.
resultCode
=
new
ResultCodeImpl
(
resultCode
);
}
/**
* 构造函数
*
* @param code
* @param msg
*/
public
OpenApiException
(
String
code
,
String
msg
)
{
this
(
new
ResultCodeImpl
(
code
,
msg
));
}
/**
* 构造函数
*
* @param code
* @param msg
* @param cause
*/
public
OpenApiException
(
String
code
,
String
msg
,
Throwable
cause
)
{
this
(
new
ResultCodeImpl
(
code
,
msg
),
cause
);
}
/**
* 构造函数
*
* @param code
* @param msg
* @param detailMessage
*/
public
OpenApiException
(
String
code
,
String
msg
,
String
detailMessage
)
{
this
(
new
ResultCodeImpl
(
code
,
msg
),
detailMessage
);
}
/**
* Getter method for property <tt>resultCode</tt>.
*
* @return property value of resultCode
*/
public
ResultCode
getResultCode
()
{
return
resultCode
;
}
public
static
class
ResultCodeImpl
implements
ResultCode
{
private
String
code
;
private
String
msg
;
public
ResultCodeImpl
(
ResultCode
resultCode
)
{
this
.
code
=
resultCode
.
getCode
();
this
.
msg
=
resultCode
.
getMsg
();
}
public
ResultCodeImpl
(
String
code
,
String
msg
)
{
this
.
code
=
code
;
this
.
msg
=
msg
;
}
@Override
public
String
getCode
()
{
return
code
;
}
@Override
public
String
getMsg
()
{
return
msg
;
}
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/SecretException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* 加密异常
*
*/
public
class
SecretException
extends
OpenApiException
{
private
static
final
long
serialVersionUID
=
-
8597436175649786898L
;
/**
* 构造函数
* @param resultCode
*/
public
SecretException
(
ResultCode
resultCode
)
{
super
(
resultCode
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
*/
public
SecretException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
resultCode
,
detailMessage
);
}
/**
* 构造函数
* @param resultCode
* @param cause
*/
public
SecretException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
resultCode
,
cause
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
* @param cause
*/
public
SecretException
(
ResultCode
resultCode
,
String
detailMessage
,
Throwable
cause
)
{
super
(
resultCode
,
detailMessage
,
cause
);
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/exception/SignatureException.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
exception
;
import
com.jz.dm.gateway.common.util.ResultCode
;
/**
* 签名异常
*
*/
public
class
SignatureException
extends
OpenApiException
{
private
static
final
long
serialVersionUID
=
6551962245794846748L
;
/**
* 构造函数
*
* @param resultCode
*/
public
SignatureException
(
ResultCode
resultCode
)
{
super
(
resultCode
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
*/
public
SignatureException
(
ResultCode
resultCode
,
String
detailMessage
)
{
super
(
resultCode
,
detailMessage
);
}
/**
* 构造函数
* @param resultCode
* @param cause
*/
public
SignatureException
(
ResultCode
resultCode
,
Throwable
cause
)
{
super
(
resultCode
,
cause
);
}
/**
* 构造函数
* @param resultCode
* @param detailMessage
* @param cause
*/
public
SignatureException
(
ResultCode
resultCode
,
String
detailMessage
,
Throwable
cause
)
{
super
(
resultCode
,
detailMessage
,
cause
);
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/util/ArrayUtil.java
0 → 100644
View file @
50e9202a
This source diff could not be displayed because it is too large. You can
view the blob
instead.
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/util/Base64.java
0 → 100644
View file @
50e9202a
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* 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.
*/
package
com
.
jz
.
dm
.
gateway
.
common
.
util
;
import
org.apache.commons.codec.BinaryDecoder
;
import
org.apache.commons.codec.BinaryEncoder
;
import
org.apache.commons.codec.DecoderException
;
import
org.apache.commons.codec.EncoderException
;
/**
* Provides Base64 encoding and decoding as defined by RFC 2045.
*
* <p>This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite>
* from RFC 2045 <cite>Multipurpose Internet Mail Extensions (MIME) Part One:
* Format of Internet Message Bodies</cite> by Freed and Borenstein.</p>
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
* @author Apache Software Foundation
* @since 1.0-dev
* @version $Id: Base64.java,v 1.20 2004/05/24 00:21:24 ggregory Exp $
*/
public
class
Base64
implements
BinaryEncoder
,
BinaryDecoder
{
/**
* Chunk size per RFC 2045 section 6.8.
*
* <p>The {@value} character limit does not count the trailing CRLF, but counts
* all other characters, including any equal signs.</p>
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
*/
static
final
int
CHUNK_SIZE
=
76
;
/**
* Chunk separator per RFC 2045 section 2.1.
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
*/
static
final
byte
[]
CHUNK_SEPARATOR
=
"\r\n"
.
getBytes
();
/**
* The base length.
*/
static
final
int
BASELENGTH
=
255
;
/**
* Lookup length.
*/
static
final
int
LOOKUPLENGTH
=
64
;
/**
* Used to calculate the number of bits in a byte.
*/
static
final
int
EIGHTBIT
=
8
;
/**
* Used when encoding something which has fewer than 24 bits.
*/
static
final
int
SIXTEENBIT
=
16
;
/**
* Used to determine how many bits data contains.
*/
static
final
int
TWENTYFOURBITGROUP
=
24
;
/**
* Used to get the number of Quadruples.
*/
static
final
int
FOURBYTE
=
4
;
/**
* Used to test the sign of a byte.
*/
static
final
int
SIGN
=
-
128
;
/**
* Byte used to pad output.
*/
static
final
byte
PAD
=
(
byte
)
'='
;
// Create arrays to hold the base64 characters and a
// lookup for base64 chars
private
static
byte
[]
base64Alphabet
=
new
byte
[
BASELENGTH
];
private
static
byte
[]
lookUpBase64Alphabet
=
new
byte
[
LOOKUPLENGTH
];
// Populating the lookup and character arrays
static
{
for
(
int
i
=
0
;
i
<
BASELENGTH
;
i
++)
{
base64Alphabet
[
i
]
=
(
byte
)
-
1
;
}
for
(
int
i
=
'Z'
;
i
>=
'A'
;
i
--)
{
base64Alphabet
[
i
]
=
(
byte
)
(
i
-
'A'
);
}
for
(
int
i
=
'z'
;
i
>=
'a'
;
i
--)
{
base64Alphabet
[
i
]
=
(
byte
)
(
i
-
'a'
+
26
);
}
for
(
int
i
=
'9'
;
i
>=
'0'
;
i
--)
{
base64Alphabet
[
i
]
=
(
byte
)
(
i
-
'0'
+
52
);
}
base64Alphabet
[
'+'
]
=
62
;
base64Alphabet
[
'/'
]
=
63
;
for
(
int
i
=
0
;
i
<=
25
;
i
++)
{
lookUpBase64Alphabet
[
i
]
=
(
byte
)
(
'A'
+
i
);
}
for
(
int
i
=
26
,
j
=
0
;
i
<=
51
;
i
++,
j
++)
{
lookUpBase64Alphabet
[
i
]
=
(
byte
)
(
'a'
+
j
);
}
for
(
int
i
=
52
,
j
=
0
;
i
<=
61
;
i
++,
j
++)
{
lookUpBase64Alphabet
[
i
]
=
(
byte
)
(
'0'
+
j
);
}
lookUpBase64Alphabet
[
62
]
=
(
byte
)
'+'
;
lookUpBase64Alphabet
[
63
]
=
(
byte
)
'/'
;
}
private
static
boolean
isBase64
(
byte
octect
)
{
if
(
octect
==
PAD
)
{
return
true
;
}
else
if
(
base64Alphabet
[
octect
]
==
-
1
)
{
return
false
;
}
else
{
return
true
;
}
}
/**
* Tests a given byte array to see if it contains
* only valid characters within the Base64 alphabet.
*
* @param arrayOctect byte array to test
* @return true if all bytes are valid characters in the Base64
* alphabet or if the byte array is empty; false, otherwise
*/
public
static
boolean
isArrayByteBase64
(
byte
[]
arrayOctect
)
{
arrayOctect
=
discardWhitespace
(
arrayOctect
);
int
length
=
arrayOctect
.
length
;
if
(
length
==
0
)
{
// shouldn't a 0 length array be valid base64 data?
// return false;
return
true
;
}
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
if
(!
isBase64
(
arrayOctect
[
i
]))
{
return
false
;
}
}
return
true
;
}
/**
* Encodes binary data using the base64 algorithm but
* does not chunk the output.
*
* @param binaryData binary data to encode
* @return Base64 characters
*/
public
static
byte
[]
encodeBase64
(
byte
[]
binaryData
)
{
return
encodeBase64
(
binaryData
,
false
);
}
/**
* Encodes binary data using the base64 algorithm and chunks
* the encoded output into 76 character blocks
*
* @param binaryData binary data to encode
* @return Base64 characters chunked in 76 character blocks
*/
public
static
byte
[]
encodeBase64Chunked
(
byte
[]
binaryData
)
{
return
encodeBase64
(
binaryData
,
true
);
}
/**
* Decodes an Object using the base64 algorithm. This method
* is provided in order to satisfy the requirements of the
* Decoder interface, and will throw a DecoderException if the
* supplied object is not of type byte[].
*
* @param pObject Object to decode
* @return An object (of type byte[]) containing the
* binary data which corresponds to the byte[] supplied.
* @throws DecoderException if the parameter supplied is not
* of type byte[]
*/
@Override
public
Object
decode
(
Object
pObject
)
throws
DecoderException
{
if
(!(
pObject
instanceof
byte
[]))
{
throw
new
DecoderException
(
"Parameter supplied to Base64 decode is not a byte[]"
);
}
return
decode
((
byte
[])
pObject
);
}
/**
* Decodes a byte[] containing containing
* characters in the Base64 alphabet.
*
* @param pArray A byte array containing Base64 character data
* @return a byte array containing binary data
*/
@Override
public
byte
[]
decode
(
byte
[]
pArray
)
{
return
decodeBase64
(
pArray
);
}
/**
* Encodes binary data using the base64 algorithm, optionally
* chunking the output into 76 character blocks.
*
* @param binaryData Array containing binary data to encode.
* @param isChunked if isChunked is true this encoder will chunk
* the base64 output into 76 character blocks
* @return Base64-encoded data.
*/
public
static
byte
[]
encodeBase64
(
byte
[]
binaryData
,
boolean
isChunked
)
{
int
lengthDataBits
=
binaryData
.
length
*
EIGHTBIT
;
int
fewerThan24bits
=
lengthDataBits
%
TWENTYFOURBITGROUP
;
int
numberTriplets
=
lengthDataBits
/
TWENTYFOURBITGROUP
;
byte
encodedData
[]
=
null
;
int
encodedDataLength
=
0
;
int
nbrChunks
=
0
;
if
(
fewerThan24bits
!=
0
)
{
//data not divisible by 24 bit
encodedDataLength
=
(
numberTriplets
+
1
)
*
4
;
}
else
{
// 16 or 8 bit
encodedDataLength
=
numberTriplets
*
4
;
}
// If the output is to be "chunked" into 76 character sections,
// for compliance with RFC 2045 MIME, then it is important to
// allow for extra length to account for the separator(s)
if
(
isChunked
)
{
nbrChunks
=
(
CHUNK_SEPARATOR
.
length
==
0
?
0
:
(
int
)
Math
.
ceil
((
float
)
encodedDataLength
/
CHUNK_SIZE
));
encodedDataLength
+=
nbrChunks
*
CHUNK_SEPARATOR
.
length
;
}
encodedData
=
new
byte
[
encodedDataLength
];
byte
k
=
0
,
l
=
0
,
b1
=
0
,
b2
=
0
,
b3
=
0
;
int
encodedIndex
=
0
;
int
dataIndex
=
0
;
int
i
=
0
;
int
nextSeparatorIndex
=
CHUNK_SIZE
;
int
chunksSoFar
=
0
;
//log.debug("number of triplets = " + numberTriplets);
for
(
i
=
0
;
i
<
numberTriplets
;
i
++)
{
dataIndex
=
i
*
3
;
b1
=
binaryData
[
dataIndex
];
b2
=
binaryData
[
dataIndex
+
1
];
b3
=
binaryData
[
dataIndex
+
2
];
//log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3);
l
=
(
byte
)
(
b2
&
0x0f
);
k
=
(
byte
)
(
b1
&
0x03
);
byte
val1
=
((
b1
&
SIGN
)
==
0
)
?
(
byte
)
(
b1
>>
2
)
:
(
byte
)
((
b1
)
>>
2
^
0xc0
);
byte
val2
=
((
b2
&
SIGN
)
==
0
)
?
(
byte
)
(
b2
>>
4
)
:
(
byte
)
((
b2
)
>>
4
^
0xf0
);
byte
val3
=
((
b3
&
SIGN
)
==
0
)
?
(
byte
)
(
b3
>>
6
)
:
(
byte
)
((
b3
)
>>
6
^
0xfc
);
encodedData
[
encodedIndex
]
=
lookUpBase64Alphabet
[
val1
];
//log.debug( "val2 = " + val2 );
//log.debug( "k4 = " + (k<<4) );
//log.debug( "vak = " + (val2 | (k<<4)) );
encodedData
[
encodedIndex
+
1
]
=
lookUpBase64Alphabet
[
val2
|
(
k
<<
4
)];
encodedData
[
encodedIndex
+
2
]
=
lookUpBase64Alphabet
[(
l
<<
2
)
|
val3
];
encodedData
[
encodedIndex
+
3
]
=
lookUpBase64Alphabet
[
b3
&
0x3f
];
encodedIndex
+=
4
;
// If we are chunking, let's put a chunk separator down.
if
(
isChunked
)
{
// this assumes that CHUNK_SIZE % 4 == 0
if
(
encodedIndex
==
nextSeparatorIndex
)
{
System
.
arraycopy
(
CHUNK_SEPARATOR
,
0
,
encodedData
,
encodedIndex
,
CHUNK_SEPARATOR
.
length
);
chunksSoFar
++;
nextSeparatorIndex
=
(
CHUNK_SIZE
*
(
chunksSoFar
+
1
))
+
(
chunksSoFar
*
CHUNK_SEPARATOR
.
length
);
encodedIndex
+=
CHUNK_SEPARATOR
.
length
;
}
}
}
// form integral number of 6-bit groups
dataIndex
=
i
*
3
;
if
(
fewerThan24bits
==
EIGHTBIT
)
{
b1
=
binaryData
[
dataIndex
];
k
=
(
byte
)
(
b1
&
0x03
);
//log.debug("b1=" + b1);
//log.debug("b1<<2 = " + (b1>>2) );
byte
val1
=
((
b1
&
SIGN
)
==
0
)
?
(
byte
)
(
b1
>>
2
)
:
(
byte
)
((
b1
)
>>
2
^
0xc0
);
encodedData
[
encodedIndex
]
=
lookUpBase64Alphabet
[
val1
];
encodedData
[
encodedIndex
+
1
]
=
lookUpBase64Alphabet
[
k
<<
4
];
encodedData
[
encodedIndex
+
2
]
=
PAD
;
encodedData
[
encodedIndex
+
3
]
=
PAD
;
}
else
if
(
fewerThan24bits
==
SIXTEENBIT
)
{
b1
=
binaryData
[
dataIndex
];
b2
=
binaryData
[
dataIndex
+
1
];
l
=
(
byte
)
(
b2
&
0x0f
);
k
=
(
byte
)
(
b1
&
0x03
);
byte
val1
=
((
b1
&
SIGN
)
==
0
)
?
(
byte
)
(
b1
>>
2
)
:
(
byte
)
((
b1
)
>>
2
^
0xc0
);
byte
val2
=
((
b2
&
SIGN
)
==
0
)
?
(
byte
)
(
b2
>>
4
)
:
(
byte
)
((
b2
)
>>
4
^
0xf0
);
encodedData
[
encodedIndex
]
=
lookUpBase64Alphabet
[
val1
];
encodedData
[
encodedIndex
+
1
]
=
lookUpBase64Alphabet
[
val2
|
(
k
<<
4
)];
encodedData
[
encodedIndex
+
2
]
=
lookUpBase64Alphabet
[
l
<<
2
];
encodedData
[
encodedIndex
+
3
]
=
PAD
;
}
if
(
isChunked
)
{
// we also add a separator to the end of the final chunk.
if
(
chunksSoFar
<
nbrChunks
)
{
System
.
arraycopy
(
CHUNK_SEPARATOR
,
0
,
encodedData
,
encodedDataLength
-
CHUNK_SEPARATOR
.
length
,
CHUNK_SEPARATOR
.
length
);
}
}
return
encodedData
;
}
/**
* Decodes Base64 data into octects
*
* @param base64Data Byte array containing Base64 data
* @return Array containing decoded data.
*/
public
static
byte
[]
decodeBase64
(
byte
[]
base64Data
)
{
// RFC 2045 requires that we discard ALL non-Base64 characters
base64Data
=
discardNonBase64
(
base64Data
);
// handle the edge case, so we don't have to worry about it later
if
(
base64Data
.
length
==
0
)
{
return
new
byte
[
0
];
}
int
numberQuadruple
=
base64Data
.
length
/
FOURBYTE
;
byte
decodedData
[]
=
null
;
byte
b1
=
0
,
b2
=
0
,
b3
=
0
,
b4
=
0
,
marker0
=
0
,
marker1
=
0
;
// Throw away anything not in base64Data
int
encodedIndex
=
0
;
int
dataIndex
=
0
;
{
// this sizes the output array properly - rlw
int
lastData
=
base64Data
.
length
;
// ignore the '=' padding
while
(
base64Data
[
lastData
-
1
]
==
PAD
)
{
if
(--
lastData
==
0
)
{
return
new
byte
[
0
];
}
}
decodedData
=
new
byte
[
lastData
-
numberQuadruple
];
}
for
(
int
i
=
0
;
i
<
numberQuadruple
;
i
++)
{
dataIndex
=
i
*
4
;
marker0
=
base64Data
[
dataIndex
+
2
];
marker1
=
base64Data
[
dataIndex
+
3
];
b1
=
base64Alphabet
[
base64Data
[
dataIndex
]];
b2
=
base64Alphabet
[
base64Data
[
dataIndex
+
1
]];
if
(
marker0
!=
PAD
&&
marker1
!=
PAD
)
{
//No PAD e.g 3cQl
b3
=
base64Alphabet
[
marker0
];
b4
=
base64Alphabet
[
marker1
];
decodedData
[
encodedIndex
]
=
(
byte
)
(
b1
<<
2
|
b2
>>
4
);
decodedData
[
encodedIndex
+
1
]
=
(
byte
)
(((
b2
&
0xf
)
<<
4
)
|
((
b3
>>
2
)
&
0xf
));
decodedData
[
encodedIndex
+
2
]
=
(
byte
)
(
b3
<<
6
|
b4
);
}
else
if
(
marker0
==
PAD
)
{
//Two PAD e.g. 3c[Pad][Pad]
decodedData
[
encodedIndex
]
=
(
byte
)
(
b1
<<
2
|
b2
>>
4
);
}
else
if
(
marker1
==
PAD
)
{
//One PAD e.g. 3cQ[Pad]
b3
=
base64Alphabet
[
marker0
];
decodedData
[
encodedIndex
]
=
(
byte
)
(
b1
<<
2
|
b2
>>
4
);
decodedData
[
encodedIndex
+
1
]
=
(
byte
)
(((
b2
&
0xf
)
<<
4
)
|
((
b3
>>
2
)
&
0xf
));
}
encodedIndex
+=
3
;
}
return
decodedData
;
}
/**
* Discards any whitespace from a base-64 encoded block.
*
* @param data The base-64 encoded data to discard the whitespace
* from.
* @return The data, less whitespace (see RFC 2045).
*/
static
byte
[]
discardWhitespace
(
byte
[]
data
)
{
byte
groomedData
[]
=
new
byte
[
data
.
length
];
int
bytesCopied
=
0
;
for
(
int
i
=
0
;
i
<
data
.
length
;
i
++)
{
switch
(
data
[
i
])
{
case
(
byte
)
' '
:
case
(
byte
)
'\n'
:
case
(
byte
)
'\r'
:
case
(
byte
)
'\t'
:
break
;
default
:
groomedData
[
bytesCopied
++]
=
data
[
i
];
}
}
byte
packedData
[]
=
new
byte
[
bytesCopied
];
System
.
arraycopy
(
groomedData
,
0
,
packedData
,
0
,
bytesCopied
);
return
packedData
;
}
/**
* Discards any characters outside of the base64 alphabet, per
* the requirements on page 25 of RFC 2045 - "Any characters
* outside of the base64 alphabet are to be ignored in base64
* encoded data."
*
* @param data The base-64 encoded data to groom
* @return The data, less non-base64 characters (see RFC 2045).
*/
static
byte
[]
discardNonBase64
(
byte
[]
data
)
{
byte
groomedData
[]
=
new
byte
[
data
.
length
];
int
bytesCopied
=
0
;
for
(
int
i
=
0
;
i
<
data
.
length
;
i
++)
{
if
(
isBase64
(
data
[
i
]))
{
groomedData
[
bytesCopied
++]
=
data
[
i
];
}
}
byte
packedData
[]
=
new
byte
[
bytesCopied
];
System
.
arraycopy
(
groomedData
,
0
,
packedData
,
0
,
bytesCopied
);
return
packedData
;
}
// Implementation of the Encoder Interface
/**
* Encodes an Object using the base64 algorithm. This method
* is provided in order to satisfy the requirements of the
* Encoder interface, and will throw an EncoderException if the
* supplied object is not of type byte[].
*
* @param pObject Object to encode
* @return An object (of type byte[]) containing the
* base64 encoded data which corresponds to the byte[] supplied.
* @throws EncoderException if the parameter supplied is not
* of type byte[]
*/
@Override
public
Object
encode
(
Object
pObject
)
throws
EncoderException
{
if
(!(
pObject
instanceof
byte
[]))
{
throw
new
EncoderException
(
"Parameter supplied to Base64 encode is not a byte[]"
);
}
return
encode
((
byte
[])
pObject
);
}
/**
* Encodes a byte[] containing binary data, into a byte[] containing
* characters in the Base64 alphabet.
*
* @param pArray a byte array containing binary data
* @return A byte array containing only Base64 character data
*/
@Override
public
byte
[]
encode
(
byte
[]
pArray
)
{
return
encodeBase64
(
pArray
,
false
);
}
public
static
void
main
(
String
[]
args
)
throws
EncoderException
,
DecoderException
{
// aGVsbG8gd29ybGQ=
// aGVsbG8gd29ybGQ=
System
.
out
.
println
(
new
Base64
().
encode
(
"hello world"
.
getBytes
()).
getClass
());
System
.
out
.
println
(
new
String
(
new
Base64
().
encode
(
"hello world"
.
getBytes
())));
System
.
out
.
println
(
new
String
(
new
Base64
().
decode
(
"aGVsbG8gd29ybGQ="
.
getBytes
())));
}
}
jz-dm-apigateway/src/main/java/com/jz/dm/gateway/common/util/ClassUtil.java
0 → 100644
View file @
50e9202a
package
com
.
jz
.
dm
.
gateway
.
common
.
util
;
import
com.jz.dm.gateway.common.StringUtil
;
import
java.lang.reflect.Array
;
import
java.util.*
;
/**
* <code>Class</code> 处理工具类
*
*/
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
public
class
ClassUtil
{
/** 资源文件的分隔符: <code>'/'</code>。 */
public
static
final
char
RESOURCE_SEPARATOR_CHAR
=
'/'
;
/** Java类名的分隔符: <code>'.'</code>。 */
public
static
final
char
PACKAGE_SEPARATOR_CHAR
=
'.'
;
/** Java类名的分隔符: <code>"."</code>。 */
public
static
final
String
PACKAGE_SEPARATOR
=
String
.
valueOf
(
PACKAGE_SEPARATOR_CHAR
);
/** 内联类的分隔符: <code>'$'</code>。 */
public
static
final
char
INNER_CLASS_SEPARATOR_CHAR
=
'$'
;
/** 内联类的分隔符: <code>"$"</code>。 */
public
static
final
String
INNER_CLASS_SEPARATOR
=
String
.
valueOf
(
INNER_CLASS_SEPARATOR_CHAR
);
/** 所有类的信息表,包括父类, 接口, 数组的维数等信息。 */
private
static
Map
TYPE_MAP
=
Collections
.
synchronizedMap
(
new
WeakHashMap
());
/* ============================================================================ */
/* 取得类名和package名的方法。 */
/* ============================================================================ */
/**
* 取得对象所属的类的直观类名。
*
* <p>
* 相当于 <code>object.getClass().getName()</code> ,但不同的是,该方法用更直观的方式显示数组类型。 例如:
* <pre>
* int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
*
* Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
* </pre>
* </p>
*
* <p>
* 对于非数组的类型,该方法等效于 <code>Class.getName()</code> 方法。
* </p>
*
* <p>
* 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 <code>Class.forName</code> 操作。
* </p>
*
* @param object 要显示类名的对象
*
* @return 用于显示的直观类名,如果原类名为空或非法,则返回 <code>null</code>
*/
public
static
String
getClassNameForObject
(
Object
object
)
{
if
(
object
==
null
)
{
return
null
;
}
return
getClassName
(
object
.
getClass
().
getName
(),
true
);
}
/**
* 取得直观的类名。
*
* <p>
* 相当于 <code>clazz.getName()</code> ,但不同的是,该方法用更直观的方式显示数组类型。 例如:
* <pre>
* int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
*
* Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
* </pre>
* </p>
*
* <p>
* 对于非数组的类型,该方法等效于 <code>Class.getName()</code> 方法。
* </p>
*
* <p>
* 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 <code>Class.forName</code> 操作。
* </p>
*
* @param clazz 要显示类名的类
*
* @return 用于显示的直观类名,如果原始类为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getClassName
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
null
;
}
return
getClassName
(
clazz
.
getName
(),
true
);
}
/**
* 取得直观的类名。
*
* <p>
* <code>className</code> 必须是从 <code>clazz.getName()</code> 所返回的合法类名。该方法用更直观的方式显示数组类型。 例如:
* <pre>
* int[].class.getName() = "[I" ClassUtil.getClassName(int[].class) = "int[]"
*
* Integer[][].class.getName() = "[[Ljava.lang.Integer;" ClassUtil.getClassName(Integer[][].class) = "java.lang.Integer[][]"
* </pre>
* </p>
*
* <p>
* 对于非数组的类型,该方法等效于 <code>Class.getName()</code> 方法。
* </p>
*
* <p>
* 注意,该方法所返回的数组类名只能用于显示给人看,不能用于 <code>Class.forName</code> 操作。
* </p>
*
* @param className 要显示的类名
*
* @return 用于显示的直观类名,如果原类名为 <code>null</code> ,则返回 <code>null</code> ,如果原类名是非法的,则返回原类名
*/
public
static
String
getClassName
(
String
className
)
{
return
getClassName
(
className
,
true
);
}
/**
* 取得直观的类名。
*
* @param className 类名
* @param processInnerClass 是否将内联类分隔符 <code>'$'</code> 转换成 <code>'.'</code>
*
* @return 直观的类名,或 <code>null</code>
*/
private
static
String
getClassName
(
String
className
,
boolean
processInnerClass
)
{
if
(
StringUtil
.
isEmpty
(
className
))
{
return
className
;
}
if
(
processInnerClass
)
{
className
=
className
.
replace
(
INNER_CLASS_SEPARATOR_CHAR
,
PACKAGE_SEPARATOR_CHAR
);
}
int
length
=
className
.
length
();
int
dimension
=
0
;
// 取得数组的维数,如果不是数组,维数为0
for
(
int
i
=
0
;
i
<
length
;
i
++,
dimension
++)
{
if
(
className
.
charAt
(
i
)
!=
'['
)
{
break
;
}
}
// 如果不是数组,则直接返回
if
(
dimension
==
0
)
{
return
className
;
}
// 确保类名合法
if
(
length
<=
dimension
)
{
return
className
;
// 非法类名
}
// 处理数组
StringBuffer
componentTypeName
=
new
StringBuffer
();
switch
(
className
.
charAt
(
dimension
))
{
case
'Z'
:
componentTypeName
.
append
(
"boolean"
);
break
;
case
'B'
:
componentTypeName
.
append
(
"byte"
);
break
;
case
'C'
:
componentTypeName
.
append
(
"char"
);
break
;
case
'D'
:
componentTypeName
.
append
(
"double"
);
break
;
case
'F'
:
componentTypeName
.
append
(
"float"
);
break
;
case
'I'
:
componentTypeName
.
append
(
"int"
);
break
;
case
'J'
:
componentTypeName
.
append
(
"long"
);
break
;
case
'S'
:
componentTypeName
.
append
(
"short"
);
break
;
case
'L'
:
if
((
className
.
charAt
(
length
-
1
)
!=
';'
)
||
(
length
<=
(
dimension
+
2
)))
{
return
className
;
// 非法类名
}
componentTypeName
.
append
(
className
.
substring
(
dimension
+
1
,
length
-
1
));
break
;
default
:
return
className
;
// 非法类名
}
for
(
int
i
=
0
;
i
<
dimension
;
i
++)
{
componentTypeName
.
append
(
"[]"
);
}
return
componentTypeName
.
toString
();
}
/**
* 取得指定对象所属的类的短类名,不包括package名。
*
* <p>
* 此方法可以正确显示数组和内联类的名称。
* </p>
*
* <p>
* 例如:
* <pre>
* ClassUtil.getShortClassNameForObject(Boolean.TRUE) = "Boolean" ClassUtil.getShortClassNameForObject(new Boolean[10]) = "Boolean[]" ClassUtil.getShortClassNameForObject(new int[1][2]) = "int[][]"
* </pre>
* </p>
*
* @param object 要查看的对象
*
* @return 短类名,如果对象为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getShortClassNameForObject
(
Object
object
)
{
if
(
object
==
null
)
{
return
null
;
}
return
getShortClassName
(
object
.
getClass
().
getName
());
}
/**
* 取得短类名,不包括package名。
*
* <p>
* 此方法可以正确显示数组和内联类的名称。
* </p>
*
* <p>
* 例如:
* <pre>
* ClassUtil.getShortClassName(Boolean.class) = "Boolean" ClassUtil.getShortClassName(Boolean[].class) = "Boolean[]" ClassUtil.getShortClassName(int[][].class) = "int[][]" ClassUtil.getShortClassName(Map.Entry.class) = "Map.Entry"
* </pre>
* </p>
*
* @param clazz 要查看的类
*
* @return 短类名,如果类为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getShortClassName
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
null
;
}
return
getShortClassName
(
clazz
.
getName
());
}
/**
* 取得类名,不包括package名。
*
* <p>
* 此方法可以正确显示数组和内联类的名称。
* </p>
*
* <p>
* 例如:
* <pre>
* ClassUtil.getShortClassName(Boolean.class.getName()) = "Boolean" ClassUtil.getShortClassName(Boolean[].class.getName()) = "Boolean[]" ClassUtil.getShortClassName(int[][].class.getName()) = "int[][]" ClassUtil.getShortClassName(Map.Entry.class.getName()) = "Map.Entry"
* </pre>
* </p>
*
* @param className 要查看的类名
*
* @return 短类名,如果类名为空,则返回 <code>null</code>
*/
public
static
String
getShortClassName
(
String
className
)
{
if
(
StringUtil
.
isEmpty
(
className
))
{
return
className
;
}
// 转换成直观的类名
className
=
getClassName
(
className
,
false
);
char
[]
chars
=
className
.
toCharArray
();
int
lastDot
=
0
;
for
(
int
i
=
0
;
i
<
chars
.
length
;
i
++)
{
if
(
chars
[
i
]
==
PACKAGE_SEPARATOR_CHAR
)
{
lastDot
=
i
+
1
;
}
else
if
(
chars
[
i
]
==
INNER_CLASS_SEPARATOR_CHAR
)
{
chars
[
i
]
=
PACKAGE_SEPARATOR_CHAR
;
}
}
return
new
String
(
chars
,
lastDot
,
chars
.
length
-
lastDot
);
}
/**
* 取得指定对象所属的类的package名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param object 要查看的对象
*
* @return package名,如果对象为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getPackageNameForObject
(
Object
object
)
{
if
(
object
==
null
)
{
return
null
;
}
return
getPackageName
(
object
.
getClass
().
getName
());
}
/**
* 取得指定类的package名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param clazz 要查看的类
*
* @return package名,如果类为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getPackageName
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
null
;
}
return
getPackageName
(
clazz
.
getName
());
}
/**
* 取得指定类名的package名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param className 要查看的类名
*
* @return package名,如果类名为空,则返回 <code>null</code>
*/
public
static
String
getPackageName
(
String
className
)
{
if
(
StringUtil
.
isEmpty
(
className
))
{
return
null
;
}
// 转换成直观的类名
className
=
getClassName
(
className
,
false
);
int
i
=
className
.
lastIndexOf
(
PACKAGE_SEPARATOR_CHAR
);
if
(
i
==
-
1
)
{
return
""
;
}
return
className
.
substring
(
0
,
i
);
}
/* ============================================================================ */
/* 取得类名和package名的resource名的方法。 */
/* */
/* 和类名、package名不同的是,resource名符合文件名命名规范,例如: */
/* java/lang/String.class */
/* com/alibaba/commons/lang */
/* etc. */
/* ============================================================================ */
/**
* 取得对象所属的类的资源名。
*
* <p>
* 例如:
* <pre>
* ClassUtil.getClassNameForObjectAsResource("This is a string") = "java/lang/String.class"
* </pre>
* </p>
*
* @param object 要显示类名的对象
*
* @return 指定对象所属类的资源名,如果对象为空,则返回<code>null</code>
*/
public
static
String
getClassNameForObjectAsResource
(
Object
object
)
{
if
(
object
==
null
)
{
return
null
;
}
return
object
.
getClass
().
getName
().
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
)
+
".class"
;
}
/**
* 取得指定类的资源名。
*
* <p>
* 例如:
* <pre>
* ClassUtil.getClassNameAsResource(String.class) = "java/lang/String.class"
* </pre>
* </p>
*
* @param clazz 要显示类名的类
*
* @return 指定类的资源名,如果指定类为空,则返回<code>null</code>
*/
public
static
String
getClassNameAsResource
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
null
;
}
return
clazz
.
getName
().
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
)
+
".class"
;
}
/**
* 取得指定类的资源名。
*
* <p>
* 例如:
* <pre>
* ClassUtil.getClassNameAsResource("java.lang.String") = "java/lang/String.class"
* </pre>
* </p>
*
* @param className 要显示的类名
*
* @return 指定类名对应的资源名,如果指定类名为空,则返回<code>null</code>
*/
public
static
String
getClassNameAsResource
(
String
className
)
{
if
(
className
==
null
)
{
return
null
;
}
return
className
.
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
)
+
".class"
;
}
/**
* 取得指定对象所属的类的package名的资源名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param object 要查看的对象
*
* @return package名,如果对象为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getPackageNameForObjectAsResource
(
Object
object
)
{
if
(
object
==
null
)
{
return
null
;
}
return
getPackageNameForObject
(
object
).
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
);
}
/**
* 取得指定类的package名的资源名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param clazz 要查看的类
*
* @return package名,如果类为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
String
getPackageNameAsResource
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
null
;
}
return
getPackageName
(
clazz
).
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
);
}
/**
* 取得指定类名的package名的资源名。
*
* <p>
* 对于数组,此方法返回的是数组元素类型的package名。
* </p>
*
* @param className 要查看的类名
*
* @return package名,如果类名为空,则返回 <code>null</code>
*/
public
static
String
getPackageNameAsResource
(
String
className
)
{
if
(
className
==
null
)
{
return
null
;
}
return
getPackageName
(
className
).
replace
(
PACKAGE_SEPARATOR_CHAR
,
RESOURCE_SEPARATOR_CHAR
);
}
/* ============================================================================ */
/* 取得类的信息,如父类, 接口, 数组的维数等。 */
/* ============================================================================ */
/**
* 取得指定维数的 <code>Array</code>类.
*
* @param componentType 数组的基类
* @param dimension 维数,如果小于 <code>0</code> 则看作 <code>0</code>
*
* @return 如果维数为0, 则返回基类本身, 否则返回数组类,如果数组的基类为 <code>null</code> ,则返回 <code>null</code>
*/
public
static
Class
getArrayClass
(
Class
componentType
,
int
dimension
)
{
if
(
dimension
<=
0
)
{
return
componentType
;
}
if
(
componentType
==
null
)
{
return
null
;
}
return
Array
.
newInstance
(
componentType
,
new
int
[
dimension
]).
getClass
();
}
/**
* 取得数组元素的类型。
*
* @param type 要查找的类
*
* @return 如果是数组, 则返回数组元素的类型, 否则返回 <code>null</code>
*/
public
static
Class
getArrayComponentType
(
Class
type
)
{
if
(
type
==
null
)
{
return
null
;
}
return
getTypeInfo
(
type
).
getArrayComponentType
();
}
/**
* 取得数组的维数。
*
* @param clazz 要查找的类
*
* @return 数组的维数. 如果不是数组, 则返回 <code>0</code> ,如果数组为 <code>null</code> ,是返回 <code>-1</code>
*/
public
static
int
getArrayDimension
(
Class
clazz
)
{
if
(
clazz
==
null
)
{
return
-
1
;
}
return
getTypeInfo
(
clazz
).
getArrayDimension
();
}
/**
* 取得指定类的所有父类。
*
* <p>
* 对于一个 <code>Class</code> 实例,如果它不是接口,也不是数组,此方法依次列出从该类的父类开始直到 <code>Object</code> 的所有类。
* </p>
*
* <p>
* 例如 <code>ClassUtil.getSuperclasses(java.util.ArrayList.class)</code> 返回以下列表:
*
* <ol>
* <li>
* <code>java.util.AbstractList</code>
* </li>
* <li>
* <code>java.util.AbstractCollection</code>
* </li>
* <li>
* <code>java.lang.Object</code>
* </li>
* </ol>
* </p>
*
* <p>
* 对于一个接口,此方法返回一个空列表。
* </p>
*
* <p>
* 例如<code>ClassUtil.getSuperclasses(java.util.List.class)</code>将返回一个空列表。
* </p>
*
* <p>
* 对于一个数组,此方法返回一个列表,列出所有component类型的父类的相同维数的数组类型。 例如:
* <code>ClassUtil.getSuperclasses(java.util.ArrayList[][].class)</code> 返回以下列表:
*
* <ol>
* <li>
* <code>java.util.AbstractList[][]</code>
* </li>
* <li>
* <code>java.util.AbstractCollection[][]</code>
* </li>
* <li>
* <code>java.lang.Object[][]</code>
* </li>
* <li>
* <code>java.lang.Object[]</code>
* </li>
* <li>
* <code>java.lang.Object</code>
* </li>
* </ol>
*
* 注意,原子类型及其数组,将被转换成相应的包装类来处理。 例如: <code>ClassUtil.getSuperclasses(int[][].class)</code>
* 返回以下列表:
*
* <ol>
* <li>
* <code>java.lang.Number[][]</code>
* </li>
* <li>
* <code>java.lang.Object[][]</code>
* </li>
* <li>
* <code>java.lang.Object[]</code>
* </li>
* <li>
* <code>java.lang.Object</code>
* </li>
* </ol>
* </p>
*
* @param clazz 要查找的类
*
* @return 所有父类的列表,如果指定类为 <code>null</code> ,则返回 <code>null</code>