1 package org.kuali.student.r2.common.criteria.transform;
2
3 import static org.kuali.rice.core.api.criteria.PredicateFactory.and;
4 import static org.kuali.rice.core.api.criteria.PredicateFactory.equal;
5 import static org.kuali.rice.core.api.criteria.PredicateFactory.like;
6
7 import java.util.regex.Matcher;
8 import java.util.regex.Pattern;
9
10 import org.kuali.rice.core.api.criteria.Predicate;
11 import org.kuali.rice.core.api.criteria.PropertyPathPredicate;
12 import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
13
14 public class AttributeTransform extends BaseTransform {
15
16 private static final String ATTRIBUTE_PROPERTY = "attributes";
17 private static final String ATTRIBUTE_ALIAS = "attr";
18 private static final String ATTRIBUTE_VALUE = "value";
19 private static final String ATTRIBUTE_KEY = "key";
20 private static final String ATTRIBUTES_REGEX = "^attributes\\[[0-9a-zA-Z.\\%]+\\]$";
21 private static final Pattern ATTRIBUTES_PATTERN = Pattern.compile(ATTRIBUTES_REGEX);
22
23 private AttributeTransform() {
24
25 }
26
27 @Override
28 public Predicate apply(final Predicate input, Criteria criteria) {
29 if (input instanceof PropertyPathPredicate) {
30 String pp = ((PropertyPathPredicate) input).getPropertyPath();
31 if (isAttributesPredicate(pp)) {
32 criteria.join(ATTRIBUTE_PROPERTY, ATTRIBUTE_ALIAS, false, true);
33
34 final String attributeName = pp.substring(pp.indexOf('[') + 1, pp.indexOf(']'));
35 final Predicate attrValue = this.createPredicate(input, getPropertyDesc() + ATTRIBUTE_VALUE);
36
37 return and(like(getPropertyDesc() + ATTRIBUTE_KEY, attributeName), attrValue);
38 }
39 }
40
41 return input;
42 }
43
44 private String getPropertyDesc(){
45 return Criteria.JPA_ALIAS_PREFIX + "'" + ATTRIBUTE_ALIAS + "'" + Criteria.JPA_ALIAS_SUFFIX + ".";
46 }
47
48 private boolean isAttributesPredicate(String pp) {
49 Matcher matcher = ATTRIBUTES_PATTERN.matcher(pp);
50 return matcher.matches();
51 }
52 }