union-ark-web 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PROJECT_OVERVIEW.md +405 -0
- package/README.md +177 -0
- package/ark-control/pom.xml +142 -0
- package/ark-control/src/local-mock/java/com/epcc/commons/securityproxy/api/SecurityResult.java +14 -0
- package/ark-control/src/local-mock/java/com/epcc/commons/securityproxy/api/SymmetricalSecurityService.java +11 -0
- package/ark-control/src/local-mock/java/com/epcc/dubbo/result/Result.java +29 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/annotation/EnDecryptField.java +16 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/annotation/EnDecryptFieldLong.java +17 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/annotation/EnDecryptFieldWithTag.java +16 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/exception/BaseDataErrorCode.java +26 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/exception/CheckException.java +33 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/exception/ErrorCode.java +9 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/redis/RedisCacheService.java +131 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/util/Constant.java +24 -0
- package/ark-control/src/local-mock/java/com/nucc/channel/ark/common/util/ResultUtil.java +9 -0
- package/ark-control/src/local-mock/java/com/union/control/local/sensitive/LocalMockSensitiveProxy.java +40 -0
- package/ark-control/src/local-mock/java/com/union/control/local/sensitive/LocalRedisCacheService.java +45 -0
- package/ark-control/src/local-mock/java/com/union/control/local/sensitive/LocalSensitiveHostConfiguration.java +27 -0
- package/ark-control/src/local-mock/java/com/union/control/local/sensitive/LocalSensitiveProxyConfiguration.java +16 -0
- package/ark-control/src/main/java/com/union/control/ArkControlApplication.java +17 -0
- package/ark-control/src/main/java/com/union/control/dubbo/ProviderAccessLogFilter.java +45 -0
- package/ark-control/src/main/java/com/union/control/mapper/AgentExecutionMapper.java +35 -0
- package/ark-control/src/main/java/com/union/control/mapper/ConversationMapper.java +44 -0
- package/ark-control/src/main/java/com/union/control/mapper/MemoryStoreMapper.java +41 -0
- package/ark-control/src/main/java/com/union/control/mapper/ScheduledTaskMapper.java +96 -0
- package/ark-control/src/main/java/com/union/control/mapper/SensitiveAddressBookDemo.java +31 -0
- package/ark-control/src/main/java/com/union/control/mapper/SensitiveDataDemoMapper.java +24 -0
- package/ark-control/src/main/java/com/union/control/mapper/interceptor/AESInterceptor.java +265 -0
- package/ark-control/src/main/java/com/union/control/mapper/interceptor/AddressBookHandler.java +105 -0
- package/ark-control/src/main/java/com/union/control/schedule/ScheduledExecutionToken.java +55 -0
- package/ark-control/src/main/java/com/union/control/schedule/ScheduledTaskScheduler.java +206 -0
- package/ark-control/src/main/java/com/union/control/service/impl/AgentExecutionServiceImpl.java +212 -0
- package/ark-control/src/main/java/com/union/control/service/impl/AgentProxyServiceImpl.java +143 -0
- package/ark-control/src/main/java/com/union/control/service/impl/ConversationServiceImpl.java +245 -0
- package/ark-control/src/main/java/com/union/control/service/impl/MemoryStoreServiceImpl.java +252 -0
- package/ark-control/src/main/java/com/union/control/service/impl/RunningAnalysisMockServiceImpl.java +301 -0
- package/ark-control/src/main/java/com/union/control/service/impl/ScheduledTaskServiceImpl.java +576 -0
- package/ark-control/src/main/java/com/union/control/service/impl/SensitiveDataDemoServiceImpl.java +144 -0
- package/ark-control/src/main/java/com/union/control/service/sensitive/RedisRevealTokenStore.java +90 -0
- package/ark-control/src/main/java/com/union/control/service/sensitive/SensitiveRevealProcessor.java +319 -0
- package/ark-control/src/main/java/com/union/control/service/sensitive/SensitiveRevealServiceImpl.java +72 -0
- package/ark-control/src/main/java/com/union/control/utils/AgentSupport.java +103 -0
- package/ark-control/src/main/java/com/union/control/utils/security/SymmetricalSecurityUtils.java +160 -0
- package/ark-control/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter +1 -0
- package/ark-control/src/main/resources/application.properties +4 -0
- package/ark-control/src/main/resources/application.yml +32 -0
- package/ark-control/src/main/resources/dubbo-provider.xml +20 -0
- package/ark-control/src/main/resources/mapper/AgentExecutionMapper.xml +75 -0
- package/ark-control/src/main/resources/mapper/ConversationMapper.xml +110 -0
- package/ark-control/src/main/resources/mapper/MemoryStoreMapper.xml +74 -0
- package/ark-control/src/main/resources/mapper/ScheduledTaskMapper.xml +286 -0
- package/ark-control/src/main/resources/mapper/SensitiveDataDemoMapper.xml +55 -0
- package/ark-control/src/main/resources/schema.sql +146 -0
- package/ark-control/src/test/java/com/union/control/AgentExecutionServiceTest.java +170 -0
- package/ark-control/src/test/java/com/union/control/ArkControlStructureContractTest.java +107 -0
- package/ark-control/src/test/java/com/union/control/ConversationServiceTest.java +89 -0
- package/ark-control/src/test/java/com/union/control/MemoryStoreServiceTest.java +26 -0
- package/ark-control/src/test/java/com/union/control/PydanticAiControlContractTest.java +52 -0
- package/ark-control/src/test/java/com/union/control/TestJson.java +45 -0
- package/ark-control/src/test/java/com/union/control/dubbo/ProviderAccessLogFilterTest.java +53 -0
- package/ark-control/src/test/java/com/union/control/local/sensitive/LocalSensitiveProxyConfigurationTest.java +23 -0
- package/ark-control/src/test/java/com/union/control/mapper/interceptor/AESInterceptorCompatibilityTest.java +505 -0
- package/ark-control/src/test/java/com/union/control/schedule/ScheduledExecutionTokenTest.java +27 -0
- package/ark-control/src/test/java/com/union/control/schedule/ScheduledTaskSchedulerTest.java +51 -0
- package/ark-control/src/test/java/com/union/control/service/AgentProxyServiceTest.java +111 -0
- package/ark-control/src/test/java/com/union/control/service/ScheduledTaskServiceTest.java +483 -0
- package/ark-control/src/test/java/com/union/control/service/impl/SensitiveDataDemoServiceImplTest.java +104 -0
- package/ark-control/src/test/java/com/union/control/service/sensitive/RedisRevealTokenStoreTest.java +65 -0
- package/ark-control/src/test/java/com/union/control/service/sensitive/SensitiveRevealBoundaryTest.java +99 -0
- package/ark-control/src/test/java/com/union/control/service/sensitive/SensitiveRevealProcessorCodecTest.java +111 -0
- package/ark-control/src/test/java/com/union/control/service/sensitive/SensitiveRevealProcessorTest.java +111 -0
- package/ark-control/src/test/java/com/union/control/utils/security/SymmetricalSecurityUtilsCompatibilityTest.java +87 -0
- package/ark-control-facade/pom.xml +16 -0
- package/ark-control-facade/src/main/java/com/union/control/service/AgentExecutionService.java +8 -0
- package/ark-control-facade/src/main/java/com/union/control/service/AgentProxyService.java +7 -0
- package/ark-control-facade/src/main/java/com/union/control/service/AgentResponse.java +22 -0
- package/ark-control-facade/src/main/java/com/union/control/service/ConversationService.java +12 -0
- package/ark-control-facade/src/main/java/com/union/control/service/MemoryStoreService.java +12 -0
- package/ark-control-facade/src/main/java/com/union/control/service/RunningAnalysisMockService.java +10 -0
- package/ark-control-facade/src/main/java/com/union/control/service/ScheduledTaskService.java +40 -0
- package/ark-control-facade/src/main/java/com/union/control/service/SensitiveDataDemoService.java +13 -0
- package/ark-control-facade/src/main/java/com/union/control/service/sensitive/SensitiveRevealService.java +18 -0
- package/ark-web/README.md +80 -0
- package/ark-web/pom.xml +105 -0
- package/ark-web/src/local-mock/java/com/epcc/arkweb/mock/ArkAuthServiceMock.java +105 -0
- package/ark-web/src/local-mock/java/com/epcc/arkweb/mock/LocalKaptchaConfiguration.java +26 -0
- package/ark-web/src/main/java/com/epcc/arkweb/Application.java +13 -0
- package/ark-web/src/main/java/com/epcc/arkweb/config/InterceptorConfig.java +20 -0
- package/ark-web/src/main/java/com/epcc/arkweb/config/Realm.java +64 -0
- package/ark-web/src/main/java/com/epcc/arkweb/config/ShiroConfig.java +129 -0
- package/ark-web/src/main/java/com/epcc/arkweb/filter/LoginFormFilter.java +43 -0
- package/ark-web/src/main/java/com/epcc/arkweb/helper/AuthContextHolder.java +39 -0
- package/ark-web/src/main/java/com/epcc/arkweb/helper/AuthenticatedRequest.java +91 -0
- package/ark-web/src/main/java/com/epcc/arkweb/model/ShiroUser.java +21 -0
- package/ark-web/src/main/java/com/epcc/arkweb/utils/ResultMsg.java +19 -0
- package/ark-web/src/main/java/com/epcc/arkweb/vo/llm/ScheduledTaskCommandVO.java +30 -0
- package/ark-web/src/main/java/com/epcc/arkweb/vo/llm/ScheduledTaskQueryVO.java +20 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/CommonController.java +25 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/llm/AgentAuthorizationInterceptor.java +229 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/llm/AgentController.java +165 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/llm/AgentPermission.java +13 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/llm/LlmController.java +209 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/llm/ScheduledTaskController.java +160 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/sensitive/reveal/SensitiveCaptchaService.java +146 -0
- package/ark-web/src/main/java/com/epcc/arkweb/web/sensitive/reveal/SensitiveRevealController.java +163 -0
- package/ark-web/src/main/resources/application.properties +1 -0
- package/ark-web/src/main/resources/application.yml +23 -0
- package/ark-web/src/main/resources/dubbo-consumer.xml +19 -0
- package/ark-web/src/production-overlay/java/com/epcc/arkweb/config/CasShiroConfig.java +229 -0
- package/ark-web/src/production-overlay/java/com/epcc/arkweb/config/InterceptorConfig.java +35 -0
- package/ark-web/src/production-overlay/java/com/epcc/arkweb/config/ShiroConfig.java +161 -0
- package/ark-web/src/test/java/com/epcc/arkweb/ArkWebStructureContractTest.java +290 -0
- package/ark-web/src/test/java/com/epcc/arkweb/ShiroTestSupport.java +32 -0
- package/ark-web/src/test/java/com/epcc/arkweb/config/LocalShiroIntegrationTest.java +121 -0
- package/ark-web/src/test/java/com/epcc/arkweb/helper/AuthenticatedRequestTest.java +131 -0
- package/ark-web/src/test/java/com/epcc/arkweb/local/LocalArkAuthServiceMockTest.java +17 -0
- package/ark-web/src/test/java/com/epcc/arkweb/web/llm/AgentAuthorizationInterceptorTest.java +134 -0
- package/ark-web/src/test/java/com/epcc/arkweb/web/llm/AgentControllerAuthorizationTest.java +97 -0
- package/ark-web/src/test/java/com/epcc/arkweb/web/llm/LlmControllerTest.java +113 -0
- package/ark-web/src/test/java/com/epcc/arkweb/web/sensitive/reveal/SensitiveRevealControllerTest.java +273 -0
- package/package.json +18 -0
- package/pom.xml +16 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
package com.union.control.dubbo;
|
|
2
|
+
|
|
3
|
+
import com.alibaba.dubbo.rpc.Filter;
|
|
4
|
+
import com.alibaba.dubbo.rpc.Invocation;
|
|
5
|
+
import com.alibaba.dubbo.rpc.Invoker;
|
|
6
|
+
import com.alibaba.dubbo.rpc.Result;
|
|
7
|
+
import com.alibaba.dubbo.rpc.RpcContext;
|
|
8
|
+
import com.alibaba.dubbo.rpc.RpcException;
|
|
9
|
+
import org.slf4j.Logger;
|
|
10
|
+
import org.slf4j.LoggerFactory;
|
|
11
|
+
|
|
12
|
+
import java.net.InetSocketAddress;
|
|
13
|
+
import java.util.concurrent.TimeUnit;
|
|
14
|
+
|
|
15
|
+
public class ProviderAccessLogFilter implements Filter {
|
|
16
|
+
private static final Logger LOG = LoggerFactory.getLogger(ProviderAccessLogFilter.class);
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
|
20
|
+
String service = invoker.getInterface().getSimpleName();
|
|
21
|
+
String method = invocation.getMethodName();
|
|
22
|
+
InetSocketAddress remoteAddress = RpcContext.getContext().getRemoteAddress();
|
|
23
|
+
String remote = String.valueOf(remoteAddress);
|
|
24
|
+
long started = System.nanoTime();
|
|
25
|
+
LOG.info("Dubbo provider request started: service={}, method={}, remote={}",
|
|
26
|
+
service, method, remote);
|
|
27
|
+
try {
|
|
28
|
+
Result result = invoker.invoke(invocation);
|
|
29
|
+
long elapsedMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - started);
|
|
30
|
+
if (result.hasException()) {
|
|
31
|
+
LOG.warn("Dubbo provider request failed: service={}, method={}, elapsedMs={}",
|
|
32
|
+
service, method, elapsedMs, result.getException());
|
|
33
|
+
} else {
|
|
34
|
+
LOG.info("Dubbo provider request completed: service={}, method={}, elapsedMs={}",
|
|
35
|
+
service, method, elapsedMs);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
} catch (RpcException error) {
|
|
39
|
+
long elapsedMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - started);
|
|
40
|
+
LOG.warn("Dubbo provider request failed: service={}, method={}, elapsedMs={}",
|
|
41
|
+
service, method, elapsedMs, error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import org.apache.ibatis.annotations.Mapper;
|
|
4
|
+
import org.apache.ibatis.annotations.Param;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
@Mapper
|
|
10
|
+
public interface AgentExecutionMapper {
|
|
11
|
+
int softDeleteExecutions(@Param("conversationId") String conversationId,
|
|
12
|
+
@Param("userId") String userId);
|
|
13
|
+
int insertRootExecution(@Param("runId") String runId,
|
|
14
|
+
@Param("conversationId") String conversationId,
|
|
15
|
+
@Param("userId") String userId);
|
|
16
|
+
int insertCompletedRootExecution(Map<String, Object> execution);
|
|
17
|
+
int updateRootAgent(@Param("id") Long id,
|
|
18
|
+
@Param("agentName") String agentName);
|
|
19
|
+
int insertChildExecution(@Param("runId") String runId,
|
|
20
|
+
@Param("conversationId") String conversationId,
|
|
21
|
+
@Param("userId") String userId,
|
|
22
|
+
@Param("parentExecutionId") Long parentExecutionId,
|
|
23
|
+
@Param("agentName") String agentName,
|
|
24
|
+
@Param("delegationCallId") String delegationCallId,
|
|
25
|
+
@Param("task") String task);
|
|
26
|
+
List<Map<String, Object>> findExecutions(@Param("userId") String userId,
|
|
27
|
+
@Param("conversationId") String conversationId);
|
|
28
|
+
List<Map<String, Object>> findExecution(@Param("userId") String userId,
|
|
29
|
+
@Param("conversationId") String conversationId,
|
|
30
|
+
@Param("runId") String runId,
|
|
31
|
+
@Param("lock") boolean lock);
|
|
32
|
+
int finishExecution(@Param("id") Long id,
|
|
33
|
+
@Param("status") String status,
|
|
34
|
+
@Param("errorCode") String errorCode);
|
|
35
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import org.apache.ibatis.annotations.Mapper;
|
|
4
|
+
import org.apache.ibatis.annotations.Param;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
@Mapper
|
|
10
|
+
public interface ConversationMapper {
|
|
11
|
+
List<Map<String, Object>> findConversations(@Param("userId") String userId,
|
|
12
|
+
@Param("limit") int limit);
|
|
13
|
+
Map<String, Object> findConversation(@Param("userId") String userId,
|
|
14
|
+
@Param("conversationId") String conversationId);
|
|
15
|
+
int updateConversationTitle(@Param("title") String title,
|
|
16
|
+
@Param("conversationId") String conversationId,
|
|
17
|
+
@Param("userId") String userId);
|
|
18
|
+
int softDeleteMessages(@Param("conversationId") String conversationId,
|
|
19
|
+
@Param("userId") String userId);
|
|
20
|
+
int softDeleteConversation(@Param("conversationId") String conversationId,
|
|
21
|
+
@Param("userId") String userId);
|
|
22
|
+
int insertConversation(@Param("conversationId") String conversationId,
|
|
23
|
+
@Param("userId") String userId,
|
|
24
|
+
@Param("title") String title);
|
|
25
|
+
Long currentMessageSequence(@Param("conversationId") String conversationId);
|
|
26
|
+
int insertMessage(@Param("conversationId") String conversationId,
|
|
27
|
+
@Param("userId") String userId,
|
|
28
|
+
@Param("messageId") String messageId,
|
|
29
|
+
@Param("executionId") Long executionId,
|
|
30
|
+
@Param("role") String role,
|
|
31
|
+
@Param("sequence") long sequence,
|
|
32
|
+
@Param("payload") String payload);
|
|
33
|
+
int touchConversation(@Param("conversationId") String conversationId,
|
|
34
|
+
@Param("userId") String userId);
|
|
35
|
+
List<Map<String, Object>> findRootMessages(@Param("userId") String userId,
|
|
36
|
+
@Param("conversationId") String conversationId);
|
|
37
|
+
List<Map<String, Object>> findBrowserMessages(@Param("userId") String userId,
|
|
38
|
+
@Param("conversationId") String conversationId);
|
|
39
|
+
Long requireOwnedActive(@Param("conversationId") String conversationId,
|
|
40
|
+
@Param("userId") String userId);
|
|
41
|
+
Long requireOwned(@Param("conversationId") String conversationId,
|
|
42
|
+
@Param("userId") String userId,
|
|
43
|
+
@Param("lock") boolean lock);
|
|
44
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import org.apache.ibatis.annotations.Mapper;
|
|
4
|
+
import org.apache.ibatis.annotations.Param;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
@Mapper
|
|
10
|
+
public interface MemoryStoreMapper {
|
|
11
|
+
List<Map<String, Object>> readMemory(@Param("userId") String userId,
|
|
12
|
+
@Param("path") String path);
|
|
13
|
+
List<String> listMemoryPaths(@Param("userId") String userId,
|
|
14
|
+
@Param("prefix") String prefix,
|
|
15
|
+
@Param("limit") int limit);
|
|
16
|
+
List<Map<String, Object>> findMemoryOperation(@Param("userId") String userId,
|
|
17
|
+
@Param("operationId") String operationId,
|
|
18
|
+
@Param("lock") boolean lock);
|
|
19
|
+
Long currentMemoryVersion(@Param("userId") String userId,
|
|
20
|
+
@Param("path") String path);
|
|
21
|
+
int updateMemoryFile(@Param("content") String content,
|
|
22
|
+
@Param("version") long version,
|
|
23
|
+
@Param("operationId") String operationId,
|
|
24
|
+
@Param("id") Object id);
|
|
25
|
+
int insertMemoryFile(@Param("userId") String userId,
|
|
26
|
+
@Param("path") String path,
|
|
27
|
+
@Param("content") String content,
|
|
28
|
+
@Param("version") long version,
|
|
29
|
+
@Param("operationId") String operationId);
|
|
30
|
+
int softDeleteMemoryFile(@Param("id") Object id);
|
|
31
|
+
List<Map<String, Object>> searchMemory(@Param("userId") String userId,
|
|
32
|
+
@Param("prefix") String prefix,
|
|
33
|
+
@Param("limit") int limit);
|
|
34
|
+
List<Map<String, Object>> findMemoryRow(@Param("userId") String userId,
|
|
35
|
+
@Param("path") String path);
|
|
36
|
+
int insertMemoryOperation(@Param("userId") String userId,
|
|
37
|
+
@Param("operationId") String operationId,
|
|
38
|
+
@Param("fingerprint") String fingerprint,
|
|
39
|
+
@Param("version") Long version,
|
|
40
|
+
@Param("existed") int existed);
|
|
41
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import org.apache.ibatis.annotations.Mapper;
|
|
4
|
+
import org.apache.ibatis.annotations.Param;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
@Mapper
|
|
10
|
+
public interface ScheduledTaskMapper {
|
|
11
|
+
List<Long> lockUserTasks(@Param("userId") String userId);
|
|
12
|
+
|
|
13
|
+
int countRunnableTasks(@Param("userId") String userId);
|
|
14
|
+
|
|
15
|
+
int insertTask(Map<String, Object> task);
|
|
16
|
+
|
|
17
|
+
int updateTask(Map<String, Object> task);
|
|
18
|
+
|
|
19
|
+
long countTasks(@Param("userId") String userId,
|
|
20
|
+
@Param("keyword") String keyword,
|
|
21
|
+
@Param("status") String status);
|
|
22
|
+
|
|
23
|
+
List<Map<String, Object>> findTasks(@Param("userId") String userId,
|
|
24
|
+
@Param("keyword") String keyword,
|
|
25
|
+
@Param("status") String status,
|
|
26
|
+
@Param("limit") int limit,
|
|
27
|
+
@Param("offset") int offset);
|
|
28
|
+
|
|
29
|
+
Map<String, Object> findTaskDetail(@Param("taskId") long taskId,
|
|
30
|
+
@Param("userId") String userId);
|
|
31
|
+
|
|
32
|
+
Map<String, Object> findTaskOwner(@Param("taskId") long taskId,
|
|
33
|
+
@Param("userId") String userId,
|
|
34
|
+
@Param("lock") boolean lock);
|
|
35
|
+
|
|
36
|
+
long countRuns(@Param("taskId") long taskId, @Param("userId") String userId);
|
|
37
|
+
|
|
38
|
+
List<Map<String, Object>> findRuns(@Param("taskId") long taskId,
|
|
39
|
+
@Param("userId") String userId,
|
|
40
|
+
@Param("limit") int limit,
|
|
41
|
+
@Param("offset") int offset);
|
|
42
|
+
|
|
43
|
+
Map<String, Object> findOwnedRun(@Param("runId") long runId,
|
|
44
|
+
@Param("userId") String userId,
|
|
45
|
+
@Param("lock") boolean lock);
|
|
46
|
+
|
|
47
|
+
long countUnread(@Param("userId") String userId);
|
|
48
|
+
|
|
49
|
+
List<Map<String, Object>> findUnread(@Param("userId") String userId);
|
|
50
|
+
|
|
51
|
+
int activateTask(@Param("taskId") long taskId,
|
|
52
|
+
@Param("userId") String userId,
|
|
53
|
+
@Param("nextRunAt") String nextRunAt);
|
|
54
|
+
|
|
55
|
+
int pauseTask(@Param("taskId") long taskId, @Param("userId") String userId);
|
|
56
|
+
|
|
57
|
+
int discardTask(@Param("taskId") long taskId, @Param("userId") String userId);
|
|
58
|
+
|
|
59
|
+
Map<String, Object> findDueTask();
|
|
60
|
+
|
|
61
|
+
int insertRun(Map<String, Object> run);
|
|
62
|
+
|
|
63
|
+
int completeOnceTask(@Param("taskId") long taskId);
|
|
64
|
+
|
|
65
|
+
int updateNextRun(@Param("taskId") long taskId,
|
|
66
|
+
@Param("nextRunAt") String nextRunAt);
|
|
67
|
+
|
|
68
|
+
List<Long> findPendingRunIds(@Param("limit") int limit);
|
|
69
|
+
|
|
70
|
+
int beginRun(@Param("runId") long runId,
|
|
71
|
+
@Param("tokenHash") String tokenHash,
|
|
72
|
+
@Param("tokenExpiresAt") String tokenExpiresAt);
|
|
73
|
+
|
|
74
|
+
Map<String, Object> findPendingRunContext(@Param("runId") long runId);
|
|
75
|
+
|
|
76
|
+
Map<String, Object> resolveScheduledToken(@Param("tokenHash") String tokenHash);
|
|
77
|
+
|
|
78
|
+
Map<String, Object> findRunForUpdate(@Param("runId") long runId);
|
|
79
|
+
|
|
80
|
+
int completeRun(@Param("runId") long runId, @Param("resultPayload") String resultPayload);
|
|
81
|
+
|
|
82
|
+
int failRun(@Param("runId") long runId,
|
|
83
|
+
@Param("errorCode") String errorCode,
|
|
84
|
+
@Param("errorMessage") String errorMessage);
|
|
85
|
+
|
|
86
|
+
int failStaleRuns(@Param("maxRunSeconds") int maxRunSeconds);
|
|
87
|
+
|
|
88
|
+
int markRunRead(@Param("runId") long runId);
|
|
89
|
+
|
|
90
|
+
int attachConversation(@Param("runId") long runId,
|
|
91
|
+
@Param("conversationId") String conversationId);
|
|
92
|
+
|
|
93
|
+
int softDeleteByConversation(@Param("conversationId") String conversationId,
|
|
94
|
+
@Param("userId") String userId);
|
|
95
|
+
|
|
96
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import com.nucc.channel.ark.common.annotation.EnDecryptField;
|
|
4
|
+
|
|
5
|
+
public class SensitiveAddressBookDemo {
|
|
6
|
+
private Long id;
|
|
7
|
+
private String name;
|
|
8
|
+
private String role;
|
|
9
|
+
@EnDecryptField
|
|
10
|
+
private String email;
|
|
11
|
+
@EnDecryptField
|
|
12
|
+
private String telephone;
|
|
13
|
+
@EnDecryptField
|
|
14
|
+
private String mobileNumber;
|
|
15
|
+
private String createdAt;
|
|
16
|
+
|
|
17
|
+
public Long getId() { return id; }
|
|
18
|
+
public void setId(Long id) { this.id = id; }
|
|
19
|
+
public String getName() { return name; }
|
|
20
|
+
public void setName(String name) { this.name = name; }
|
|
21
|
+
public String getRole() { return role; }
|
|
22
|
+
public void setRole(String role) { this.role = role; }
|
|
23
|
+
public String getEmail() { return email; }
|
|
24
|
+
public void setEmail(String email) { this.email = email; }
|
|
25
|
+
public String getTelephone() { return telephone; }
|
|
26
|
+
public void setTelephone(String telephone) { this.telephone = telephone; }
|
|
27
|
+
public String getMobileNumber() { return mobileNumber; }
|
|
28
|
+
public void setMobileNumber(String mobileNumber) { this.mobileNumber = mobileNumber; }
|
|
29
|
+
public String getCreatedAt() { return createdAt; }
|
|
30
|
+
public void setCreatedAt(String createdAt) { this.createdAt = createdAt; }
|
|
31
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package com.union.control.mapper;
|
|
2
|
+
|
|
3
|
+
import org.apache.ibatis.annotations.Mapper;
|
|
4
|
+
import org.apache.ibatis.annotations.Param;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
import java.util.Map;
|
|
8
|
+
|
|
9
|
+
@Mapper
|
|
10
|
+
public interface SensitiveDataDemoMapper {
|
|
11
|
+
int insert(@Param("phoneNumber") String phoneNumber);
|
|
12
|
+
|
|
13
|
+
List<Map<String, Object>> query();
|
|
14
|
+
|
|
15
|
+
int insertSaved(Map<String, Object> row);
|
|
16
|
+
int update(Map<String, Object> row);
|
|
17
|
+
Map<String, Object> queryById(@Param("id") long id);
|
|
18
|
+
|
|
19
|
+
int insertAddressBook(SensitiveAddressBookDemo row);
|
|
20
|
+
|
|
21
|
+
List<SensitiveAddressBookDemo> queryAddressBook();
|
|
22
|
+
int updateAddressBook(SensitiveAddressBookDemo row);
|
|
23
|
+
SensitiveAddressBookDemo queryAddressBookById(@Param("id") long id);
|
|
24
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
package com.union.control.mapper.interceptor;
|
|
2
|
+
|
|
3
|
+
import com.alibaba.fastjson.JSON;
|
|
4
|
+
import com.alibaba.fastjson.TypeReference;
|
|
5
|
+
import com.nucc.channel.ark.common.util.Constant;
|
|
6
|
+
import com.union.control.service.sensitive.SensitiveRevealProcessor;
|
|
7
|
+
import org.apache.ibatis.executor.Executor;
|
|
8
|
+
import org.apache.ibatis.mapping.BoundSql;
|
|
9
|
+
import org.apache.ibatis.mapping.MappedStatement;
|
|
10
|
+
import org.apache.ibatis.mapping.ParameterMapping;
|
|
11
|
+
import org.apache.ibatis.mapping.SqlCommandType;
|
|
12
|
+
import org.apache.ibatis.mapping.SqlSource;
|
|
13
|
+
import org.apache.ibatis.plugin.Interceptor;
|
|
14
|
+
import org.apache.ibatis.plugin.Intercepts;
|
|
15
|
+
import org.apache.ibatis.plugin.Invocation;
|
|
16
|
+
import org.apache.ibatis.plugin.Plugin;
|
|
17
|
+
import org.apache.ibatis.plugin.Signature;
|
|
18
|
+
import org.apache.ibatis.session.ResultHandler;
|
|
19
|
+
import org.apache.ibatis.session.RowBounds;
|
|
20
|
+
import org.springframework.beans.factory.annotation.Autowired;
|
|
21
|
+
import org.springframework.beans.factory.annotation.Value;
|
|
22
|
+
|
|
23
|
+
import java.util.ArrayList;
|
|
24
|
+
import java.util.Arrays;
|
|
25
|
+
import java.util.Collections;
|
|
26
|
+
import java.util.LinkedHashSet;
|
|
27
|
+
import java.util.List;
|
|
28
|
+
import java.util.Properties;
|
|
29
|
+
import java.util.Set;
|
|
30
|
+
import java.util.function.Consumer;
|
|
31
|
+
|
|
32
|
+
@Intercepts({
|
|
33
|
+
@Signature(type = Executor.class, method = "query", args = {
|
|
34
|
+
MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
|
|
35
|
+
@Signature(type = Executor.class, method = "update", args = {
|
|
36
|
+
MappedStatement.class, Object.class})
|
|
37
|
+
})
|
|
38
|
+
public class AESInterceptor implements Interceptor {
|
|
39
|
+
private static final Set<String> ADDRESS_BOOK = statements(
|
|
40
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.insertAddressBook",
|
|
41
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.updateAddressBook",
|
|
42
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.queryAddressBookById",
|
|
43
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.queryAddressBook",
|
|
44
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.getAddressBookPageResult",
|
|
45
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.queryById",
|
|
46
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.selectAllUsers",
|
|
47
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.selectByOrgCodeList",
|
|
48
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.selectByOrgCodeAndParaList",
|
|
49
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.getUserEmail",
|
|
50
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceUserGroupRelationMapper.getAddressMailOfBusinessType",
|
|
51
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceUserGroupRelationMapper.selectNewUserByGroupId",
|
|
52
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookMapper.queryByUserAccount",
|
|
53
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceUserGroupRelationMapper.selectUserByGroupId");
|
|
54
|
+
private static final Set<String> DECRYPT = statements(
|
|
55
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.query",
|
|
56
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.queryById",
|
|
57
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookRecordMapper.selectPageResult",
|
|
58
|
+
"com.nucc.channel.ark.dao.mapper.announce.ReformTrackMapper.queryReformTrackItemsById",
|
|
59
|
+
"com.nucc.channel.ark.dao.mapper.announce.ReformTrackMapper.queryReformTrackItemsByConditions",
|
|
60
|
+
"com.nucc.channel.ark.dao.mapper.announce.QuestionnaireMapper.queryQuestionnaireListByUpdateOrgCodeAndNo",
|
|
61
|
+
"com.nucc.channel.ark.dao.mapper.announce.QuestionnaireMapper.queryQuestionnaireListByParam",
|
|
62
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.selectAnnounceMailPageResult",
|
|
63
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.queryAnnounceMailSend",
|
|
64
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.getByBatchId",
|
|
65
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.getBy",
|
|
66
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.getById",
|
|
67
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.queryBySeriesNo",
|
|
68
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.queryByIds",
|
|
69
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.queryBySeriesNoS",
|
|
70
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.selectJiraNoticeResult",
|
|
71
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.selectMailList",
|
|
72
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.selectAnnounceMailPageResult",
|
|
73
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.queryAnnounceMail",
|
|
74
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.listBy",
|
|
75
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.getNormalMail",
|
|
76
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.checkMail",
|
|
77
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.getAnnounceMailById",
|
|
78
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.getAutoAuditPass",
|
|
79
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.queryBySeriesNos",
|
|
80
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.queryNoticeExemptionMail",
|
|
81
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.selectAppealMailPageResult",
|
|
82
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.selectRelatedInfo",
|
|
83
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.selectAppealPageResult",
|
|
84
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.selectByPrimaryKey",
|
|
85
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.selectProcess",
|
|
86
|
+
"com.nucc.channel.ark.dao.mapper.announce.TicketMapper.getTicketById",
|
|
87
|
+
"com.nucc.channel.ark.dao.mapper.announce.TicketMapper.queryTicketListByParamsPageResult",
|
|
88
|
+
"com.nucc.channel.ark.dao.mapper.announce.TicketMapper.exportTicketListByParams",
|
|
89
|
+
"com.nucc.channel.ark.dao.mapper.announce.TicketMapper.queryTicketByOrgCode",
|
|
90
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.selectByPrimaryKey",
|
|
91
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.selectByRecord",
|
|
92
|
+
"com.nucc.channel.ark.dao.mapper.announce.NotifyMapper.selectPageResult",
|
|
93
|
+
"com.nucc.channel.ark.dao.mapper.announce.NotifyMapper.queryLastNotify",
|
|
94
|
+
"com.nucc.channel.ark.dao.mapper.announce.NotifyMapper.queryLastDashBoardNotify");
|
|
95
|
+
private static final Set<String> ENCRYPT = statements(
|
|
96
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.insert",
|
|
97
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.insertSaved",
|
|
98
|
+
"com.union.control.mapper.SensitiveDataDemoMapper.update",
|
|
99
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceAddressBookRecordMapper.insert",
|
|
100
|
+
"com.nucc.channel.ark.dao.mapper.announce.ReformTrackMapper.batchInsertReformTrackItems",
|
|
101
|
+
"com.nucc.channel.ark.dao.mapper.announce.ReformTrackMapper.batchUpdateReformTrackItems",
|
|
102
|
+
"com.nucc.channel.ark.dao.mapper.announce.QuestionnaireMapper.updateQuestionnaire",
|
|
103
|
+
"com.nucc.channel.ark.dao.mapper.announce.QuestionnaireMapper.insertBatchQuestionnaireList",
|
|
104
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.insert",
|
|
105
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailSendMapper.insertBatch",
|
|
106
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.insert",
|
|
107
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.insertBatch",
|
|
108
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.batchUpdateMailAudit",
|
|
109
|
+
"com.nucc.channel.ark.dao.mapper.announce.AnnounceMailMapper.update",
|
|
110
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.insert",
|
|
111
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.insertSelective",
|
|
112
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.updateByPrimaryKeySelective",
|
|
113
|
+
"com.nucc.channel.ark.dao.mapper.announce.AppealMapper.updateByPrimaryKey",
|
|
114
|
+
"com.nucc.channel.ark.dao.mapper.announce.TicketMapper.insert",
|
|
115
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.insert",
|
|
116
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.insertSelective",
|
|
117
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.updateByPrimaryKeySelective",
|
|
118
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.updateByPrimaryKeyWithBLOBs",
|
|
119
|
+
"com.nucc.channel.ark.dao.mapper.announce.MailDetailMapper.updateByPrimaryKey",
|
|
120
|
+
"com.nucc.channel.ark.dao.mapper.announce.NotifyMapper.insert");
|
|
121
|
+
|
|
122
|
+
@Autowired
|
|
123
|
+
private SensitiveRevealProcessor processor;
|
|
124
|
+
@Autowired
|
|
125
|
+
private AddressBookHandler addressBook;
|
|
126
|
+
@Value("${sensitive.reveal.enabled:false}")
|
|
127
|
+
private boolean revealEnabled;
|
|
128
|
+
@Value("${sensitive.reveal.strict_mode:false}")
|
|
129
|
+
private boolean strictMode;
|
|
130
|
+
|
|
131
|
+
public AESInterceptor() {}
|
|
132
|
+
|
|
133
|
+
AESInterceptor(SensitiveRevealProcessor processor, AddressBookHandler addressBook,
|
|
134
|
+
boolean revealEnabled) {
|
|
135
|
+
this.processor = processor;
|
|
136
|
+
this.addressBook = addressBook;
|
|
137
|
+
this.revealEnabled = revealEnabled;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@Override
|
|
141
|
+
public Object intercept(Invocation invocation) throws Throwable {
|
|
142
|
+
MappedStatement statement = (MappedStatement) invocation.getArgs()[0];
|
|
143
|
+
if (ADDRESS_BOOK.contains(statement.getId())) {
|
|
144
|
+
return interceptAddressBook(invocation, statement);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
boolean encrypt = ENCRYPT.contains(statement.getId());
|
|
148
|
+
if (!encrypt && !DECRYPT.contains(statement.getId())) return invocation.proceed();
|
|
149
|
+
if (!interceptorEnabled(statement.getId())) return invocation.proceed();
|
|
150
|
+
requireProcessor();
|
|
151
|
+
if (encrypt) {
|
|
152
|
+
processor.encrypt(invocation.getArgs()[1]);
|
|
153
|
+
return invocation.proceed();
|
|
154
|
+
}
|
|
155
|
+
Object parameter = invocation.getArgs()[1];
|
|
156
|
+
if (statement.isUseCache()) {
|
|
157
|
+
invocation.getArgs()[0] = copy(statement, parameter,
|
|
158
|
+
statement.getBoundSql(parameter).getSql());
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
Object result = invocation.proceed();
|
|
162
|
+
if (result == null) return null;
|
|
163
|
+
if (revealEnabled || strictMode) processor.process(result);
|
|
164
|
+
else processor.decrypt(result);
|
|
165
|
+
return result;
|
|
166
|
+
} finally {
|
|
167
|
+
((Executor) invocation.getTarget()).clearLocalCache();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private Object interceptAddressBook(Invocation invocation, MappedStatement statement)
|
|
172
|
+
throws Throwable {
|
|
173
|
+
requireAddressBook();
|
|
174
|
+
invocation.getArgs()[0] = addressBook.prepare(statement, invocation.getArgs()[1]);
|
|
175
|
+
if (statement.getSqlCommandType() != SqlCommandType.SELECT) return invocation.proceed();
|
|
176
|
+
try {
|
|
177
|
+
Object result = invocation.proceed();
|
|
178
|
+
if (result != null) addressBook.processResult(result, revealEnabled, strictMode);
|
|
179
|
+
return result;
|
|
180
|
+
} finally {
|
|
181
|
+
((Executor) invocation.getTarget()).clearLocalCache();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private void requireProcessor() {
|
|
186
|
+
if (processor == null) {
|
|
187
|
+
throw new IllegalStateException("AESInterceptor sensitive dependencies are not configured");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private void requireAddressBook() {
|
|
192
|
+
if (addressBook == null) {
|
|
193
|
+
throw new IllegalStateException("AESInterceptor sensitive dependencies are not configured");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
private static boolean interceptorEnabled(String statementId) {
|
|
198
|
+
Object configured = Constant.flagMap.get("interceptorItems");
|
|
199
|
+
List<String> items = Arrays.asList(Constant.INTERCEPTOR_ITEMS.split(","));
|
|
200
|
+
if (!Constant.flagMap.isEmpty() && configured != null) {
|
|
201
|
+
items = JSON.parseObject(configured.toString(),
|
|
202
|
+
new TypeReference<ArrayList<String>>() {});
|
|
203
|
+
}
|
|
204
|
+
if (items == null) return false;
|
|
205
|
+
for (String item : items) {
|
|
206
|
+
if (!item.isEmpty() && statementId.contains(item)) return true;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static MappedStatement copy(MappedStatement statement, Object parameter, String sql) {
|
|
212
|
+
BoundSql source = statement.getBoundSql(parameter);
|
|
213
|
+
if (sql.equals(source.getSql()) && !statement.isUseCache()) return statement;
|
|
214
|
+
BoundSql boundSql = new BoundSql(statement.getConfiguration(), sql,
|
|
215
|
+
source.getParameterMappings(), parameter);
|
|
216
|
+
for (ParameterMapping mapping : source.getParameterMappings()) {
|
|
217
|
+
String property = mapping.getProperty();
|
|
218
|
+
if (source.hasAdditionalParameter(property)) {
|
|
219
|
+
boundSql.setAdditionalParameter(property, source.getAdditionalParameter(property));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
MappedStatement.Builder builder = new MappedStatement.Builder(statement.getConfiguration(),
|
|
223
|
+
statement.getId(), new FixedSqlSource(boundSql), statement.getSqlCommandType());
|
|
224
|
+
builder.resource(statement.getResource());
|
|
225
|
+
builder.fetchSize(statement.getFetchSize());
|
|
226
|
+
builder.statementType(statement.getStatementType());
|
|
227
|
+
builder.keyGenerator(statement.getKeyGenerator());
|
|
228
|
+
joined(statement.getKeyProperties(), builder::keyProperty);
|
|
229
|
+
joined(statement.getKeyColumns(), builder::keyColumn);
|
|
230
|
+
joined(statement.getResultSets(), builder::resultSets);
|
|
231
|
+
builder.timeout(statement.getTimeout());
|
|
232
|
+
builder.parameterMap(statement.getParameterMap());
|
|
233
|
+
builder.resultMaps(statement.getResultMaps());
|
|
234
|
+
builder.resultSetType(statement.getResultSetType());
|
|
235
|
+
builder.cache(statement.getCache());
|
|
236
|
+
builder.flushCacheRequired(statement.isFlushCacheRequired());
|
|
237
|
+
builder.useCache(false);
|
|
238
|
+
builder.resultOrdered(statement.isResultOrdered());
|
|
239
|
+
builder.databaseId(statement.getDatabaseId());
|
|
240
|
+
builder.lang(statement.getLang());
|
|
241
|
+
return builder.build();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private static void joined(String[] values, Consumer<String> setter) {
|
|
245
|
+
if (values != null && values.length > 0) setter.accept(String.join(",", values));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
@Override
|
|
249
|
+
public Object plugin(Object target) {
|
|
250
|
+
return target instanceof Executor ? Plugin.wrap(target, this) : target;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
@Override
|
|
254
|
+
public void setProperties(Properties properties) {}
|
|
255
|
+
|
|
256
|
+
private static Set<String> statements(String... values) {
|
|
257
|
+
return Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList(values)));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private static final class FixedSqlSource implements SqlSource {
|
|
261
|
+
private final BoundSql boundSql;
|
|
262
|
+
private FixedSqlSource(BoundSql boundSql) { this.boundSql = boundSql; }
|
|
263
|
+
@Override public BoundSql getBoundSql(Object parameterObject) { return boundSql; }
|
|
264
|
+
}
|
|
265
|
+
}
|