1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.gridsystems.beanfilter;
18
19 import java.util.HashSet;
20 import java.util.Iterator;
21 import com.gridsystems.beanfilter.ArrayValue.ArrayType;
22
23
24
25
26
27
28
29 public final class SelectWhereValue extends EvalValue implements FilterParserConstants {
30
31
32
33
34 private EvalValue select;
35
36
37
38
39 private EvalNode where;
40
41
42
43
44 private Class<?> selectClass;
45
46
47
48
49 private Token whereToken;
50
51
52
53
54
55
56
57
58
59
60
61 public SelectWhereValue(Token selectToken, EvalValue select,
62 Token whereToken, EvalNode where, Class<?> parentClass) throws EvalException {
63 super(selectToken.beginLine, selectToken.beginColumn);
64 this.select = select;
65 this.whereToken = whereToken;
66 this.where = where;
67 this.selectClass = select.getClassValue(parentClass);
68
69 checkWhereSyntax();
70 }
71
72
73
74
75 @SuppressWarnings("unchecked")
76 @Override public Object getValue(Object src) throws EvalException {
77 Object selectValue = select.getValue(src);
78
79 HashSet<Object> result = new HashSet<Object>();
80 String expr = where.toString();
81
82 HashSet<Object> theList;
83
84 if (selectValue instanceof HashSet) {
85 theList = (HashSet<Object>)selectValue;
86 } else {
87 if (selectValue.getClass().isArray()) {
88 theList = ArrayValue.arrayToHash(selectValue, ArrayType.ALL_ITEMS);
89 } else {
90 theList = new HashSet<Object>();
91 theList.add(selectValue);
92 }
93 }
94
95 Iterator<Object> iter = theList.iterator();
96 while (iter.hasNext()) {
97 Object obj = iter.next();
98 Class<?> theClass;
99 if (obj == null) {
100 theClass = this.selectClass;
101 } else {
102 theClass = obj.getClass();
103 }
104 Filter filter = new Filter(expr, theClass);
105 boolean eval = filter.eval(obj);
106 if (eval) {
107 result.add(obj);
108 }
109 }
110 return result;
111 }
112
113
114
115
116 @Override public String toString() {
117 return "select " + select.toString() + " where " + where.toString();
118 }
119
120
121
122
123 @Override
124 public Class<?> getClassValue(Class<?> parentClass) throws EvalException {
125 return select.getClassValue(parentClass);
126 }
127
128
129
130
131
132
133 private void checkWhereSyntax() throws EvalException {
134
135 try {
136 new Filter(where.toString().trim(), selectClass);
137 } catch (EvalException e) {
138 if (e.getCode().equals("FTR005")) {
139 Object[] params = e.getParams();
140 for (int i = 0; i < params.length; i++) {
141 try {
142 if ((i == 0) || (i == 1)) {
143 int tmp = Integer.parseInt(params[i].toString());
144 if (i == 0) {
145
146 tmp = tmp + whereToken.beginLine - 1;
147 } else {
148
149 int whereLen = whereToken.beginLine + tokenImage[WHERE].length() - 2;
150 tmp = tmp + whereToken.beginColumn + whereLen - 1;
151 }
152 params[i] = String.valueOf(tmp);
153 }
154 } catch (Exception ex) {
155 }
156 }
157
158 throw new EvalException("FTR005", params);
159 }
160 throw e;
161 }
162 }
163
164 }