1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.docsearch;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.hibernate.annotations.GenericGenerator;
20 import org.hibernate.annotations.Parameter;
21 import org.kuali.rice.core.api.search.SearchOperator;
22 import org.kuali.rice.core.framework.persistence.jdbc.sql.SQLUtils;
23 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
24 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeFactory;
25 import org.kuali.rice.kew.api.document.attribute.DocumentAttributeInteger;
26 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
27 import org.kuali.rice.kew.service.KEWServiceLocator;
28 import org.kuali.rice.kew.api.KewApiConstants;
29
30 import javax.persistence.CascadeType;
31 import javax.persistence.Column;
32 import javax.persistence.Entity;
33 import javax.persistence.FetchType;
34 import javax.persistence.GeneratedValue;
35 import javax.persistence.Id;
36 import javax.persistence.JoinColumn;
37 import javax.persistence.ManyToOne;
38 import javax.persistence.NamedQueries;
39 import javax.persistence.NamedQuery;
40 import javax.persistence.Table;
41 import javax.persistence.Transient;
42 import java.io.Serializable;
43 import java.math.BigInteger;
44 import java.sql.ResultSet;
45 import java.sql.SQLException;
46 import java.text.DecimalFormat;
47 import java.text.NumberFormat;
48 import java.util.Arrays;
49 import java.util.List;
50 import java.util.regex.Matcher;
51 import java.util.regex.Pattern;
52
53
54
55
56
57 @Entity
58 @Table(name="KREW_DOC_HDR_EXT_LONG_T")
59
60 @NamedQueries({
61 @NamedQuery(name="SearchableAttributeLongValue.FindByDocumentId", query="select s from SearchableAttributeLongValue as s where s.documentId = :documentId"),
62 @NamedQuery(name="SearchableAttributeLongValue.FindByKey", query="select s from SearchableAttributeLongValue as s where s.documentId = :documentId and s.searchableAttributeKey = :searchableAttributeKey")
63 })
64 public class SearchableAttributeLongValue implements SearchableAttributeValue, Serializable {
65
66 private static final long serialVersionUID = 5786144436732198346L;
67
68 private static final String ATTRIBUTE_DATABASE_TABLE_NAME = "KREW_DOC_HDR_EXT_LONG_T";
69 private static final boolean DEFAULT_WILDCARD_ALLOWANCE_POLICY = false;
70 private static final boolean ALLOWS_RANGE_SEARCH = true;
71 private static final boolean ALLOWS_CASE_INSENSITIVE_SEARCH = false;
72 private static final String DEFAULT_VALIDATION_REGEX_EXPRESSION = "^-?[0-9]+$";
73 private static final String ATTRIBUTE_XML_REPRESENTATION = KewApiConstants.SearchableAttributeConstants.DATA_TYPE_LONG;
74 private static final String DEFAULT_FORMAT_PATTERN = "#";
75
76 @Id
77 @GeneratedValue(generator="KREW_SRCH_ATTR_S")
78 @GenericGenerator(name="KREW_SRCH_ATTR_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
79 @Parameter(name="sequence_name",value="KREW_SRCH_ATTR_S"),
80 @Parameter(name="value_column",value="id")
81 })
82 @Column(name="DOC_HDR_EXT_LONG_ID")
83 private String searchableAttributeValueId;
84 @Column(name="KEY_CD")
85 private String searchableAttributeKey;
86 @Column(name="VAL")
87 private Long searchableAttributeValue;
88 @Transient
89 protected String ojbConcreteClass;
90
91 @Column(name="DOC_HDR_ID")
92 private String documentId;
93 @ManyToOne(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST})
94 @JoinColumn(name="DOC_HDR_ID", insertable=false, updatable=false)
95 private DocumentRouteHeaderValue routeHeader;
96
97
98
99
100 public SearchableAttributeLongValue() {
101 super();
102 this.ojbConcreteClass = this.getClass().getName();
103 }
104
105
106
107
108 public void setupAttributeValue(String value) {
109 this.setSearchableAttributeValue(convertStringToLong(value));
110 }
111
112 private Long convertStringToLong(String value) {
113 if (org.apache.commons.lang.StringUtils.isEmpty(value)) {
114 return null;
115 } else {
116 return Long.valueOf(value.trim());
117 }
118 }
119
120
121
122
123 public void setupAttributeValue(ResultSet resultSet, String columnName) throws SQLException {
124 this.setSearchableAttributeValue(resultSet.getLong(columnName));
125 }
126
127
128
129
130 public String getSearchableAttributeDisplayValue() {
131 NumberFormat format = DecimalFormat.getInstance();
132 ((DecimalFormat)format).applyPattern(DEFAULT_FORMAT_PATTERN);
133 return format.format(getSearchableAttributeValue().longValue());
134 }
135
136
137
138
139 public String getAttributeDataType() {
140 return ATTRIBUTE_XML_REPRESENTATION;
141 }
142
143
144
145
146 public String getAttributeTableName() {
147 return ATTRIBUTE_DATABASE_TABLE_NAME;
148 }
149
150
151
152
153 public boolean allowsWildcards() {
154 return DEFAULT_WILDCARD_ALLOWANCE_POLICY;
155 }
156
157
158
159
160 public boolean allowsCaseInsensitivity() {
161 return ALLOWS_CASE_INSENSITIVE_SEARCH;
162 }
163
164
165
166
167 public boolean allowsRangeSearches() {
168 return ALLOWS_RANGE_SEARCH;
169 }
170
171
172
173
174 public boolean isPassesDefaultValidation(String valueEntered) {
175
176 boolean bRet = true;
177 boolean bSplit = false;
178
179 if (StringUtils.contains(valueEntered, SearchOperator.BETWEEN.op())) {
180 List<String> l = Arrays.asList(valueEntered.split("\\.\\."));
181 for(String value : l){
182 bSplit = true;
183 if(!isPassesDefaultValidation(value)){
184 bRet = false;
185 }
186 }
187 }
188 if (StringUtils.contains(valueEntered, SearchOperator.OR.op())) {
189
190 List<String> l = Arrays.asList(StringUtils.split(valueEntered, SearchOperator.OR.op()));
191 for(String value : l){
192 bSplit = true;
193 if(!isPassesDefaultValidation(value)){
194 bRet = false;
195 }
196 }
197 }
198 if (StringUtils.contains(valueEntered, SearchOperator.AND.op())) {
199
200 List<String> l = Arrays.asList(StringUtils.split(valueEntered, SearchOperator.AND.op()));
201 for(String value : l){
202 bSplit = true;
203 if(!isPassesDefaultValidation(value)){
204 bRet = false;
205 }
206 }
207 }
208
209 if(bSplit){
210 return bRet;
211 }
212
213 Pattern pattern = Pattern.compile(DEFAULT_VALIDATION_REGEX_EXPRESSION);
214 Matcher matcher = pattern.matcher(SQLUtils.cleanNumericOfValidOperators(valueEntered).trim());
215 if(!matcher.matches()){
216 bRet = false;
217 }
218
219 return bRet;
220
221 }
222
223
224
225
226
227 public Boolean isRangeValid(String lowerValue, String upperValue) {
228 if (allowsRangeSearches()) {
229 Long lower = convertStringToLong(lowerValue);
230 Long upper = convertStringToLong(upperValue);
231 if ( (lower != null) && (upper != null) ) {
232 return (lower.compareTo(upper) <= 0);
233 }
234 return true;
235 }
236 return null;
237 }
238
239 public String getOjbConcreteClass() {
240 return ojbConcreteClass;
241 }
242
243 public void setOjbConcreteClass(String ojbConcreteClass) {
244 this.ojbConcreteClass = ojbConcreteClass;
245 }
246
247 public DocumentRouteHeaderValue getRouteHeader() {
248 return routeHeader;
249 }
250
251 public void setRouteHeader(DocumentRouteHeaderValue routeHeader) {
252 this.routeHeader = routeHeader;
253 }
254
255 public String getDocumentId() {
256 return documentId;
257 }
258
259 public void setDocumentId(String documentId) {
260 this.documentId = documentId;
261 }
262
263 public String getSearchableAttributeKey() {
264 return searchableAttributeKey;
265 }
266
267 public void setSearchableAttributeKey(String searchableAttributeKey) {
268 this.searchableAttributeKey = searchableAttributeKey;
269 }
270
271 public Long getSearchableAttributeValue() {
272 return searchableAttributeValue;
273 }
274
275 public void setSearchableAttributeValue(Long searchableAttributeValue) {
276 this.searchableAttributeValue = searchableAttributeValue;
277 }
278
279 public String getSearchableAttributeValueId() {
280 return searchableAttributeValueId;
281 }
282
283 public void setSearchableAttributeValueId(String searchableAttributeValueId) {
284 this.searchableAttributeValueId = searchableAttributeValueId;
285 }
286
287
288 public void beforeInsert(){
289 OrmUtils.populateAutoIncValue(this, KEWServiceLocator.getEntityManagerFactory().createEntityManager());
290 }
291
292 @Override
293 public DocumentAttributeInteger toDocumentAttribute() {
294 BigInteger integer = null;
295 if (getSearchableAttributeValue() != null) {
296 integer = BigInteger.valueOf(getSearchableAttributeValue().longValue());
297 }
298 return DocumentAttributeFactory.createIntegerAttribute(getSearchableAttributeKey(), integer);
299 }
300
301 }
302