Skip to content

Commit cee260b

Browse files
committed
add DynamicScript
1 parent 3870d57 commit cee260b

File tree

10 files changed

+242
-1
lines changed

10 files changed

+242
-1
lines changed

pom.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@
3535
<jsonwebtoken.jjwt.version>0.12.3</jsonwebtoken.jjwt.version>
3636
<commons-io.version>2.15.0</commons-io.version>
3737
<commons-dbutils.version>1.8.1</commons-dbutils.version>
38+
<commons-text.version>1.11.0</commons-text.version>
3839
<org.reflections.version>0.10.2</org.reflections.version>
3940
<perf4j.version>0.9.16</perf4j.version>
4041
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
4142
<commons-crypto.version>1.2.0</commons-crypto.version>
4243
<snakeyaml.version>2.2</snakeyaml.version>
44+
<apache-groovy.version>4.0.15</apache-groovy.version>
4345
</properties>
4446

4547
<dependencies>
@@ -157,6 +159,30 @@
157159
<version>${commons-dbutils.version}</version>
158160
</dependency>
159161

162+
<dependency>
163+
<groupId>org.apache.commons</groupId>
164+
<artifactId>commons-text</artifactId>
165+
<version>${commons-text.version}</version>
166+
</dependency>
167+
168+
<dependency>
169+
<groupId>org.apache.groovy</groupId>
170+
<artifactId>groovy</artifactId>
171+
<version>${apache-groovy.version}</version>
172+
</dependency>
173+
174+
<dependency>
175+
<groupId>org.apache.groovy</groupId>
176+
<artifactId>groovy-json</artifactId>
177+
<version>${apache-groovy.version}</version>
178+
</dependency>
179+
180+
<dependency>
181+
<groupId>org.apache.groovy</groupId>
182+
<artifactId>groovy-xml</artifactId>
183+
<version>${apache-groovy.version}</version>
184+
</dependency>
185+
160186
</dependencies>
161187
</dependencyManagement>
162188

springboot-starter-data-fast/pom.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,21 @@
4242
<dependency>
4343
<groupId>org.apache.commons</groupId>
4444
<artifactId>commons-text</artifactId>
45-
<version>1.11.0</version>
45+
</dependency>
46+
47+
<dependency>
48+
<groupId>org.apache.groovy</groupId>
49+
<artifactId>groovy</artifactId>
50+
</dependency>
51+
52+
<dependency>
53+
<groupId>org.apache.groovy</groupId>
54+
<artifactId>groovy-json</artifactId>
55+
</dependency>
56+
57+
<dependency>
58+
<groupId>org.apache.groovy</groupId>
59+
<artifactId>groovy-xml</artifactId>
4660
</dependency>
4761

4862
</dependencies>

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/DataFastConfiguration.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.codingapi.springboot.fast.executor.JpaExecutor;
55
import com.codingapi.springboot.fast.manager.EntityManagerInitializer;
66
import com.codingapi.springboot.fast.mapping.DynamicMappingRegister;
7+
import com.codingapi.springboot.fast.mapping.DynamicScriptRegister;
78
import com.codingapi.springboot.fast.mapping.MvcEndpointMapping;
89
import com.codingapi.springboot.fast.registrar.MvcMappingRegistrar;
910
import org.springframework.aop.Advisor;
@@ -35,6 +36,12 @@ public DynamicMappingRegister dynamicMapping(MvcEndpointMapping mvcEndpointMappi
3536
return new DynamicMappingRegister(mvcEndpointMapping, dynamicQuery, jdbcTemplate);
3637
}
3738

39+
@Bean
40+
@ConditionalOnMissingBean
41+
public DynamicScriptRegister dynamicScriptRegister(MvcEndpointMapping mvcEndpointMapping, DynamicQuery dynamicQuery, JdbcTemplate jdbcTemplate) {
42+
return new DynamicScriptRegister(mvcEndpointMapping, dynamicQuery, jdbcTemplate);
43+
}
44+
3845

3946
@Bean(initMethod = "registerMvcMapping")
4047
@ConditionalOnMissingBean

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/mapping/DynamicMappingRegister.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,27 @@ private void addHqlMapping(String mapping, RequestMethod requestMethod,String hq
4848
mvcEndpointMapping.addMapping(mapping, requestMethod, handler, method);
4949
}
5050

