1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.formresponsxpage.business;
35
36
37 import java.lang.reflect.Method;
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43
44
45 import org.apache.commons.lang3.StringUtils;
46
47
48 public abstract class AbstractFilterDao {
49
50
51 protected HashMap<String,String> _mapSql;
52
53
54 private final static String PREFIX_GET = "get";
55 private final static String PREFIX_IS = "is";
56
57
58 private final static String SQL_WHERE =" WHERE 1 ";
59 private final static String SQL_ORDER_BY =" ORDER BY ";
60 private final static String SQL_EQUAL =" = ? ";
61 private final static String SQL_LIKE =" LIKE ? ";
62 private final static String SQL_AND = " AND ";
63 private final static String SQL_ASC =" ASC ";
64 private final static String SQL_DESC =" DESC ";
65
66
67 protected final static String TYPE_DATE = "Date";
68 protected final static String TYPE_STRING = "String";
69 protected final static String TYPE_BOOLEAN = "boolean";
70 protected final static String TYPE_INT = "int";
71
72
73 private final static List<String> _listPrefixToRemove = Arrays.asList(PREFIX_GET,PREFIX_IS);
74 protected final static List<String> _listTypeAllowedForSearch = Arrays.asList(TYPE_DATE,TYPE_STRING,TYPE_BOOLEAN,TYPE_INT);
75
76
77
78
79
80
81
82
83
84
85 protected String prepareSelectStatement(String SQL_QUERY_SELECTALL_ID,Map <String,String> mapFilterCriteria, String strColumnToOrder, String strSortMode) {
86
87
88 StringBuilder builder = new StringBuilder();
89
90 builder.append(SQL_QUERY_SELECTALL_ID);
91 builder.append(addWhereClauses(mapFilterCriteria));
92 builder.append(addOrderByClause(strColumnToOrder,strSortMode));
93
94
95 return builder.toString();
96
97 }
98
99
100
101
102
103
104
105 protected String addWhereClauses(Map<String, String> mapFilterCriteria) {
106
107 StringBuilder WhereClauses = new StringBuilder();
108
109 if(!mapFilterIsEmpty(mapFilterCriteria)) {
110
111 WhereClauses.append(SQL_WHERE);
112
113 for(Map.Entry<String, String> filter : mapFilterCriteria.entrySet()) {
114
115
116 if(StringUtils.isNotBlank(filter.getValue())) {
117
118
119 if(_mapSql.containsKey(filter.getKey()) && _listTypeAllowedForSearch.contains(_mapSql.get(filter.getKey()))) {
120
121 WhereClauses.append(SQL_AND);
122 WhereClauses.append(filter.getKey());
123 WhereClauses.append(addWhereClauseOperator(filter.getKey()));
124 }
125 }
126 }
127
128 }
129
130 return WhereClauses.toString();
131 };
132
133
134
135
136
137
138
139
140 protected String addOrderByClause(String strColumnToOrder,String strSortMode) {
141
142
143 if(StringUtils.isNotBlank(strColumnToOrder) && _mapSql.containsKey(strColumnToOrder)) {
144
145
146 StringBuilder orderByClauses = new StringBuilder();
147
148 orderByClauses.append(SQL_ORDER_BY);
149 orderByClauses.append(strColumnToOrder);
150 orderByClauses.append(strSortMode);
151
152 return orderByClauses.toString();
153
154 }
155
156 return "";
157 }
158
159
160
161
162
163
164 private boolean mapFilterIsEmpty(Map<String,String> mapFilterCriteria) {
165
166 for (Map.Entry<String, String> entry : mapFilterCriteria.entrySet()) {
167 if(StringUtils.isNotBlank(entry.getValue())) {
168 return false;
169 }
170 }
171
172 return true;
173 }
174
175
176
177
178
179
180
181 private String addWhereClauseOperator(String strWhereClauseColumn) {
182
183 if(_mapSql.containsKey(strWhereClauseColumn)) {
184
185 switch(_mapSql.get(strWhereClauseColumn)) {
186 case TYPE_DATE :
187 return SQL_EQUAL;
188 case TYPE_STRING :
189 return SQL_LIKE;
190 case TYPE_BOOLEAN :
191 return SQL_EQUAL;
192 case TYPE_INT :
193 return SQL_EQUAL;
194 default :
195 return SQL_LIKE;
196 }
197 }
198
199 return SQL_LIKE;
200 }
201
202
203
204
205
206 private String getFormatedColumnName(String strAttributeName, String strPrefixToCut){
207
208
209 String strRemovePrefix = StringUtils.uncapitalize(strAttributeName.substring(strPrefixToCut.length())).toString();
210
211 StringBuilder builder = new StringBuilder();
212
213
214 for(char c: strRemovePrefix.toCharArray()) {
215
216 if( Character.isUpperCase(c)) {
217 builder.append('_');
218 builder.append(Character.toLowerCase(c));
219 }else {
220 builder.append(c);
221 }
222 }
223
224 return builder.toString();
225
226 }
227
228
229
230
231
232
233 protected void initMapSql(Class<?> businessClass) {
234
235 _mapSql = new HashMap<>();
236
237 for (Method method : businessClass.getDeclaredMethods()) {
238
239 for(String prefix : _listPrefixToRemove) {
240
241 if(method.getName().startsWith(prefix)){
242 _mapSql.put(getFormatedColumnName(method.getName(),prefix),method.getReturnType().getSimpleName());
243 }
244 }
245 }
246 }
247
248 }
249