43 Commits

Author SHA1 Message Date
yanlongqi
717792f057 删除额外的文件 2025-11-22 18:43:57 +08:00
yanlongqi
70c9f2deaf fix: 统一项目版本号并修复Maven Central发布配置
- 将父项目版本从2.0.5升级到2.0.6
- 移除子项目中的硬编码版本号,改为继承父项目版本
- 将内部依赖引用改为使用${project.version}变量
- 添加RELEASE-2.0.6.md发布说明文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 18:42:07 +08:00
yanlongqi
db26e8fae6 docs: 完善README文档和优化测试代码格式
- 更新版本信息,添加JH_Appform_6.5_Release支持
- 完善Spring配置示例,修正init-method为setExecution
- 新增全局用户获取方式配置示例(JHApiRequestHandler)
- 更新依赖版本号到2.0.6
- 优化测试代码格式,统一API执行器获取方式
- 改进文档结构和代码示例的可读性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 18:17:27 +08:00
yanlongqi
5c5b9c198e feat: 优化JSON序列化输出和测试代码格式
- 为JsonUtil添加格式化输出功能,启用INDENT_OUTPUT提高可读性
- 优化AppApiTest中的输出格式,使用JsonUtil格式化输出并改进显示格式
- 更新JobApiTest中的测试参数

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 18:00:34 +08:00
yanlongqi
bc36e3d0ac feat: 为所有API执行器添加不带用户名参数的重载方法
- JHAppApiExecution: 新增21个重载方法
- JHDataApiExecution: 新增6个重载方法
- JHFileApiExecution: 新增26个重载方法,优化HTTP资源管理
- JHDepartmentApiExecution: 新增4个重载方法
- JHUserApiExecution: 新增8个重载方法,优化密码类型处理

主要改进:
- 统一重载方法规则:紧跟原方法,调用传入null用户名
- 支持JHApiRequestHandler自动获取用户名,简化API调用
- 修复HTTP连接资源泄露问题,使用try-with-resources
- 优化Token缓存线程安全性,使用原子操作
- 保持向后兼容性,原有方法签名不变
- 重构重载方法组织结构,提高代码可读性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 17:39:52 +08:00
yanlongqi
08a56f782a fix: 修复HTTP连接资源泄露和Token缓存线程安全问题
- 修复HTTP连接资源管理问题
  * 所有HTTP请求方法使用try-with-resources确保InputStream自动关闭
  * 添加EntityUtils.consume确保HTTP响应实体被完全消费
  * 引入必要的Apache HttpClient工具类

- 修复Token缓存线程安全问题
  * 使用computeIfAbsent确保首次创建token的原子性操作
  * 实现双重检查锁定机制避免重复获取token
  * 提取createNewTokenInfo方法提高代码可读性和复用性

- 性能和稳定性提升
  * 消除HTTP连接泄露风险,提高连接池利用率
  * 解决多线程环境下的token竞争问题
  * 减少重复token请求,提升高并发场景下系统稳定性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 15:33:01 +08:00
yanlongqi
1c00f7eaee refactor: 重构API请求处理架构和用户管理
- 新增JHApiRequestHandler接口支持自定义请求头处理
- 重构JHApiExecutionAbstract为依赖注入提供更好支持
- 优化JHRequestExecution支持用户上下文管理
- 增强Spring Boot自动配置支持请求处理器注入
- 更新版本号至2.0.6
- 删除废弃的JHApiExecution类
- 修正测试类中的命名错误

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 15:07:43 +08:00
yanlongqi
360e30c4ff refactor: 优化API执行器架构和HTTP客户端配置
引入JHApiExecutionAbstract抽象类统一管理API执行器,所有执行器从实现JHApiExecution接口改为继承该抽象类,简化代码结构并提高可扩展性。同时优化HTTP客户端配置的灵活性,支持按需配置超时和连接参数。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 11:59:18 +08:00
yanlongqi
69c4037b4b feat: 增强应用和文件API功能
主要更新:
- AppInfo: 添加了icon、os、type等字段的详细文档说明
- AppTypeConstant: 新增应用类型分类工具类,支持按类型、操作系统、分类筛选应用
- Confidential: 实现文件密级管理功能,包括获取密级列表和标密操作
- JHAppApiExecution: 重构getWebSessionUrl方法,改为通过API获取会话URL
- JHFileApiExecution: 新增getConfList和markConf方法支持文件密级功能
- 优化代码格式,规范注释和文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 18:20:11 +08:00
yanlongqi
89a3783e69 Merge pull request #10 from yanlongqi/fix-config
添加密级字段
2025-05-30 13:05:35 +08:00
燕陇琪
e97ff288f1 添加密级字段 2025-05-30 12:50:52 +08:00
燕陇琪
683037c60d feat(流水线): github的流水线配置 2025-04-02 20:25:47 +08:00
燕陇琪
b09feb2cb5 feat(流水线): github的流水线配置 2025-04-02 20:25:28 +08:00
燕陇琪
d2d80d4988 feat(流水线): github的流水线配置 2025-04-02 20:20:58 +08:00
燕陇琪
12cdeba2eb feat(流水线): github的流水线配置 2025-04-02 20:16:02 +08:00
燕陇琪
3abfd182f9 feat(流水线): github的流水线配置 2025-04-02 20:13:55 +08:00
燕陇琪
a125e7c493 feat(流水线): github的流水线配置 2025-04-02 20:00:08 +08:00
燕陇琪
53f7ea1c92 feat(流水线): github的流水线配置 2025-04-02 19:16:30 +08:00
燕陇琪
4752f8e577 feat(流水线): github的流水线配置 2025-04-02 19:07:42 +08:00
燕陇琪
76933effe3 feat(流水线): github的流水线配置 2025-04-02 19:01:29 +08:00
燕陇琪
88333ed930 feat(流水线): github的流水线配置 2025-04-02 18:59:35 +08:00
燕陇琪
0c2e7b96ec feat(流水线): github的流水线配置 2025-04-02 18:47:24 +08:00
燕陇琪
206ea8ac5a feat(流水线): github的流水线配置 2025-04-02 18:35:52 +08:00
燕陇琪
3b2ea5f061 feat(流水线): github的流水线配置 2025-04-02 18:27:24 +08:00
燕陇琪
3343aa9ca4 feat(流水线): 添加github的流水线 2025-04-02 17:30:02 +08:00
燕陇琪
b0c104a1c9 release(发版): 发布release-2.0.5 2025-04-02 17:17:14 +08:00
燕陇琪
fcb78277fe feat(请求路径): 适配其他服务的请求路径 2025-04-02 17:10:20 +08:00
59ca7bfe4a fix(pom.xml): 插件的修改 2025-02-20 23:58:07 +08:00
lqyan
98c1bb8d9f feat(pom.xml): 升级central-publishing-maven-plugin的版本为0.7.0 2025-02-20 21:38:54 +08:00
lqyan
31b9a53799 fix(文件): 修改文件的测试类 2025-02-20 19:18:13 +08:00
lqyan
2765639cff feat(文件下载): 文件下载支持强制下载和文件流的获取 2025-02-20 19:14:21 +08:00
lqyan
85aef61455 feat(作业): 增加查询历史作业的接口 2025-02-20 18:46:59 +08:00
lqyan
9aecf0b6a2 doc(扩展方式): 解决扩展方式的文档问题 2025-02-20 18:02:44 +08:00
lqyan
4054c373b1 doc(集成方式): 增加使用方式和扩展方式的文档 2025-02-20 17:58:19 +08:00
lqyan
72f508c14f feat(sdk): 项目使用优化和代码的优化 2025-02-20 17:24:52 +08:00
lqyan
9ae5d9acd2 doc(使用说明): 增加没有网络环境和没有maven环境的使用方法说明 2025-02-19 18:40:21 +08:00
lqyan
58209849dc feat(版本发布): 推送中央maven的配置 2024-08-23 19:10:30 +08:00
lqyan
55838a455f fix(编译): 解决编译的jar不能使用的问题 2024-08-19 16:44:39 +08:00
lqyan
bfb613c15f 上传到maven仓库的配置 2024-08-19 15:59:19 +08:00
lqyan
4f2490e797 feat(扩展 优化): 优化SDK在Springboot项目中的扩展体验 2024-08-19 12:01:08 +08:00
lqyan
88d7b7b65c feat(示例): 增加SpringBoot示例以及SDK扩展逻辑的优化 2024-08-19 11:59:35 +08:00
lqyan
753a40a6d0 release(发布): release-2.0.2 2024-08-09 19:13:57 +08:00
lqyan
0c9e98247c feat(应用): 增加更加用途和文件后缀获取应用列表 2024-08-09 19:11:36 +08:00
52 changed files with 2650 additions and 990 deletions

31
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: deploy
on:
# 支持手动触发构建
workflow_dispatch:
release:
types: [released]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 拉取源码
uses: actions/checkout@v2
- name: Set up Apache Maven Central
uses: actions/setup-java@v4
with:
java-version: 8.0.302+8
distribution: 'temurin'
cache: maven
server-id: central
server-username: MAVEN_USERNAME
server-password: MAVEN_CENTRAL_TOKEN
gpg-passphrase: MAVEN_GPG_PASSPHRASE
gpg-private-key: ${{ secrets.GPG_SECRET }}
- name: Publish to Apache Maven Central
run: mvn deploy
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USER }}
MAVEN_CENTRAL_TOKEN: ${{ secrets.OSSRH_PASSWORD }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSWORD }}

411
README.md
View File

