org.encuestame.persistence.dao.imp.AbstractHibernateDaoSupport.java Source code

Java tutorial

Introduction

Here is the source code for org.encuestame.persistence.dao.imp.AbstractHibernateDaoSupport.java

Source

/*
 ************************************************************************************
 * Copyright (C) 2001-2011 encuestame: system online surveys Copyright (C) 2011
 * encuestame Development Team.
 * Licensed under the Apache Software License version 2.0
 * 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.
 ************************************************************************************
 */
package org.encuestame.persistence.dao.imp;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.collections.ListUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.Version;
import org.encuestame.persistence.domain.security.SocialAccount;
import org.encuestame.utils.DateUtil;
import org.encuestame.utils.enums.SearchPeriods;
import org.encuestame.utils.enums.Status;
import org.encuestame.utils.social.SocialProvider;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

/**
 * Abstract Base Dao Class extend Spring class {@link HibernateDaoSupport}
 * @author Picado, Juan juanATencuestame.org
 * @since October 30, 2009
 * @version $Id$
 */
public abstract class AbstractHibernateDaoSupport extends HibernateDaoSupport {

    protected Log log = LogFactory.getLog(this.getClass());

    /**
     * Session.
     */
    private Session session = null;

    /**
     * Default lucene version.
     */
    private Version version = Version.LUCENE_5_3_0;

    /**
     * Default value to similarity searchs.
     */
    protected final Float SIMILARITY_VALUE = 0.4f;

    /**
     * Save or Create entity.
     * @param obj obj
     * @throws HibernateException hibernate
     */
    @Transactional(readOnly = false)
    public void saveOrUpdate(final Object obj) {
        getHibernateTemplate().saveOrUpdate(obj);
        //TODO:MIGRATION  getSession().flush();
        currentSession().flush();

    }

    /**
     *
     * @param obj
     * @throws HibernateException
     */
    public void merge(final Object obj) {
        getHibernateTemplate().merge(obj);
        currentSession().flush();
        //TODO: MIGRATION getSession().flush();
    }

    /**
     * Delete object.
     * @param obj domain
     * @throws HibernateException exception
     */
    public void delete(Object obj) throws HibernateException {
        getHibernateTemplate().delete(obj);
        currentSession().flush();
        //TODO: MIGRATION  getSession().flush();
    }

    /**
     * Filter By Max or Start Items.
     * @param criteria {@link DetachedCriteria}
     * @param maxResults max results
     * @param start start.
     * @return
     */
    public List<?> filterByMaxorStart(final DetachedCriteria criteria, final Integer maxResults,
            final Integer start) {
        @SuppressWarnings("rawtypes")
        List<?> results = new ArrayList();
        if (maxResults != null && start != null) {
            if (maxResults == 0) {
                results = ListUtils.EMPTY_LIST;
            } else {
                results = getHibernateTemplate().findByCriteria(criteria, start, maxResults);
            }
        } else {
            results = getHibernateTemplate().findByCriteria(criteria);
        }
        return results;
    }

    /**
     * Return current midnight date +1.
     * @return midnight date
     */
    public Date getNextDayMidnightDate() {
        return DateUtil.getNextDayMidnightDate();
    }

    /**
     * Return before midnight date -1.
     * @return
     */
    public Date getBefDayMidnightDate() {
        return DateUtil.getBeforeDayMidnightDate();
    }

    /**
     * Return the current date midnight.
     * @return
     */
    //TODO: move to DateUtils
    public Date getCurrentdMidnightDate() {
        final DateMidnight midnightDate = new DateTime().toDateMidnight();
        return midnightDate.toDate();
    }

    /**
     * Return the current date.
     * @return
     */
    //TODO: move to DateUtils
    public Date getCurrentdDateTime() {
        DateTime currentDate = new DateTime();
        return currentDate.toDate();
    }

