Skip to content

Commit 88179c3

Browse files
author
qiushui
committed
开发
1 parent 9cd4240 commit 88179c3

8 files changed

Lines changed: 233 additions & 67 deletions

File tree

‎src/main/java/com/github/developframework/expression/ArrayExpression.java‎

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@
1111
* 示例: abc[i]
1212
* @author qiuzhenhao
1313
*/
14-
public class ArrayExpression extends Expression{
14+
@Getter
15+
public class ArrayExpression extends Expression {
1516

1617
/* 属性名称 */
17-
@Getter
1818
private String propertyName;
1919
/* 索引 */
20-
@Getter
2120
private int index;
2221

2322
/**
@@ -34,50 +33,29 @@ public ArrayExpression(@NonNull String propertyName, int index) {
3433
* 构造方法:根据表达式字符串创建数组表达式对象
3534
* @param expressionValue 表达式字符串
3635
*/
37-
public ArrayExpression(@NonNull String expressionValue) {
36+
protected ArrayExpression(@NonNull String expressionValue) {
3837
if (!isArrayExpression(expressionValue)) {
39-
throw new ExpressionParseException("The Expression \"%s\" is not a array type expression.", expressionValue);
38+
throw new ExpressionParseException("The expression \"%s\" is not a array type expression.", expressionValue);
4039
}
4140
this.propertyName = StringUtils.substringBefore(expressionValue, "[");
4241
try {
43-
this.index = new Integer(StringUtils.substringBetween(expressionValue, "[", "]"));
42+
this.index = Integer.parseInt(StringUtils.substringBetween(expressionValue, "[", "]"));
4443
} catch(NumberFormatException e) {
45-
throw new ExpressionParseException("The Expression \"%s\": index is not a number.", expressionValue);
44+
throw new ExpressionParseException("The expression \"%s\": index is not a number.", expressionValue);
4645
}
4746
}
4847

49-
/**
50-
* 检测expressionValue是否是数组型表达式
51-
* @param expressionValue 表达式字符串
52-
* @return 检测结果
53-
*/
54-
public final static boolean isArrayExpression(String expressionValue) {
55-
return expressionValue.matches("^\\w*(\\[\\w+\\])+$");
56-
}
57-
58-
/**
59-
* 从ObjectExpression转化
60-
* @param objectExpression 对象表达式
61-
* @param index 索引
62-
* @return 数组表达式
63-
*/
64-
public static final ArrayExpression fromObject(ObjectExpression objectExpression, int index) {
65-
ArrayExpression arrayExpression = new ArrayExpression(objectExpression.getPropertyName(), index);
66-
arrayExpression.setParentExpression(objectExpression.getParentExpression());
67-
return arrayExpression;
68-
}
69-
7048
/**
7149
* 判断是否有属性名称
7250
* @return
7351
*/
7452
public boolean hasPropertyName() {
75-
return StringUtils.isNotBlank(propertyName);
53+
return StringUtils.isNotEmpty(propertyName);
7654
}
7755

7856
@Override
7957
public String toString() {
80-
if(parentExpression == Expression.EMPTY_EXPRESSION) {
58+
if (parentExpression == EmptyExpression.INSTANCE) {
8159
return propertyName + "[" + index + "]";
8260
}
8361
return parentExpression + "." + propertyName + "[" + index + "]";
@@ -104,4 +82,27 @@ public boolean equals(Object obj) {
10482
}
10583
return false;
10684
}
85+
86+
/**
87+
* 检测expressionValue是否是数组型表达式
88+
*
89+
* @param expressionValue 表达式字符串
90+
* @return 检测结果
91+
*/
92+
public static boolean isArrayExpression(String expressionValue) {
93+
return expressionValue.matches("^\\w*(\\[\\w+])+$");
94+
}
95+
96+
/**
97+
* 从ObjectExpression转化
98+
*
99+
* @param objectExpression 对象表达式
100+
* @param index 索引
101+
* @return 数组表达式
102+
*/
103+
public static ArrayExpression fromObject(ObjectExpression objectExpression, int index) {
104+
ArrayExpression arrayExpression = new ArrayExpression(objectExpression.getPropertyName(), index);
105+
arrayExpression.setParentExpression(objectExpression.getParentExpression());
106+
return arrayExpression;
107+
}
107108
}

‎src/main/java/com/github/developframework/expression/EmptyExpression.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
*/
77
public class EmptyExpression extends Expression{
88

9+
public static final EmptyExpression INSTANCE = new EmptyExpression();
10+
911
@Override
1012
public String toString() {
1113
return "";

‎src/main/java/com/github/developframework/expression/Expression.java‎

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,9 @@
1515
*/
1616
public abstract class Expression {
1717

18-
public static final EmptyExpression EMPTY_EXPRESSION = new EmptyExpression();
19-
2018
/* 父表达式对象 */
2119
@Getter
22-
protected Expression parentExpression = EMPTY_EXPRESSION;
20+
protected Expression parentExpression = EmptyExpression.INSTANCE;
2321

2422
public void setParentExpression(Expression parentExpression) {
2523
if(parentExpression == null) {
@@ -34,7 +32,7 @@ public void setParentExpression(Expression parentExpression) {
3432
* @return 判断结果
3533
*/
3634
public boolean hasParentExpression() {
37-
return parentExpression != EMPTY_EXPRESSION;
35+
return parentExpression != EmptyExpression.INSTANCE;
3836
}
3937

4038
/**
@@ -45,7 +43,7 @@ public boolean hasParentExpression() {
4543
public Expression[] expressionTree() {
4644
List<Expression> expressionTree = new LinkedList<>();
4745
Expression tempExpression = this;
48-
while (tempExpression != Expression.EMPTY_EXPRESSION) {
46+
while (tempExpression != EmptyExpression.INSTANCE) {
4947
expressionTree.add(tempExpression);
5048
tempExpression = tempExpression.parentExpression;
5149
}
@@ -59,10 +57,10 @@ public Expression[] expressionTree() {
5957
* @param expressionValue 表达式字符串
6058
* @return 表达式对象
6159
*/
62-
public static final Expression parse(String expressionValue) {
63-
if (StringUtils.isNotBlank(expressionValue)) {
60+
public static Expression parse(String expressionValue) {
61+
if (StringUtils.isNotEmpty(expressionValue)) {
6462
if (expressionValue.contains(".")) {
65-
String[] expressionFragments = expressionValue.split("\\.");
63+
String[] expressionFragments = split(expressionValue);
6664
Expression rootExpression = parseSingle(expressionFragments[0]);
6765
for (int i = 1; i < expressionFragments.length; i++) {
6866
Expression childExpression = parseSingle(expressionFragments[i]);
@@ -74,7 +72,48 @@ public static final Expression parse(String expressionValue) {
7472
return parseSingle(expressionValue);
7573
}
7674
}
77-
return EMPTY_EXPRESSION;
75+
return EmptyExpression.INSTANCE;
76+
}
77+
78+
/**
79+
* 切分表达式
80+
*
81+
* @param expressionValue 表达式字符串
82+
* @return 切分结果
83+
*/
84+
public static String[] split(String expressionValue) {
85+
if (!expressionValue.contains("(")) {
86+
return expressionValue.split("\\.");
87+
}
88+
List<String> parts = new LinkedList<>();
89+
StringBuilder sb = new StringBuilder();
90+
int inBracketLevel = 0;
91+
for (int i = 0; i < expressionValue.length(); i++) {
92+
final char ch = expressionValue.charAt(i);
93+
switch (ch) {
94+
case '(':
95+
inBracketLevel++;
96+
break;
97+
case ')':
98+
inBracketLevel--;
99+
break;
100+
case '.': {
101+
if (inBracketLevel == 0) {
102+
parts.add(sb.toString());
103+
sb.setLength(0);
104+
inBracketLevel = 0;
105+
} else {
106+
sb.append(ch);
107+
}
108+
}
109+
continue;
110+
}
111+
sb.append(ch);
112+
}
113+
if (sb.length() > 0) {
114+
parts.add(sb.toString());
115+
}
116+
return parts.toArray(String[]::new);
78117
}
79118

80119
/**
@@ -84,10 +123,12 @@ public static final Expression parse(String expressionValue) {
84123
* @return 单项表达式对象
85124
*/
86125
private static Expression parseSingle(String singleExpressionValue) {
87-
if (StringUtils.isBlank(singleExpressionValue)) {
88-
return EMPTY_EXPRESSION;
126+
if (StringUtils.isEmpty(singleExpressionValue)) {
127+
return EmptyExpression.INSTANCE;
89128
} else if (ArrayExpression.isArrayExpression(singleExpressionValue)) {
90129
return new ArrayExpression(singleExpressionValue);
130+
} else if (MethodExpression.isMethodExpression(singleExpressionValue)) {
131+
return new MethodExpression(singleExpressionValue);
91132
} else {
92133
return new ObjectExpression(singleExpressionValue);
93134
}
@@ -98,20 +139,20 @@ private static Expression parseSingle(String singleExpressionValue) {
98139
* @param expression 表达式对象
99140
* @return 新的表达式对象
100141
*/
101-
public static final Expression copy(Expression expression) {
142+
public static Expression copy(Expression expression) {
102143
Expression newExpression;
103144
if(expression instanceof ObjectExpression) {
104145
newExpression = new ObjectExpression(((ObjectExpression) expression).getPropertyName());
105146
} else if(expression instanceof ArrayExpression){
106147
ArrayExpression arrayExpression = (ArrayExpression) expression;
107148
newExpression = new ArrayExpression(arrayExpression.getPropertyName(), arrayExpression.getIndex());
108149
} else {
109-
newExpression = EMPTY_EXPRESSION;
150+
newExpression = EmptyExpression.INSTANCE;
110151
}
111-
if(expression.getParentExpression() != EMPTY_EXPRESSION) {
152+
if (expression.getParentExpression() != EmptyExpression.INSTANCE) {
112153
newExpression.setParentExpression(copy(expression.getParentExpression()));
113154
} else {
114-
newExpression.setParentExpression(EMPTY_EXPRESSION);
155+
newExpression.setParentExpression(EmptyExpression.INSTANCE);
115156
}
116157
return newExpression;
117158
}
@@ -123,7 +164,7 @@ public static final Expression copy(Expression expression) {
123164
* @param childExpressionValue 子表达式字符串
124165
* @return 新的表达式对象
125166
*/
126-
public static final Expression concat(Expression parentExpression, String childExpressionValue) {
167+
public static Expression concat(Expression parentExpression, String childExpressionValue) {
127168
Expression childExpression = parse(childExpressionValue);
128169
return concat(parentExpression, childExpression);
129170
}
@@ -134,15 +175,15 @@ public static final Expression concat(Expression parentExpression, String childE
134175
* @param childExpression 子表达式对象
135176
* @return 新的表达式对象
136177
*/
137-
public static final Expression concat(Expression parentExpression, Expression childExpression) {
138-
if(childExpression == EMPTY_EXPRESSION) {
178+
public static Expression concat(Expression parentExpression, Expression childExpression) {
179+
if (childExpression == EmptyExpression.INSTANCE) {
139180
return parentExpression;
140181
}
141-
if(parentExpression == EMPTY_EXPRESSION) {
182+
if (parentExpression == EmptyExpression.INSTANCE) {
142183
return childExpression;
143184
} else {
144185
Expression newExpression = copy(childExpression);
145-
if(newExpression.getParentExpression() == EMPTY_EXPRESSION) {
186+
if (newExpression.getParentExpression() == EmptyExpression.INSTANCE) {
146187
newExpression.setParentExpression(parentExpression);
147188
} else {
148189
newExpression.getParentExpression().setParentExpression(parentExpression);

‎src/main/java/com/github/developframework/expression/ExpressionUtils.java‎

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.lang.reflect.Field;
88
import java.util.*;
9+
import java.util.stream.Stream;
910

1011
/**
1112
* 表达式取值工具
@@ -68,21 +69,20 @@ public static Object getValue(Object instance, Expression expression) {
6869
if (expression == null) {
6970
throw new ExpressionException("expression is null.");
7071
}
71-
if (expression == Expression.EMPTY_EXPRESSION) {
72+
if (expression == EmptyExpression.INSTANCE) {
7273
return instance;
7374
}
7475
Expression[] expressionTree = expression.expressionTree();
7576
Object tempObject = instance;
7677
for (Expression singleExpression : expressionTree) {
7778
if (tempObject == null) {
7879
return null;
79-
}
80-
if (singleExpression instanceof ObjectExpression) {
80+
} else if (singleExpression instanceof ObjectExpression) {
8181
tempObject = getValueFromObjectOrMap(tempObject, ((ObjectExpression) singleExpression).getPropertyName());
8282
} else if (singleExpression instanceof ArrayExpression) {
8383
tempObject = getValueFromArray(tempObject, (ArrayExpression) singleExpression);
84-
} else {
85-
// 空表达式 无操作
84+
} else if (singleExpression instanceof MethodExpression) {
85+
tempObject = getValueFromMethod(instance, tempObject, (MethodExpression) singleExpression);
8686
}
8787
}
8888
return tempObject;
@@ -133,6 +133,18 @@ private static Object getValueFromArray(Object instance, ArrayExpression arrayEx
133133
}
134134
}
135135

136+
private static Object getValueFromMethod(Object rootInstance, Object instance, MethodExpression methodExpression) {
137+
final Object[] arguments = Stream
138+
.of(methodExpression.getArguments())
139+
.map(argumentExpression -> getValue(rootInstance, argumentExpression))
140+
.toArray(Object[]::new);
141+
try {
142+
return MethodUtils.invokeMethod(instance, true, methodExpression.getMethodName(), arguments);
143+
} catch (Exception e) {
144+
throw new ExpressionException("%s invoke failed: %s", methodExpression.getMethodName(), e.getMessage());
145+
}
146+
}
147+
136148
private static Field getDeclaredField(final Class<?> clazz, String propertyName) {
137149
Class<?> temp = clazz;
138150
do {

0 commit comments

Comments
 (0)