View Javadoc

1   /*
2    * Joey and its relative products are published under the terms
3    * of the Apache Software License.
4    */
5   /*
6    * Created on 2004/02/27
7    */
8   package org.asyrinx.joey.om.hibernate;
9   
10  import java.text.DateFormat;
11  import java.text.ParseException;
12  import java.util.Collection;
13  import java.util.Date;
14  import java.util.Map;
15  
16  import net.sf.hibernate.Criteria;
17  import net.sf.hibernate.Session;
18  import net.sf.hibernate.exception.NestableRuntimeException;
19  import net.sf.hibernate.expression.Criterion;
20  import net.sf.hibernate.expression.Expression;
21  import net.sf.hibernate.expression.Order;
22  
23  import org.asyrinx.brownie.core.sql.Operator;
24  import org.asyrinx.joey.om.ConditionTranslator;
25  import org.asyrinx.joey.om.SearchCondition;
26  
27  /***
28   * @author akima
29   */
30  public class CriteriaTranslator extends AbstractHibernateTranslator implements
31  		ConditionTranslator {
32  
33  	/***
34  	 *  
35  	 */
36  	public CriteriaTranslator(Map columnToProperty, Map tableToClass,
37  			Session session, Class targetClass) {
38  		super(columnToProperty, tableToClass);
39  		this.criteria = session.createCriteria(targetClass);
40  		setUsePropertyInCondition(true);
41  	}
42  
43  	private final Criteria criteria;
44  
45  	/***
46  	 * @see org.asyrinx.joey.om.ConditionTranslator#addFrom(java.lang.String)
47  	 */
48  	public void addFrom(String tableName) {
49  		//criteria.
50  	}
51  
52  	/***
53  	 * @see org.asyrinx.joey.om.ConditionTranslator#addInt(java.lang.String,
54  	 *        java.lang.String, java.lang.Object)
55  	 */
56  	public void addInt(String fieldName, Object value, Object operator) {
57  		fieldName = toFieldName(fieldName);
58  		final Object val = toNumber(value, Integer.class);
59  		if (val == null)
60  			return;
61  		criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
62  				fieldName, val));
63  	}
64  
65  	/***
66  	 * @see org.asyrinx.joey.om.ConditionTranslator#addLong(java.lang.String,
67  	 *        java.lang.String, java.lang.Object)
68  	 */
69  	public void addLong(String fieldName, Object value, Object operator) {
70  		fieldName = toFieldName(fieldName);
71  		final Object val = toNumber(value, Long.class);
72  		if (val == null)
73  			return;
74  		criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
75  				fieldName, val));
76  	}
77  
78  	/***
79  	 * @see org.asyrinx.joey.om.ConditionTranslator#addDate(java.lang.String,
80  	 *        java.lang.String, java.lang.Object, java.text.DateFormat)
81  	 */
82  	public void addDate(String fieldName, Object value, Object operator,
83  			DateFormat dateFormat) {
84  		fieldName = toFieldName(fieldName);
85  		try {
86  			final Date d = (value instanceof Date) ? (Date) value : dateFormat
87  					.parse(String.valueOf(value));
88  			criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
89  					fieldName, d));
90  		} catch (ParseException e) {
91  			throw new NestableRuntimeException(e);
92  		}
93  	}
94  
95  	/***
96  	 * @see org.asyrinx.joey.om.ConditionTranslator#addString(java.lang.String,
97  	 *        java.lang.String, java.lang.Object)
98  	 */
99  	public void addString(String fieldName, Object value, Object operator) {
100 		fieldName = toFieldName(fieldName);
101 		criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
102 				fieldName, value));
103 	}
104 
105 	/***
106 	 * @see org.asyrinx.joey.om.ConditionTranslator#addAscendingOrderByColumn(java.lang.String)
107 	 */
108 	public void addAscendingOrderByColumn(String fieldName) {
109 		fieldName = toFieldName(fieldName);
110 		criteria.addOrder(Order.asc(fieldName));
111 	}
112 
113 	/***
114 	 * @see org.asyrinx.joey.om.ConditionTranslator#addDescendingOrderByColumn(java.lang.String)
115 	 */
116 	public void addDescendingOrderByColumn(String fieldName) {
117 		fieldName = toFieldName(fieldName);
118 		criteria.addOrder(Order.desc(fieldName));
119 	}
120 
121 	/***
122 	 * @return
123 	 */
124 	public Criteria toCriteria(SearchCondition condition) {
125 		condition.attach(this);
126 		return criteria;
127 	}
128 
129 }
130 
131 class CriteriaUtils {
132 	public static Criterion toExpression(Operator operator, Object targetValue,
133 			Object value) {
134 		if (operator == null) {
135 			throw new UnsupportedOperationException(
136 					"No operator to translate to Expression");
137 		} else if (operator == Operator.AND) {
138 			if (targetValue instanceof Criterion && value instanceof Criterion)
139 				return Expression.and((Criterion) targetValue,
140 						(Criterion) value);
141 			else
142 				throw new UnsupportedOperationException(
143 						"target and value must be Criteria.");
144 		} else if (operator == Operator.EQUAL || operator == Operator.EQUAL2) {
145 			return Expression.eq(toString(targetValue), value);
146 		} else if (operator == Operator.IN) {
147 			if (value instanceof Collection)
148 				return Expression.in(toString(targetValue), (Collection) value);
149 			else if (value.getClass().isArray()) {
150 				if (!value.getClass().getComponentType().isPrimitive())
151 					return Expression.in(toString(targetValue),
152 							(Object[]) value);
153 				throw new UnsupportedOperationException(
154 						"value must be Collection or array of Object.");
155 			} else
156 				throw new UnsupportedOperationException(
157 						"value must be Collection or array of Object.");
158 		} else if (operator == Operator.GREATER_EQUAL
159 				|| operator == Operator.GREATER_EQUAL2) {
160 			return Expression.ge(toString(targetValue), value);
161 		} else if (operator == Operator.GREATER_THAN) {
162 			return Expression.gt(toString(targetValue), value);
163 		} else if (operator == Operator.LIKE) {
164 			return Expression.like(toString(targetValue), value);
165 		} else if (operator == Operator.NOT_EQUAL
166 				|| operator == Operator.NOT_EQUAL2) {
167 			return Expression.not(toExpression(Operator.EQUAL,
168 					toString(targetValue), value));
169 		} else if (operator == Operator.NOT_IN) {
170 			return Expression.not(toExpression(Operator.IN,
171 					toString(targetValue), value));
172 		} else if (operator == Operator.OR) {
173 			if (targetValue instanceof Criterion && value instanceof Criterion)
174 				return Expression
175 						.or((Criterion) targetValue, (Criterion) value);
176 			else
177 				throw new UnsupportedOperationException(
178 						"target and value must be Criteria.");
179 		} else if (operator == Operator.LESS_EQUAL
180 				|| operator == Operator.LESS_EQUAL2) {
181 			return Expression.le(toString(targetValue), value);
182 		} else if (operator == Operator.LESS_THAN) {
183 			return Expression.lt(toString(targetValue), value);
184 		} else {
185 			throw new UnsupportedOperationException(
186 					"Unknown operator to translate to Expression. '"
187 							+ operator.toString() + "'");
188 		}
189 	}
190 
191 	private static String toString(Object targetValue) {
192 		if (!(targetValue instanceof String))
193 			throw new UnsupportedOperationException("target must be String.");
194 		return (String) targetValue;
195 	}
196 
197 }