// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by the License. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.utils.db; import java.lang.reflect.Field; import javax.persistence.Column; import com.cloud.utils.Pair; import com.cloud.utils.ReflectUtil; /** * Try to use static initialization to help you in finding incorrect * field names being passed in early. * * Something like the following: * protected static final Filter s_NameFilter = new Filter(VMInstanceVO, name, true, null, null); * * Filter nameFilter = new Filter(s_nameFilter); * */ public class Filter { Long _offset; Long _limit; String _orderBy; /** * @param clazz the VO object type * @param field name of the field * @param offset * @param limit */ public Filter(Class<?> clazz, String field, boolean ascending, Long offset, Long limit) { _offset = offset; _limit = limit; addOrderBy(clazz, field, ascending); } public Filter(long limit) { _orderBy = " ORDER BY RAND() LIMIT " + limit; } /** * Note that this copy constructor does not copy offset and limit. * @param that filter */ public Filter(Filter that) { this._orderBy = that._orderBy; this._limit = null; that._limit = null; } public void addOrderBy(Class<?> clazz, String field, boolean ascending) { if (field == null) { return; } Field f; Pair<Class<?>, Field> pair = ReflectUtil.getAnyField(clazz, field); assert(pair != null) : "Can't find field " + field + " in " + clazz.getName(); clazz = pair.first(); f = pair.second(); Column column = f.getAnnotation(Column.class); String name = column != null ? column.name() : field; StringBuilder order = new StringBuilder(); if (column.table() == null || column.table().length() == 0) { order.append(DbUtil.getTableName(clazz)); } else { order.append(column.table()); } order.append(".").append(name).append(ascending ? " ASC " : " DESC "); if (_orderBy == null) { _orderBy = order.insert(0, " ORDER BY ").toString(); } else { _orderBy = order.insert(0, _orderBy).toString(); } } public String getOrderBy() { return _orderBy; } public void setOffset(Long offset) { _offset = offset; } public Long getOffset() { return _offset; } public Long getLimit() { return _limit; } public void setLimit(Long limit) { _limit = limit; } }