com.algoTrader.PropertySearch.java Source code

Java tutorial

Introduction

Here is the source code for com.algoTrader.PropertySearch.java

Source

// license-header java merge-point
//
// Attention: Generated code! Do not modify by hand!
// Generated by: hibernate/search/PropertySearch.java.vsl in andromda-spring-cartridge.
//
package com.algoTrader;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.converters.IntegerConverter;
import org.apache.commons.beanutils.converters.LongConverter;
import org.apache.commons.beanutils.converters.ShortConverter;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;

/**
 * Provides the ability to search by properties.
 */
@SuppressWarnings({ "unchecked" })
public class PropertySearch extends CriteriaSearch {
    private Search search;

    /**
     * Constructor for PropertySearch. Creates a <code>PropertySearch</code> instance
     * from the given arguments.
     *
     * @param session The Hibernate session.
     * @param entityType The <code>Class</code> of the result.
     * @param searchIn the object that specifies the search criteria.
     */
    public PropertySearch(final Session session, final Class entityType, final Search searchIn) {
        super(session, entityType);
        this.search = searchIn;
        try {
            this.initializeConverters();
            this.getConfiguration().setForceEagerLoading(searchIn.isEagerFetching());
            final SearchParameter[] parameters = searchIn.getParameters();
            if (parameters != null) {
                for (int ctr = 0; ctr < parameters.length; ctr++) {
                    final SearchParameter searchParameter = parameters[ctr];

                    Object value;
                    switch (searchParameter.getComparator()) {
                    case SearchParameter.IN_COMPARATOR:
                        value = searchParameter.getValue();
                        break;
                    case SearchParameter.NOT_IN_COMPARATOR:
                        value = searchParameter.getValue();
                        break;
                    default:
                        value = this.getValue(entityType, searchParameter);
                        break;
                    }

                    // - now add the parameter.
                    final CriteriaSearchParameter parameter = new CriteriaSearchParameter(value,
                            searchParameter.getName(), searchParameter.getComparator());
                    parameter.setOrderDirection(searchParameter.getOrder());
                    parameter.setSearchIfNull(searchParameter.isSearchIfNull());
                    switch (searchParameter.getMatch()) {
                    case SearchParameter.MATCH_ANYWHERE:
                        parameter.setMatchMode(MatchMode.ANYWHERE);
                        break;
                    case SearchParameter.MATCH_START:
                        parameter.setMatchMode(MatchMode.START);
                        break;
                    case SearchParameter.MATCH_END:
                        parameter.setMatchMode(MatchMode.END);
                        break;
                    default:
                        parameter.setMatchMode(MatchMode.EXACT);
                        break;
                    }
                    this.addParameter(parameter);
                    if (searchIn.isUseSqlLimiting()) {
                        if (searchIn.getPageNumber() > 0 && searchIn.getPageSize() > 0) {
                            // - set the first result as part of pagination support
                            this.getConfiguration().setFirstResult(new Integer(
                                    this.calculateFirstResult(searchIn.getPageNumber(), searchIn.getPageSize())));
                            this.getConfiguration().setMaximumResultSize(new Integer(searchIn.getPageSize()));
                        }
                    }
                }
            }
        } catch (Exception exception) {
            throw new RuntimeException(exception);
        }
    }

    /**
     * Stores the total count when sql limiting isn't used.
     */
    private int totalCount;

    /**
     * Gets the total possible count of objects returned in this search.
     * @return totalCount
     */
    public int getTotalCount() {
        int count;
        if (this.search.isUseSqlLimiting()) {
            // Remove first result requirement
            this.getConfiguration().setFirstResult(new Integer(0));
            this.getRootCriteria().setProjection(Projections.projectionList().add(Projections.rowCount()));
            count = ((Integer) this.executeAsList().iterator().next()).intValue();
        } else {
            count = this.totalCount;
        }
        return count;
    }

    /**
     * @see CriteriaSearch#executeAsList()
     */
    @Override
    public List executeAsList() throws HibernateException {
        List results = super.executeAsList();
        if (!this.search.isUseSqlLimiting() && this.search.getPageNumber() > 0 && this.search.getPageSize() > 0) {
            int start = this.calculateFirstResult(this.search.getPageNumber(), this.search.getPageSize());
            int end = this.calculateLastResult(this.search.getPageNumber(), this.search.getPageSize());
            this.totalCount = results.size();
            if (this.totalCount < start) {
                start = this.totalCount;
            }
            if (this.totalCount < end) {
                end = this.totalCount;
            }
            results = results.subList(start, end);
        }
        return results;
    }