    /**
     * Get comment time range.
     * @param range
     * @return
     */
    //TODO: move to DateUtils
    public Date getCommentTimeRange(final Integer range) {
        final Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -range);
        return cal.getTime();
    }

    /**
     * Fetch by multi query parser full text.
     * @param keyword keyword to search
     * @param fields list of fields.
     * @param clazz class referece
     * @param criteria {@link Criteria} reference.
     * @param analyzer {@link Analyzer} reference.
     * @return list of results.
     */
    public List<?> fetchMultiFieldQueryParserFullText(final String keyword, final String[] fields,
            final Class<?> clazz, final Criteria criteria, final Analyzer analyzer) {
        final MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer);
        Query query = null;
        try {
            query = parser.parse(keyword);
        } catch (ParseException e) {
            log.error("Error on Parse Query " + e);
        }
        return fetchFullTextSession(clazz, criteria, analyzer, query);
    }

    /**
     * Querying for an exact match on one phrase.
     * @param keyword keyword
     * @param field field to search.
     * @param clazz class reference
     * @param criteria criteria referece
     * @param analyzer {@link Analyzer}.
     * @return
     */
    public List<?> fetchPhraseFullText(final String keyword, final String field, final Class<?> clazz,
            final Criteria criteria, final Analyzer analyzer) {
        final StringTokenizer st = new StringTokenizer(keyword, " ");
        final PhraseQuery query = new PhraseQuery();
        while (st.hasMoreTokens()) {
            query.add(new Term(field, st.nextToken()));
        }
        log.trace("fetchPhraseFullText Query :{" + query.toString() + "}");
        return fetchFullTextSession(clazz, criteria, analyzer, query);
    }

    /**
     * Fetch full text session by regular expresion.
     * @param regExp regular expresion.
     * @param field field to search.
     * @param clazz class reference
     * @param criteria criteria referece
     * @param analyzer {@link Analyzer}.
     * @return list of results.
     */
    public List<?> fetchWildcardFullText(final String regExp, final String field, final Class<?> clazz,
            final Criteria criteria, final Analyzer analyzer) {
        final WildcardQuery query = new WildcardQuery(new Term(field, regExp));
        log.trace("fetchWildcardFullText Query :{" + query.toString() + "}");
        return fetchFullTextSession(clazz, criteria, analyzer, query);
    }

    /**
     * Fetch by prefix as full text search.
     * @param keyword keyword
     * @param field field to search.
     * @param clazz class reference
     * @param criteria criteria referece
     * @param analyzer {@link Analyzer}.
     * @return list of results.
     */
    public List<?> fetchPrefixQueryFullText(final String keyword, final String field, final Class<?> clazz,
            final Criteria criteria, final Analyzer analyzer) {
        final PrefixQuery query = new PrefixQuery(new Term(field, keyword));
        log.trace("fetchPrefixQueryFullText Query :{" + query.toString() + "}");
        return fetchFullTextSession(clazz, criteria, analyzer, query);
    }

    /**
     * Fetch fuzzy keywords as full text search.
     * @param keyword keyword
     * @param field field to search.
     * @param clazz class reference
     * @param criteria criteria referece
     * @param analyzer {@link Analyzer}.
     * @param @{deprecated} similarity similarity factor
     * @return list of results.
     */
    public List<?> fetchFuzzyQueryFullText(final String keyword, final String field, final Class<?> clazz,
            final Criteria criteria, final Analyzer analyzer, final Float similarity) {
        final FuzzyQuery query = new FuzzyQuery(new Term(field, keyword));
        log.trace("fetchPrefixQueryFullText Query :{" + query.toString() + "}");
        return fetchFullTextSession(clazz, criteria, analyzer, query);
    }

    /**
     * Abstract fetch full text session.
     * @param clazz class to search.
     * @param criteria {@link Criteria}
     * @param analyzer {@link Analyzer} reference
     * @param queryOperation {@link Query} reference
     * @return list of results.
     */
    public final List<?> fetchFullTextSession(final Class<?> clazz, final Criteria criteria,
            final Analyzer analyzer, final Query queryOperation) {
        final FullTextSession fullTextSession = Search.getFullTextSession(getSessionFactory().getCurrentSession());
        log.trace("fetchFullTextSession query:{" + queryOperation.toString() + "}");
        final FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(queryOperation, clazz);
        hibernateQuery.setCriteriaQuery(criteria);
        final List<?> result = hibernateQuery.list();
        log.info("fetchFullTextSession result size:{" + result.size() + "}");
        return result;
    }

    /**
     * Set a Criteria between date calculating start and end date.
     * @param searchPeriods {@link SearchPeriods}.
     * @param criteria DetachedCriteria
     */
    protected void calculateSearchPeriodsDates(final SearchPeriods searchPeriods, final DetachedCriteria criteria,
            final String dateProperty) {
        if (searchPeriods != null) {
            final DateTime endDateTime = new DateTime();
            final DateTime startDateTime = endDateTime.minusDays(searchPeriods.toDays());
            if (endDateTime.isAfter(startDateTime)) {
                criteria.add(Restrictions.between(dateProperty, startDateTime.toDate(), endDateTime.toDate()));
            }
        }
    }

    /**
     *
     * @param criteria
     * @param isCompleted
     * @param isScheduled
     * @param isFavourite
     * @param isPublished
     * @param keyword
     * @param period
     */
    protected void advancedTweetPollSearchOptions(final DetachedCriteria criteria, final Boolean isCompleted,
            final Boolean isScheduled, final Boolean isFavourite, final Boolean isPublished, final String keyword,
            final String period) {

        //final SearchPeriods searchPeriods = SearchPeriods.getPeriodString(period);
        //  calculateSearchPeriodsDates(searchPeriods, criteria, "createDate");
        if (keyword != null) {
            criteria.createAlias("question", "question");
            criteria.add(Restrictions.like("question.question", keyword, MatchMode.ANYWHERE));
        }
        if (isCompleted != null && isCompleted) {
            criteria.add(Restrictions.eq("completed", isCompleted));
        }
        if (isScheduled != null && isScheduled) {
            criteria.add(Restrictions.eq("scheduleTweetPoll", isScheduled));
            criteria.add(Restrictions.isNotNull("scheduleDate"));
        }
        if (isFavourite != null && isFavourite) {
            criteria.add(Restrictions.eq("favourites", isFavourite));

        }
        if (isPublished != null && isPublished) {
            criteria.add(Restrictions.eq("publishTweetPoll", isPublished));
        }
    }

    /**
    *
    * @param criteria
    * @param isCompleted
    * @param isScheduled
    * @param isFavourite
    * @param isPublished
    * @param keyword
    * @param period
    */
    protected void advancedPollSearchOptions(final DetachedCriteria criteria, final Boolean isCompleted,
            final Boolean isScheduled, final Boolean isFavourite, final Boolean isPublished, final Boolean isHidden,
            final Boolean isPasswordProtected, final String keyword, final String period) {

        //final SearchPeriods searchPeriods = SearchPeriods.getPeriodString(period);
        //  calculateSearchPeriodsDates(searchPeriods, criteria, "createDate");
        if (keyword != null) {
            criteria.createAlias("question", "question");
            criteria.add(Restrictions.like("question.question", keyword, MatchMode.ANYWHERE));
        }
        if (isCompleted != null && isCompleted) {
            criteria.add(Restrictions.eq("completed", isCompleted));
        }
        if (isScheduled != null && isScheduled) {
            criteria.add(Restrictions.eq("schedule", isScheduled));
            criteria.add(Restrictions.isNotNull("scheduleDate"));
        }
        if (isFavourite != null && isFavourite) {
            criteria.add(Restrictions.eq("favourites", isFavourite));

        }
        if (isPublished != null && isPublished) {
            criteria.add(Restrictions.eq("publish", isPublished));
        }
        if (isHidden != null && isHidden) {
            criteria.add(Restrictions.eq("isHidden", isHidden));
        }
        if (isPasswordProtected != null && isPasswordProtected) {
            criteria.add(Restrictions.eq("isPasswordProtected", isPasswordProtected));
        }
    }

    /**
     *
     * @param criteria
     * @param property
     * @param splist
     */
    public void criteriaSearchSocialLinksByType(final DetachedCriteria criteria, final List<SocialProvider> splist,
            final List<SocialAccount> socialAccounts) {
        criteria.add(Restrictions.isNotNull("tweetId"));
        criteria.add(Restrictions.eq("status", Status.SUCCESS));
        if (splist.size() > 0) {
            criteria.add(Restrictions.in("apiType", splist));
        }
        if (socialAccounts.size() > 0) {
            criteria.add(Restrictions.in("socialAccount", socialAccounts));
        }
    }

    /**
     * Create query to get  {@link TweetPoll}, {@link Poll}, {@link Survey} by geolocation.
     * @param idProperty
     * @param latitudeProperty
     * @param fieldLongitude
     * @param questionNameProperty
     * @param tableName
     * @param creationDateProperty
     * @return
     */
    public String getQueryStringForGeoLocation(final String idProperty, final String latitudeProperty,
            final String fieldLongitude, final String questionNameProperty, final String tableName,
            final String creationDateProperty) {
        //final String queryBetween = this.calculateSearchPeriodForGeo(period, creationDateProperty);
        final String queryStr = "SELECT " + idProperty + "," + latitudeProperty + "," + fieldLongitude + ","
                + questionNameProperty + ", (acos(sin(radians(locationLatitude)) * sin((:latitude)) +"
                + "cos(radians(locationLatitude)) * cos((:latitude)) * "
                + "cos(radians(locationLongitude) - (:longitude))) * :radius) AS " + "distanceFrom FROM "
                + tableName + " WHERE (acos(sin(radians(locationLatitude)) * sin((:latitude)) + "
                + "cos(radians(locationLatitude)) * cos((:latitude)) * cos(radians(locationLongitude) - (:longitude))) * :radius) <= :distance AND "
                + creationDateProperty + " BETWEEN :startDate AND :endDate";
        return queryStr;
    }

    /**
     *
     * @param searchPeriods
     * @return
     */
    protected DateTime calculateSearchPeriodForGeo(final SearchPeriods searchPeriods) {
        DateTime startDateTime = null;
        if (searchPeriods != null) {
            final DateTime endDateTime = new DateTime();
            startDateTime = endDateTime.minusDays(searchPeriods.toDays());

        }
        return startDateTime;
    }

    /**
     * Retrieve geoLocation data from a point.
     *
     * @param query
     * @param latitude
     * @param longitude
     * @param distance
     * @param radius
     * @param maxItems
     * @param startDate
     * @param endDate
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> findByNamedParamGeoLocationItems(final String query, final double latitude,
            final double longitude, final double distance, final double radius, final int maxItems,
            final Date startDate, final Date endDate) {
        return (List<Object[]>) (currentSession().createQuery(query).setParameter("latitude", latitude)
                .setParameter("longitude", longitude).setParameter("radius", radius)
                .setParameter("distance", distance).setParameter("startDate", startDate)
                .setParameter("endDate", endDate).list());

    }

    /**
     * @return the version
     */
    public Version getVersion() {
        return version;
    }

    /**
     * @param version the version to set
     */
    public void setVersion(Version version) {
        this.version = version;
    }
}