51+
/**
52+
* test dynamic mapping
53+
* @param dynamicMapping dynamic mapping
54+
* @return result
55+
*/
56+
@ResponseBody
57+
public Object test(DynamicMapping dynamicMapping) {
58+
return switch (dynamicMapping.getType()) {
59+
case JDBC ->
60+
new JdbcMapping(jdbcTemplate, dynamicMapping.getSql(), dynamicMapping.getClazz(), dynamicMapping.getParams()).execute();
61+
case HQL ->
62+
new HqlMapping(dynamicQuery, dynamicMapping.getSql(), dynamicMapping.getClazz(), dynamicMapping.getParams()).execute();
63+
case JDBC_MAP ->
64+
new JdbcMapMapping(jdbcTemplate, dynamicMapping.getSql(), dynamicMapping.getParams()).execute();
65+
};
66+
}
67+
68+
/**
69+
* add dynamic mapping
70+
* @param dynamicMapping dynamic mapping
71+
*/
5172
public void addMapping(DynamicMapping dynamicMapping) {
5273
switch (dynamicMapping.getType()) {
5374
case JDBC:
@@ -64,6 +85,14 @@ public void addMapping(DynamicMapping dynamicMapping) {
6485
}
6586
}
6687

88+
/**
89+
* remove mapping
90+
* @param mapping mapping
91+
* @param requestMethod request method
92+
*/
93+
public void removeMapping(String mapping,RequestMethod requestMethod) {
94+
mvcEndpointMapping.removeMapping(mapping,requestMethod);
95+
}
6796

6897

6998
@SneakyThrows
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.codingapi.springboot.fast.mapping;
2+
3+
import com.codingapi.springboot.fast.dynamic.DynamicQuery;
4+
import com.codingapi.springboot.fast.script.DynamicScript;
5+
import com.codingapi.springboot.fast.script.ScriptContext;
6+
import org.springframework.jdbc.core.JdbcTemplate;
7+
import org.springframework.web.bind.annotation.RequestMethod;
8+
import org.springframework.web.bind.annotation.ResponseBody;
9+
10+
public class DynamicScriptRegister {
11+
12+
private final MvcEndpointMapping mvcEndpointMapping;
13+
14+
15+
public DynamicScriptRegister(MvcEndpointMapping mvcEndpointMapping, DynamicQuery dynamicQuery, JdbcTemplate jdbcTemplate) {
16+
this.mvcEndpointMapping = mvcEndpointMapping;
17+
ScriptContext.getInstance().init(dynamicQuery, jdbcTemplate);
18+
}
19+
20+
21+
/**
22+
* test dynamic mapping
23+
* @param dynamicScript dynamic mapping
24+
**/
25+
public void addMapping(DynamicScript dynamicScript) {
26+
mvcEndpointMapping.addMapping(dynamicScript.getMapping(), dynamicScript.getRequestMethod(),
27+
dynamicScript, dynamicScript.getExecuteMethod());
28+
}
29+
30+
/**
31+
* remove mapping
32+
* @param mapping mapping
33+
* @param requestMethod requestMethod
34+
*/
35+
public void removeMapping(String mapping, RequestMethod requestMethod) {
36+
mvcEndpointMapping.removeMapping(mapping, requestMethod);
37+
}
38+
39+
/**
40+
* test dynamic mapping
41+
* @param dynamicScript dynamic mapping
42+
* @return result
43+
*/
44+
@ResponseBody
45+
public Object test(DynamicScript dynamicScript) {
46+
return dynamicScript.execute();
47+
}
48+
49+
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/mapping/MvcEndpointMapping.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,23 @@ public void addMapping(String url, RequestMethod requestMethod, Object handler,
3737
handlerMapping.registerMapping(mappingInfo, handler, method);
3838
}
3939

40+
/**
41+
* remove mvc mapping
42+
* @param url mapping url
43+
* @param requestMethod request method
44+
*/
45+
public void removeMapping(String url, RequestMethod requestMethod) {
46+
RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration();
47+
options.setPatternParser(new PathPatternParser());
48+
49+
RequestMappingInfo mappingInfo = RequestMappingInfo
50+
.paths(url)
51+
.methods(requestMethod)
52+
.produces(MediaType.APPLICATION_JSON_VALUE)
53+
.options(options)
54+
.build();
55+
56+
handlerMapping.unregisterMapping(mappingInfo);
57+
}
58+
4059
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.codingapi.springboot.fast.script;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.springframework.web.bind.annotation.RequestMethod;
6+
import org.springframework.web.bind.annotation.ResponseBody;
7+
8+
import java.lang.reflect.Method;
9+
10+
@Setter
11+
@Getter
12+
public class DynamicScript {
13+
14+
private String script;
15+
private String mapping;
16+
private RequestMethod requestMethod;
17+
18+
19+
@ResponseBody
20+
public Object execute() {
21+
ScriptContext context = ScriptContext.getInstance();
22+
return ScriptRuntime.running(script,context);
23+
}
24+
25+
public Method getExecuteMethod() {
26+
try {
27+
return this.getClass().getDeclaredMethod("execute");
28+
} catch (NoSuchMethodException e) {
29+
throw new RuntimeException(e);
30+
}
31+
}
32+
33+
34+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.codingapi.springboot.fast.script;
2+
3+
import com.codingapi.springboot.fast.dynamic.DynamicQuery;
4+
import lombok.Getter;
5+
import org.springframework.jdbc.core.JdbcTemplate;
6+
7+
public class ScriptContext {
8+
9+
@Getter
10+
private final static ScriptContext instance = new ScriptContext();
11+
12+
13+
private ScriptContext() {
14+
15+
}
16+
17+
18+
@Getter
19+
private DynamicQuery dynamicQuery;
20+
@Getter
21+
private JdbcTemplate jdbcTemplate;
22+
23+
24+
public void init(DynamicQuery dynamicQuery, JdbcTemplate jdbcTemplate) {
25+
this.dynamicQuery = dynamicQuery;
26+
this.jdbcTemplate = jdbcTemplate;
27+
}
28+
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codingapi.springboot.fast.script;
2+
3+
import groovy.lang.Binding;
4+
import groovy.lang.GroovyShell;
5+
import groovy.lang.Script;
6+
7+
8+
public class ScriptRuntime {
9+
10+
public static Object running(String script, ScriptContext context) {
11+
Binding binding = new Binding();
12+
binding.setVariable("$hql", context.getDynamicQuery());
13+
binding.setVariable("$jdbc", context.getJdbcTemplate());
14+
GroovyShell groovyShell = new GroovyShell(binding);
15+
Script userScript = groovyShell.parse(script);
16+
return userScript.run();
17+
}
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.codingapi.springboot.fast.script;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.boot.test.context.SpringBootTest;
5+
6+
import static org.junit.jupiter.api.Assertions.*;
7+
8+
@SpringBootTest
9+
class ScriptRuntimeTest {
10+
11+
@Test
12+
void running() {
13+
Object res = ScriptRuntime.running("return 1",ScriptContext.getInstance());
14+
assertEquals(1,res);
15+
}
16+
}

0 commit comments

Comments
 (0)