Skip to content

Commit 7a5acb6

Browse files
committed
add IConditionSQLHandler
1 parent 0f923cc commit 7a5acb6

16 files changed

Lines changed: 303 additions & 18 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<groupId>com.codingapi.springboot</groupId>
1717
<artifactId>springboot-parent</artifactId>
18-
<version>2.10.36</version>
18+
<version>2.10.37</version>
1919

2020
<url>https://github.com/codingapi/springboot-framewrok</url>
2121
<name>springboot-parent</name>

springboot-starter-data-authorization/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.36</version>
9+
<version>2.10.37</version>
1010
</parent>
1111

1212
<name>springboot-starter-data-authorization</name>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.codingapi.springboot.authorization.condition;
2+
3+
public interface IConditionSQL {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.codingapi.springboot.authorization.condition;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
import net.sf.jsqlparser.expression.Alias;
8+
import net.sf.jsqlparser.schema.Table;
9+
import org.springframework.util.StringUtils;
10+
11+
@Setter
12+
@Getter
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
public class JoinConditionSQL implements IConditionSQL {
16+
17+
private Type type;
18+
private String tableName;
19+
private String tableAlias;
20+
private String onCondition;
21+
22+
23+
24+
public static enum Type{
25+
INNER,
26+
LEFT,
27+
RIGHT
28+
}
29+
30+
31+
public Table toJoinTable(){
32+
if(StringUtils.hasText(tableAlias)){
33+
Table table = new Table(this.tableName);
34+
table.setAlias(new Alias(tableAlias));
35+
return table;
36+
}else {
37+
return new Table(this.tableName);
38+
}
39+
}
40+
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codingapi.springboot.authorization.condition;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@AllArgsConstructor
9+
@NoArgsConstructor
10+
public class WhereConditionSQL implements IConditionSQL {
11+
12+
private String condition;
13+
14+
public WhereConditionSQL(String condition,Object... args){
15+
this.condition = String.format(condition, args);
16+
}
17+
18+
}

springboot-starter-data-authorization/src/main/java/com/codingapi/springboot/authorization/enhancer/DataPermissionSQLEnhancer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.codingapi.springboot.authorization.enhancer;
22

33

4+
import com.codingapi.springboot.authorization.condition.IConditionSQL;
5+
import com.codingapi.springboot.authorization.enhancer.handler.ConditionSQLHandlerContext;
46
import com.codingapi.springboot.authorization.handler.Condition;
57
import com.codingapi.springboot.authorization.handler.RowHandler;
68
import net.sf.jsqlparser.expression.Expression;
@@ -154,12 +156,9 @@ private void injectDataPermissionCondition(PlainSelect plainSelect, Table table,
154156
String aliaName = table.getAlias() != null ? table.getAlias().getName() : tableName;
155157
Condition condition = rowHandler.handler(plainSelect.toString(), tableName, aliaName);
156158
if (condition != null) {
157-
// 添加自定义条件
158-
Expression customExpression = CCJSqlParserUtil.parseCondExpression(condition.getCondition());
159-
if (where != null) {
160-
plainSelect.setWhere(new AndExpression(customExpression, where));
161-
} else {
162-
plainSelect.setWhere(customExpression);
159+
List<IConditionSQL> conditionList = condition.getConditionList();
160+
for (IConditionSQL conditionSQL : conditionList) {
161+
ConditionSQLHandlerContext.getInstance().handler(conditionSQL, plainSelect, table, where);
163162
}
164163
}
165164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.codingapi.springboot.authorization.enhancer.handler;
2+
3+
import com.codingapi.springboot.authorization.condition.IConditionSQL;
4+
import lombok.Getter;
5+
import net.sf.jsqlparser.expression.Expression;
6+
import net.sf.jsqlparser.schema.Table;
7+
import net.sf.jsqlparser.statement.select.PlainSelect;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
public class ConditionSQLHandlerContext {
13+
14+
private final List<IConditionSQLHandler> handlers;
15+
16+
@Getter
17+
private final static ConditionSQLHandlerContext instance = new ConditionSQLHandlerContext();
18+
19+
private ConditionSQLHandlerContext() {
20+
this.handlers = new ArrayList<>();
21+
this.registerHandlers();
22+
}
23+
24+
25+
private void registerHandlers(){
26+
this.handlers.add(new WhereConditionSQLHandler());
27+
this.handlers.add(new JoinConditionSQLHandler());
28+
}
29+
30+
31+
public void handler(IConditionSQL dynamicSQL, PlainSelect plainSelect, Table table, Expression where) {
32+
for (IConditionSQLHandler handler:handlers){
33+
if (handler.support(dynamicSQL)){
34+
handler.handler(dynamicSQL,plainSelect, table, where);
35+
}
36+
}
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.codingapi.springboot.authorization.enhancer.handler;
2+
3+
import com.codingapi.springboot.authorization.condition.IConditionSQL;
4+
import net.sf.jsqlparser.expression.Expression;
5+
import net.sf.jsqlparser.schema.Table;
6+
import net.sf.jsqlparser.statement.select.PlainSelect;
7+
8+
public interface IConditionSQLHandler {
9+
10+
boolean support(IConditionSQL conditionSQL);
11+
12+
void handler(IConditionSQL conditionSQL, PlainSelect plainSelect, Table table, Expression where);
13+
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.codingapi.springboot.authorization.enhancer.handler;
2+
3+
import com.codingapi.springboot.authorization.condition.IConditionSQL;
4+
import com.codingapi.springboot.authorization.condition.JoinConditionSQL;
5+
import lombok.SneakyThrows;
6+
import net.sf.jsqlparser.expression.Expression;
7+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
8+
import net.sf.jsqlparser.schema.Table;
9+
import net.sf.jsqlparser.statement.select.Join;
10+
import net.sf.jsqlparser.statement.select.PlainSelect;
11+
12+
import java.util.ArrayList;
13+
import java.util.Collection;
14+
15+
public class JoinConditionSQLHandler implements IConditionSQLHandler {
16+
17+
@Override
18+
public boolean support(IConditionSQL conditionSQL) {
19+
return conditionSQL instanceof JoinConditionSQL;
20+
}
21+
22+
@SneakyThrows
23+
@Override
24+
public void handler(IConditionSQL conditionSQL, PlainSelect plainSelect, Table table, Expression where) {
25+
JoinConditionSQL joinConditionSQL = (JoinConditionSQL) conditionSQL;
26+
27+
if(plainSelect.getJoins()==null){
28+
plainSelect.setJoins(new ArrayList<>());
29+
}
30+
31+
Join join = new Join();
32+
join.setFromItem(joinConditionSQL.toJoinTable());
33+
34+
if(joinConditionSQL.getType()== JoinConditionSQL.Type.INNER){
35+
join.setInner(true);
36+
}
37+
38+
if(joinConditionSQL.getType()== JoinConditionSQL.Type.RIGHT){
39+
join.setRight(true);
40+
}
41+
42+
if(joinConditionSQL.getType()== JoinConditionSQL.Type.LEFT){
43+
join.setLeft(true);
44+
}
45+
46+
Collection<Expression> expressions = new ArrayList<>();
47+
Expression expression = CCJSqlParserUtil.parseCondExpression(joinConditionSQL.getOnCondition());
48+
expressions.add(expression);
49+
join.setOnExpressions(expressions);
50+
plainSelect.addJoins(join);
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.codingapi.springboot.authorization.enhancer.handler;
2+
3+
import com.codingapi.springboot.authorization.condition.IConditionSQL;
4+
import com.codingapi.springboot.authorization.condition.WhereConditionSQL;
5+
import lombok.SneakyThrows;
6+
import net.sf.jsqlparser.expression.Expression;
7+
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
8+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
9+
import net.sf.jsqlparser.schema.Table;
10+
import net.sf.jsqlparser.statement.select.PlainSelect;
11+
12+
public class WhereConditionSQLHandler implements IConditionSQLHandler {
13+
14+
@Override
15+
public boolean support(IConditionSQL conditionSQL) {
16+
return conditionSQL instanceof WhereConditionSQL;
17+
}
18+
19+
@SneakyThrows
20+
@Override
21+
public void handler(IConditionSQL conditionSQL, PlainSelect plainSelect, Table table, Expression where) {
22+
String whereSQL = ((WhereConditionSQL) conditionSQL).getCondition();
23+
// 添加自定义条件
24+
Expression customExpression = CCJSqlParserUtil.parseCondExpression(whereSQL);
25+
if (where != null) {
26+
plainSelect.setWhere(new AndExpression(customExpression, where));
27+
} else {
28+
plainSelect.setWhere(customExpression);
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)