Skip to content

Commit e09f07a

Browse files
lvhuichaochengluo
authored and
chengluo
committed
feat: remove redundant serialization and deserialization of graphql plugin
1 parent c6dc54e commit e09f07a

File tree

20 files changed

+1220
-466
lines changed

20 files changed

+1220
-466
lines changed

server/api-service/openblocks-plugins/graphqlPlugin/src/main/java/com/openblocks/plugin/graphql/GraphQLExecutor.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR;
88
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR;
99
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_EXECUTION_TIMEOUT;
10-
import static com.openblocks.sdk.plugin.restapi.DataUtils.parseJsonBody;
1110
import static com.openblocks.sdk.plugin.restapi.auth.RestApiAuthType.DIGEST_AUTH;
1211
import static com.openblocks.sdk.util.JsonUtils.readTree;
1312
import static com.openblocks.sdk.util.JsonUtils.toJsonThrows;
@@ -379,13 +378,6 @@ private QueryExecutionResult convertToQueryExecutionResult(ResponseEntity<byte[]
379378
return QueryExecutionResult.ofRestApiResult(statusCode, headersObjectNode, responseBodyData.getBody());
380379
}
381380

382-
private String addHttpToUrlWhenPrefixNotPresent(String url) {
383-
if (url == null || url.toLowerCase().startsWith("http") || url.contains("://")) {
384-
return url;
385-
}
386-
return "http://" + url;
387-
}
388-
389381
private JsonNode parseExecuteResultHeaders(HttpHeaders headers) {
390382
// Convert the headers into json tree to store in the results
391383
String headerInJsonString;
@@ -440,19 +432,19 @@ private ResponseBodyData parseResponseDataInfo(byte[] body, MediaType contentTyp
440432

441433
private BodyInserter<?, ? super ClientHttpRequest> buildBodyInserter(boolean isEncodeParams,
442434
String requestContentType,
443-
String queryBody,
435+
Object queryBody,
444436
List<Property> bodyFormData) {
445-
if (StringUtils.isBlank(queryBody)) {
446-
return BodyInserters.fromValue(new byte[0]);
447-
}
448437
switch (requestContentType) {
449-
case MediaType.APPLICATION_JSON_VALUE:
450-
final Object bodyObject = parseJsonBody(queryBody);
451-
return BodyInserters.fromValue(bodyObject);
438+
452439
case MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE:
453440
return dataUtils.buildBodyInserter(bodyFormData, requestContentType, isEncodeParams);
441+
442+
// include application/json
454443
default:
455-
return BodyInserters.fromValue((queryBody).getBytes(StandardCharsets.ISO_8859_1));
444+
if (queryBody == null) {
445+
return BodyInserters.fromValue(new byte[0]);
446+
}
447+
return BodyInserters.fromValue(queryBody);
456448
}
457449
}
458450

server/api-service/openblocks-plugins/graphqlPlugin/src/main/java/com/openblocks/plugin/graphql/model/GraphQLQueryExecutionContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class GraphQLQueryExecutionContext extends QueryExecutionContext {
3333

3434
private JsonNode variablesParams;
3535
@Setter
36-
private String queryBody;
36+
private Object queryBody;
3737
private String contentType;
3838
private boolean encodeParams;
3939

@@ -49,7 +49,7 @@ public String getUrl() {
4949
return url;
5050
}
5151

52-
public String getQueryBody() {
52+
public Object getQueryBody() {
5353
return queryBody;
5454
}
5555

server/api-service/openblocks-plugins/graphqlPlugin/src/main/java/com/openblocks/plugin/graphql/utils/GraphQLBodyUtils.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,21 @@
55

66
import com.fasterxml.jackson.databind.JsonNode;
77
import com.openblocks.plugin.graphql.model.GraphQLQueryExecutionContext;
8-
import com.openblocks.sdk.util.JsonUtils;
98

109

1110
public class GraphQLBodyUtils {
1211

1312
public static final String QUERY_KEY = "query";
1413
public static final String VARIABLES_KEY = "variables";
1514

16-
public static String convertToGraphQLBody(GraphQLQueryExecutionContext graphQLQueryExecutionContext) {
15+
public static Object convertToGraphQLBody(GraphQLQueryExecutionContext graphQLQueryExecutionContext) {
1716
Map<String, Object> map = new HashMap<>();
1817
map.put(QUERY_KEY, graphQLQueryExecutionContext.getQueryBody());
1918
// variables
2019
JsonNode variablesParams = graphQLQueryExecutionContext.getVariablesParams();
2120
if (!variablesParams.isEmpty()) {
2221
map.put(VARIABLES_KEY, graphQLQueryExecutionContext.getVariablesParams());
2322
}
24-
return JsonUtils.toJson(map);
23+
return map;
2524
}
2625
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugin.id=mysql-plugin
2-
plugin.class=com.openblocks.plugin.mysql.MySqlPlugin
2+
plugin.class=com.openblocks.plugin.mysql.MysqlPlugin
33
plugin.version=1.0-SNAPSHOT
44
plugin.provider=dev@openblocks.dev
55
plugin.dependencies=

server/api-service/openblocks-plugins/mysqlPlugin/pom.xml

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<maven.compiler.source>${java.version}</maven.compiler.source>
2121
<maven.compiler.target>${java.version}</maven.compiler.target>
2222
<plugin.id>mysql-plugin</plugin.id>
23-
<plugin.class>com.openblocks.plugin.mysql.MySqlPlugin</plugin.class>
23+
<plugin.class>com.openblocks.plugin.mysql.MysqlPlugin</plugin.class>
2424
<plugin.version>1.0-SNAPSHOT</plugin.version>
2525
<plugin.provider>dev@openblocks.dev</plugin.provider>
2626
<plugin.dependencies/>
@@ -34,19 +34,11 @@
3434
<version>8.0.29</version>
3535
</dependency>
3636
<dependency>
37-
<groupId>com.zaxxer</groupId>
38-
<artifactId>HikariCP</artifactId>
39-
<version>5.0.1</version>
40-
<exclusions>
41-
<exclusion>
42-
<groupId>org.slf4j</groupId>
43-
<artifactId>slf4j-api</artifactId>
44-
</exclusion>
45-
</exclusions>
37+
<groupId>com.openblocks</groupId>
38+
<artifactId>sqlBasedPlugin</artifactId>
39+
<version>1.0-SNAPSHOT</version>
4640
</dependency>
4741

48-
<!-- Test Dependencies -->
49-
5042
<dependency>
5143
<groupId>org.testcontainers</groupId>
5244
<artifactId>testcontainers</artifactId>

server/api-service/openblocks-plugins/mysqlPlugin/src/main/java/com/openblocks/plugin/mysql/MySqlPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import org.pf4j.Plugin;
44
import org.pf4j.PluginWrapper;
55

6-
public class MySqlPlugin extends Plugin {
6+
public class MysqlPlugin extends Plugin {
77

8-
public MySqlPlugin(PluginWrapper wrapper) {
8+
public MysqlPlugin(PluginWrapper wrapper) {
99
super(wrapper);
1010
}
1111

Lines changed: 13 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,41 @@
11
package com.openblocks.plugin.mysql;
22

3-
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR;
43
import static org.apache.commons.lang3.StringUtils.isNotBlank;
54

6-
import java.time.Duration;
7-
import java.util.HashSet;
85
import java.util.Map;
9-
import java.util.Set;
10-
import java.util.concurrent.TimeUnit;
11-
import java.util.function.Supplier;
126

137
import javax.annotation.Nonnull;
148

159
import org.apache.commons.lang3.StringUtils;
1610
import org.pf4j.Extension;
17-
import org.springframework.beans.factory.annotation.Autowired;
1811

19-
import com.openblocks.sdk.config.dynamic.ConfigCenter;
20-
import com.openblocks.sdk.exception.PluginException;
21-
import com.openblocks.sdk.models.DatasourceTestResult;
22-
import com.openblocks.sdk.plugin.common.BlockingDatasourceConnector;
23-
import com.openblocks.sdk.plugin.common.sql.HikariPerfWrapper;
12+
import com.openblocks.plugin.sql.SqlBasedConnector;
13+
import com.openblocks.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig;
2414
import com.openblocks.sdk.plugin.mysql.MysqlDatasourceConfig;
2515
import com.zaxxer.hikari.HikariConfig;
26-
import com.zaxxer.hikari.HikariDataSource;
2716

2817
@Extension
29-
public class MysqlConnector extends BlockingDatasourceConnector<HikariPerfWrapper, MysqlDatasourceConfig> {
18+
public class MysqlConnector extends SqlBasedConnector {
3019

3120
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
32-
private static final long LEAK_DETECTION_THRESHOLD_MS = Duration.ofSeconds(30).toMillis();
33-
private static final long MAX_LIFETIME_MS = TimeUnit.MINUTES.toMillis(30);
34-
private static final long KEEPALIVE_TIME_MS = TimeUnit.MINUTES.toMillis(3);
35-
private static final long CONNECTION_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(5);
36-
private static final long VALIDATION_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(3);
37-
private static final long INITIALIZATION_FAIL_TIMEOUT = TimeUnit.SECONDS.toMillis(4);
38-
private final Supplier<Long> connectionPoolIdleTimeoutMillis;
39-
private final Supplier<Integer> connectionPoolMaxPoolSize;
4021

41-
public MysqlConnector(@Autowired ConfigCenter configCenter) {
42-
this.connectionPoolIdleTimeoutMillis = configCenter.mysqlPlugin().ofInteger("connectionPoolIdleTimeoutMinutes", 6)
43-
.then(Duration::ofMinutes)
44-
.then(Duration::toMillis);
45-
this.connectionPoolMaxPoolSize = configCenter.mysqlPlugin().ofInteger("connectionPoolMaxPoolSize", 50);
22+
public MysqlConnector() {
23+
super(50);
4624
}
4725

4826
@Nonnull
4927
@Override
50-
protected HikariPerfWrapper blockingCreateConnection(MysqlDatasourceConfig connectionConfig) {
51-
try {
52-
Class.forName(JDBC_DRIVER);
53-
} catch (ClassNotFoundException e) {
54-
throw new PluginException(QUERY_EXECUTION_ERROR, "LOAD_MYSQL_JDBC_ERROR");
55-
}
56-
57-
return createHikariDataSource(connectionConfig);
28+
public MysqlDatasourceConfig resolveConfig(Map<String, Object> configMap) {
29+
return MysqlDatasourceConfig.buildFrom(configMap);
5830
}
5931

60-
private HikariPerfWrapper createHikariDataSource(MysqlDatasourceConfig datasourceConfig) {
61-
62-
HikariConfig config = new HikariConfig();
63-
config.setDriverClassName(JDBC_DRIVER);
64-
config.setMinimumIdle(1);
65-
config.setMaxLifetime(MAX_LIFETIME_MS);
66-
config.setKeepaliveTime(KEEPALIVE_TIME_MS);
67-
config.setIdleTimeout(connectionPoolIdleTimeoutMillis.get());
68-
config.setMaximumPoolSize(connectionPoolMaxPoolSize.get());
69-
config.setLeakDetectionThreshold(LEAK_DETECTION_THRESHOLD_MS);
70-
config.setConnectionTimeout(CONNECTION_TIMEOUT_MS);
71-
config.setValidationTimeout(VALIDATION_TIMEOUT_MS);
72-
config.setInitializationFailTimeout(INITIALIZATION_FAIL_TIMEOUT);
32+
@Override
33+
protected String getJdbcDriver() {
34+
return JDBC_DRIVER;
35+
}
7336

37+
@Override
38+
protected void setUpConfigs(SqlBasedDatasourceConnectionConfig datasourceConfig, HikariConfig config) {
7439
// Set authentication properties
7540
String username = datasourceConfig.getUsername();
7641
if (StringUtils.isNotEmpty(username)) {
@@ -97,64 +62,5 @@ private HikariPerfWrapper createHikariDataSource(MysqlDatasourceConfig datasourc
9762
config.addDataSourceProperty("useSSL", "false");
9863
config.addDataSourceProperty("requireSSL", "false");
9964
}
100-
101-
config.setReadOnly(datasourceConfig.isReadonly());
102-
103-
HikariDataSource hikariDataSource = new HikariDataSource(config);
104-
return HikariPerfWrapper.wrap(hikariDataSource,
105-
() -> hikariDataSource.getHikariPoolMXBean().getTotalConnections(),
106-
() -> hikariDataSource.getHikariPoolMXBean().getIdleConnections(),
107-
() -> hikariDataSource.getHikariPoolMXBean().getActiveConnections(),
108-
() -> hikariDataSource.getHikariPoolMXBean().getThreadsAwaitingConnection(),
109-
hikariDataSource::getDataSourceProperties,
110-
hikariDataSource::getHealthCheckProperties
111-
);
112-
}
113-
114-
@Nonnull
115-
@Override
116-
protected DatasourceTestResult blockingTestConnection(HikariPerfWrapper wrapper) {
117-
blockingDestroyConnection(wrapper);
118-
return DatasourceTestResult.testSuccess();
119-
}
120-
121-
@Override
122-
protected void blockingDestroyConnection(HikariPerfWrapper wrapper) {
123-
if (wrapper != null) {
124-
((HikariDataSource) wrapper.getHikariDataSource()).close();
125-
}
12665
}
127-
128-
@Nonnull
129-
@Override
130-
public MysqlDatasourceConfig resolveConfig(Map<String, Object> configMap) {
131-
return MysqlDatasourceConfig.buildFrom(configMap);
132-
}
133-
134-
@Override
135-
public Set<String> validateConfig(MysqlDatasourceConfig connectionConfig) {
136-
137-
Set<String> invalids = new HashSet<>();
138-
139-
String host = connectionConfig.getHost();
140-
if (StringUtils.isBlank(host)) {
141-
invalids.add("HOST_EMPTY_PLZ_CHECK");
142-
}
143-
144-
if (host.contains("/") || host.contains(":")) {
145-
invalids.add("HOST_WITH_COLON");
146-
}
147-
148-
if (StringUtils.equalsIgnoreCase(host, "localhost") || StringUtils.equals(host, "127.0.0.1")) {
149-
invalids.add("INVALID_HOST");
150-
}
151-
152-
if (StringUtils.isBlank(connectionConfig.getDatabase())) {
153-
invalids.add("DATABASE_NAME_EMPTY");
154-
}
155-
156-
return invalids;
157-
}
158-
159-
16066
}

0 commit comments

Comments
 (0)