    /**
     * Calculates the first result based upon page size and current
     * desired page.
     *
     * @param pageNumber the page number to retrieve.
     * @param pageSize the page size to retrieve.
     *
     * @return the calculated first result.
     */
    private int calculateFirstResult(int pageNumber, int pageSize) {
        int firstResult = 0;
        if (pageNumber > 0 && pageSize > 0) {
            firstResult = (pageNumber - 1) * pageSize;
        }
        return firstResult;
    }

    /**
     * Calculates the last result based upon page size and current
     * desired page.
     *
     * @param pageNumber the page number to retrieve.
     * @param pageSize the page size to retrieve.
     *
     * @return the calculated first result.
     */
    private int calculateLastResult(int pageNumber, int pageSize) {
        int lastResult = 0;
        if (pageNumber > 0 && pageSize > 0) {
            lastResult = pageNumber * pageSize;
        }
        return lastResult;
    }

    private static final String PERIOD = ".";

    /**
     * Initializes the converters to behave the way we want when converting values (we don't
     * want empty strings converted to zeros, like beanutils does by default)
     */
    private void initializeConverters() {
        ConvertUtils.register(new LongConverter(null), Long.class);
        ConvertUtils.register(new IntegerConverter(null), Integer.class);
        ConvertUtils.register(new ShortConverter(null), Short.class);
        ConvertUtils.register(new CalendarConverter(), Calendar.class);
        ConvertUtils.register(new DateConverter(), Date.class);
    }

    /**
     * <p>Convert the value to an object of the specified class (if
     * possible).</p>
     *
     * @param value Value to be converted (may be null)
     * @param type Class of the value to be converted to
     * @return The converted value
     *
     * @exception ConversionException if thrown by an underlying Converter
     */
    protected Object convert(Object value, Class type) {
        Converter converter = ConvertUtils.lookup(type);
        Object result;
        if (converter != null) {
            result = converter.convert(type, value);
        } else {
            result = value;
        }
        return result;
    }

    /**
     * Converts the value contained within the parameter to the type which Hibernate expects.
     *
     * @param entityType the class of the entity for which the search is being performed.
     * @param parameter the parameter from which to get the value.
     * @return the appropriate value.
     */
    private Object getValue(Class type, final SearchParameter parameter) {
        try {
            Object value = parameter.getValue();
            // - don't try to convert null values or classes
            if (value != null && !value.getClass().equals(Class.class)) {
                Class propertyType = type;
                for (final StringTokenizer tokenizer = new StringTokenizer(parameter.getName(), PERIOD); tokenizer
                        .hasMoreTokens();) {
                    final String token = tokenizer.nextToken().trim();
                    Class lastType = type;
                    type = CriteriaSearchProperties.getPropertyType(type, token);
                    if (!tokenizer.hasMoreTokens()) {
                        break;
                    }
                    if (type == null) {
                        throw new RuntimeException(
                                "No accessible property named '" + token + "', exists on: " + lastType.getName());
                    }
                    propertyType = type;
                }
                final Object object = propertyType.newInstance();
                final String name = parameter.getName().replaceAll(".*\\" + PERIOD, "");
                try {
                    value = convert(value, PropertyUtils.getPropertyType(object, name));
                } catch (final NoSuchMethodException noSuchMethodException) {
                    throw new RuntimeException(
                            "No accessible property named '" + name + "', exists on: " + propertyType.getName());
                }
            }
            return value;
        } catch (final Exception exception) {
            throw new RuntimeException(exception);
        }
    }

    /**
     * A beanutils converter that converts Calendar objects to Date instances.
     */
    private static final class DateConverter implements Converter {
        public DateConverter() {
            // Empty block comment
        }

        /**
         * @see org.apache.commons.beanutils.Converter#convert(Class, Object)
         */
        public Object convert(Class type, Object value) throws ConversionException {
            if (value != null) {
                try {
                    if (value instanceof Calendar) {
                        value = ((Calendar) value).getTime();
                    }
                } catch (Exception ex) {
                    throw new ConversionException(ex);
                }
            }
            return value;
        }
    }

    /**
     * A beanutils converter that converts Date objects to Calendar instances.
     */
    private static final class CalendarConverter implements Converter {
        public CalendarConverter() {
            // Empty block comment
        }

        /**
         * @see org.apache.commons.beanutils.Converter#convert(Class, Object)
         */
        public Object convert(Class type, Object value) throws ConversionException {
            if (value != null) {
                try {
                    if (value instanceof Date) {
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime((Date) value);
                        value = calendar;
                    }
                } catch (Exception ex) {
                    throw new ConversionException(ex);
                }
            }
            return value;
        }
    }
}