package fi.otavanopisto.pyramus.dao; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import org.apache.commons.lang.StringUtils; import org.hibernate.search.jpa.FullTextEntityManager; import org.hibernate.search.jpa.Search; public abstract class PyramusEntityDAO<T> extends GenericDAO<T> { @SuppressWarnings("unchecked") public List<T> listUnarchived(Integer firstResult, Integer maxResults) { EntityManager entityManager = getEntityManager(); Class<?> genericTypeClass = getGenericTypeClass(); Query query = entityManager.createQuery("select o from " + genericTypeClass.getName() + " o where archived=:archived"); query.setParameter("archived", Boolean.FALSE); if (firstResult != null) { query.setFirstResult(firstResult); } if (maxResults != null) { query.setMaxResults(maxResults); } return query.getResultList(); } public List<T> listUnarchived() { return listUnarchived(null, null); } public void forceReindex(T o) { FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager()); fullTextEntityManager.index(o); } protected void addTokenizedSearchCriteria(StringBuilder queryBuilder, String fieldName, String value, boolean required, Float boost) { String inputText = value.replaceAll(" +", " "); String[] tokens = escapeSearchCriteria(inputText).split("[ ,]"); for (String token : tokens) { if (!StringUtils.isBlank(token)) { queryBuilder.append(' '); if (required) { queryBuilder.append("+"); } queryBuilder.append(fieldName).append(':').append(token); if (boost != null) queryBuilder.append("^").append(boost); } } } protected void addTokenizedSearchCriteria(StringBuilder queryBuilder, String fieldName, String value, boolean required) { addTokenizedSearchCriteria(queryBuilder, fieldName, value, required, null); } protected void addTokenizedSearchCriteria(StringBuilder queryBuilder, String fieldName1, String fieldName2, String value, boolean required) { String inputText = value.replaceAll(" +", " "); String[] tokens = escapeSearchCriteria(inputText).split("[ ,]"); for (String token : tokens) { if (!StringUtils.isBlank(token)) { if (required) { queryBuilder.append("+"); } queryBuilder.append('(').append(fieldName1).append(':').append(token).append(' ').append(fieldName2).append(':').append(token).append(')'); } } } protected void addTokenizedSearchCriteria(StringBuilder queryBuilder, boolean required, String value, String ... fields) { String inputText = value.replaceAll(" +", " "); String[] tokens = escapeSearchCriteria(inputText).split("[ ,]"); for (String token : tokens) { if (!StringUtils.isBlank(token)) { if (required) { queryBuilder.append("+"); } queryBuilder.append('('); for (String field : fields) { queryBuilder.append(field).append(':').append(token).append(' '); } queryBuilder.append(')'); } } } protected String getSearchDateInfinityHigh() { return DATERANGE_INFINITY_HIGH; } protected String getSearchDateInfinityLow() { return DATERANGE_INFINITY_LOW; } protected String getSearchFormattedDate(Date date) { return new SimpleDateFormat("yyyyMMdd").format(date); } private String escapeSearchCriteria(String value) { return value .replaceAll("[\\:\\+\\-\\~\\(\\)\\{\\}\\[\\]\\^\\&\\|\\!\\\\]", "\\\\$0") .replaceAll("[*]{1,}", "\\*"); } private static final String DATERANGE_INFINITY_LOW = "00000000"; private static final String DATERANGE_INFINITY_HIGH = "99999999"; }