@@ -1,22 +1,24 @@
# 1. Jhinno OpenAPI SDK for Java
针对Java的景行API SDK使Java开发人员能够轻松使用景行API接口。您可以在几分钟内开始通过Mavenjar文件使用它。
针对 Java 的景行 API SDK 使 Java 开发人员能够轻松使用景行 API 接口。您可以在几分钟内开始通过 Mavenjar 文件使用它。
- [仓库地址https://github.com/yanlongqi/jhinno-openapi-java-sdk](https://github.com/yanlongqi/jhinno-openapi-java-sdk)
- [开发文档https://jhinno-sdk-doc.yuchat.top/apidocs](https://jhinno-sdk-doc.yuchat.top/apidocs)
- [jar包下载https://github.com/yanlongqi/jhinno-openapi-java-sdk/releases](https://github.com/yanlongqi/jhinno-openapi-java-sdk/releases)
- [jar 包下载https://github.com/yanlongqi/jhinno-openapi-java-sdk/releases](https://github.com/yanlongqi/jhinno-openapi-java-sdk/releases)
## 1.1 必要条件
- Java 1.8 or later
- Maven
## 1.2 支持的Appform的版本
## 1.2 支持的 Appform 的版本
1. JH_Appform_6.0_Release
2. JH_Appform_6.0_SP1_Release
3. JH_Appform_6.1_Release
3. JH_Appform_6.2_Release6.2以前用1.x.x版本
4. JH_Appform_6.2_Release使用: release-2.0.3
5. JH_Appform_6.3_Release(使用: release-2.0.4
5. JH_Appform_6.4_Release(使用: release-2.0.5
6. JH_Appform_6.5_Release(使用: release-2.0.6
# 2. 快速开始
@@ -24,24 +26,9 @@
### 2.1.1 安装
建议在您的项目中使用Jhinno OpenAPI SDK for Java的方法是从Maven中使用它。
建议在您的项目中使用 Jhinno OpenAPI SDK for Java 的方法是从 Maven 中使用它。:
#### 方法一通过Maven仓库安装
> 添加仓库地址改方案为备用方案后续会上传至Maven中央仓库目前不影响正常使用
```xml
<repositories>
<repository>
<id>jhinno-nexus</id>
<name>jhinno-nexus</name>
<url>https://jhinno-nexus.yuchat.top/repository/maven-releases</url>
</repository>
</repositories>
```
#### 方法二通过命令将jar包导入本地Maven仓库
#### 方法一:通过命令将 jar 包导入本地 Maven 仓库
```shell
@@ -57,10 +44,19 @@ mvn org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file -Dfile="E:/
```
> 注:
> - jhinno-openapi-java-sdk-x.x.x.jar 为SDK的jar包。
> - jhinno-openapi-java-sdk-x.x.x-sources.jar 为源码包添加可方便查看SDK代码的注释
> - jhinno-openapi-sdk-spring-boot-starter-x.x.x.jar 为SDK的spring-boot-starter的jar包
> - jhinno-openapi-sdk-spring-boot-starter-x.x.x-sources.jar 为SDKspring-boot-starter的源码包。
>
> - jhinno-openapi-java-sdk-x.x.x.jar 为 SDK 的 jar 包
> - jhinno-openapi-java-sdk-x.x.x-sources.jar 为源码包,添加可方便查看 SDK 代码的注释
> - jhinno-openapi-sdk-spring-boot-starter-x.x.x.jar 为 SDKspring-boot-starter 的 jar 包。
> - jhinno-openapi-sdk-spring-boot-starter-x.x.x-sources.jar 为 SDK 的 spring-boot-starter 的源码包。
#### 方法二:通过源码导入
```shell
git clone https://github.com/yanlongqi/jhinno-openapi-java-sdk.git
cd jhinno-openapi-java-sdk
mvn clean install
```
### 2.1.2 引入`jhinno-openapi-sdk-spring-boot-starter`坐标
@@ -69,29 +65,36 @@ mvn org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file -Dfile="E:/
<dependency>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-sdk-spring-boot-starter</artifactId>
<version>1.0.1</version>
<version>2.0.6</version>
</dependency>
```
#### 方法三:直接使用 jar 包
如果开发环境没有网络,或者没有使用 maven 的构建工具,则可以使用 jar 包的方式导入。下载`dependency-jar.zip`
`jhinno-openapi-java-sdk-2.0.3-sources.jar``jhinno-openapi-java-sdk-2.0.3.jar`导入到你的 java 项目的 lib 里面。如果你的项目是
SpringBoot 项目,则还需要导入`jhinno-openapi-sdk-spring-boot-starter-2.0.3.jar``jhinno-openapi-sdk-spring-boot-starter-2.0.3-sources.jar
`这两个 jar 包。
### 2.1.3 配置
在SpringBoot的`application.properties``application.yml`里面配置
SpringBoot `application.properties``application.yml`里面配置
#### 2.1.3.1 application.yaml
#### 2.1.3.1 application.yaml
```yaml
jhinno:
openapi:
server-url: https://172.17.0.5/appform
server-url: https://172.17.0.5
access-key: xxxxx
access-key-secret: xxxx
auth-type: access_secret_mode
```
#### 2.1.3.2 application.properties
#### 2.1.3.2 application.properties
```properties
jhinno.openapi.server-url=https://{appform服务器的地址}/appform
jhinno.openapi.server-url=https://{appform服务器的地址}
jhinno.openapi.access-key=xxxxx
jhinno.openapi.access-key-secret=xxxx
jhinno.openapi.auth-type=access_secret_mode
@@ -99,12 +102,32 @@ jhinno.openapi.auth-type=access_secret_mode
```
> 注:
> - 其中`jhinno.openapi.server-url`为景行接口服务的BaseUrl
> - `auth-type` 认证类型,`token_mode`(Token认证) 和 `access_secret_mode`AccessKey认证Appform Release 6.2 `token_mode`作为过渡,将会弃用
> - `jhinno.openapi.used-server-time`是否获取服务器时间来请求token关闭可提高获取token的时间但打开有可能因为服务器时间不准确而导致token获取失败的问题。
>
> - 其中`jhinno.openapi.server-url`为景行接口服务的 BaseUrl
> - `auth-type` 认证类型,`token_mode`(Token 认证) 和 `access_secret_mode`AccessKey 认证Appform Release 6.2
`token_mode`
作为过渡,将会弃用;
> - `jhinno.openapi.used-server-time`是否获取服务器时间来请求 token关闭可提高获取 token 的时间,但打开有可能因为服务器时间不准确而导致
token 获取失败的问题token模式配置
> - `access-key` 和 `access-key-secret` 作为访问接口的凭证,需要提供集成商名称、系统名称、负责人姓名、负责电话电话信息申请。
> - 更多配置见`com.jhinno.sdk.openapi.autoconfigure.JHOpenapiProperties`源码。
```java
// 新增全局用户获取方式
@Configuration
public class ApiConfig implements JHApiRequestHandler {
@Override
public String getCurrentUserName() {
return "yanlongqi";
}
}
```
### 2.1.4 使用
`com.jhinno.sdk.openapi.api`包下面对应`app``data``file``job``organization`这几个子包,分别代表景行`Appform`
@@ -125,6 +148,10 @@ public class DemoUserSDK {
// 调用执行其中想要调用的方法
List<FileInfo> list = fileApiExecution.getFileList("jhadmin", "$HOME");
System.out.println(list);
// 如果配置全局的 JHApiRequestHandler 方式获取用户名可以不用传userName
List<FileInfo> list1 = fileApiExecution.getFileList("$HOME");
System.out.println(list1);
}
}
```
@@ -133,24 +160,9 @@ public class DemoUserSDK {
### 2.2.1 安装
建议在您的项目中使用Jhinno OpenAPI SDK for Java的方法是从Maven中使用它。
建议在您的项目中使用 Jhinno OpenAPI SDK for Java 的方法是从 Maven 中使用它。:
#### 方法一通过Maven仓库安装
> 添加仓库地址改方案为备用方案后续会上传至Maven中央仓库目前不影响正常使用
```xml
<repositories>
<repository>
<id>jhinno-nexus</id>
<name>jhinno-nexus</name>
<url>https://jhinno-nexus.yuchat.top/repository/maven-releases</url>
</repository>
</repositories>
```
#### 方法二通过命令将jar包导入本地Maven仓库
#### 方法一:通过命令将 jar 包导入本地 Maven 仓库(无网络开发额外配置)
```shell
@@ -161,8 +173,17 @@ mvn org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file -Dfile="E:/
```
> 注:
> - jhinno-openapi-java-sdk-x.x.x.jar 为SDK的jar包。
> - jhinno-openapi-java-sdk-x.x.x-sources.jar 为源码包添加可方便查看SDK代码的注释
>
> - jhinno-openapi-java-sdk-x.x.x.jar 为 SDK 的 jar 包
> - jhinno-openapi-java-sdk-x.x.x-sources.jar 为源码包,添加可方便查看 SDK 代码的注释。
#### 方法二:通过源码导入(无网络开发额外配置)
```shell
git clone https://github.com/yanlongqi/jhinno-openapi-java-sdk.git
cd jhinno-openapi-java-sdk
mvn clean install
```
### 2.2.2 引入`jhinno-openapi-java-sdk`坐标
@@ -171,39 +192,33 @@ mvn org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file -Dfile="E:/
<dependency>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk</artifactId>
<version>1.0.1</version>
<version>${最新的版本号}</version>
</dependency>
```
### 2.2.3 配置
spring.xml添加以下内容
spring.xml 添加以下内容
```xml
<?xml version="1.0" encoding="utf-8"?>
<beans>
<bean id="apiClient" class="com.jhinno.sdk.openapi.client.JHApiClient" init-method="initDefaultApiClient">
<constructor-arg value="https://172.17.0.5/appform"/>
<constructor-arg value="https://172.17.0.5"/>
</bean>
<bean id="appApiExecution" class="com.jhinno.sdk.openapi.api.app.JHAppApiExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="dataApiExecution" class="com.jhinno.sdk.openapi.api.data.JHDataApiExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="fileApiExecution" class="com.jhinno.sdk.openapi.api.file.JHFileApiExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="jhJobApiExecution" class="com.jhinno.sdk.openapi.api.job.JHJobApiExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="departmentApiExecution" class="com.jhinno.sdk.openapi.api.organization.JHDepartmentApiExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="userApiExecution" class="com.jhinno.sdk.openapi.api.organization.JHUserApiExecution">
<bean id="requestExecution" class="com.jhinno.sdk.openapi.api.JHRequestExecution">
<constructor-arg ref="apiClient"/>
</bean>
<bean id="appApiExecution" class="com.jhinno.sdk.openapi.api.app.JHAppApiExecution" init-method="setExecution"></bean>
<bean id="dataApiExecution" class="com.jhinno.sdk.openapi.api.data.JHDataApiExecution" init-method="setExecution"></bean>
<bean id="fileApiExecution" class="com.jhinno.sdk.openapi.api.file.JHFileApiExecution" init-method="setExecution"></bean>
<bean id="jhJobApiExecution" class="com.jhinno.sdk.openapi.api.job.JHJobApiExecution" init-method="setExecution"></bean>
<bean id="departmentApiExecution" class="com.jhinno.sdk.openapi.api.organization.JHDepartmentApiExecution"
init-method="setExecution"></bean>
<bean id="userApiExecution" class="com.jhinno.sdk.openapi.api.organization.JHUserApiExecution"
init-method="setExecution"></bean>
</beans>
```
@@ -231,7 +246,7 @@ public class DemoUserSDK {
}
```
## 2.3 普通java项目
## 2.3 普通 java 项目
### 2.3.1 安装
@@ -244,7 +259,7 @@ public class DemoUserSDK {
<dependency>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk</artifactId>
<version>2.0.0</version>
<version>${最新的版本号}</version>
</dependency>
```
@@ -256,89 +271,203 @@ public class DemoUserSDK {
具体的使用步骤如下:
1. 创建一个`JHApiClient`客户端此为HTTP连接池为确保资源浪费需保证全局唯一每次创建执行器都使用个客户端。
1. 创建一个`JHApiClient`客户端,此为 HTTP 连接池,为确保资源浪费,需保证全局唯一,每次创建执行器都使用个客户端。
2. 创建接口的执行器,即:`JHxxxApiExecution`,如:`JHAppApiExecution`
3. 调用接口执行器的方法,使用景行接口资源,如下代码片段。
```java
public class DemoUserSDK {
public class JHClientConfig {
public static final JHApiRequestHandler REQUEST_HANDLER = new JHApiRequestHandler() {
@Override
public String getCurrentUserName() {
return "yanlongqi";
}
};
public static final String APPFORM_SERVER_URL = "https://172.20.0.200";
public static final String ACCESS_KEY = "8147c7470bfd4a27952fe750c6bc7cef";
public static final String ACCESS_KEY_SECRET = "899b13f590394c3daafc6468fed4b1df";
/**
* JHApiClient 是一个HTTP连接池开发者需要复用
* 其中https://172.17.0.5/appform为景行API服务的地址
* 注意: JHApiClient为内置的http连接池系统只需要初始化一份即可单例调用
* 创建一个API执行器管理器
*/
public static final JHApiClient client = new JHApiClient("https://172.17.0.5/appform");
public static final JHApiExecutionManage API_EXECUTION_MANAGE = new JHApiExecutionManage(APPFORM_SERVER_URL, REQUEST_HANDLER);
public static final Map<Class<? extends JHApiExecution>, JHApiExecution> jhApiClientMap = new HashMap<>();
static {
API_EXECUTION_MANAGE.configureApiExecution(t -> {
// 默认为使用Token模式如何使用的Token模式则不需要配置ACCESS_KEY和ACCESS_KEY SECRET
t.setAuthType(AuthType.ACCESS_SECRET_MODE);
t.setAccessKey(ACCESS_KEY);
t.setAccessKeySecret(ACCESS_KEY_SECRET);
});
}
}
public class AppApiTest {
/**
* 获得一个调用应用接口的执行器
*/
public static final JHAppApiExecution jhAppApiExecution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHAppApiExecution.class);
/**
* 测测试使用自定义的参数启动jhadmin的Linux桌面
*/
@Test
public void testStartApp() {
AppStartRequest appStartRequest = new AppStartRequest();
appStartRequest.setStartNew(true);
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("linux_desktop", appStartRequest);
System.out.println("会话ID" + appStartedInfo.getDesktopId());
System.out.println("JhAppURL" + appStartedInfo.getJhappUrl());
System.out.println("WebURL:" + appStartedInfo.getWebSessionUrl());
}
/**
* 测试查询用户的应用列表
*/
@Test
public void testGetAppList() {
List<AppInfo> appList = jhAppApiExecution.getAppList();
System.out.println("全部列表:");
System.out.println(JsonUtil.objectToString(appList));
// 类型获取
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.SYSTEM_APP.getAppList(appList)));
System.out.println("计算应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.BATCH_APP.getAppList(appList)));
System.out.println("图形应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.DESKTOP_APP.getAppList(appList)));
// 操作系统分类
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.SYSTEM.getAppList(appList)));
System.out.println("Linux应用");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.LINUX.getAppList(appList)));
System.out.println("Windows应用");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.WINDOWS.getAppList(appList)));
// 应用分类
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppCategory.SYSTEM.getAppList(appList)));
System.out.println("景行发布应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppCategory.APP.getAppList(appList)));
}
}
```
# 3. 支持 SDK 的扩展
如果是基于景行定制的接口,本 SDK 没有包含这些方法,因此您可以基于`JHApiExecution`快速进行扩展,具体的扩展步骤如下:
- 新建需要扩展的执行器命名为`JHxxxApiExecution`,并继承`JHApiExecution`
- 编写基于接口调用的方法;
父类提供了封装好的`get``post``put``delete`方法,可以直接使用,而不考虑 token 的问题
## 3.1 SpringBoot 项目
### 3.1.1 方式一
通过实现`JHApiExecution`接口,实现自定义的`JHDemoApiExecution`,并注册到 Spring 容器中。
```java
/**
* 注意一下代码为伪代码需要根据实际的情况进行修改其示例代码可参照SDK中JHDemoApiExecution子类的实现
*/
@Component
public class JHDemoApiExecution extends JHApiExecutionAbstract {
public XxxDTO getXXXX(String username, String demoParams) {
return super.execution.get("/demo/path", username, new TypeReference<ResponseResult<XxxDTO>>() {
});
}
}
```
### 3.1.2 方式二
通过注入 `JHRequestExecution` 的方式来注入
```java
/**
* 注意一下代码为伪代码需要根据实际的情况进行修改其示例代码可参照SDK中JHDemoApiExecution子类的实现
*/
public class JHDemoApiExecution {
@Autowired
private JHRequestExecution execution;
public XxxDTO getXXXX(String username, String demoParams) {
// ResponseResult<XxxDTO> 可以参照接口文档定义自己的数据传输对象
return execution.get("/demo/path", username, new TypeReference<ResponseResult<XxxDTO>>() {
});
}
}
```
# 3.2 非 SpringBoot 项目
```java
/**
* 注意一下代码为伪代码需要根据实际的情况进行修改其示例代码可参照SDK中JHDemoApiExecution子类的实现
*/
public class JHDemoApiExecution extends JHApiExecutionAbstract {
public XxxDTO getXXXX(String username, String demoParams) {
return super.execution.get("/demo/path", username, new TypeReference<ResponseResult<XxxDTO>>() {
});
}
}
public class JHApiUtile {
public static final JHApiExecutionManage API_EXECUTION_MANAGE = new JHApiExecutionManage("https://192.168.87.24");
public static final String ACCESS_KEY = "3f03747f147942bd8debd81b6c9c6a80";
public static final String ACCESS_KEY_SECRET = "e0681859b91c499eb1d2c8e09cea3242";
static {
client.initDefaultApiClient();
jhApiClientMap.put(JHAppApiExecution.class, new JHAppApiExecution());
jhApiClientMap.put(JHDataApiExecution.class, new JHDataApiExecution());
jhApiClientMap.put(JHFileApiExecution.class, new JHFileApiExecution());
jhApiClientMap.put(JHJobApiExecution.class, new JHJobApiExecution());
jhApiClientMap.put(JHDepartmentApiExecution.class, new JHDepartmentApiExecution());
jhApiClientMap.put(JHUserApiExecution.class, new JHUserApiExecution());
jhApiClientMap.forEach((k, v) -> {
v.setJhApiClient(client);
v.setAuthType(AuthType.ACCESS_SECRET_MODE);
v.setAccessKey(ACCESS_KEY);
v.setAccessKeySecret(ACCESS_KEY_SECRET);
v.setUsedServerTime(true);
// 配置API执行器管理器设置认证信息等。
API_EXECUTRON_MANAGE.configureApiExecution(t -> {
// 默认为使用Token模式如何使用的Token模式则不需要配置ACCESS_KEY和ACCESS_KEY SECRET
// t.setAuthType(AuthType.ACCESS_KEY);
t.setAccessKey(ACCESS_KEY);
t.setAccessKeySecret(ACCESS_KEY_SECRET);
});
// 注册自定义的API执行器会自动配置你自定义的执行器
API_EXECUTRON_MANAGE.registerApiExecution(new JHDemoApiExecution());
}
public static void main(String[] args) {
// 初始化一个调用调用景行会话服务接口执行器
JHAppApiExecution jhAppApiExecution = (JHAppApiExecution) jhApiClientMap.get(JHAppApiExecution.class);
// 从API执行器管理器取出调用应用相关接口执行器
JHDemoApiExecution jhAppApiExecution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHDemoApiExecution.class);
// 调用启动会话的接口
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("jhadmin", "linux_desktop", new AppStartRequest());
// 打印接口的调用结果
System.out.println(appStartedInfo);
}
}
```
# 3. 支持SDK的扩展
如果是基于景行定制的接口本SDK没有包含这些方法因此您可以基于`JHApiExecution`快速进行扩展,具体的扩展步骤如下:
- 新建需要扩展的执行器命名为`JHxxxApiExecution`,并继承`JHApiExecution`
- 编写基于接口调用的方法;
父类提供了封装好的`get``post``put``delete`方法可以直接使用而不考虑token的问题
```java
/**
* 注意一下代码为伪代码需要根据实际的情况进行修改其示例代码可参照SDK中JHApiExecution子类的实现
*/
public class JHAppApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHAppApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public XxxDTO getXXXX(String username, String demoParams) {
return get("/demo/path", username, new TypeReference<ResponseResult<XxxDTO>>() {
});
jhAppApiExecution.getXXXX("jhadmin", "xxxx");
}
}
@@ -346,16 +475,16 @@ public class JHAppApiExecution extends JHApiExecution {
# 4. 构建
一旦您检出代码就可以使用Maven构建它。使用以下命令进行构建
一旦您检出代码,就可以使用 Maven 构建它。使用以下命令进行构建:
```shell
mvn clean package -DskipTests -P product
mvn clean package
```
# 5. 代码贡献
- 代码必须格式化使用IDEA自带的格式即可
- 请求路径必须放在一个单独的const类中统一维护具体可参考现有代码提交
- 代码必须格式化,使用 IDEA 自带的格式即可;
- 请求路径必须放在一个单独的 const 类中统一维护,具体可参考现有代码提交;
- 封装新的接口是需要继承`JHApiExecution`,调用父类的辅助方法辅助封装;
# 6. 作者
@@ -365,4 +494,4 @@ mvn clean package -DskipTests -P product
# 7. 支持
- 电话同微信18794888087
- 邮箱lqyan@jhinno.com
- 邮箱lqyan@jhinno.com

View File

@@ -5,7 +5,6 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>jhinno-openapi-java-sdk</artifactId>
<version>2.0.1</version>
<packaging>jar</packaging>
<name>Jhinno OpenAPI SDK for Java</name>
<description>The Jhinno OpenAPI SDK for Java used for accessing Jhinno OpenApi Service</description>
@@ -14,7 +13,7 @@
<parent>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk-parent</artifactId>
<version>2.0.1</version>
<version>2.0.6</version>
</parent>
<dependencies>
@@ -77,88 +76,4 @@
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>jhinno-releases</id>
<url>http://192.168.87.22:8081/repository/maven-releases</url>
</repository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.0.0</version>
<configuration>
<encoding>UTF-8</encoding>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<sourcepath>target/generated-sources/delombok</sourcepath>
<encoding>${project.build.sourceEncoding}</encoding>
<docencoding>${project.build.sourceEncoding}</docencoding>
<charset>${project.build.sourceEncoding}</charset>
<doclint>none</doclint>
<tags>
<tag>
<name>date</name>
<placement>X</placement>
</tag>
</tags>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<developers>
<developer>
<id>lqyan</id>
<name>lqyan</name>
<email>lqyan@jhinno.com</email>
</developer>
</developers>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
</project>

View File

@@ -2,17 +2,18 @@ package com.jhinno.sdk.openapi;
/**
* 目前Appform的认证类型有两个Token模式和AK/SK的模式。
* 使用AK/SK的模式需要应用门户安装API接口安全插件并且需要配置AK/SK信息。
* 推荐使用AK/SK的模式Token模式后续将被弃用
*/
public enum AuthType {
/**
* Token模式
* Token模式,不推荐使用,后续将被弃用
*/
TOKEN_MODE,
/**
* AK/SK模式
* AK/SK模式,推荐使用,但需要服务端安装接口安全插件
*/
ACCESS_SECRET_MODE,

View File

@@ -0,0 +1,21 @@
package com.jhinno.sdk.openapi;
import com.jhinno.sdk.openapi.api.JHRequestExecution;
import lombok.Setter;
@Setter
public abstract class JHApiExecutionAbstract {
// 提供setter方法支持依赖注入
protected JHRequestExecution execution;
// 默认构造函数,允许子类不实现构造方法
public JHApiExecutionAbstract() {
}
// 带参数的构造函数,允许直接注入
public JHApiExecutionAbstract(JHRequestExecution execution) {
this.execution = execution;
}
}

View File

@@ -0,0 +1,107 @@
package com.jhinno.sdk.openapi;
import java.util.HashMap;
import java.util.Map;
import com.jhinno.sdk.openapi.api.JHRequestExecution;
import com.jhinno.sdk.openapi.api.app.JHAppApiExecution;
import com.jhinno.sdk.openapi.api.data.JHDataApiExecution;
import com.jhinno.sdk.openapi.api.file.JHFileApiExecution;
import com.jhinno.sdk.openapi.api.job.JHJobApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHDepartmentApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHUserApiExecution;
import com.jhinno.sdk.openapi.client.JHApiClient;
import com.jhinno.sdk.openapi.client.JHApiHttpClient;
public class JHApiExecutionManage {
public static final Map<Class<? extends JHApiExecutionAbstract>, JHApiExecutionAbstract> API_CLIENT_MAP = new HashMap<>();
public final JHRequestExecution EXECUTION;
/**
* 创建一个带有默认HTTP客户端的API执行管理器
*
* @param appformBaseUrl 景行API的URL
*/
public JHApiExecutionManage(String appformBaseUrl, JHApiRequestHandler requestHandler) {
JHApiClient client = new JHApiClient(appformBaseUrl);
client.initDefaultApiClient();
EXECUTION = new JHRequestExecution(client, requestHandler);
initApiExecution();
}
public JHApiExecutionManage(String appformBaseUrl) {
this(appformBaseUrl, new JHApiRequestHandler() {
});
}
/**
* 创建一个带有自定义HTTP客户端的API执行管理器
*
* @param httpClient 自定义HTTP客户端
* @param appformBaseUrl 景行API的URL
*/
public JHApiExecutionManage(JHApiHttpClient httpClient, String appformBaseUrl) {
JHApiClient client = new JHApiClient(appformBaseUrl);
client.setApiHttpClient(httpClient);
EXECUTION = new JHRequestExecution(client);
EXECUTION.setAuthType(AuthType.TOKEN_MODE);
initApiExecution();
}
/**
* 初始化默认的执行器
*/
private void initApiExecution() {
registerApiExecution(new JHAppApiExecution());
registerApiExecution(new JHDataApiExecution());
registerApiExecution(new JHFileApiExecution());
registerApiExecution(new JHJobApiExecution());
registerApiExecution(new JHDepartmentApiExecution());
registerApiExecution(new JHUserApiExecution());
}
/**
* 配置API执行器
*
* @param configurator API执行器配置器
*/
public void configureApiExecution(ApiExecutionConfigurator configurator) {
configurator.configure(EXECUTION);
}
/**
* 注册自定义的执行器
*
* @param execution 自定义的执行器实例
*/
public void registerApiExecution(JHApiExecutionAbstract execution) {
execution.setExecution(EXECUTION);
API_CLIENT_MAP.put(execution.getClass(), execution);
}
/**
* 获取一个特定的执行器用于调用接口
*
* @param <T> 执行器的类型
* @param clazz 执行器的类
* @return 执行器实例
*/
public <T extends JHApiExecutionAbstract> T getApiExecution(Class<? extends T> clazz) {
return (T) API_CLIENT_MAP.get(clazz);
}
/**
* API执行器配置器接口用于配置API执行器的参数
*/
public interface ApiExecutionConfigurator {
/**
* 配置API执行器的参数
*
* @param execution API执行器实例
*/
void configure(JHRequestExecution execution);
}
}

View File

@@ -0,0 +1,26 @@
package com.jhinno.sdk.openapi;
import java.util.Map;
public interface JHApiRequestHandler {
/**
* 获取当前登录的用户名
*
* @return 用户名
*/
default String getCurrentUserName() {
return null;
}
/**
* 构建一个带token的请求头
*
* @param headers 处理器的请求头
* @return 请求头
*/
default Map<String, Object> getHeaders(Map<String, Object> headers) {
return headers;
}
}

View File

@@ -30,9 +30,9 @@ import java.util.concurrent.ConcurrentHashMap;
* <p>
* 对于定制接口可参考以下步骤封装调用方法
* <ol>
* <li>定义一个const类同来存放接口的路径方便后期的维护{@link AppPathConstant}</li>
* <li>继承{@link JHApiExecution}{@link JHAppApiExecution}</li>
* <li>参考{@link JHAppApiExecution}中封装的方法调用{@link JHApiExecution}中的getpostputdelete等对新的接口封装</li>
* <li>定义一个const类同来存放接口的路径方便后期的维护{@link AppPathConstant}</li>
* <li>继承{@link JHRequestExecution}{@link JHAppApiExecution}</li>
* <li>参考{@link JHAppApiExecution}中封装的方法调用{@link JHRequestExecution}中的getpostputdelete等对新的接口封装</li>
* </ol>
*
* @author yanlongqi
@@ -41,8 +41,12 @@ import java.util.concurrent.ConcurrentHashMap;
*/
@Data
@NoArgsConstructor
public class JHApiExecution {
public class JHRequestExecution {
/**
* 用户令牌的缓存
*/
private static final Map<String, TokenInfo> TOKEN_INFO_MAP = new ConcurrentHashMap<>(20);
/**
* JHApiClient实例
@@ -59,7 +63,6 @@ public class JHApiExecution {
*/
private int tokenResidueTime = DefaultHttpClientConfig.DEFAULT_TOKEN_RESIDUE_TIME;
/**
* 是否使用服务器时间开启可能会导致请求过慢但是不会太慢默认token会有缓存
*/
@@ -74,7 +77,7 @@ public class JHApiExecution {
/**
* 接口请求的认证类型
*/
private AuthType authType = AuthType.ACCESS_SECRET_MODE;
private AuthType authType = AuthType.TOKEN_MODE;
/**
* 访问密钥
@@ -86,31 +89,49 @@ public class JHApiExecution {
*/
private String accessKeySecret;
private JHApiRequestHandler requestHandler;
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
* @param requestHandler 请求头处理器
*/
public JHRequestExecution(JHApiClient jhApiClient, JHApiRequestHandler requestHandler) {
this.jhApiClient = jhApiClient;
this.requestHandler = requestHandler;
}
/**
* 创建一个默认的请求处理器
*
* @param jhApiClient 请求的客户端
*/
protected JHApiExecution(JHApiClient jhApiClient) {
public JHRequestExecution(JHApiClient jhApiClient) {
this.jhApiClient = jhApiClient;
this.requestHandler = new JHApiRequestHandler() {
};
}
/**
* 用户令牌的缓存
*/
private static final Map<String, TokenInfo> TOKEN_INFO_MAP = new ConcurrentHashMap<>(20);
public String getUserName(String userName) {
if (StringUtils.isNotBlank(userName)) {
return userName;
}
return requestHandler.getCurrentUserName();
}
/**
* 设置是否使用服务器时间
* 获取当前用户的token
*
* @param usedServerTime 是否使用服务器时间
* @return 用户token
*/
public void setUsedServerTime(boolean usedServerTime) {
isUsedServerTime = usedServerTime;
public String getToken() {
return getToken(requestHandler.getCurrentUserName());
}
/**
* 获取用户的Token
*
@@ -121,42 +142,62 @@ public class JHApiExecution {
if (StringUtils.isBlank(username)) {
throw new ArgsException("用户名称不能为空!");
}
TokenInfo tokenInfo = TOKEN_INFO_MAP.get(username);
// 防止因为服务器时间的问题二导致token不可用可以通过此配置提前获取token
int tokenEffectiveTime = (tokenTimeout - tokenResidueTime) * 60 * 1000;
// 如果是强制获取用户令牌为空用户令牌过期等则获取令牌
if (isForceGetToken || tokenInfo == null || System.currentTimeMillis() - tokenInfo.getCurrentTimestamp() > tokenEffectiveTime) {
Map<String, Object> params = new HashMap<>(2);
params.put("timeout", tokenTimeout);
String currentTimeMillis = getCurrentTimeMillis();
String beforeEncryption = String.format(CommonConstant.TokenUserFormat, username, currentTimeMillis);
try {
SecretKeySpec secretKey = new SecretKeySpec(CommonConstant.DEFAULT_AES_KEY.getBytes(StandardCharsets.UTF_8), CommonConstant.AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(CommonConstant.AES_ECB_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptBytes = cipher.doFinal(beforeEncryption.getBytes(StandardCharsets.UTF_8));
params.put("username", Base64.getEncoder().encodeToString(encryptBytes));
} catch (Exception e) {
throw new ClientException("AES加密失败失败原因" + e.getMessage(), e);
}
// 使用computeIfAbsent确保原子性操作避免重复获取token
TokenInfo tokenInfo = TOKEN_INFO_MAP.computeIfAbsent(username, this::createNewTokenInfo);
String url = JHApiClient.getUrl(AuthPathConstant.AUTH_TOKEN_PATH, params);
Map<String, String> token = get(url, new TypeReference<ResponseResult<Map<String, String>>>() {
});
tokenInfo = new TokenInfo();
tokenInfo.setUserName(username);
tokenInfo.setToken(token.get("token"));
tokenInfo.setCurrentTimestamp(System.currentTimeMillis());
TOKEN_INFO_MAP.put(username, tokenInfo);
// 检查token是否过期如果过期则创建新token
long currentTime = System.currentTimeMillis();
if (isForceGetToken || currentTime - tokenInfo.getCurrentTimestamp() > tokenEffectiveTime) {
synchronized (this) {
// 双重检查锁定确保在同步块中再次检查
tokenInfo = TOKEN_INFO_MAP.get(username);
if (tokenInfo == null || currentTime - tokenInfo.getCurrentTimestamp() > tokenEffectiveTime || isForceGetToken) {
tokenInfo = createNewTokenInfo(username);
TOKEN_INFO_MAP.put(username, tokenInfo);
}
}
}
return tokenInfo.getToken();
}
/**
* 创建新的TokenInfo
*
* @param username 用户名
* @return 新的TokenInfo
*/
private TokenInfo createNewTokenInfo(String username) {
Map<String, Object> params = new HashMap<>(2);
params.put("timeout", tokenTimeout);
String currentTimeMillis = getCurrentTimeMillis();
String beforeEncryption = String.format(CommonConstant.TokenUserFormat, username, currentTimeMillis);
try {
SecretKeySpec secretKey = new SecretKeySpec(
CommonConstant.DEFAULT_AES_KEY.getBytes(StandardCharsets.UTF_8), CommonConstant.AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(CommonConstant.AES_ECB_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptBytes = cipher.doFinal(beforeEncryption.getBytes(StandardCharsets.UTF_8));
params.put("username", Base64.getEncoder().encodeToString(encryptBytes));
} catch (Exception e) {
throw new ClientException("AES加密失败失败原因" + e.getMessage(), e);
}
TokenInfo tokenInfo = new TokenInfo();
tokenInfo.setUserName(username);
tokenInfo.setToken(requestToken(params));
tokenInfo.setCurrentTimestamp(System.currentTimeMillis());
return tokenInfo;
}
/**
* @return
* 获得当前的时间
*
* @return 当前时间
*/
public String getCurrentTimeMillis() {
if (authType == AuthType.ACCESS_SECRET_MODE || !isUsedServerTime) {
@@ -167,13 +208,35 @@ public class JHApiExecution {
/**
* 构建一个带token的请求头
* 获得最终的请求头
*
* @param username 用户名
* @param isContentType 是否携带默认的Content-type默认为{@link ContentType#APPLICATION_JSON}
* @return 请求头
*/
protected Map<String, Object> getHeaders(String username, boolean isContentType) {
public Map<String, Object> getHeaders(String username, boolean isContentType) {
Map<String, Object> defaultHeaders = getDefaultHeaders(getUserName(username), isContentType);
return requestHandler.getHeaders(defaultHeaders);
}
/**
* 获得当前用户的请求头
*
* @param isContentType 是否携带默认的Content-type默认为{@link ContentType#APPLICATION_JSON}
* @return 请求头
*/
public Map<String, Object> getHeaders(boolean isContentType) {
return getHeaders(null, isContentType);
}
/**
* 构建一个默认参数的请求头
*
* @param username 用户名
* @param isContentType 是否携带默认的Content-type默认为{@link ContentType#APPLICATION_JSON}
* @return 请求头
*/
private Map<String, Object> getDefaultHeaders(String username, boolean isContentType) {
Map<String, Object> headers = new HashMap<>();
// 默认请求json数据
if (isContentType) {
@@ -202,6 +265,15 @@ public class JHApiExecution {
return headers;
}
/**
* 获得一个签名
*
* @param currentTimeMillis 时间戳
* @return 签名
*/
public String getsSignature(String currentTimeMillis) {
return getsSignature(requestHandler.getCurrentUserName(), currentTimeMillis);
}
/**
* 获取签名
@@ -211,11 +283,13 @@ public class JHApiExecution {
* @return 签名
*/
public String getsSignature(String username, String currentTimeMillis) {
SecretKeySpec secretKey = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8), CommonConstant.HMAC_SHA_256_ALGORITHM);
SecretKeySpec secretKey = new SecretKeySpec(accessKeySecret.getBytes(StandardCharsets.UTF_8),
CommonConstant.HMAC_SHA_256_ALGORITHM);
try {
Mac mac = Mac.getInstance(CommonConstant.HMAC_SHA_256_ALGORITHM);
mac.init(secretKey);
String beforeSignature = String.format(CommonConstant.SIGNATURE_FORMAT, accessKey, username, currentTimeMillis);
String beforeSignature = String.format(CommonConstant.SIGNATURE_FORMAT, accessKey, username,
currentTimeMillis);
byte[] digest = mac.doFinal(beforeSignature.getBytes(StandardCharsets.UTF_8));
return Hex.encodeHexString(digest);
} catch (Exception e) {
@@ -229,7 +303,7 @@ public class JHApiExecution {
* @param username 用户名
* @return 请求头
*/
protected Map<String, Object> getHeaders(String username) {
public Map<String, Object> getHeaders(String username) {
return getHeaders(username, true);
}
@@ -262,6 +336,16 @@ public class JHApiExecution {
return result.getData();
}
private String requestToken(Map<String, Object> params) {
String url = JHApiClient.getUrl(AuthPathConstant.AUTH_TOKEN_PATH, params);
ResponseResult<Map<String, String>> result = jhApiClient.get(url, new TypeReference<ResponseResult<Map<String, String>>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(url, result.getCode(), result.getMessage());
}
Map<String, String> token = result.getData();
return token.get("token");
}
/**
* 发起一个有返回值的POST请求
@@ -282,7 +366,6 @@ public class JHApiExecution {
return result.getData();
}
/**
* 发起一个有返回值的POST请求
*
@@ -296,7 +379,6 @@ public class JHApiExecution {
return post(path, username, null, type);
}
/**
* 发起一个没有返回值的POST请求
*
@@ -306,14 +388,14 @@ public class JHApiExecution {
* @param <B> 请求体数据类型
*/
public <B> void post(String path, String username, B body) {
ResponseResult<?> result = jhApiClient.post(path, body, getHeaders(username), new TypeReference<ResponseResult<?>>() {
});
ResponseResult<?> result = jhApiClient.post(path, body, getHeaders(username),
new TypeReference<ResponseResult<?>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(path, result.getCode(), result.getMessage());
}
}
/**
* 发起一个没有请求体没有数据返回的POST请求
*
@@ -325,7 +407,6 @@ public class JHApiExecution {
});
}
/**
* 发起一个有返回值的PUT请求
*
@@ -345,7 +426,6 @@ public class JHApiExecution {
return result.getData();
}
/**
* 发起一个有返回值的PUT请求
*
@@ -368,14 +448,14 @@ public class JHApiExecution {
* @param <B> 请求体数据类型
*/
public <B> void put(String path, String username, B body) {
ResponseResult<?> result = jhApiClient.put(path, body, getHeaders(username), new TypeReference<ResponseResult<?>>() {
});
ResponseResult<?> result = jhApiClient.put(path, body, getHeaders(username),
new TypeReference<ResponseResult<?>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(path, result.getCode(), result.getMessage());
}
}
/**
* 发起一个没有请求体没有数据返回的PUT请求
*
@@ -387,7 +467,6 @@ public class JHApiExecution {
});
}
/**
* 发起一个DELETE请求有数据返回
*
@@ -405,7 +484,6 @@ public class JHApiExecution {
return result.getData();
}
/**
* 发起一个DELETE请求没有数据返回
*
@@ -413,16 +491,16 @@ public class JHApiExecution {
* @param username 用户名
*/
public void delete(String path, String username) {
ResponseResult<?> result = jhApiClient.delete(path, getHeaders(username), new TypeReference<ResponseResult<?>>() {
});
ResponseResult<?> result = jhApiClient.delete(path, getHeaders(username),
new TypeReference<ResponseResult<?>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(path, result.getCode(), result.getMessage());
}
}
/**
* 退出用户的登录释放许可当用户退出登录后建议清除用户的token信息
* 退出用户的登录释放许可
*
* @param username 用户名
*/
@@ -430,4 +508,11 @@ public class JHApiExecution {
delete(AuthPathConstant.AUTH_LOGOUT, username);
TOKEN_INFO_MAP.remove(username);
}
/**
* 退出当前用户的登录
*/
public void logout() {
logout(requestHandler.getCurrentUserName());
}
}

View File

@@ -1,5 +1,7 @@
package com.jhinno.sdk.openapi.api.app;
import com.jhinno.sdk.openapi.api.JHRequestExecution;
import com.jhinno.sdk.openapi.client.JHApiClient;
import lombok.Data;
import java.util.List;
@@ -29,6 +31,24 @@ public class AppInfo {
/**
* 应用图标
*
* <p>
* 示例数据:/appform/images/apps/app_fluent.png
* <p>
* 需要使用 {@link JHApiClient#getUrl(String)} 拼接景行的服务器地址;使用SpringJHApiClient在容器中可以使用注入的方式获得
*
* <pre>{@code
* @Autoward
* private JHApiClient apiClient;
*
* public String getIconUrl(String icon){
* return apiClient.getUrl(icon);
* }
*
* }</pre>
*
* <p>
* 拼接后的示例数据https://192.168.87.24/appform/images/apps/app_fluent.png
*/
private String icon;
private String copyAppClass;
@@ -67,6 +87,18 @@ public class AppInfo {
private String mode;
/**
* 操作系统类型
* <ul>
* <li>空:系统应用,如:我的会话、我的作业、应用仓库等。</li>
* <li>linux: 应用是Linux应用</li>
* <li>windows: 应用是Windows应用</li>
* </ul>
*
* @see AppTypeConstant.AppOsType 定义了 os 可能的值
* <p>
* 如果需要获取特定分类的应用列表,可以使用 {@link AppTypeConstant.AppOsType#getAppList(List)}
*/
private String os;
private String showin;
@@ -77,16 +109,31 @@ public class AppInfo {
/**
* 应用类型
*
* <ul>
* <li>空:系统应用,如:我的会话、我的作业、应用仓库等。</li>
* <li>batch: 计算应用通用计算、Fluent等</li>
* <li>desktop: 图形应用。如Windows桌面、Linux桌面、Notepad等</li>
* </ul>
*
* @see AppTypeConstant.AppType 定义了 os 可能的值
* <p>
* 如果需要获取特定分类的应用列表,可以使用 {@link AppTypeConstant.AppType#getAppList(List)}
*/
private String type;
/**
* 应用分类
* <p>
* 系统应用返回system其他为空字符串
*/
private String category;
/**
* 应用协议
* <p>
* 图形会话返回jhapp,其他应用为空字符串
* </p>
*/
private String protocol;
@@ -156,4 +203,19 @@ public class AppInfo {
private String cwd;
private String apiKey;
/**
* 应用状态
*/
private String appStatus;
/**
* 应用描述
*/
private String description;
private Boolean used;
}

View File

@@ -11,90 +11,106 @@ public class AppPathConstant {
/**
* 申请会话
*/
public static final String APPS_START_PATH = "/ws/api/apps/{appId}/start";
public static final String APPS_START_PATH = "/appform/ws/api/apps/{appId}/start";
/**
* 查询会列表
*/
public static final String APPS_SESSIONS_ALL_PATH = "/ws/api/apps/sessions/all";
public static final String APPS_SESSIONS_ALL_PATH = "/appform/ws/api/apps/sessions/all";
/**
* 使用参数查询会话列表
*/
public static final String APPS_SESSIONS_PATH = "/ws/api/apps/sessions";
public static final String APPS_SESSIONS_PATH = "/appform/ws/api/apps/sessions";
/**
* 根据会话id列表查询会话列表
*/
public static final String APPS_SESSIONS_IDS_PATH = "/ws/api/apps/listBySessionIds";
public static final String APPS_SESSIONS_IDS_PATH = "/appform/ws/api/apps/listBySessionIds";
/**
* 根据会话名称查询会话列表
*/
public static final String APPS_SESSIONS_NAME_PATH = "/ws/api/apps/listBySessionName";
public static final String APPS_SESSIONS_NAME_PATH = "/appform/ws/api/apps/listBySessionName";
/**
* 会话共享
*/
public static final String APPS_SESSIONS_SHARE_PATH = "/ws/api/apps/sessions/{sessionId}/share";
public static final String APPS_SESSIONS_SHARE_PATH = "/appform/ws/api/apps/sessions/{sessionId}/share";
/**
* 取消会话共享
*/
public static final String APPS_SESSIONS_CANCEL_SHARE_PATH = "/ws/api/apps/sessions/{sessionId}/share_cancel";
public static final String APPS_SESSIONS_CANCEL_SHARE_PATH = "/appform/ws/api/apps/sessions/{sessionId}/share_cancel";
/**
* 传递会话的操作权
*/
public static final String APPS_SESSIONS_OPERATION_TRANSFER_PATH = "/ws/api/apps/sessions/{sessionId}/operation_transfer";
public static final String APPS_SESSIONS_OPERATION_TRANSFER_PATH = "/appform/ws/api/apps/sessions/{sessionId}/operation_transfer";
/**
* 连接会话
*/
public static final String APPS_SESSIONS_CONNECT_JHAPP_PATH = "/ws/api/apps/sessions/{sessionId}/connect";
public static final String APPS_SESSIONS_CONNECT_JHAPP_PATH = "/appform/ws/api/apps/sessions/{sessionId}/connect";
/**
* 断开会话连接(作业/应用)
*/
public static final String APPS_SESSIONS_DISCONNECT_PATH = "/ws/api/apps/sessions/{sessionId}/disconnect";
public static final String APPS_SESSIONS_DISCONNECT_PATH = "/appform/ws/api/apps/sessions/{sessionId}/disconnect";
/**
* 批量断开会话
*/
public static final String APPS_SESSIONS_DISCONNECT_IDS_PATH = "/ws/api/apps/sessions/disconnect";
public static final String APPS_SESSIONS_DISCONNECT_IDS_PATH = "/appform/ws/api/apps/sessions/disconnect";
/**
* 注销会话
*/
public static final String APPS_SESSIONS_DESTROY_PATH = "/ws/api/apps/sessions/{sessionId}/close";
public static final String APPS_SESSIONS_DESTROY_PATH = "/appform/ws/api/apps/sessions/{sessionId}/close";
/**
* 批量注销会话
*/
public static final String APPS_SESSIONS_DESTROY_IDS_PATH = "/ws/api/apps/sessions/close";
public static final String APPS_SESSIONS_DESTROY_IDS_PATH = "/appform/ws/api/apps/sessions/close";
/**
* 查询应用列表
*/
public static final String APPS_LIST_PATH = "/ws/api/apps";
public static final String APPS_LIST_PATH = "/appform/ws/api/apps";
/**
* 获取应用链接URL
*/
public static final String APPS_GET_URL_PATH = "/ws/api/apps/{appName}/url";
public static final String APPS_GET_URL_PATH = "/appform/ws/api/apps/{appName}/url";
/**
* WEB启动会话URL
*/
public static final String WEB_SESSION_URL_PATH = "/pageapi/apps/webclient/gui/{desktopId}";
public static final String WEB_SESSION_URL_PATH = "/appform/ws/api/apps/webclient/{sessionId}/connect";
/**
* 根据用途查询应用
* <p/>
* 该接口目前在Solutions下面维护未经过产品的测试
*/
public static final String APP_USE_LABEL_PATH = "/appform/ws/api/app/use_label/apps";
/**
* 根据文件后缀查询应用
* <p/>
* 该接口目前在Solutions下面维护未经过产品的测试
*/
public static final String APPS_SUFFIXES_PATH = "/appform/ws/api/apps/suffixes";
}

View File

@@ -0,0 +1,73 @@
package com.jhinno.sdk.openapi.api.app;
import com.jhinno.sdk.openapi.utils.CollectionUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
public class AppTypeConstant {
@Getter
@AllArgsConstructor
public enum AppType {
/**
* 系统应用
*/
SYSTEM_APP(StringUtils.EMPTY),
BATCH_APP("batch"),
DESKTOP_APP("desktop"),
;
private final String type;
public List<AppInfo> getAppList(List<AppInfo> list) {
if (CollectionUtil.isEmpty(list)) {
return list;
}
return list.stream()
.filter(t -> StringUtils.equals(t.getType(), this.type))
.collect(Collectors.toList());
}
}
@Getter
@AllArgsConstructor
public enum AppOsType {
SYSTEM(StringUtils.EMPTY),
LINUX("linux"),
WINDOWS("windows"),
;
private final String os;
public List<AppInfo> getAppList(List<AppInfo> list) {
if (CollectionUtil.isEmpty(list)) {
return list;
}
return list.stream()
.filter(t -> StringUtils.equals(t.getOs(), this.os))
.collect(Collectors.toList());
}
}
@Getter
@AllArgsConstructor
public enum AppCategory {
SYSTEM("system"),
APP(StringUtils.EMPTY);
private final String category;
public List<AppInfo> getAppList(List<AppInfo> list) {
if (CollectionUtil.isEmpty(list)) {
return list;
}
return list.stream()
.filter(t -> StringUtils.equals(t.getCategory(), this.category))
.collect(Collectors.toList());
}
}
}

View File

@@ -0,0 +1,121 @@
package com.jhinno.sdk.openapi.api.app;
import lombok.Data;
/**
* 应用
*/
@Data
public class AppstoreAppInfo {
/**
* 应ID
*/
private String id;
/**
* 应用名称
*/
private String name;
/**
* 应用图标
*/
private String image;
/**
* 应用类型
*/
private String type;
/**
* 应用版本
*/
private String version;
/**
* 应用状态
*/
private Boolean status;
/**
* 是否 使用
*/
private Boolean isUsed;
/**
* CPU使用
*/
private String cpuUsage;
/**
* 空闲内存
*/
private String idleMem;
/**
*
*/
private String idleTime;
/**
* 应用路径
*/
private String appPath;
/**
* 工作路径
*/
private String appCwd;
/**
* 发布时间
*/
private String appReleaseTime;
/**
* 启动选项
*/
private String appStartOpt;
/**
* 启动前缀
*/
private String appStartPrefix;
/**
* 启动后缀
*/
private String appStartSuffix;
/**
* 应用详情
*/
private String appDetail;
/**
* 启动数量
*/
private String startNum;
/**
* 用途英文名
*/
private String useLabelEnStr;
/**
* 用途中文名
*/
private String useLabelCnStr;
/**
* 应用系统
*/
private String appOs;
/**
* 申请状态
*/
private String applyStatus;
}

View File

@@ -1,17 +1,13 @@
package com.jhinno.sdk.openapi.api.app;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.AuthType;
import com.jhinno.sdk.openapi.CommonConstant;
import com.jhinno.sdk.openapi.ServiceException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.*;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
import com.jhinno.sdk.openapi.utils.CollectionUtil;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -22,17 +18,8 @@ import java.util.Map;
* @author yanlongqi
* @date 2024/2/1 16:26
*/
@NoArgsConstructor
public class JHAppApiExecution extends JHApiExecution {
public class JHAppApiExecution extends JHApiExecutionAbstract {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHAppApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
/**
* 启动一个会话
@@ -46,17 +33,19 @@ public class JHAppApiExecution extends JHApiExecution {
* <p>
* 开发阶段,主要有一下几种方式:
* <ul>
* <li>使用js的 `window.open("{@link AppStartedInfo#getJhappUrl()}")`</li>
* <li>使用HTML的a标签的href</li>
* <li>使用HTML的iframe标签的src</li>
* <li>使用js的 `window.open("{@link AppStartedInfo#getJhappUrl()}")`</li>
* <li>使用HTML的a标签的href</li>
* <li>使用HTML的iframe标签的src</li>
* </ul>
* 以下是使用的伪代码:
*
* <pre class="code">
* // 使用a标签实例代码
* var a = document.createElement("a");
* a.href = "{@link AppStartedInfo#getJhappUrl()}";
* a.click();
* </pre>
*
* <pre class="code">
* // 使用iframe标签实例代码
* var iframe = document.createElement("iframe");
@@ -70,6 +59,7 @@ public class JHAppApiExecution extends JHApiExecution {
* 并使用js生产的时间具体的参数见 {@link AppStartRequest#setCurrentTimestamp(String)}
*
* <h4>通过浏览器启动</h4>
*
* <pre class="code">
* window.open("{@link AppStartedInfo#getWebSessionUrl()}}")
* </pre>
@@ -81,8 +71,9 @@ public class JHAppApiExecution extends JHApiExecution {
*/
public AppStartedInfo desktopStart(String username, String appId, AppStartRequest appStartRequest) {
String path = AppPathConstant.APPS_START_PATH.replace("{appId}", appId);
List<AppStartedInfo> data = post(path, username, appStartRequest, new TypeReference<ResponseResult<List<AppStartedInfo>>>() {
});
List<AppStartedInfo> data = execution.post(path, username, appStartRequest,
new TypeReference<ResponseResult<List<AppStartedInfo>>>() {
});
if (CollectionUtil.isEmpty(data)) {
throw new ServiceException(path, 500, "获取到的会话信息为空");
}
@@ -91,21 +82,14 @@ public class JHAppApiExecution extends JHApiExecution {
return appStartedInfo;
}
public String getWebSessionUrl(String username, String desktopId) {
String webSessionUrlPath = AppPathConstant.WEB_SESSION_URL_PATH.replace("{desktopId}", desktopId);
String url = getJhApiClient().getUrl(webSessionUrlPath);
Map<String, Object> params = new HashMap<>();
AuthType authType = getAuthType();
if (authType == AuthType.TOKEN_MODE) {
params.put(CommonConstant.TOKEN, getToken(username));
} else if (authType == AuthType.ACCESS_SECRET_MODE) {
params.put(CommonConstant.USERNAME, username);
params.put(CommonConstant.ACCESS_KEY, getAccessKey());
String currentTimeMillis = getCurrentTimeMillis();
params.put(CommonConstant.CURRENT_TIME_MILLIS, currentTimeMillis);
params.put(CommonConstant.SIGNATURE, getsSignature(username, currentTimeMillis));
public String getWebSessionUrl(String username, String sessionId) {
String webSessionUrlPath = AppPathConstant.WEB_SESSION_URL_PATH.replace("{sessionId}", sessionId);
Map<String, String> result = execution.get(webSessionUrlPath, username, new TypeReference<ResponseResult<Map<String, String>>>() {
});
if (CollectionUtil.isEmpty(result)) {
return null;
}
return JHApiClient.getUrl(url, params);
return result.get("url");
}
/**
@@ -130,16 +114,16 @@ public class JHAppApiExecution extends JHApiExecution {
* @return 会话列表
*/
public List<SessionInfo> getDesktopList(String username) {
return get(AppPathConstant.APPS_SESSIONS_ALL_PATH, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
});
return execution.get(AppPathConstant.APPS_SESSIONS_ALL_PATH, username,
new TypeReference<ResponseResult<List<SessionInfo>>>() {
});
}
/**
* 使用参数查询会话列表
* <ul>
* <li>sessionIds 和 sessionName 不能同时为空</li>
* <li>开启密级后,仅能查看比自己密级低以及和自己密级一致的会话</li>
* <li>sessionIds 和 sessionName 不能同时为空</li>
* <li>开启密级后,仅能查看比自己密级低以及和自己密级一致的会话</li>
* </ul>
*
* @param username 用户名
@@ -156,11 +140,10 @@ public class JHAppApiExecution extends JHApiExecution {
params.put("sessionName", sessionName);
}
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
});
}
/**
* 根据会话列表查询会话列表
* <p>
@@ -178,7 +161,7 @@ public class JHAppApiExecution extends JHApiExecution {
}
params.put("sessionIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, ids));
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_IDS_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
});
}
@@ -200,16 +183,16 @@ public class JHAppApiExecution extends JHApiExecution {
}
params.put("sessionName", sessionName);
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_NAME_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<SessionInfo>>>() {
});
}
/**
* 会话共享
* <ul>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>observers 和 interacts 不能同时为空</li>
* <li>会话共享有密级限制,仅能将会话共享给比会话密级高的用户</li>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>observers 和 interacts 不能同时为空</li>
* <li>会话共享有密级限制,仅能将会话共享给比会话密级高的用户</li>
* </ul>
*
* @param username 用户名
@@ -218,7 +201,8 @@ public class JHAppApiExecution extends JHApiExecution {
* @param interacts 协作者列表 (非必填)
* @param isTransfer 是否传递操作权(不确定,需要咨询产品,非必填)
*/
public void shareDesktop(String username, String sessionId, List<String> observers, List<String> interacts, String isTransfer) {
public void shareDesktop(String username, String sessionId, List<String> observers, List<String> interacts,
String isTransfer) {
if (StringUtils.isBlank(sessionId)) {
throw new ArgsException("sessionId为必填字段");
}
@@ -232,16 +216,16 @@ public class JHAppApiExecution extends JHApiExecution {
if (StringUtils.isBlank(isTransfer)) {
params.put("isTransfer", isTransfer);
}
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_SHARE_PATH.replace("{sessionId}", sessionId), params);
post(path, username);
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_SHARE_PATH.replace("{sessionId}", sessionId),
params);
execution.post(path, username);
}
/**
* 取消会话共享
* <ul>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>开启密级后,仅能操作比自己密级低或者和自己密级一致的会话</li>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>开启密级后,仅能操作比自己密级低或者和自己密级一致的会话</li>
* </ul>
*
* @param username 用户名
@@ -252,14 +236,14 @@ public class JHAppApiExecution extends JHApiExecution {
throw new ArgsException("sessionId为必填字段");
}
String path = AppPathConstant.APPS_SESSIONS_CANCEL_SHARE_PATH.replace("{sessionId}", sessionId);
put(path, username);
execution.put(path, username);
}
/**
* 传递会话操作权
* <ul>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>开启密级后,仅能操作比自己密级低或者和自己密级一致的会话</li>
* <li>调用该接口需要打开景行会话共享的功能</li>
* <li>开启密级后,仅能操作比自己密级低或者和自己密级一致的会话</li>
* </ul>
*
* @param username 用户名
@@ -277,10 +261,9 @@ public class JHAppApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("interact", interact);
path = JHApiClient.getUrl(path, params);
put(path, username);
execution.put(path, username);
}
/**
* 连接会话
*
@@ -293,8 +276,9 @@ public class JHAppApiExecution extends JHApiExecution {
throw new ArgsException("sessionId为必填字段");
}
String path = AppPathConstant.APPS_SESSIONS_CONNECT_JHAPP_PATH.replace("{sessionId}", sessionId);
List<AppStartedInfo> list = get(path, username, new TypeReference<ResponseResult<List<AppStartedInfo>>>() {
});
List<AppStartedInfo> list = execution.get(path, username,
new TypeReference<ResponseResult<List<AppStartedInfo>>>() {
});
if (CollectionUtil.isEmpty(list)) {
throw new ServiceException(path, 500, "获取到的会话信息为空");
}
@@ -304,7 +288,6 @@ public class JHAppApiExecution extends JHApiExecution {
return appStartedInfo;
}
/**
* 断开会话连接(作业/应用)
* <p>
@@ -319,10 +302,9 @@ public class JHAppApiExecution extends JHApiExecution {
throw new ArgsException("sessionId为必填字段");
}
String path = AppPathConstant.APPS_SESSIONS_DISCONNECT_PATH.replace("{sessionId}", sessionId);
put(path, username);
execution.put(path, username);
}
/**
* 通过应用id批量断开会话作业/应用)
* <p>
@@ -339,10 +321,9 @@ public class JHAppApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("sessionIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, sessionIds));
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_DISCONNECT_IDS_PATH, params);
put(path, username);
execution.put(path, username);
}
/**
* 注销会话
* <p>
@@ -357,10 +338,9 @@ public class JHAppApiExecution extends JHApiExecution {
throw new ArgsException("sessionId为必填字段");
}
String path = AppPathConstant.APPS_SESSIONS_DESTROY_PATH.replace("{sessionId}", sessionId);
put(path, username);
execution.put(path, username);
}
/**
* 批量注销会话
*
@@ -374,10 +354,9 @@ public class JHAppApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("sessionIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, sessionIds));
String path = JHApiClient.getUrl(AppPathConstant.APPS_SESSIONS_DESTROY_IDS_PATH, params);
put(path, username);
execution.put(path, username);
}
/**
* 获取当前用户的应用列表
*
@@ -385,15 +364,15 @@ public class JHAppApiExecution extends JHApiExecution {
* @return 应用列表
*/
public List<AppInfo> getAppList(String username) {
return get(AppPathConstant.APPS_LIST_PATH, username, new TypeReference<ResponseResult<List<AppInfo>>>() {
});
return execution.get(AppPathConstant.APPS_LIST_PATH, username,
new TypeReference<ResponseResult<List<AppInfo>>>() {
});
}
/**
* 获取应用链接
*
* @param username 户名
* @param username 户名
* @param appName 应用名
* @return 应用链接地址
*/
@@ -402,11 +381,265 @@ public class JHAppApiExecution extends JHApiExecution {
throw new ArgsException("appName为必填字段");
}
String path = AppPathConstant.APPS_GET_URL_PATH.replace("{appName}", appName);
List<Map<String, String>> apps = get(path, username, new TypeReference<ResponseResult<List<Map<String, String>>>>() {
});
List<Map<String, String>> apps = execution.get(path, username,
new TypeReference<ResponseResult<List<Map<String, String>>>>() {
});
if (CollectionUtil.isEmpty(apps)) {
throw new ServiceException(path, 500, "应用信息为空!");
}
return apps.get(0).get("url");
}
/**
* 根据文件后缀查询应用
*
* @param username 用户名
* @param suffixes 文件后缀列表
* @return 应用列表
*/
public List<AppstoreAppInfo> getAppInfoSuffixList(String username, String... suffixes) {
return getAppInfoSuffixList(username, Arrays.asList(suffixes));
}
/**
* 根据文件后缀查询应用
*
* @param username 用户名
* @param suffixes 文件后缀列表
* @return 应用列表
*/
public List<AppstoreAppInfo> getAppInfoSuffixList(String username, List<String> suffixes) {
Map<String, Object> params = new HashMap<>(1);
if (CollectionUtil.isNotEmpty(suffixes)) {
params.put("suffixes", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, suffixes));
}
String path = JHApiClient.getUrl(AppPathConstant.APPS_SUFFIXES_PATH, params);
return execution.get(path, username, new TypeReference<ResponseResult<List<AppstoreAppInfo>>>() {
});
}
/**
* 根据用途查询应用
*
* @param username 用户名
* @param labels 用途列表
* @return 应用列表
*/
public List<UseLabelInfo> getUseLabelList(String username, String... labels) {
return getUseLabelList(username, Arrays.asList(labels));
}
/**
* 根据用途查询应用
*
* @param username 用户名
* @param labels 用途列表
* @return 应用列表
*/
public List<UseLabelInfo> getUseLabelList(String username, List<String> labels) {
Map<String, Object> params = new HashMap<>(1);
if (CollectionUtil.isNotEmpty(labels)) {
params.put("use_labels", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, labels));
}
String path = JHApiClient.getUrl(AppPathConstant.APP_USE_LABEL_PATH, params);
return execution.get(path, username, new TypeReference<ResponseResult<List<UseLabelInfo>>>() {
});
}
/**
* 启动一个会话
*
* @param appId 应用ID
* @return JHClient协议链接
*/
public AppStartedInfo desktopStart(String appId) {
return desktopStart(appId, new AppStartRequest());
}
/**
* 启动一个会话
*
* @param appId 应用ID
* @param appStartRequest 启动参数
* @return JHClient协议链接
*/
public AppStartedInfo desktopStart(String appId, AppStartRequest appStartRequest) {
return desktopStart(null, appId, appStartRequest);
}
/**
* 获取Web会话URL
*
* @param sessionId 会话ID
* @return Web会话URL
*/
public String getWebSessionUrl(String sessionId) {
return getWebSessionUrl(null, sessionId);
}
/**
* 查询当前用户的会话列表
*
* @return 会话列表
*/
public List<SessionInfo> getDesktopList() {
return getDesktopList(null);
}
/**
* 使用参数查询会话列表
*
* @param sessionIds 会话ID列表非必填
* @param sessionName 会话名称(非必填)
* @return 会话列表
*/
public List<SessionInfo> getDesktopsByParams(List<String> sessionIds, String sessionName) {
return getDesktopsByParams(null, sessionIds, sessionName);
}
/**
* 根据会话ID列表查询会话列表
*
* @param ids 会话ID列表
* @return 会话列表
*/
public List<SessionInfo> getDesktopsById(List<String> ids) {
return getDesktopsById(null, ids);
}
/**
* 根据会话名称查询会话
*
* @param sessionName 会话名称
* @return 会话列表
*/
public List<SessionInfo> getDesktopsByName(String sessionName) {
return getDesktopsByName(null, sessionName);
}
/**
* 会话共享
*
* @param sessionId 会话ID必填
* @param observers 观察者列表(非必填)
* @param interacts 协作者列表(非必填)
* @param isTransfer 是否传递操作权(非必填)
*/
public void shareDesktop(String sessionId, List<String> observers, List<String> interacts, String isTransfer) {
shareDesktop(null, sessionId, observers, interacts, isTransfer);
}
/**
* 取消会话共享
*
* @param sessionId 会话ID
*/
public void cancelShare(String sessionId) {
cancelShare(null, sessionId);
}
/**
* 传递会话操作权
*
* @param sessionId 会话ID必填
* @param interact 操作权(必填)
*/
public void transferOperatorRight(String sessionId, String interact) {
transferOperatorRight(null, sessionId, interact);
}
/**
* 连接会话
*
* @param sessionId 会话ID
* @return JHClient协议链接信息
*/
public AppStartedInfo connectJhapp(String sessionId) {
return connectJhapp(null, sessionId);
}
/**
* 断开会话连接
*
* @param sessionId 会话ID
*/
public void disconnectSessionInfo(String sessionId) {
disconnectSessionInfo(null, sessionId);
}
/**
* 通过应用ID批量断开会话
*
* @param sessionIds 会话ID列表
*/
public void disconnectSessionByIds(List<String> sessionIds) {
disconnectSessionByIds(null, sessionIds);
}
/**
* 注销会话
*
* @param sessionId 会话ID
*/
public void destroySession(String sessionId) {
destroySession(null, sessionId);
}
/**
* 批量注销会话
*
* @param sessionIds 会话ID列表
*/
public void destroySessionByIds(List<String> sessionIds) {
destroySessionByIds(null, sessionIds);
}
/**
* 获取当前用户的应用列表
*
* @return 应用列表
*/
public List<AppInfo> getAppList() {
return getAppList(null);
}
/**
* 根据文件后缀查询应用
*
* @param suffixes 文件后缀列表
* @return 应用列表
*/
public List<AppstoreAppInfo> getAppInfoSuffixList(String... suffixes) {
return getAppInfoSuffixList(null, suffixes);
}
/**
* 根据文件后缀查询应用
*
* @param suffixes 文件后缀列表
* @return 应用列表
*/
public List<AppstoreAppInfo> getAppInfoSuffixList(List<String> suffixes) {
return getAppInfoSuffixList(null, suffixes);
}
/**
* 根据用途查询应用
*
* @param labels 用途列表
* @return 应用列表
*/
public List<UseLabelInfo> getUseLabelList(String... labels) {
return getUseLabelList(null, labels);
}
/**
* 根据用途查询应用
*
* @param labels 用途列表
* @return 应用列表
*/
public List<UseLabelInfo> getUseLabelList(List<String> labels) {
return getUseLabelList(null, labels);
}
}

View File

@@ -0,0 +1,28 @@
package com.jhinno.sdk.openapi.api.app;
import lombok.Data;
import java.util.List;
@Data
public class UseLabelInfo {
/**
* 用途id
*/
private String useLabelId;
/**
* 用途名称
*/
private String useLabelName;
/**
* 用途图片
*/
private String useLabelIcon;
/**
* 用途app列表
*/
private List<AppstoreAppInfo> apps;
}

View File

@@ -11,22 +11,22 @@ public class AuthPathConstant {
/**
* 获取用户token
*/
public static final String AUTH_TOKEN_PATH = "/ws/api/auth/token";
public static final String AUTH_TOKEN_PATH = "/appform/ws/api/auth/token";
/**
* 注销token
*/
public static final String AUTH_LOGOUT = "/ws/api/auth/logout";
public static final String AUTH_LOGOUT = "/appform/ws/api/auth/logout";
/**
* 用户注册
*/
public static final String AUTH_REGISTER = "/ws/api/auth/register";
public static final String AUTH_REGISTER = "/appform/ws/api/auth/register";
/**
* 测试服务器是否可用
*/
public static final String PING = "/ws/api/ping";
public static final String PING = "/appform/ws/api/ping";
}

View File

@@ -11,32 +11,32 @@ public class DataPathConstant {
/**
* 根据用户scope查询数据目录列表
*/
public static final String DATA_SPOOLERS_PATH = "/ws/api/spoolers";
public static final String DATA_SPOOLERS_PATH = "/appform/ws/api/spoolers";
/**
* 根据作业id查数据目录信息
*/
public static final String DATA_SPOOLER_JOB_ID_PATH = "/ws/api/spooler/{jobId}";
public static final String DATA_SPOOLER_JOB_ID_PATH = "/appform/ws/api/spooler/{jobId}";
/**
* 根据作业id集合查询数据目录列表
*/
public static final String DATA_SPOOLERS_LIST_PATH = "/ws/api/spoolers/list";
public static final String DATA_SPOOLERS_LIST_PATH = "/appform/ws/api/spoolers/list";
/**
* 根据数据目录名称查询数据目录列表
*/
public static final String DATA_SPOOLERS_NAME_PATH = "/ws/api/spoolers/name";
public static final String DATA_SPOOLERS_NAME_PATH = "/appform/ws/api/spoolers/name";
/**
* 立即删除数据目录
*/
public static final String DATA_SPOOLERS_DELETE_ID_PATH = "/ws/api/spooler/del/{id}";
public static final String DATA_SPOOLERS_DELETE_ID_PATH = "/appform/ws/api/spooler/del/{id}";
/**
* 设置过期时间删除数据目录
*/
public static final String DATA_SPOOLERS_PURGE_PATH = "/ws/api/spooler/purge";
public static final String DATA_SPOOLERS_PURGE_PATH = "/appform/ws/api/spooler/purge";
}

View File

@@ -1,10 +1,7 @@
package com.jhinno.sdk.openapi.api.data;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.CommonConstant;
import com.jhinno.sdk.openapi.ServiceException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.*;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
import com.jhinno.sdk.openapi.utils.CollectionUtil;
@@ -23,16 +20,7 @@ import java.util.Map;
* @date 2024/2/4 17:09
*/
@NoArgsConstructor
public class JHDataApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHDataApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public class JHDataApiExecution extends JHApiExecutionAbstract {
/**
* 根据用户scope查询数据目录列表
@@ -41,11 +29,11 @@ public class JHDataApiExecution extends JHApiExecution {
* @return 用户数据目录列表
*/
public List<SpoolerDataInfo> getSpoolersData(String username) {
return get(DataPathConstant.DATA_SPOOLERS_PATH, username, new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
return execution.get(DataPathConstant.DATA_SPOOLERS_PATH, username,
new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
}
/**
* 根据作业id查作业数据目录信息
*
@@ -58,8 +46,9 @@ public class JHDataApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = DataPathConstant.DATA_SPOOLER_JOB_ID_PATH.replace("{jobId}", jobId);
List<SpoolerDataInfo> list = get(path, username, new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
List<SpoolerDataInfo> list = execution.get(path, username,
new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
if (CollectionUtil.isEmpty(list)) {
throw new ServiceException(path, 500, "作业数据目录信息为空!");
}
@@ -80,7 +69,7 @@ public class JHDataApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
String path = JHApiClient.getUrl(DataPathConstant.DATA_SPOOLERS_LIST_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
}
@@ -98,15 +87,15 @@ public class JHDataApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("name", dataName);
String path = JHApiClient.getUrl(DataPathConstant.DATA_SPOOLERS_NAME_PATH, params);
List<SpoolerDataInfo> list = get(path, username, new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
List<SpoolerDataInfo> list = execution.get(path, username,
new TypeReference<ResponseResult<List<SpoolerDataInfo>>>() {
});
if (CollectionUtil.isEmpty(list)) {
throw new ServiceException(path, 500, "作业数据目录信息为空!");
}
return list.get(0);
}
/**
* 立即删除作业数据目录
*
@@ -118,11 +107,10 @@ public class JHDataApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = DataPathConstant.DATA_SPOOLERS_DELETE_ID_PATH.replace("{id}", jobId);
get(path, username, new TypeReference<ResponseResult<Object>>() {
execution.get(path, username, new TypeReference<ResponseResult<Object>>() {
});
}
/**
* 设置用户数据目录的过期时间,也给以通过设置过期时间来删除用户数据区
*
@@ -141,8 +129,67 @@ public class JHDataApiExecution extends JHApiExecution {
params.put("id", jobId);
params.put("expiration_time", expirationTime);
String path = JHApiClient.getUrl(DataPathConstant.DATA_SPOOLERS_PURGE_PATH, params);
get(path, username, new TypeReference<ResponseResult<Object>>() {
execution.get(path, username, new TypeReference<ResponseResult<Object>>() {
});
}
/**
* 根据用户scope查询数据目录列表
*
* @return 用户数据目录列表
*/
public List<SpoolerDataInfo> getSpoolersData() {
return getSpoolersData(null);
}
/**
* 根据作业id查作业数据目录信息
*
* @param jobId 作业id
* @return 作业目录信息
*/
public SpoolerDataInfo getSpoolersDataById(String jobId) {
return getSpoolersDataById(null, jobId);
}
/**
* 根据作业id集合查询数据目录列表
*
* @param jobIds 作业id列表
* @return 用户数据目录列表
*/
public List<SpoolerDataInfo> getSpoolersDataByIds(List<String> jobIds) {
return getSpoolersDataByIds(null, jobIds);
}
/**
* 根据数据目录名称查询数据目录列表
*
* @param dataName 数据目录名称
* @return 作业目录信息
*/
public SpoolerDataInfo getSpoolersByName(String dataName) {
return getSpoolersByName(null, dataName);
}
/**
* 立即删除作业数据目录
*
* @param jobId 作业id
*/
public void deleteSpoolerData(String jobId) {
deleteSpoolerData(null, jobId);
}
/**
* 设置用户数据目录的过期时间,也给以通过设置过期时间来删除用户数据区
*
* @param jobId 作业id
* @param expirationTime 过期时间
*/
public void purgeSpooler(String jobId, Date expirationTime) {
purgeSpooler(null, jobId, expirationTime);
}
}

View File

@@ -0,0 +1,28 @@
package com.jhinno.sdk.openapi.api.file;
import lombok.Data;
@Data
public class Confidential {
/**
* 密级key
*/
private String conf;
/**
* 密级英文名
*/
private String confEn;
/**
* 密级中文名
*/
private String confCn;
/**
* 密级权重
*/
private int confLevel;
}

View File

@@ -12,56 +12,61 @@ public class FilePathConstant {
/**
* 重命名文件
*/
public static final String FILE_RENAME_PATH = "/ws/api/files/rename";
public static final String FILE_RENAME_PATH = "/appform/ws/api/files/rename";
/**
* 删除文件
*/
public static final String FILE_DELETE_PATH = "/ws/api/files/delete";
public static final String FILE_DELETE_PATH = "/appform/ws/api/files/delete";
/**
* 拷贝文件
*/
public static final String FILE_COPY_PATH = "/ws/api/files/copy";
public static final String FILE_COPY_PATH = "/appform/ws/api/files/copy";
/**
* 获取文件列表
*/
public static final String FILE_LIST_PATH = "/ws/api/files";
public static final String FILE_LIST_PATH = "/appform/ws/api/files";
/**
* 创建文件夹
*/
public static final String FILE_MKDIR_PATH = "/ws/api/files/mkdir";
public static final String FILE_MKDIR_PATH = "/appform/ws/api/files/mkdir";
/**
* 创建文件
*/
public static final String FILE_MKFILE_PATH = "/ws/api/files/mkfile";
public static final String FILE_MKFILE_PATH = "/appform/ws/api/files/mkfile";
/**
* 文件上传
*/
public static final String FILE_UPLOAD_PATH = "/ws/api/files/upload";
public static final String FILE_UPLOAD_PATH = "/appform/ws/api/files/upload";
/**
* 文件下载
*/
public static final String FILE_DOWNLOAD_PATH = "/ws/api/files/download";
public static final String FILE_DOWNLOAD_PATH = "/appform/ws/api/files/download";
/**
* 压缩文件
*/
public static final String FILE_COMPRESS_PATH = "/ws/api/files/compress";
public static final String FILE_COMPRESS_PATH = "/appform/ws/api/files/compress";
/**
* 解压文件
*/
public static final String FILE_UNCOMPRESS_PATH = "/ws/api/files/uncompress";
public static final String FILE_UNCOMPRESS_PATH = "/appform/ws/api/files/uncompress";
/**
* 密级相关请求路径
*/
public static final String FILE_CONF_PATH = "/appform/ws/api/file/conf";
}

View File

@@ -1,10 +1,7 @@
package com.jhinno.sdk.openapi.api.file;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.CommonConstant;
import com.jhinno.sdk.openapi.ServiceException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.*;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
import com.jhinno.sdk.openapi.utils.CollectionUtil;
@@ -14,6 +11,7 @@ import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
@@ -26,12 +24,7 @@ import java.util.Map;
* @date 2024/2/4 18:58
*/
@NoArgsConstructor
public class JHFileApiExecution extends JHApiExecution {
public JHFileApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public class JHFileApiExecution extends JHApiExecutionAbstract {
/**
* 重命名文件
@@ -50,9 +43,18 @@ public class JHFileApiExecution extends JHApiExecution {
Map<String, Object> body = new HashMap<>(2);
body.put("oldFileName", sourceFileNamePath);
body.put("newFileName", targetFileName);
put(FilePathConstant.FILE_RENAME_PATH, username, body);
execution.put(FilePathConstant.FILE_RENAME_PATH, username, body);
}
/**
* 重命名文件
*
* @param sourceFileNamePath 源文件路径
* @param targetFileName 目标文件路径
*/
public void renameFile(String sourceFileNamePath, String targetFileName) {
renameFile(null, sourceFileNamePath, targetFileName);
}
/**
* 删除文件
@@ -67,9 +69,17 @@ public class JHFileApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("fileName", sourceFilePath);
String path = JHApiClient.getUrl(FilePathConstant.FILE_DELETE_PATH, params);
delete(path, username);
execution.delete(path, username);
}
/**
* 删除文件
*
* @param sourceFilePath 源文件路径
*/
public void deleteFile(String sourceFilePath) {
deleteFile(null, sourceFilePath);
}
/**
* 拷贝文件到目标文件夹
@@ -88,9 +98,18 @@ public class JHFileApiExecution extends JHApiExecution {
Map<String, Object> body = new HashMap<>(2);
body.put("sourceFileName", sourceFilePath);
body.put("targetDirectory", targetDirectoryPath);
put(FilePathConstant.FILE_COPY_PATH, username, body);
execution.put(FilePathConstant.FILE_COPY_PATH, username, body);
}
/**
* 拷贝文件到目标文件夹
*
* @param sourceFilePath 源文件路径
* @param targetDirectoryPath 目标文件路径
*/
public void copyFile(String sourceFilePath, String targetDirectoryPath) {
copyFile(null, sourceFilePath, targetDirectoryPath);
}
/**
* 获取文件列表
@@ -106,10 +125,19 @@ public class JHFileApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("dir", dirPath);
String path = JHApiClient.getUrl(FilePathConstant.FILE_LIST_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<FileInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<FileInfo>>>() {
});
}
/**
* 获取文件列表
*
* @param dirPath 文件路径
* @return 文件列表
*/
public List<FileInfo> getFileList(String dirPath) {
return getFileList(null, dirPath);
}
/**
* 创建文件夹
@@ -128,15 +156,15 @@ public class JHFileApiExecution extends JHApiExecution {
if (isForce != null) {
body.put("isForce", isForce.toString());
}
Map<String, String> result = post(FilePathConstant.FILE_MKDIR_PATH, username, body, new TypeReference<ResponseResult<Map<String, String>>>() {
});
Map<String, String> result = execution.post(FilePathConstant.FILE_MKDIR_PATH, username, body,
new TypeReference<ResponseResult<Map<String, String>>>() {
});
if (CollectionUtil.isEmpty(result)) {
return null;
}
return result.get("dirPath");
}
/**
* 新建文件夹,默认不强制新建
*
@@ -148,6 +176,26 @@ public class JHFileApiExecution extends JHApiExecution {
return mkdir(username, dirPath, null);
}
/**
* 创建文件夹
*
* @param dirPath 文件夹路径
* @param isForce 是否强制创建非必传默认false
* @return 新建后的文件路径
*/
public String mkdir(String dirPath, Boolean isForce) {
return mkdir(null, dirPath, isForce);
}
/**
* 新建文件夹,默认不强制新建
*
* @param dirPath 文件路径
* @return 新建后的文件路径
*/
public String mkdir(String dirPath) {
return mkdir(dirPath, true);
}
/**
* 创建文件
@@ -162,14 +210,68 @@ public class JHFileApiExecution extends JHApiExecution {
}
Map<String, Object> body = new HashMap<>(1);
body.put("filePath", filePath);
Map<String, String> result = post(FilePathConstant.FILE_MKFILE_PATH, username, body, new TypeReference<ResponseResult<Map<String, String>>>() {
});
Map<String, String> result = execution.post(FilePathConstant.FILE_MKFILE_PATH, username, body,
new TypeReference<ResponseResult<Map<String, String>>>() {
});
if (CollectionUtil.isEmpty(result)) {
return null;
}
return result.get("dirPath");
}
/**
* 创建文件
*
* @param filePath 文件路径
* @return 新的文件路径
*/
public String mkFile(String filePath) {
return mkFile(null, filePath);
}
/**
* 上传文件
* <p>
* 如果isCover为空或者为false源文件目录下存在相同文件则会报错
* </p>
*
* @param username 用户名
* @param is 文件流
* @param fileName 文件名称
* @param uploadPath 上传路径
* @param isCover 是否覆盖非必填默认false
* @param fileConf 密级只有开启了密级才需要此参数可以是密级的中文名也可以是密级的中文名、英文名、或者密级的key
*/
public void uploadFile(String username, InputStream is, String fileName, String uploadPath, Boolean isCover, String fileConf) {
if (is == null) {
throw new ArgsException("is是必填参数");
}
if (StringUtils.isBlank(uploadPath)) {
throw new ArgsException("uploadPath是必填参数");
}
Map<String, Object> body = new HashMap<>(3);
if (isCover != null) {
body.put("isCover", isCover);
}
if (StringUtils.isNotBlank(fileConf)) {
body.put("fileConf", fileConf);
}
body.put("uploadPath", uploadPath);
ResponseResult<Object> result = execution.getJhApiClient().upload(
FilePathConstant.FILE_UPLOAD_PATH,
"file",
fileName,
is,
execution.getHeaders(username, false),
body,
new TypeReference<ResponseResult<Object>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(FilePathConstant.FILE_UPLOAD_PATH, result.getCode(), result.getMessage());
}
}
/**
* 上传文件
* <p>
@@ -183,38 +285,15 @@ public class JHFileApiExecution extends JHApiExecution {
* @param isCover 是否覆盖非必填默认false
*/
public void uploadFile(String username, InputStream is, String fileName, String uploadPath, Boolean isCover) {
if (is == null) {
throw new ArgsException("is是必填参数");
}
if (StringUtils.isBlank(uploadPath)) {
throw new ArgsException("uploadPath是必填参数");
}
Map<String, Object> body = new HashMap<>(3);
if (isCover != null) {
body.put("isCover", isCover);
}
body.put("uploadPath", uploadPath);
ResponseResult<Object> result = getJhApiClient().upload(
FilePathConstant.FILE_UPLOAD_PATH,
"file",
fileName,
is,
getHeaders(username, false),
body,
new TypeReference<ResponseResult<Object>>() {
}
);
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(FilePathConstant.FILE_UPLOAD_PATH, result.getCode(), result.getMessage());
}
uploadFile(username, is, fileName, uploadPath, isCover, null);
}
/**
* 上传文件(不覆盖源文件)
* <p>源文件目录下存在相同文件则会报错</p>
* <p>
* 源文件目录下存在相同文件则会报错
* </p>
*
* @param username 用户名
* @param is 文件流
@@ -226,6 +305,8 @@ public class JHFileApiExecution extends JHApiExecution {
}
/**
* 上传一个本地的路径
*
* @param username 用户名
* @param path 本地文件路径
* @param fileName 文件名
@@ -241,40 +322,22 @@ public class JHFileApiExecution extends JHApiExecution {
uploadFile(username, fileInputStream, fileName, uploadPath, isCover);
}
/**
* 上传一个本地的路径(不覆盖源文件)
* <p>
* 源文件目录下存在相同文件则会报错
* </p>
*
* @param username 用户名
* @param path 本地文件路径
* @param fileName 文件名
* @param uploadPath 上传路径,服务器路径
*/
public void uploadFile(String username, String path, String fileName, String uploadPath) throws FileNotFoundException {
public void uploadFile(String username, String path, String fileName, String uploadPath)
throws FileNotFoundException {
uploadFile(username, path, fileName, uploadPath, null);
}
/**
* @param username 用户名
* @param path 本地文件路径
* @param uploadPath 上传路径,服务器路径
* @param isCover 是否覆盖非必填默认false
*/
public void uploadFile(String username, String path, String uploadPath, Boolean isCover) throws FileNotFoundException {
File file = new File(path);
uploadFile(username, path, file.getName(), uploadPath, isCover);
}
/**
* @param username 用户名
* @param path 本地文件路径
* @param uploadPath 上传路径,服务器路径
*/
public void uploadFile(String username, String path, String uploadPath) throws FileNotFoundException {
File file = new File(path);
uploadFile(username, path, file.getName(), uploadPath, null);
}
/**
* 获取文件下载地址
*
@@ -283,20 +346,60 @@ public class JHFileApiExecution extends JHApiExecution {
* @return 文件地址信息
*/
public String getFileDownloadUrl(String username, String filePath) {
return getFileDownloadUrl(username, filePath, null);
}
/**
* 获取文件下载地址
*
* @param username 用户名
* @param filePath 文件路径
* @param forceDownload 是否强制下载打开密级之后未标密的文件无法下载可以通过设置当前参数为true来强制下载默认false
* @return 文件地址信息
*/
public String getFileDownloadUrl(String username, String filePath, Boolean forceDownload) {
if (StringUtils.isBlank(filePath)) {
throw new ArgsException("filePath不能为空");
}
Map<String, Object> params = new HashMap<>(1);
params.put("filePath", filePath);
params.put("forceDownload", forceDownload);
String path = JHApiClient.getUrl(FilePathConstant.FILE_DOWNLOAD_PATH, params);
Map<String, String> downloadInfo = get(path, username, new TypeReference<ResponseResult<Map<String, String>>>() {
});
Map<String, String> downloadInfo = execution.get(path, username,
new TypeReference<ResponseResult<Map<String, String>>>() {
});
if (CollectionUtil.isEmpty(downloadInfo)) {
return null;
}
return downloadInfo.get("url");
}
/**
* 获取文件输入流
*
* @param username 用户名
* @param filePath 文件路径
* @return 文件流
* @throws IOException
*/
public InputStream getFileInputStream(String username, String filePath) throws IOException {
return getFileInputStream(username, filePath, null);
}
/**
* 获取文件输入流
*
* @param username 用户名
* @param filePath 文件路径
* @param forceDownload 是否强制下载打开密级之后未标密的文件无法下载可以通过设置当前参数为true来强制下载默认false
* @return 文件流
* @throws IOException
*/
public InputStream getFileInputStream(String username, String filePath, Boolean forceDownload) throws IOException {
String fileUrl = getFileDownloadUrl(username, filePath, forceDownload);
return execution.getJhApiClient().getApiHttpClient().get(fileUrl, null);
}
/**
* 文件压缩
*
@@ -319,19 +422,7 @@ public class JHFileApiExecution extends JHApiExecution {
params.put("compressType", compressType);
}
String path = JHApiClient.getUrl(FilePathConstant.FILE_COMPRESS_PATH, params);
post(path, username);
}
/**
* 文件压缩
*
* @param username 用户名
* @param sourceDirName 源文件目录(多个文件适用英文逗号隔开)
* @param targetFilePath 目标文件路径
*/
public void compress(String username, String sourceDirName, String targetFilePath) {
compress(username, sourceDirName, targetFilePath, null);
execution.post(path, username);
}
/**
@@ -344,7 +435,8 @@ public class JHFileApiExecution extends JHApiExecution {
* @param password 密码
* @param compressType 压缩类型 (未使用以后扩展)
*/
public void uncompress(String username, String sourceFilePath, String targetDirPath, Boolean isCover, String password, String compressType) {
public void uncompress(String username, String sourceFilePath, String targetDirPath, Boolean isCover,
String password, String compressType) {
if (StringUtils.isBlank(sourceFilePath)) {
throw new ArgsException("sourceFilePath不能为空");
}
@@ -364,10 +456,9 @@ public class JHFileApiExecution extends JHApiExecution {
params.put("compressType", compressType);
}
String path = JHApiClient.getUrl(FilePathConstant.FILE_UNCOMPRESS_PATH, params);
post(path, username);
execution.post(path, username);
}
/**
* 解压文件
*
@@ -377,7 +468,8 @@ public class JHFileApiExecution extends JHApiExecution {
* @param isCover 是否覆盖
* @param password 密码
*/
public void uncompress(String username, String sourceFilePath, String targetDirPath, Boolean isCover, String password) {
public void uncompress(String username, String sourceFilePath, String targetDirPath, Boolean isCover,
String password) {
uncompress(username, sourceFilePath, targetDirPath, isCover, password, null);
}
@@ -403,6 +495,264 @@ public class JHFileApiExecution extends JHApiExecution {
public void uncompress(String username, String sourceFilePath, String targetDirPath) {
uncompress(username, sourceFilePath, targetDirPath, null);
}
/**
* 获取可用的文件吗密级列表
*
* @param username 用户名
* @return 密级列表
*/
public List<Confidential> getConfList(String username) {
return execution.get(FilePathConstant.FILE_CONF_PATH, username, new TypeReference<ResponseResult<List<Confidential>>>() {
});
}
/**
* 文件表表标密
*
* @param username 用户名
* @param conf 密级使用{@link JHFileApiExecution#getConfList(String)}返回的{@link Confidential#conf}
* @param path 文件路径
*
*
*/
public void markConf(String username, String conf, String path) {
Map<String, Object> body = new HashMap<>(2);
body.put("conf", conf);
body.put("path", path);
execution.post(FilePathConstant.FILE_CONF_PATH, username, body);
}
/**
* 上传文件
* <p>
* 如果isCover为空或者为false源文件目录下存在相同文件则会报错
* </p>
*
* @param is 文件流
* @param fileName 文件名称
* @param uploadPath 上传路径
* @param isCover 是否覆盖非必填默认false
* @param fileConf 密级只有开启了密级才需要此参数可以是密级的中文名也可以是密级的中文名、英文名、或者密级的key
*/
public void uploadFile(InputStream is, String fileName, String uploadPath, Boolean isCover, String fileConf) {
uploadFile(null, is, fileName, uploadPath, isCover, fileConf);
}
/**
* 上传文件
* <p>
* 如果isCover为空或者为false源文件目录下存在相同文件则会报错
* </p>
*
* @param is 文件流
* @param fileName 文件名称
* @param uploadPath 上传路径
* @param isCover 是否覆盖非必填默认false
*/
public void uploadFile(InputStream is, String fileName, String uploadPath, Boolean isCover) {
uploadFile(is, fileName, uploadPath, isCover, null);
}
/**
* 上传文件(不覆盖源文件)
* <p>
* 源文件目录下存在相同文件则会报错
* </p>
*
* @param is 文件流
* @param fileName 文件名
* @param uploadPath 上传路径
*/
public void uploadFile(InputStream is, String fileName, String uploadPath) {
uploadFile(is, fileName, uploadPath, false);
}
/**
* 上传一个本地的路径
*
* @param path 本地文件路径
* @param fileName 文件名
* @param uploadPath 上传路径,服务器路径
* @param isCover 是否覆盖非必填默认false
*/
public void uploadFile(String path, String fileName, String uploadPath, Boolean isCover) throws FileNotFoundException {
if (StringUtils.isBlank(path)) {
throw new ArgsException("path是必填参数");
}
File file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);
if (StringUtils.isBlank(fileName)) {
fileName = file.getName();
}
uploadFile(fileInputStream, fileName, uploadPath, isCover);
}
/**
* 上传一个本地的路径(不覆盖源文件)
* <p>
* 源文件目录下存在相同文件则会报错
* </p>
*
* @param path 本地文件路径
* @param fileName 文件名
* @param uploadPath 上传路径,服务器路径
*/
public void uploadFile(String path, String fileName, String uploadPath) throws FileNotFoundException {
uploadFile(path, fileName, uploadPath, false);
}
/**
* 上传一个本地的路径
*
* @param path 本地文件路径
* @param uploadPath 上传路径,服务器路径
* @param isCover 是否覆盖非必填默认false
*/
public void uploadFile(String path, String uploadPath, Boolean isCover) throws FileNotFoundException {
File file = new File(path);
uploadFile(null, path, file.getName(), uploadPath, isCover);
}
/**
* 上传一个本地的路径(不覆盖源文件)
*
* @param path 本地文件路径
* @param uploadPath 上传路径,服务器路径
*/
public void uploadFile(String path, String uploadPath) throws FileNotFoundException {
uploadFile(path, null, uploadPath);
}
/**
* 获取文件下载地址
*
* @param filePath 文件路径
* @return 文件地址信息
*/
public String getFileDownloadUrl(String filePath) {
return getFileDownloadUrl(filePath, false);
}
/**
* 获取文件下载地址
*
* @param filePath 文件路径
* @param forceDownload 是否强制下载打开密级之后未标密的文件无法下载可以通过设置当前参数为true来强制下载默认false
* @return 文件地址信息
*/
public String getFileDownloadUrl(String filePath, Boolean forceDownload) {
return getFileDownloadUrl(null, filePath, forceDownload);
}
/**
* 获取文件输入流
*
* @param filePath 文件路径
* @return 文件流
* @throws IOException
*/
public InputStream getFileInputStream(String filePath) throws IOException {
return getFileInputStream(filePath, false);
}
/**
* 获取文件输入流
*
* @param filePath 文件路径
* @param forceDownload 是否强制下载打开密级之后未标密的文件无法下载可以通过设置当前参数为true来强制下载默认false
* @return 文件流
* @throws IOException
*/
public InputStream getFileInputStream(String filePath, Boolean forceDownload) throws IOException {
return getFileInputStream(null, filePath, forceDownload);
}
/**
* 文件压缩
*
* @param sourceDirName 源文件目录
* @param targetFilePath 目标文件路径
* @param compressType 压缩类型 (未使用以后扩展)
*/
public void compress(String sourceDirName, String targetFilePath, String compressType) {
compress(null, sourceDirName, targetFilePath, compressType);
}
/**
* 文件压缩
*
* @param sourceDirName 源文件目录(多个文件适用英文逗号隔开)
* @param targetFilePath 目标文件路径
*/
public void compress(String sourceDirName, String targetFilePath) {
compress(sourceDirName, targetFilePath, null);
}
/**
* 解压文件
*
* @param sourceFilePath 源文件路径
* @param targetDirPath 目标文件路径
* @param isCover 是否覆盖
* @param password 密码
* @param compressType 压缩类型 (未使用以后扩展)
*/
public void uncompress(String sourceFilePath, String targetDirPath, Boolean isCover, String password, String compressType) {
uncompress(null, sourceFilePath, targetDirPath, isCover, password, compressType);
}
/**
* 解压文件
*
* @param sourceFilePath 源文件路径
* @param targetDirPath 目标文件路径
* @param isCover 是否覆盖
* @param password 密码
*/
public void uncompress(String sourceFilePath, String targetDirPath, Boolean isCover, String password) {
uncompress(sourceFilePath, targetDirPath, isCover, password, null);
}
/**
* 解压文件
*
* @param sourceFilePath 源文件路径
* @param targetDirPath 目标文件路径
* @param isCover 是否覆盖
*/
public void uncompress(String sourceFilePath, String targetDirPath, Boolean isCover) {
uncompress(sourceFilePath, targetDirPath, isCover, null);
}
/**
* 解压文件
*
* @param sourceFilePath 源文件路径
* @param targetDirPath 目标文件路径
*/
public void uncompress(String sourceFilePath, String targetDirPath) {
uncompress(sourceFilePath, targetDirPath, false);
}
/**
* 获取可用的文件密级列表
*
* @return 密级列表
*/
public List<Confidential> getConfList() {
return getConfList(null);
}
/**
* 文件标密
*
* @param conf 密级使用{@link JHFileApiExecution#getConfList(String)}返回的{@link Confidential#conf}
* @param path 文件路径
*/
public void markConf(String conf, String path) {
markConf(null, conf, path);
}
}

View File

@@ -1,10 +1,7 @@
package com.jhinno.sdk.openapi.api.job;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.CommonConstant;
import com.jhinno.sdk.openapi.ServiceException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.*;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.api.file.FileInfo;
import com.jhinno.sdk.openapi.client.JHApiClient;
@@ -22,16 +19,7 @@ import java.util.Map;
* @date 2024/2/5 18:44
*/
@NoArgsConstructor
public class JHJobApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHJobApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public class JHJobApiExecution extends JHApiExecutionAbstract {
/**
* 提交作业
@@ -52,8 +40,9 @@ public class JHJobApiExecution extends JHApiExecution {
map.put("appId", appId);
map.put("params", JsonUtil.objectToString(params));
String path = JHApiClient.getUrl(JobPathConstant.JOB_SUBMIT_PATH, map);
List<Map<String, String>> result = post(path, username, new TypeReference<ResponseResult<List<Map<String, String>>>>() {
});
List<Map<String, String>> result = execution.post(path, username,
new TypeReference<ResponseResult<List<Map<String, String>>>>() {
});
if (CollectionUtil.isEmpty(result)) {
throw new ServiceException(path, 500, "作业提交返回为空!");
}
@@ -72,13 +61,15 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_FIND_JOB_FILES_PATH.replace("{jobId}", jobId);
return get(path, username, new TypeReference<ResponseResult<List<FileInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<FileInfo>>>() {
});
}
/**
* 分页查询作业列表
* <p>作业名、作业状态等为非必填自动,如果为空则没有添加该查询条件</p>
* <p>
* 注name、status、condition均为删选条件condition为 高级筛选
* </p>
*
* @param username 用户名
* @param page 页码非必填默认1
@@ -89,7 +80,8 @@ public class JHJobApiExecution extends JHApiExecution {
* @return 作业列表
* @see JobStatusEnum
*/
public PageJobInfo getJobPage(String username, Integer page, Integer pageSize, String name, JobStatusEnum status, Map<String, Object> condition) {
public PageJobInfo getJobPage(String username, Integer page, Integer pageSize, String name, JobStatusEnum status,
Map<String, Object> condition) {
Map<String, Object> params = new HashMap<>(5);
if (page != null) {
params.put("page", page);
@@ -107,13 +99,15 @@ public class JHJobApiExecution extends JHApiExecution {
params.put("condition", JsonUtil.objectToString(params));
}
String path = JHApiClient.getUrl(JobPathConstant.JOB_PAGE_PATH, params);
return get(path, username, new TypeReference<ResponseResult<PageJobInfo>>() {
return execution.get(path, username, new TypeReference<ResponseResult<PageJobInfo>>() {
});
}
/**
* 分页查询作业列表
* <p>作业名、作业状态等为非必填自动,如果为空则没有添加该查询条件</p>
* <p>
* 注name、status、condition均为删选条件condition为 高级筛选
* </p>
*
* @param username 用户名
* @param page 页码非必填默认1
@@ -124,10 +118,71 @@ public class JHJobApiExecution extends JHApiExecution {
* @return 作业列表
* @see JobStatusEnum
*/
public PageJobInfo getJobPage(String username, Integer page, Integer pageSize, String name, String status, Map<String, Object> condition) {
public PageJobInfo getJobPage(String username, Integer page, Integer pageSize, String name, String status,
Map<String, Object> condition) {
return getJobPage(username, page, pageSize, name, JobStatusEnum.getJobStatus(status), condition);
}
/**
* 分页查询作业列表
* <p>
* 注name、status、condition均为删选条件condition为 高级筛选
* </p>
*
* @param username 用户名
* @param page 页码非必填默认1
* @param pageSize 每页大小非必填默认20
* @param name 作业名(非必填)
* @param status 作业名(非必填)
* @param condition 作业状态(非必填),取值见{@link JobStatusEnum#getJobStatus(String)}
* @return 作业列表
* @see JobStatusEnum
*/
public PageJobInfo getHistoryJobs(String username, Integer page, Integer pageSize, String name,
JobStatusEnum status, Map<String, Object> condition) {
Map<String, Object> params = new HashMap<>(5);
if (page != null) {
params.put("page", page);
}
if (pageSize != null) {
params.put("pageSize", pageSize);
}
if (StringUtils.isNotBlank(name)) {
params.put("jobName", name);
}
if (status != null) {
params.put("status", status.getStatus());
}
if (CollectionUtil.isNotEmpty(condition)) {
params.put("condition", JsonUtil.objectToString(params));
}
String path = JHApiClient.getUrl(JobPathConstant.JOB_HISTORY_JOBS_PATH, params);
return execution.get(path, username, new TypeReference<ResponseResult<PageJobInfo>>() {
});
}
/**
* 分页查询作业列表
* <p>
* 注name、status、condition均为删选条件condition为 高级筛选
* </p>
*
* @param username 用户名
* @param page 页码非必填默认1
* @param pageSize 每页大小非必填默认20
* @param name 作业名(非必填)
* @param status 作业名(非必填)
* @param condition 作业状态(非必填),取值见{@link JobStatusEnum#getJobStatus(String)}
* @return 作业列表
* @see JobStatusEnum
*/
public PageJobInfo getHistoryJobs(String username, Integer page, Integer pageSize, String name, String status,
Map<String, Object> condition) {
return getHistoryJobs(username, page, pageSize, name, JobStatusEnum.getJobStatus(status), condition);
}
/**
* 查询作业详情
*
@@ -140,11 +195,10 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_DETAIL_INFO_PATH.replace("{jobId}", jobId);
return get(path, username, new TypeReference<ResponseResult<JobInfo>>() {
return execution.get(path, username, new TypeReference<ResponseResult<JobInfo>>() {
});
}
/**
* 分页检索作业名称查询作业信息
*
@@ -168,11 +222,10 @@ public class JHJobApiExecution extends JHApiExecution {
}
String path = JHApiClient.getUrl(JobPathConstant.JOB_LIST_BY_NAME_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
});
}
/**
* 分页检索作业状态
* <p>
@@ -195,12 +248,12 @@ public class JHJobApiExecution extends JHApiExecution {
if (pageSize != null) {
params.put("pageSize", pageSize);
}
String path = JHApiClient.getUrl(JobPathConstant.JOB_LIST_BY_STATUS_PATH.replace("{status}", status.getStatus()), params);
return get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
String path = JHApiClient
.getUrl(JobPathConstant.JOB_LIST_BY_STATUS_PATH.replace("{status}", status.getStatus()), params);
return execution.get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
});
}
/**
* 作业的状态(必填),
*
@@ -215,7 +268,6 @@ public class JHJobApiExecution extends JHApiExecution {
return getJobsByStatus(username, JobStatusEnum.getJobStatus(status), page, pageSize);
}
/**
* 通过作业id列表查询作业列表
*
@@ -230,14 +282,15 @@ public class JHJobApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
String path = JHApiClient.getUrl(JobPathConstant.JOB_LIST_BY_IDS_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<JobInfo>>>() {
});
}
/**
* 操作作业
* <p>
* {@link JobActionEnum} 中的 静态方法{@link JobActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobActionEnum}对象
* {@link JobActionEnum} 中的
* 静态方法{@link JobActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobActionEnum}对象
* <p>
* 或者使用{@link #action(String, String, String)}直接操作,但最终还是调的这个方法,我们只不过是内部做了转换而已
*
@@ -254,7 +307,7 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_ACTION_PATH.replace("{jobId}", jobId).replace("{action}", action.getAction());
put(path, username);
execution.put(path, username);
}
/**
@@ -268,11 +321,11 @@ public class JHJobApiExecution extends JHApiExecution {
action(username, JobActionEnum.getJobAction(action), jobId);
}
/**
* 批量操作作业
* <p>
* {@link JobsActionEnum} 中的 静态方法{@link JobsActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobsActionEnum}对象
* {@link JobsActionEnum} 中的
* 静态方法{@link JobsActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobsActionEnum}对象
* <p>
* 或者使用{@link #actions(String, String, List)}直接操作,但最终还是调的这个方法,我们只不过是内部做了转换而已
*
@@ -289,8 +342,9 @@ public class JHJobApiExecution extends JHApiExecution {
}
Map<String, Object> params = new HashMap<>(1);
params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
String path = JHApiClient.getUrl(JobPathConstant.JOB_ACTION_IDS_PATH.replace("{action}", action.getAction()), params);
put(path, username);
String path = JHApiClient.getUrl(JobPathConstant.JOB_ACTION_IDS_PATH.replace("{action}", action.getAction()),
params);
execution.put(path, username);
}
/**
@@ -304,7 +358,6 @@ public class JHJobApiExecution extends JHApiExecution {
actions(username, JobsActionEnum.getJobAction(action), jobIds);
}
/**
* 查询制定作业的作业历史
*
@@ -317,15 +370,15 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_HISTORY_PATH.replace("{jobId}", jobId);
List<JobHistoryInfo> list = get(path, username, new TypeReference<ResponseResult<List<JobHistoryInfo>>>() {
});
List<JobHistoryInfo> list = execution.get(path, username,
new TypeReference<ResponseResult<List<JobHistoryInfo>>>() {
});
if (CollectionUtil.isEmpty(list)) {
throw new ServiceException(path, 500, "历史作业信息不存在!");
}
return list.get(0);
}
/**
* 通过多个id查询作业历史列表
*
@@ -340,7 +393,7 @@ public class JHJobApiExecution extends JHApiExecution {
Map<String, Object> params = new HashMap<>(1);
params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
String path = JHApiClient.getUrl(JobPathConstant.JOB_HISTORY_IDS_PATH, params);
return get(path, username, new TypeReference<ResponseResult<List<JobHistoryInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<JobHistoryInfo>>>() {
});
}
@@ -356,8 +409,9 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_PEEK_PATH.replace("{jobId}", jobId);
ResponseResult<String> result = getJhApiClient().get(path, getHeaders(username), new TypeReference<ResponseResult<String>>() {
});
ResponseResult<String> result = execution.getJhApiClient().get(path, execution.getHeaders(username),
new TypeReference<ResponseResult<String>>() {
});
if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
throw new ServiceException(path, result.getCode(), result.getMessage());
}
@@ -368,7 +422,6 @@ public class JHJobApiExecution extends JHApiExecution {
return result.getMessage();
}
/**
* 连接作业会话
*
@@ -381,7 +434,7 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("jobId不能为空");
}
String path = JobPathConstant.JOB_CONNECT_SESSION_PATH.replace("{jobId}", jobId);
return post(path, username, new TypeReference<ResponseResult<Object>>() {
return execution.post(path, username, new TypeReference<ResponseResult<Object>>() {
});
}
@@ -396,7 +449,7 @@ public class JHJobApiExecution extends JHApiExecution {
throw new ArgsException("appId不能为空");
}
String path = JobPathConstant.JOB_GET_APP_FORM_PATH.replace("{appId}", appId);
return get(path, username, new TypeReference<ResponseResult<List<JobAppFormItemInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<List<JobAppFormItemInfo>>>() {
});
}

View File

@@ -8,84 +8,80 @@ package com.jhinno.sdk.openapi.api.job;
*/
public class JobPathConstant {
/**
* 提交作业
*/
public static final String JOB_SUBMIT_PATH = "/ws/api/jobs/jsub";
public static final String JOB_SUBMIT_PATH = "/appform/ws/api/jobs/jsub";
/**
* 使用作业id查询作业列表
*/
public static final String JOB_FIND_JOB_FILES_PATH = "/ws/api/jobs/{jobId}/files";
public static final String JOB_FIND_JOB_FILES_PATH = "/appform/ws/api/jobs/{jobId}/files";
/**
* 分页查询作业列表
*/
public static final String JOB_PAGE_PATH = "/ws/api/jobs/page";
public static final String JOB_PAGE_PATH = "/appform/ws/api/jobs/page";
/**
* 查询历史作业列表
*/
public static final String JOB_HISTORY_JOBS_PATH = "/appform/ws/api/jobs/historyPage";
/**
* 查询作业详情
*/
public static final String JOB_DETAIL_INFO_PATH = "/ws/api/jobs/{jobId}";
public static final String JOB_DETAIL_INFO_PATH = "/appform/ws/api/jobs/{jobId}";
/**
* 分页检索作业名
*/
public static final String JOB_LIST_BY_NAME_PATH = "/ws/api/jobs/byName";
public static final String JOB_LIST_BY_NAME_PATH = "/appform/ws/api/jobs/byName";
/**
* 作业号检索作业列表
*/
public static final String JOB_LIST_BY_STATUS_PATH = "/ws/api/jobs/byStatus/{status}";
public static final String JOB_LIST_BY_STATUS_PATH = "/appform/ws/api/jobs/byStatus/{status}";
/**
* 通过作业号查询作业列表
*/
public static final String JOB_LIST_BY_IDS_PATH = "/ws/api/jobs/list";
public static final String JOB_LIST_BY_IDS_PATH = "/appform/ws/api/jobs/list";
/**
* 作业操作
*/
public static final String JOB_ACTION_PATH = "/ws/api/jobs/{jobId}/{action}";
public static final String JOB_ACTION_PATH = "/appform/ws/api/jobs/{jobId}/{action}";
/**
* 批量操作作业
*/
public static final String JOB_ACTION_IDS_PATH = "/ws/api/jobs/{action}";
public static final String JOB_ACTION_IDS_PATH = "/appform/ws/api/jobs/{action}";
/**
* 获取作业历史
*/
public static final String JOB_HISTORY_PATH = "/ws/api/jobs/{jobId}/hist";
public static final String JOB_HISTORY_PATH = "/appform/ws/api/jobs/{jobId}/hist";
/**
* 通过多个作业号查询作业历史
*/
public static final String JOB_HISTORY_IDS_PATH = "/ws/api/jobs/hist";
public static final String JOB_HISTORY_IDS_PATH = "/appform/ws/api/jobs/hist";
/**
* 获取作业动态输出
*/
public static final String JOB_PEEK_PATH = "/ws/api/jobs/{jobId}/peek";
public static final String JOB_PEEK_PATH = "/appform/ws/api/jobs/{jobId}/peek";
/**
* 连接作业会话
*/
public static final String JOB_CONNECT_SESSION_PATH = "/ws/api/jobs/{jobId}/connect";
public static final String JOB_CONNECT_SESSION_PATH = "/appform/ws/api/jobs/{jobId}/connect";
/**
* 获取作业表单
* <p/>
* 该接口目前在Solutions下面维护未经过产品的测试
*/
public static final String JOB_GET_APP_FORM_PATH = "/ws/api/jobs/{appId}/form_params";
public static final String JOB_GET_APP_FORM_PATH = "/appform/ws/api/jobs/{appId}/form_params";
}

View File

@@ -28,7 +28,6 @@ public enum JobStatusEnum {
EXIT("EXIT", "退出"),
UNKNOWN_UNKWN("UNKNOWN#UNKWN", "状态不明");
/**
* 状态标识
*/
@@ -39,7 +38,6 @@ public enum JobStatusEnum {
*/
private final String name;
/**
* 使用标号获得JobStatusEnum对象
*
@@ -49,7 +47,7 @@ public enum JobStatusEnum {
*/
public static JobStatusEnum getJobStatus(String status) {
if (StringUtils.isBlank(status)) {
throw new ArgsException("作业状态不能为空!");
return null;
}
for (JobStatusEnum value : values()) {
if (StringUtils.equals(status, value.getStatus())) {

View File

@@ -11,11 +11,11 @@ public class DepartmentPathConstant {
/**
* 组织
*/
public static final String DEPARTMENT_PATH = "/ws/api/deps";
public static final String DEPARTMENT_PATH = "/appform/ws/api/deps";
/**
* 组织名称操作组织
*/
public static final String DEPARTMENT_NAME_PATH = "/ws/api/deps/{depName}";
public static final String DEPARTMENT_NAME_PATH = "/appform/ws/api/deps/{depName}";
}

View File

@@ -2,9 +2,8 @@ package com.jhinno.sdk.openapi.api.organization;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.JHApiExecutionAbstract;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
@@ -20,17 +19,7 @@ import java.util.Map;
* @date 2024/2/6 17:37
*/
@NoArgsConstructor
public class JHDepartmentApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHDepartmentApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public class JHDepartmentApiExecution extends JHApiExecutionAbstract {
/**
* 查询用户列表
@@ -39,10 +28,19 @@ public class JHDepartmentApiExecution extends JHApiExecution {
* @return 用户列表
*/
public List<Map<String, Object>> getDepartmentList(String username) {
return get(DepartmentPathConstant.DEPARTMENT_PATH, username, new TypeReference<ResponseResult<List<Map<String, Object>>>>() {
});
return execution.get(DepartmentPathConstant.DEPARTMENT_PATH, username,
new TypeReference<ResponseResult<List<Map<String, Object>>>>() {
});
}
/**
* 查询用户列表
*
* @return 用户列表
*/
public List<Map<String, Object>> getDepartmentList() {
return getDepartmentList(null);
}
/**
* 添加部门
@@ -51,9 +49,17 @@ public class JHDepartmentApiExecution extends JHApiExecution {
* @param departmentInfo 部门信息
*/
public void addDepartment(String username, AddUpdateDepartment departmentInfo) {
post(DepartmentPathConstant.DEPARTMENT_PATH, username, departmentInfo);
execution.post(DepartmentPathConstant.DEPARTMENT_PATH, username, departmentInfo);
}
/**
* 添加部门
*
* @param departmentInfo 部门信息
*/
public void addDepartment(AddUpdateDepartment departmentInfo) {
addDepartment(null, departmentInfo);
}
/**
* 修改部门信息
@@ -66,9 +72,17 @@ public class JHDepartmentApiExecution extends JHApiExecution {
throw new ArgsException("departmentInfo中的depName不能为空");
}
String path = DepartmentPathConstant.DEPARTMENT_NAME_PATH.replace("{depName}", departmentInfo.getDepName());
put(path, username, departmentInfo);
execution.put(path, username, departmentInfo);
}
/**
* 修改部门信息
*
* @param departmentInfo 部门信息
*/
public void updateDepartment(AddUpdateDepartment departmentInfo) {
updateDepartment(null, departmentInfo);
}
/**
* 删除部门信息
@@ -81,6 +95,15 @@ public class JHDepartmentApiExecution extends JHApiExecution {
throw new ArgsException("departmentName不能为空");
}
String path = DepartmentPathConstant.DEPARTMENT_NAME_PATH.replace("{depName}", departmentName);
delete(path, username);
execution.delete(path, username);
}
/**
* 删除部门信息
*
* @param departmentName 部门名称
*/
public void deleteDepartment(String departmentName) {
deleteDepartment(null, departmentName);
}
}

View File

@@ -2,7 +2,7 @@ package com.jhinno.sdk.openapi.api.organization;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.ArgsException;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.JHApiExecutionAbstract;
import com.jhinno.sdk.openapi.api.PageResult;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
@@ -21,16 +21,7 @@ import java.util.Map;
* @date 2024/2/6 17:37
*/
@NoArgsConstructor
public class JHUserApiExecution extends JHApiExecution {
/**
* 获取一个执行器的实例
*
* @param jhApiClient 请求的客户端
*/
public JHUserApiExecution(JHApiClient jhApiClient) {
super(jhApiClient);
}
public class JHUserApiExecution extends JHApiExecutionAbstract {
/**
* 分页查询用户列表
@@ -53,10 +44,22 @@ public class JHUserApiExecution extends JHApiExecution {
params.put("userConf", userConf);
}
String path = JHApiClient.getUrl(UserPathConstant.USERS_PATH, params);
return get(path, username, new TypeReference<ResponseResult<PageResult<UserInfo>>>() {
return execution.get(path, username, new TypeReference<ResponseResult<PageResult<UserInfo>>>() {
});
}
/**
* 分页查询用户列表
*
* @param keyword 检索关键字
* @param depName 部门名称
* @param userConf 密级
* @return 分页的用户列表
*/
public PageResult<UserInfo> getUserList(String keyword, String depName, String userConf) {
return getUserList(null, keyword, depName, userConf);
}
/**
* 添加用户
*
@@ -64,7 +67,16 @@ public class JHUserApiExecution extends JHApiExecution {
* @param userInfo 用户信息
*/
public void addUser(String username, AddUpdateUserInfo userInfo) {
post(UserPathConstant.USERS_PATH, username, userInfo);
execution.post(UserPathConstant.USERS_PATH, username, userInfo);
}
/**
* 添加用户
*
* @param userInfo 用户信息
*/
public void addUser(AddUpdateUserInfo userInfo) {
addUser(null, userInfo);
}
/**
@@ -78,17 +90,25 @@ public class JHUserApiExecution extends JHApiExecution {
throw new ArgsException("userInfo中userName的值不能为空");
}
String path = UserPathConstant.USERS_USERNAME_PATH.replace("{username}", userInfo.getUserName());
put(path, username, userInfo);
execution.put(path, username, userInfo);
}
/**
* 修改用户信息
*
* @param userInfo 用户信息
*/
public void updateUser(AddUpdateUserInfo userInfo) {
updateUser(null, userInfo);
}
/**
* 修改或重置用户密码
*
* <ul>
* <li>当type值为{@link UpdateUserPasswordType#FORCE_UPDATE_PASSWORD_TYPE}重置密码后用户再次登录需要修改密码</li>
* <li>当type值为{@link UpdateUserPasswordType#RESET_UPDATE_PASSWORD_TYPE}重置用户的密码</li>
* <li>当type值为空时修改用户密码</li>
* <li>当type值为{@link UpdateUserPasswordType#FORCE_UPDATE_PASSWORD_TYPE}重置密码后用户再次登录需要修改密码</li>
* <li>当type值为{@link UpdateUserPasswordType#RESET_UPDATE_PASSWORD_TYPE}重置用户的密码</li>
* <li>当type值为空时修改用户密码</li>
* </ul>
* 参数怎么传,还需进一步确认,此处需要增加三个重构,方便开发者调用
*
@@ -98,7 +118,7 @@ public class JHUserApiExecution extends JHApiExecution {
* @param password 新密码
* @param type 类型,(非必填,取值见{@link UpdateUserPasswordType}
*/
public void updateUserPassword(String username, String updatePasswordUsername, String oldPassword, String password, String type) {
public void updateUserPassword(String username, String updatePasswordUsername, String oldPassword, String password, UpdateUserPasswordType type) {
if (StringUtils.isBlank(updatePasswordUsername)) {
throw new ArgsException("updatePasswordUsername不能为空");
}
@@ -108,12 +128,29 @@ public class JHUserApiExecution extends JHApiExecution {
params.put("oldPassword", oldPassword);
}
if (StringUtils.isNotBlank("type")) {
params.put("type", type);
params.put("type", type.getValue());
}
params.put("password", password);
put(path, username, params);
execution.put(path, username, params);
}
/**
* 修改或重置用户密码
*
* <ul>
* <li>当type值为{@link UpdateUserPasswordType#FORCE_UPDATE_PASSWORD_TYPE}重置密码后用户再次登录需要修改密码</li>
* <li>当type值为{@link UpdateUserPasswordType#RESET_UPDATE_PASSWORD_TYPE}重置用户的密码</li>
* <li>当type值为空时修改用户密码</li>
* </ul>
*
* @param updatePasswordUsername 被修改的用户名
* @param oldPassword 旧密码
* @param password 新密码
* @param type 类型,(非必填,取值见{@link UpdateUserPasswordType}
*/
public void updateUserPassword(String updatePasswordUsername, String oldPassword, String password, UpdateUserPasswordType type) {
updateUserPassword(null, updatePasswordUsername, oldPassword, password, type);
}
/**
* 修改用户的密码
@@ -128,28 +165,16 @@ public class JHUserApiExecution extends JHApiExecution {
}
/**
* 重置用户密码后强制用户修改密码
* 修改用户的密码
*
* @param username 用户名
* @param updatePasswordUsername 被修改的用户名
* @param password 新的用户密码
* @param oldPassword 密码
* @param password 新密码
*/
public void resetForceUpdatePassword(String username, String updatePasswordUsername, String password) {
updateUserPassword(username, updatePasswordUsername, null, password, UpdateUserPasswordType.FORCE_UPDATE_PASSWORD_TYPE);
public void updateUserPassword(String updatePasswordUsername, String oldPassword, String password) {
updateUserPassword(updatePasswordUsername, oldPassword, password, UpdateUserPasswordType.RESET_UPDATE_PASSWORD_TYPE);
}
/**
* 重置用户名
*
* @param username 用户名
* @param updatePasswordUsername 被修改的用户密码
* @param password 新的用户密码
*/
public void resetPassword(String username, String updatePasswordUsername, String password) {
updateUserPassword(username, updatePasswordUsername, null, password, UpdateUserPasswordType.RESET_UPDATE_PASSWORD_TYPE);
}
/**
* 删除用户
*
@@ -160,7 +185,16 @@ public class JHUserApiExecution extends JHApiExecution {
if (StringUtils.isBlank(deleteUsername)) {
throw new ArgsException("deleteUsername不能为空");
}
delete(UserPathConstant.USERS_USERNAME_PATH.replace("{username}", deleteUsername), username);
execution.delete(UserPathConstant.USERS_USERNAME_PATH.replace("{username}", deleteUsername), username);
}
/**
* 删除用户
*
* @param deleteUsername 被删除的用户名
*/
public void deleteUser(String deleteUsername) {
deleteUser(null, deleteUsername);
}
}

View File

@@ -1,20 +1,27 @@
package com.jhinno.sdk.openapi.api.organization;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 密码操作的类型
*
* @author yanlongqi
* @date 2024/2/19 10:54
*/
public class UpdateUserPasswordType {
@Getter
@AllArgsConstructor
public enum UpdateUserPasswordType {
/**
* 重置密码
*/
protected static final String RESET_UPDATE_PASSWORD_TYPE = "reset";
RESET_UPDATE_PASSWORD_TYPE("reset"),
/**
* 首次登录强制修改密码
*/
protected static final String FORCE_UPDATE_PASSWORD_TYPE = "force";
FORCE_UPDATE_PASSWORD_TYPE("force");
private final String value;
}

View File

@@ -11,18 +11,18 @@ public class UserPathConstant {
/**
* 查询用户和修改用户
*/
public static final String USERS_PATH = "/ws/api/users";
public static final String USERS_PATH = "/appform/ws/api/users";
/**
* 修改用户和删除用户
*/
public static final String USERS_USERNAME_PATH = "/ws/api/users/{username}";
public static final String USERS_USERNAME_PATH = "/appform/ws/api/users/{username}";
/**
* 用户密码操作
*/
public static final String USERS_RESET_PASSWORD_PATH = "/ws/api/users/{username}/password/password_reset";
public static final String USERS_RESET_PASSWORD_PATH = "/appform/ws/api/users/{username}/password/password_reset";
}

View File

@@ -87,8 +87,7 @@ public class JHApiClient {
if (StringUtils.isBlank(path)) {
throw new ArgsException("url不能为空");
}
try {
InputStream content = apiHttpClient.get(getUrl(path), headers);
try (InputStream content = apiHttpClient.get(getUrl(path), headers)) {
return mapper.readValue(content, type);
} catch (IOException e) {
throw new ClientException(e.getMessage(), e);
@@ -179,8 +178,9 @@ public class JHApiClient {
if (body != null) {
bodyStr = mapper.writeValueAsString(body);
}
InputStream content = apiHttpClient.post(getUrl(path), bodyStr, headers);
return mapper.readValue(content, type);
try (InputStream content = apiHttpClient.post(getUrl(path), bodyStr, headers)) {
return mapper.readValue(content, type);
}
} catch (IOException e) {
throw new ClientException(e.getMessage(), e);
}
@@ -208,8 +208,9 @@ public class JHApiClient {
if (body != null) {
bodyStr = mapper.writeValueAsString(body);
}
InputStream content = apiHttpClient.put(getUrl(path), bodyStr, headers);
return mapper.readValue(content, type);
try (InputStream content = apiHttpClient.put(getUrl(path), bodyStr, headers)) {
return mapper.readValue(content, type);
}
} catch (IOException e) {
throw new ClientException(e.getMessage(), e);
}
@@ -272,8 +273,7 @@ public class JHApiClient {
if (StringUtils.isBlank(path)) {
throw new ArgsException("path不能为空");
}
try {
InputStream content = apiHttpClient.delete(getUrl(path), headers);
try (InputStream content = apiHttpClient.delete(getUrl(path), headers)) {
return mapper.readValue(content, type);
} catch (IOException e) {
throw new ClientException(e.getMessage(), e);
@@ -314,8 +314,9 @@ public class JHApiClient {
throw new ArgsException("path不能为空");
}
try {
InputStream content = apiHttpClient.upload(getUrl(path), keyName, fileName, is, body, headers);
return mapper.readValue(content, type);
try (InputStream content = apiHttpClient.upload(getUrl(path), keyName, fileName, is, body, headers)) {
return mapper.readValue(content, type);
}
} catch (IOException e) {
throw new ClientException(e.getMessage(), e);
}

View File

@@ -26,6 +26,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.InputStream;
@@ -35,6 +36,7 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.util.Map;
import java.util.Objects;
@Data
@NoArgsConstructor
@@ -63,62 +65,57 @@ public class JHApiHttpClientImpl implements JHApiHttpClient {
private RequestConfig requestConfig;
/**
* Socket连接超时的时间(单位:毫秒,默认:{@link DefaultHttpClientConfig#SOCKET_TIMEOUT})
*/
private int socketTimeout = DefaultHttpClientConfig.SOCKET_TIMEOUT;
/**
* 连接超时的时间(单位:毫秒,默认:{@link DefaultHttpClientConfig#CONNECT_TIMEOUT})
*/
private int connectTimeout = DefaultHttpClientConfig.CONNECT_TIMEOUT;
/**
* 默认请求超时的时间(单位:毫秒,默认:{@link DefaultHttpClientConfig#CONNECTION_REQUEST_TIMEOUT})
*/
private int connectRequestTimeout = DefaultHttpClientConfig.CONNECTION_REQUEST_TIMEOUT;
/**
* 设置最大连接数(默认:{@link DefaultHttpClientConfig#MAX_TOTAL})
*/
private int maxTotal = DefaultHttpClientConfig.MAX_TOTAL;
/**
* 服务每次能并行接收的请求数量(默认:{@link DefaultHttpClientConfig#MAX_PER_ROUTE})
*/
private int maxPerRoute = DefaultHttpClientConfig.MAX_PER_ROUTE;
/**
* 初始化一个HTTP客户端实例
*
* @return 返回一个可关闭的HTTP客户端示例
*/
public void createHttpClients() {
public void createHttpClients(Integer maxTotal, Integer maxPerRoute) {
SSLContextBuilder builder = new SSLContextBuilder();
try {
builder.loadTrustMaterial(null, (x509Certificates, s) -> true);
SSLConnectionSocketFactory sslref = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory()).register("https", sslref).build();
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslref)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(maxTotal);
cm.setDefaultMaxPerRoute(maxPerRoute);
if (Objects.nonNull(maxTotal)) {
cm.setMaxTotal(maxTotal);
}
if (Objects.nonNull(maxPerRoute)) {
cm.setDefaultMaxPerRoute(maxPerRoute);
}
closeableHttpClient = HttpClients.custom().setSSLSocketFactory(sslref).setConnectionManager(cm).setConnectionManagerShared(true).build();
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
throw new ClientException(e.getMessage(), ClientErrorCode.SSL_EXCEPTION, e);
}
}
public void createHttpClients() {
createHttpClients(null, null);
}
/**
* 初始化客户端
*/
public void init() {
this.requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectRequestTimeout)
.build();
public void init(Integer socketTimeout, Integer connectTimeout, Integer connectRequestTimeout) {
RequestConfig.Builder custom = RequestConfig.custom();
if (Objects.nonNull(socketTimeout)) {
custom.setSocketTimeout(socketTimeout);
}
if (Objects.nonNull(connectTimeout)) {
custom.setConnectTimeout(connectTimeout);
}
if (Objects.nonNull(connectRequestTimeout)) {
custom.setConnectionRequestTimeout(connectRequestTimeout);
}
this.requestConfig = custom.build();
}
public void init() {
init(null, null, null);
}
/**
* 原始发送请求
@@ -150,7 +147,9 @@ public class JHApiHttpClientImpl implements JHApiHttpClient {
try {
HttpResponse response = closeableHttpClient.execute(httpRequest);
int statusCode = response.getStatusLine().getStatusCode();
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
if (statusCode != HttpStatus.SC_OK) {
// 确保响应实体被完全消费以释放连接
EntityUtils.consume(response.getEntity());
httpRequest.releaseConnection();
throw new ClientException("发送HTTP请求失败请求码" + statusCode, ClientErrorCode.REQUEST_ERROR);
}
@@ -226,7 +225,7 @@ public class JHApiHttpClientImpl implements JHApiHttpClient {
return CommonConstant.HTTP_DATETIME_FORMAT.parse(value).getTime();
} catch (ParseException e) {
throw new ClientException("时间格式获取失败,失败原因:" + e.getMessage(), e);
}finally {
} finally {
httpGet.releaseConnection();
}
}

View File

@@ -3,6 +3,7 @@ package com.jhinno.sdk.openapi.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.jhinno.sdk.openapi.CommonConstant;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
@@ -19,6 +20,7 @@ public class JsonUtil {
OBJECT_MAPPER.setTimeZone(TimeZone.getTimeZone("GMT+8"));
OBJECT_MAPPER.setDateFormat(new SimpleDateFormat(CommonConstant.NORM_DATETIME_PATTERN));
OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
OBJECT_MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
}
@SneakyThrows

View File

@@ -1,17 +1,8 @@
package com.jhinno.sdk.openapi.test;
import com.jhinno.sdk.openapi.AuthType;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.api.app.JHAppApiExecution;
import com.jhinno.sdk.openapi.api.data.JHDataApiExecution;
import com.jhinno.sdk.openapi.api.file.JHFileApiExecution;
import com.jhinno.sdk.openapi.api.job.JHJobApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHDepartmentApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHUserApiExecution;
import com.jhinno.sdk.openapi.client.JHApiClient;
import java.util.HashMap;
import java.util.Map;
import com.jhinno.sdk.openapi.JHApiExecutionManage;
import com.jhinno.sdk.openapi.JHApiRequestHandler;
/**
* SDK Client 的配置
@@ -21,32 +12,30 @@ import java.util.Map;
*/
public class JHClientConfig {
public static final JHApiRequestHandler REQUEST_HANDLER = new JHApiRequestHandler() {
@Override
public String getCurrentUserName() {
return "yanlongqi";
}
};
public static final String APPFORM_SERVER_URL = "https://172.20.0.200";
public static final String ACCESS_KEY = "8147c7470bfd4a27952fe750c6bc7cef";
public static final String ACCESS_KEY_SECRET = "899b13f590394c3daafc6468fed4b1df";
/**
* 初始化JHApi客户端
* 创建一个API执行器管理器
*/
public static final JHApiClient client = new JHApiClient("https://172.17.0.6/appform");
public static final JHApiExecutionManage API_EXECUTION_MANAGE = new JHApiExecutionManage(APPFORM_SERVER_URL, REQUEST_HANDLER);
public static final Map<Class<? extends JHApiExecution>, JHApiExecution> jhApiClientMap = new HashMap<>();
public static final String ACCESS_KEY = "3f03747f147942bd8debd81b6c9c6a80";
public static final String ACCESS_KEY_SECRET = "e0681859b91c499eb1d2c8e09cea3242";
static {
client.initDefaultApiClient();
jhApiClientMap.put(JHAppApiExecution.class, new JHAppApiExecution());
jhApiClientMap.put(JHDataApiExecution.class, new JHDataApiExecution());
jhApiClientMap.put(JHFileApiExecution.class, new JHFileApiExecution());
jhApiClientMap.put(JHJobApiExecution.class, new JHJobApiExecution());
jhApiClientMap.put(JHDepartmentApiExecution.class, new JHDepartmentApiExecution());
jhApiClientMap.put(JHUserApiExecution.class, new JHUserApiExecution());
jhApiClientMap.forEach((k, v) -> {
v.setJhApiClient(client);
v.setAuthType(AuthType.TOKEN_MODE);
v.setAccessKey(ACCESS_KEY);
v.setAccessKeySecret(ACCESS_KEY_SECRET);
v.setUsedServerTime(true);
API_EXECUTION_MANAGE.configureApiExecution(t -> {
// 默认为使用Token模式如何使用的Token模式则不需要配置ACCESS_KEY和ACCESS_KEY SECRET
t.setAuthType(AuthType.ACCESS_SECRET_MODE);
t.setAccessKey(ACCESS_KEY);
t.setAccessKeySecret(ACCESS_KEY_SECRET);
});
}

View File

@@ -2,9 +2,11 @@ package com.jhinno.sdk.openapi.test.app;
import com.jhinno.sdk.openapi.api.app.*;
import com.jhinno.sdk.openapi.test.JHClientConfig;
import com.jhinno.sdk.openapi.utils.JsonUtil;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
@@ -13,14 +15,12 @@ import java.util.List;
* @author yanlongqi
* @date 2024/2/1 16:47
*/
public class AppApiTest {
/**
* 获得一个调用应用接口的执行器
*/
public static final JHAppApiExecution jhAppApiExecution = (JHAppApiExecution) JHClientConfig.jhApiClientMap.get(JHAppApiExecution.class);
public static final JHAppApiExecution jhAppApiExecution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHAppApiExecution.class);
/**
* 测测试使用自定义的参数启动jhadmin的Linux桌面
@@ -29,8 +29,10 @@ public class AppApiTest {
public void testStartApp() {
AppStartRequest appStartRequest = new AppStartRequest();
appStartRequest.setStartNew(true);
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("jhadmin", "linux_desktop", appStartRequest);
System.out.println(appStartedInfo);
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("linux_desktop", appStartRequest);
System.out.println("会话ID" + appStartedInfo.getDesktopId());
System.out.println("JhAppURL" + appStartedInfo.getJhappUrl());
System.out.println("WebURL:" + appStartedInfo.getWebSessionUrl());
}
/**
@@ -38,18 +40,17 @@ public class AppApiTest {
*/
@Test
public void testDefaultParamsStartApp() {
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("jhadmin", "linux_desktop");
System.out.println(appStartedInfo);
AppStartedInfo appStartedInfo = jhAppApiExecution.desktopStart("linux_desktop");
System.out.println(JsonUtil.objectToString(appStartedInfo));
}
/**
* 测试获取用户jhadmin的会话列表
*/
@Test
public void testGetSessionsList() {
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopList("jhadmin");
System.out.println(desktopList);
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopList();
System.out.println(JsonUtil.objectToString(desktopList));
}
/**
@@ -57,18 +58,17 @@ public class AppApiTest {
*/
@Test
public void testGetDesktopsByParams() {
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsByParams("jhadmin", null, "Windows桌面");
System.out.println(desktopList);
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsByParams(null, "Windows桌面");
System.out.println(JsonUtil.objectToString(desktopList));
}
/**
* 测试根据会话列表查询会话列表
*/
@Test
public void testGetDesktopsById() {
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsById("jhadmin", Arrays.asList("7649", "7637", "123"));
System.out.println(desktopList);
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsById(Arrays.asList("151", "7637", "123"));
System.out.println(JsonUtil.objectToString(desktopList));
}
/**
@@ -76,17 +76,16 @@ public class AppApiTest {
*/
@Test
public void testGetDesktopsByName() {
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsByName("jhadmin", "Windows桌面");
System.out.println(desktopList);
List<SessionInfo> desktopList = jhAppApiExecution.getDesktopsByName("Linux桌面");
System.out.println(JsonUtil.objectToString(desktopList));
}
/**
* 测试会话共享
*/
@Test
public void testShareDesktop() {
jhAppApiExecution.shareDesktop("jhadmin", "7649", null, null, null);
jhAppApiExecution.shareDesktop("7649", null, null, null);
}
/**
@@ -94,7 +93,7 @@ public class AppApiTest {
*/
@Test
public void testCancelShare() {
jhAppApiExecution.cancelShare("jhadmin", "7649");
jhAppApiExecution.cancelShare("7649");
}
/**
@@ -102,26 +101,24 @@ public class AppApiTest {
*/
@Test
public void testTransferOperatorRight() {
jhAppApiExecution.transferOperatorRight("jhadmin", "7649", "123");
jhAppApiExecution.transferOperatorRight("7649", "123");
}
/**
* 测试链接会话
*/
@Test
public void testConnectJhapp() {
AppStartedInfo appStartedInfo = jhAppApiExecution.connectJhapp("lqyan", "7666");
System.out.println(appStartedInfo);
AppStartedInfo appStartedInfo = jhAppApiExecution.connectJhapp("151");
System.out.println(JsonUtil.objectToString(appStartedInfo));
}
/**
* 测试断开会话的连接
*/
@Test
public void testDisconnectSessionInfo() {
jhAppApiExecution.disconnectSessionInfo("jhadmin", "7666");
jhAppApiExecution.disconnectSessionInfo("151");
}
/**
@@ -129,25 +126,23 @@ public class AppApiTest {
*/
@Test
public void testDisconnectSessionByIds() {
jhAppApiExecution.disconnectSessionByIds("jhadmin", Arrays.asList("123", "456"));
jhAppApiExecution.disconnectSessionByIds(Arrays.asList("151", "456"));
}
/**
* 测试注销会话
*/
@Test
public void testDestroySession() {
jhAppApiExecution.destroySession("jhadmin", "4856");
jhAppApiExecution.destroySession("156");
}
/**
* 测试批量注销会话
*/
@Test
public void testDestroySessionByIds() {
jhAppApiExecution.destroySessionByIds("jhadmin", Arrays.asList("123", "456"));
jhAppApiExecution.destroySessionByIds(Arrays.asList("123", "456"));
}
/**
@@ -155,17 +150,59 @@ public class AppApiTest {
*/
@Test
public void testGetAppList() {
List<AppInfo> appList = jhAppApiExecution.getAppList("jhadmin");
System.out.println(appList);
}
List<AppInfo> appList = jhAppApiExecution.getAppList();
System.out.println("全部列表:");
System.out.println(JsonUtil.objectToString(appList));
// 类型获取
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.SYSTEM_APP.getAppList(appList)));
System.out.println("计算应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.BATCH_APP.getAppList(appList)));
System.out.println("图形应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppType.DESKTOP_APP.getAppList(appList)));
// 操作系统分类
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.SYSTEM.getAppList(appList)));
System.out.println("Linux应用");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.LINUX.getAppList(appList)));
System.out.println("Windows应用");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppOsType.WINDOWS.getAppList(appList)));
// 应用分类
System.out.println("系统应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppCategory.SYSTEM.getAppList(appList)));
System.out.println("景行发布应用:");
System.out.println(JsonUtil.objectToString(AppTypeConstant.AppCategory.APP.getAppList(appList)));
}
/**
* 测试获取应用链接
*/
@Test
public void testGetAppUrl() {
System.out.println(jhAppApiExecution.getAppUrl("jhadmin", "myjobmana"));
System.out.println(JsonUtil.objectToString(jhAppApiExecution.getAppUrl("jhadmin", "myjobmana")));
}
/**
* 测试根据文件后缀取应用列表
*/
@Test
public void testGetAppInfoSuffixList() {
System.out.println(JsonUtil.objectToString(jhAppApiExecution.getAppInfoSuffixList(Collections.singletonList(".cas"))));
}
/**
* 测试根据用途获取应用列表
*/
@Test
public void testGetUseLabelList() {
System.out.println(JsonUtil.objectToString(jhAppApiExecution.getUseLabelList()));
}
}

View File

@@ -14,14 +14,14 @@ import java.util.Arrays;
*/
public class DataApiTest {
public static final JHDataApiExecution execution = (JHDataApiExecution) JHClientConfig.jhApiClientMap.get(JHDataApiExecution.class);
public static final JHDataApiExecution execution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHDataApiExecution.class);
/**
* 测试获取作业数据区目录列表
*/
@Test
public void testGetSpoolers() {
System.out.println(execution.getSpoolersData("jhadmin"));
System.out.println(execution.getSpoolersData());
}
@@ -30,7 +30,7 @@ public class DataApiTest {
*/
@Test
public void testGetSpoolersDataById() {
System.out.println(execution.getSpoolersDataById("jhadmin", "5909"));
System.out.println(execution.getSpoolersDataById("157"));
}
@@ -39,7 +39,7 @@ public class DataApiTest {
*/
@Test
public void testGetSpoolersDataByIds() {
System.out.println(execution.getSpoolersDataByIds("jhadmin", Arrays.asList("6799", "6686")));
System.out.println(execution.getSpoolersDataByIds(Arrays.asList("157", "6686")));
}
/**
@@ -47,7 +47,7 @@ public class DataApiTest {
*/
@Test
public void testGetSpoolersDataByName() {
System.out.println(execution.getSpoolersByName("jhadmin", "common_sub__t1_aaa.sh_20240206103137"));
System.out.println(execution.getSpoolersByName("common_sub__t1_test.sh_2511221613073988875752"));
}

View File

@@ -1,11 +1,14 @@
package com.jhinno.sdk.openapi.test.file;
import com.jhinno.sdk.openapi.api.file.Confidential;
import com.jhinno.sdk.openapi.api.file.FileInfo;
import com.jhinno.sdk.openapi.api.file.JHFileApiExecution;
import com.jhinno.sdk.openapi.test.JHClientConfig;
import com.jhinno.sdk.openapi.utils.JsonUtil;
import org.junit.Test;
import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -17,15 +20,14 @@ import java.util.List;
*/
public class FileApiTest {
private static final JHFileApiExecution execution = (JHFileApiExecution) JHClientConfig.jhApiClientMap.get(JHFileApiExecution.class);
private static final JHFileApiExecution execution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHFileApiExecution.class);
/**
* 测试重命名文件或文件夹
*/
@Test
public void testRenameFile() {
execution.renameFile("lqyan", "/apps/JHDP/lqyan/temp/PSUserService.class", "aaa.class");
execution.renameFile("$HOME/test.sh", "test1.sh");
}
/**
@@ -33,7 +35,7 @@ public class FileApiTest {
*/
@Test
public void testDeleteFile() {
execution.deleteFile("lqyan", "/apps/JHDP/lqyan/temp/aaa.class");
execution.deleteFile("$HOME/test1/test.sh");
}
/**
@@ -41,16 +43,15 @@ public class FileApiTest {
*/
@Test
public void testCopyFile() {
execution.copyFile("lqyan", "/apps/JHDP/lqyan/PSUserService.class", "/apps/JHDP/lqyan/temp");
execution.copyFile("$HOME/test.sh", "$HOME/test1");
}
/**
* 测试获取文件列表
*/
@Test
public void testGetFileList() {
List<FileInfo> fileList = execution.getFileList("jhadmin", "$HOME");
List<FileInfo> fileList = execution.getFileList("$HOME");
System.out.println(fileList);
}
@@ -59,47 +60,54 @@ public class FileApiTest {
*/
@Test
public void testMkdir() {
System.out.println(execution.mkdir("jhadmin", "$HOMEtest1", true));
System.out.println(execution.mkdir("$HOMEtest1", true));
}
/**
* 新建文件夹不强制新建
*/
@Test
public void testMkdirNoForce() {
System.out.println(execution.mkdir("lqyan", "/apps/JHDP/lqyan/temp/bbb/ddd"));
System.out.println(execution.mkdir("$HOME/temp/bbb/ddd"));
}
/**
* 测试新建文件(接口执行失败)
*/
@Test
public void testMkFile() {
System.out.println(execution.mkFile("lqyan", "/apps/JHDP/lqyan/temp/ddd.txt"));
System.out.println(execution.mkFile("$HOME/temp/ddd.txt"));
}
/**
* 测试文件上传 (是否覆盖存在问题)
*/
@Test
public void testUploadFile() throws IOException {
File file = new File("C:\\Users\\yanlongqi\\Desktop\\LdapAdminv1830.exe");
File file = new File("D:\\Program Files\\Java\\apache-maven-3.9.11\\conf\\settings.xml");
FileInputStream fileInputStream = new FileInputStream(file);
execution.uploadFile("jhadmin", fileInputStream, file.getName(), "$HOME", true);
execution.uploadFile(fileInputStream, file.getName(), "$HOME", true);
}
/**
* 测试上传文件不覆盖源文件如果isCover是true上传后的文件有数字下标
*/
@Test
public void testUploadFileNoCover() throws IOException {
File file = new File("C:\\Users\\yanlongqi\\Desktop\\双色球.xls");
File file = new File("D:\\Program Files\\Java\\apache-maven-3.9.11\\conf\\settings.xml");
FileInputStream fileInputStream = new FileInputStream(file);
execution.uploadFile("jhadmin", fileInputStream, file.getName(), "$HOME/temp");
execution.uploadFile(fileInputStream, file.getName(), "$HOME/temp");
}
/**
* 测试上传文件,开启密级的情况
*/
@Test
public void testUploadFileConf() throws IOException {
File file = new File("D:\\Program Files\\Java\\apache-maven-3.9.11\\conf\\settings.xml");
FileInputStream fileInputStream = new FileInputStream(file);
execution.uploadFile(fileInputStream, file.getName(), "$HOME/temp111", false, "public");
}
/**
@@ -107,18 +115,36 @@ public class FileApiTest {
*/
@Test
public void testGetFileDownloadUrl() {
System.out.println(execution.getFileDownloadUrl("jhadmin", "$HOME/aa2a.sh"));
System.out.println(execution.getFileDownloadUrl("$HOME/test.sh"));
}
@Test
public void testGetFileStream() throws IOException {
InputStream in = execution.getFileInputStream("$HOME/test.sh");
byte[] bytes = new byte[1024];
while (in.read(bytes) != -1) {
System.out.println(new String(bytes));
}
}
@Test
public void testCompress() {
execution.compress("jhadmin", "$HOME/temp", "$HOME/temp.zip");
execution.compress("$HOME/temp", "$HOME/temp.zip");
}
@Test
public void testUncompress() {
execution.uncompress("jhadmin", "$HOME/temp.zip", "$HOME/test");
execution.uncompress("$HOME/temp.zip", "$HOME/test");
}
@Test
public void testGetConfList() {
List<Confidential> confList = execution.getConfList("yanlongqi");
System.out.println(JsonUtil.objectToString(confList));
}
@Test
public void testMarkConf() {
execution.markConf("999999998", "/home/yanlongqi/test.sh");
}
}

View File

@@ -17,7 +17,7 @@ import java.util.Map;
*/
public class JobApiTest {
private static final JHJobApiExecution execution = (JHJobApiExecution) JHClientConfig.jhApiClientMap.get(JHJobApiExecution.class);
private static final JHJobApiExecution execution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHJobApiExecution.class);
/**
* 测试提交作业
@@ -25,12 +25,12 @@ public class JobApiTest {
@Test
public void testSubmitJob() {
Map<String, Object> params = new HashMap<>();
params.put("JH_CAS", "$HOME/aaa.sh");
params.put("JH_CAS", "$HOME/test1.sh");
params.put("JH_NCPU", "1");
System.out.println(execution.submit("jhadmin", "common_sub", params));
params.put("JH_JOB_CONF", "public");
System.out.println(execution.submit("yanlongqi", "common_sub", params));
}
/**
* 测试根据作业id查询作业文件列表
*/
@@ -39,14 +39,22 @@ public class JobApiTest {
System.out.println(execution.getJobFilesById("jhadmin", "42"));
}
/**
* 测试分页查询作业列表
*/
@Test
public void testGetJobPage() {
PageJobInfo jhadmin = execution.getJobPage("jhadmin", 1, 5, null, JobStatusEnum.DONE, null);
System.out.println(jhadmin);
PageJobInfo pages = execution.getJobPage("jhadmin", 1, 5, null, JobStatusEnum.DONE, null);
System.out.println(pages);
}
/**
* 测试查询历史作业列表
*/
@Test
public void testGetHistoryJobs() {
PageJobInfo pages = execution.getHistoryJobs("jhadmin", 1, 5, null, JobStatusEnum.DONE, null);
System.out.println(pages);
}
/**
@@ -57,7 +65,6 @@ public class JobApiTest {
System.out.println(execution.getJobDetail("jhadmin", "42"));
}
/**
* 测试使用作业名称检索
*/
@@ -74,7 +81,6 @@ public class JobApiTest {
System.out.println(execution.getJobsByStatus("jhadmin", JobStatusEnum.DONE, 1, 10));
}
/**
* 测试使用作业拆id列表查询作业
*/
@@ -83,7 +89,6 @@ public class JobApiTest {
System.out.println(execution.getJobsByIds("jhadmin", Arrays.asList("42", "41")));
}
/**
* 测试查询作业历史
*/
@@ -93,7 +98,6 @@ public class JobApiTest {
System.out.println(result);
}
/**
* 测试通过多个子哦也好查询作业历史
*/
@@ -112,7 +116,6 @@ public class JobApiTest {
System.out.println("peek = " + peek);
}
/**
* 测试会话连接(目前没有测试条件)
*/

View File

@@ -13,7 +13,7 @@ import org.junit.Test;
*/
public class DepartmentApiTest {
private static final JHDepartmentApiExecution execution = (JHDepartmentApiExecution) JHClientConfig.jhApiClientMap.get(JHDepartmentApiExecution.class);
private static final JHDepartmentApiExecution execution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHDepartmentApiExecution.class);
/**
@@ -21,7 +21,7 @@ public class DepartmentApiTest {
*/
@Test
public void testGetDepartment() {
System.out.println(execution.getDepartmentList("jhadmin"));
System.out.println(execution.getDepartmentList());
}
/**
@@ -30,10 +30,10 @@ public class DepartmentApiTest {
@Test
public void testAddDepartment() {
AddUpdateDepartment addUpdateDepartment = new AddUpdateDepartment();
addUpdateDepartment.setDepName("test2");
addUpdateDepartment.setDepNameCN("测试部门2");
addUpdateDepartment.setDepName("test1");
addUpdateDepartment.setDepNameCN("测试部门1");
addUpdateDepartment.setParentDepName("defaultDep");
execution.addDepartment("jhadmin", addUpdateDepartment);
execution.addDepartment(addUpdateDepartment);
}
/**
@@ -45,7 +45,7 @@ public class DepartmentApiTest {
addUpdateDepartment.setDepName("test2");
addUpdateDepartment.setDepNameCN("测试部门2111");
addUpdateDepartment.setParentDepName("defaultDep");
execution.updateDepartment("jhadmin", addUpdateDepartment);
execution.updateDepartment(addUpdateDepartment);
}
/**
@@ -53,6 +53,6 @@ public class DepartmentApiTest {
*/
@Test
public void testDeleteDepartment() {
execution.deleteDepartment("jhadmin", "test2");
execution.deleteDepartment("test1");
}
}

View File

@@ -5,6 +5,7 @@ import com.jhinno.sdk.openapi.api.organization.AddUpdateUserInfo;
import com.jhinno.sdk.openapi.api.organization.JHUserApiExecution;
import com.jhinno.sdk.openapi.api.organization.UserInfo;
import com.jhinno.sdk.openapi.test.JHClientConfig;
import com.jhinno.sdk.openapi.utils.JsonUtil;
import org.junit.Test;
/**
@@ -15,7 +16,7 @@ import org.junit.Test;
*/
public class UserApiTest {
private static final JHUserApiExecution execution = (JHUserApiExecution) JHClientConfig.jhApiClientMap.get(JHUserApiExecution.class);
private static final JHUserApiExecution execution = JHClientConfig.API_EXECUTION_MANAGE.getApiExecution(JHUserApiExecution.class);
/**
@@ -23,8 +24,8 @@ public class UserApiTest {
*/
@Test
public void testGetUserList() {
PageResult<UserInfo> result = execution.getUserList("jhadmin", null, null, null);
System.out.println("result = " + result);
PageResult<UserInfo> result = execution.getUserList(null, null, null);
System.out.println(JsonUtil.objectToString(result));
}
/**
@@ -37,7 +38,7 @@ public class UserApiTest {
addUpdateUserInfo.setUserNameCn("张三3");
addUpdateUserInfo.setUserPassword("Jhadmin123");
addUpdateUserInfo.setDepName("defaultDep");
execution.addUser("jhadmin", addUpdateUserInfo);
execution.addUser(addUpdateUserInfo);
}
@@ -47,11 +48,11 @@ public class UserApiTest {
@Test
public void updateUser() {
AddUpdateUserInfo addUpdateUserInfo = new AddUpdateUserInfo();
addUpdateUserInfo.setUserName("zhangsan");
addUpdateUserInfo.setUserName("zhangsan3");
addUpdateUserInfo.setUserNameCn("张三1");
addUpdateUserInfo.setDepName("defaultDep");
addUpdateUserInfo.setUserPassword("Jhadmin123");
execution.updateUser("jhadmin", addUpdateUserInfo);
execution.updateUser(addUpdateUserInfo);
}
@@ -60,7 +61,7 @@ public class UserApiTest {
*/
@Test
public void testDeleteUser() {
execution.deleteUser("jhadmin", "zhangsan1");
execution.deleteUser("zhangsan3");
}
@@ -70,12 +71,7 @@ public class UserApiTest {
@Test
public void testUpdateUserPassword() {
// 修改用户密码应该是自己的密码需要自己的token修改
execution.updateUserPassword("jhadmin", "zhangsan1", "Jhadmin123", "Jhadmin124");
execution.updateUserPassword("zhangsan1", "Jhadmin124", "Jhadmin1241");
// 管理员重置密码
execution.resetPassword("jhadmin", "zhangsan2", "Jhadmin125");
// 管理员重置密码后,强制让用户修改密码(改接口调用报错,不应该传入旧密码)
execution.resetForceUpdatePassword("jhadmin", "zhangsan3", "Jhadmin127");
}
}

View File

@@ -0,0 +1,75 @@
<?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>cim.jhinno</groupId>
<artifactId>jhinno-openapi-sdk-spring-boot-example</artifactId>
<version>2.0.6</version>
<packaging>jar</packaging>
<name>Jhinno OpenAPI SDK for Java SpringBoot Example</name>
<description>The Jhinno OpenAPI SDK for Java used for accessing Jhinno OpenApi Service</description>
<url>http://jhinno.com</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<dependencies>
<dependency>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-sdk-spring-boot-starter</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
<developers>
<developer>
<id>lqyan</id>
<name>lqyan</name>
<email>lqyan@jhinno.com</email>
</developer>
</developers>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
</project>

View File

@@ -0,0 +1,13 @@
package com.jhinno.sdk.openapi.example;
import com.jhinno.sdk.openapi.JHApiRequestHandler;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApiConfig implements JHApiRequestHandler {
@Override
public String getCurrentUserName() {
return "yanlongqi";
}
}

View File

@@ -0,0 +1,13 @@
package com.jhinno.sdk.openapi.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}

View File

@@ -0,0 +1,19 @@
package com.jhinno.sdk.openapi.example.api.extend;
public enum FileEnvType {
HOME_ENV{
@Override
public String getEnv() {
return "home";
}
},
SPOOLER_ENV{
@Override
public String getEnv() {
return "spooler";
}
};
public abstract String getEnv();
}

View File

@@ -0,0 +1,13 @@
package com.jhinno.sdk.openapi.example.api.extend;
import lombok.Data;
@Data
public class FilePath {
/**
* 文件路径
*/
private String path;
}

View File

@@ -0,0 +1,24 @@
package com.jhinno.sdk.openapi.example.api.extend;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FileSystemType {
SYSTEM_TYPE_LINUX {
@Override
public String getType() {
return "linux";
}
},
SYSTEM_TYPE_WINDOWS {
@Override
public String getType() {
return "windows";
}
};
public abstract String getType();
}

View File

@@ -0,0 +1,32 @@
package com.jhinno.sdk.openapi.example.api.extend;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jhinno.sdk.openapi.JHApiExecutionAbstract;
import com.jhinno.sdk.openapi.api.ResponseResult;
import com.jhinno.sdk.openapi.client.JHApiClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class JHFileApiExtendExecution extends JHApiExecutionAbstract {
public static String GET_FILE_ENV_PATH = "/appform/ws/api/files/path/{env}";
public FilePath getFileEnvPath(String username, FileEnvType env, FileSystemType type) {
Map<String, Object> params = new HashMap<>(1);
if (StringUtils.isNotBlank(type.getType())) {
params.put("type", type.getType());
}
String url = JHApiClient.getUrl(GET_FILE_ENV_PATH.replace("{env}", env.getEnv()), params);
return execution.get(url, username, new TypeReference<ResponseResult<FilePath>>() {
});
}
public FilePath getFileHomeEnvPath(String username, FileSystemType type) {
return getFileEnvPath(username, FileEnvType.HOME_ENV, type);
}
}

View File

@@ -0,0 +1,6 @@
jhinno:
openapi:
server-url: https://172.20.0.200
auth-type: access_secret_mode
access-key: 8147c7470bfd4a27952fe750c6bc7cef
access-key-secret: 899b13f590394c3daafc6468fed4b1df

View File

@@ -0,0 +1,32 @@
package com.jhinno.sdk.openapi.example.test.extend;
import com.jhinno.sdk.openapi.api.app.AppStartedInfo;
import com.jhinno.sdk.openapi.example.api.extend.FileSystemType;
import com.jhinno.sdk.openapi.example.api.extend.JHFileApiExtendExecution;
import com.jhinno.sdk.openapi.utils.JsonUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.jhinno.sdk.openapi.api.app.JHAppApiExecution;
@SpringBootTest
public class JHFileApiExtendTest {
@Autowired
private JHFileApiExtendExecution jhFileApiExtendExecution;
@Autowired
private JHAppApiExecution jhAppApiExecution;
@Test
void testGetFileHomeEnvPath() {
System.out.println(jhFileApiExtendExecution.getFileHomeEnvPath("jhadmin", FileSystemType.SYSTEM_TYPE_LINUX));
}
@Test
void testStartApp() {
AppStartedInfo linuxDesktop = jhAppApiExecution.desktopStart(null, "linux_desktop");
System.out.println(JsonUtil.objectToString(linuxDesktop));
}
}

View File

@@ -5,7 +5,6 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>jhinno-openapi-sdk-spring-boot-starter</artifactId>
<version>2.0.1</version>
<packaging>jar</packaging>
<name>Jhinno OpenAPI SDK for Java SpringBoot Starter</name>
<description>The Jhinno OpenAPI SDK for Java used for accessing Jhinno OpenApi Service</description>
@@ -14,15 +13,14 @@
<parent>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk-parent</artifactId>
<version>2.0.1</version>
<version>2.0.6</version>
</parent>
<dependencies>
<dependency>
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk</artifactId>
<version>2.0.1</version>
<version>${project.version}</version>
</dependency>
<dependency>
@@ -44,93 +42,6 @@
<optional>true</optional>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>jhinno-releases</id>
<url>http://192.168.87.22:8081/repository/maven-releases</url>
</repository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.0.0</version>
<configuration>
<encoding>UTF-8</encoding>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.3</version>
<configuration>
<sourcepath>target/generated-sources/delombok</sourcepath>
<encoding>${project.build.sourceEncoding}</encoding>
<docencoding>${project.build.sourceEncoding}</docencoding>
<charset>${project.build.sourceEncoding}</charset>
<doclint>none</doclint>
<tags>
<tag>
<name>date</name>
<placement>X</placement>
</tag>
</tags>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<developers>
<developer>
<id>lqyan</id>
<name>lqyan</name>
<email>lqyan@jhinno.com</email>
</developer>
</developers>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
</project>

View File

@@ -1,5 +1,7 @@
package com.jhinno.sdk.openapi.autoconfigure;
import com.jhinno.sdk.openapi.JHApiRequestHandler;
import com.jhinno.sdk.openapi.api.JHRequestExecution;
import com.jhinno.sdk.openapi.client.JHApiClient;
import com.jhinno.sdk.openapi.client.JHApiHttpClientImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -17,21 +19,35 @@ import org.springframework.context.annotation.Configuration;
@EnableConfigurationProperties(JHOpenapiProperties.class)
public class JHOpenapiClientAutoConfigure {
@Bean
@ConditionalOnMissingBean
public JHApiClient jhApiClient(JHOpenapiProperties properties) {
JHApiClient jhApiClient = new JHApiClient(properties.getServerUrl());
JHApiHttpClientImpl jhApiHttpClient = new JHApiHttpClientImpl();
jhApiHttpClient.setMaxPerRoute(properties.getMaxPerRout());
jhApiHttpClient.setSocketTimeout(properties.getSocketTimeout());
jhApiHttpClient.setMaxTotal(properties.getMaxTotal());
jhApiHttpClient.setConnectTimeout(properties.getConnectTimeout());
jhApiHttpClient.setConnectRequestTimeout(properties.getConnectRequestTimeout());
jhApiHttpClient.init();
jhApiHttpClient.createHttpClients();
jhApiHttpClient.init(properties.getSocketTimeout(), properties.getConnectTimeout(), properties.getConnectRequestTimeout());
jhApiHttpClient.createHttpClients(properties.getMaxTotal(), properties.getMaxPerRout());
jhApiClient.setApiHttpClient(jhApiHttpClient);
return jhApiClient;
}
@Bean
@ConditionalOnMissingBean
public JHApiRequestHandler defaultRequestHandler() {
return new JHApiRequestHandler() {
};
}
@Bean
public JHRequestExecution requestExecution(JHApiClient jhApiClient, JHOpenapiProperties properties, JHApiRequestHandler requestHandler) {
JHRequestExecution requestExecution = new JHRequestExecution(jhApiClient, requestHandler);
requestExecution.setForceGetToken(properties.isForceGetToken());
requestExecution.setAuthType(properties.getAuthType());
requestExecution.setAccessKey(properties.getAccessKey());
requestExecution.setAccessKeySecret(properties.getAccessKeySecret());
requestExecution.setTokenTimeout(properties.getTokenTimeout());
requestExecution.setTokenResidueTime(properties.getTokenResidueTime());
requestExecution.setUsedServerTime(properties.isUsedServerTime());
return requestExecution;
}
}

View File

@@ -1,17 +1,22 @@
package com.jhinno.sdk.openapi.autoconfigure;
import com.jhinno.sdk.openapi.api.JHApiExecution;
import com.jhinno.sdk.openapi.JHApiExecutionAbstract;
import com.jhinno.sdk.openapi.api.JHRequestExecution;
import com.jhinno.sdk.openapi.api.app.JHAppApiExecution;
import com.jhinno.sdk.openapi.api.data.JHDataApiExecution;
import com.jhinno.sdk.openapi.api.file.JHFileApiExecution;
import com.jhinno.sdk.openapi.api.job.JHJobApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHDepartmentApiExecution;
import com.jhinno.sdk.openapi.api.organization.JHUserApiExecution;
import com.jhinno.sdk.openapi.client.JHApiClient;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.List;
/**
* openapi执行器自动配置
*
@@ -20,64 +25,52 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
@RequiredArgsConstructor
public class JHOpenapiExecutionAutoconfigure {
public class JHOpenapiExecutionAutoconfigure implements BeanPostProcessor {
private final JHRequestExecution jhRequestExecution;
private final JHOpenapiProperties properties;
private final JHApiClient client;
public void init(JHApiExecution apiExecution) {
apiExecution.setJhApiClient(client);
apiExecution.setForceGetToken(properties.isForceGetToken());
apiExecution.setAuthType(properties.getAuthType());
apiExecution.setAccessKey(properties.getAccessKey());
apiExecution.setAccessKeySecret(properties.getAccessKeySecret());
apiExecution.setTokenTimeout(properties.getTokenTimeout());
apiExecution.setTokenResidueTime(properties.getTokenResidueTime());
apiExecution.setUsedServerTime(properties.isUsedServerTime());
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean instanceof JHApiExecutionAbstract) {
((JHApiExecutionAbstract) bean).setExecution(jhRequestExecution);
}
return bean;
}
@Bean
@ConditionalOnMissingBean
public JHAppApiExecution appApiExecution() {
JHAppApiExecution jhAppApiExecution = new JHAppApiExecution();
init(jhAppApiExecution);
return jhAppApiExecution;
return new JHAppApiExecution();
}
@Bean
@ConditionalOnMissingBean
public JHDataApiExecution dataApiExecution() {
JHDataApiExecution dataApiExecution = new JHDataApiExecution();
init(dataApiExecution);
return dataApiExecution;
return new JHDataApiExecution();
}
@Bean
@ConditionalOnMissingBean
public JHFileApiExecution fileApiExecution() {
JHFileApiExecution fileApiExecution = new JHFileApiExecution();
init(fileApiExecution);
return fileApiExecution;
return new JHFileApiExecution();
}
@Bean
@ConditionalOnMissingBean
public JHJobApiExecution jobApiExecution() {
JHJobApiExecution jobApiExecution = new JHJobApiExecution();
init(jobApiExecution);
return jobApiExecution;
return new JHJobApiExecution();
}
@Bean
@ConditionalOnMissingBean
public JHDepartmentApiExecution departmentApiExecution() {
JHDepartmentApiExecution departmentApiExecution = new JHDepartmentApiExecution();
init(departmentApiExecution);
return departmentApiExecution;
return new JHDepartmentApiExecution();
}
@Bean
@ConditionalOnMissingBean
public JHUserApiExecution userApiExecution() {
JHUserApiExecution userApiExecution = new JHUserApiExecution();
init(userApiExecution);
return userApiExecution;
return new JHUserApiExecution();
}
}

View File

@@ -8,43 +8,42 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author yanlongqi
* @date 2024/6/4 16:03
*/
@Data
@ConfigurationProperties(prefix = CommonConstants.CONFIG_PREFIX)
public class JHOpenapiProperties {
/**
* 接口服务的BaseURL, 列如https://192.168.87.20/appform
* 接口服务的BaseURL, 列如https://192.168.87.20
*/
private String serverUrl;
/**
* 设置连接池的最大连接数,默认{@link DefaultHttpClientConfig#MAX_TOTAL}
* 设置连接池的最大连接数
*/
private int maxTotal = DefaultHttpClientConfig.MAX_TOTAL;
private Integer maxTotal;
/**
* 设置服务每次能并行接收的请求数量,默认{@link DefaultHttpClientConfig#MAX_PER_ROUTE}
* 设置服务每次能并行接收的请求数量
*/
private int maxPerRout = DefaultHttpClientConfig.MAX_PER_ROUTE;
private Integer maxPerRout;
/**
* 设置服务socket连接超时的时间(单位:毫秒),默认{@link DefaultHttpClientConfig#SOCKET_TIMEOUT}
* 设置服务socket连接超时的时间(单位:毫秒)
*/
private int socketTimeout = DefaultHttpClientConfig.SOCKET_TIMEOUT;
private int socketTimeout;
/**
* 设置服务连接超时的时间(单位:毫秒),默认{@link DefaultHttpClientConfig#CONNECT_TIMEOUT}
* 设置服务连接超时的时间(单位:毫秒)
*/
private int connectTimeout = DefaultHttpClientConfig.CONNECT_TIMEOUT;
private int connectTimeout;
/**
* 设置服务请求超时的时间(单位:毫秒),默认{@link DefaultHttpClientConfig#CONNECTION_REQUEST_TIMEOUT}
* 设置服务请求超时的时间(单位:毫秒)
*/
private int connectRequestTimeout = DefaultHttpClientConfig.CONNECTION_REQUEST_TIMEOUT;
private int connectRequestTimeout;
/**

94
pom.xml
View File

@@ -6,11 +6,11 @@
<groupId>com.jhinno</groupId>
<artifactId>jhinno-openapi-java-sdk-parent</artifactId>
<version>2.0.1</version>
<version>2.0.6</version>
<packaging>pom</packaging>
<name>Jhinno OpenAPI SDK for Java parent</name>
<description>The Jhinno OpenAPI SDK for Java used for accessing Jhinno OpenApi Service</description>
<url>http://jhinno.com</url>
<url>https://github.com/yanlongqi/jhinno-openapi-java-sdk</url>
<properties>
@@ -26,20 +26,80 @@
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<distributionManagement>
<repository>
<id>jhinno-releases</id>
<url>http://192.168.87.22:8081/repository/maven-releases</url>
</repository>
</distributionManagement>
<modules>
<module>jhinno-openapi-java-sdk</module>
<module>jhinno-openapi-sdk-spring-boot-starter</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<show>private</show>
<nohelp>true</nohelp>
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<docencoding>UTF-8</docencoding>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.7.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish>
</configuration>
</plugin>
</plugins>
</build>
<developers>
<developer>
@@ -56,4 +116,16 @@
</license>
</licenses>
<issueManagement>
<system>github</system>
<url>https://github.com/yanlongqi/jhinno-openapi-java-sdk/issues</url>
</issueManagement>
<scm>
<connection>scm:git:https://github.com/yanlongqi/jhinno-openapi-java-sdk.git</connection>
<developerConnection>scm:git:https://github.com/yanlongqi/jhinno-openapi-java-sdk.git</developerConnection>
<url>https://github.com/yanlongqi/jhinno-openapi-java-sdk</url>
</scm>
</project>