/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.eperson.dao.impl; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataField; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.dao.EPersonDAO; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Restrictions; import java.sql.SQLException; import java.util.*; /** * Hibernate implementation of the Database Access Object interface class for the EPerson object. * This class is responsible for all database calls for the EPerson object and is autowired by spring * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com */ public class EPersonDAOImpl extends AbstractHibernateDSODAO<EPerson> implements EPersonDAO { protected EPersonDAOImpl() { super(); } @Override public EPerson findByEmail(Context context, String email) throws SQLException { // All email addresses are stored as lowercase, so ensure that the email address is lowercased for the lookup Criteria criteria = createCriteria(context, EPerson.class); criteria.add(Restrictions.eq("email", email.toLowerCase())); return uniqueResult(criteria); } @Override public EPerson findByNetid(Context context, String netid) throws SQLException { Criteria criteria = createCriteria(context, EPerson.class); criteria.add(Restrictions.eq("netid", netid)); return uniqueResult(criteria); } @Override public List<EPerson> search(Context context, String query, List<MetadataField> queryFields, List<MetadataField> sortFields, int offset, int limit) throws SQLException { String queryString = "SELECT " + EPerson.class.getSimpleName().toLowerCase() + " FROM EPerson as " + EPerson.class.getSimpleName().toLowerCase() + " "; if(query != null) query= "%"+query.toLowerCase()+"%"; Query hibernateQuery = getSearchQuery(context, queryString, query, queryFields, sortFields, null); if(0 <= offset) { hibernateQuery.setFirstResult(offset); } if(0 <= limit) { hibernateQuery.setMaxResults(limit); } return list(hibernateQuery); } @Override public int searchResultCount(Context context, String query, List<MetadataField> queryFields) throws SQLException { String queryString = "SELECT count(*) FROM EPerson as " + EPerson.class.getSimpleName().toLowerCase(); Query hibernateQuery = getSearchQuery(context, queryString, query, queryFields, ListUtils.EMPTY_LIST, null); return count(hibernateQuery); } @Override public List<EPerson> findAll(Context context, MetadataField metadataSortField, String sortField, int pageSize, int offset) throws SQLException { String queryString = "SELECT " + EPerson.class.getSimpleName().toLowerCase() + " FROM EPerson as " + EPerson.class.getSimpleName().toLowerCase(); List<MetadataField> sortFields = ListUtils.EMPTY_LIST; if(metadataSortField!=null){ sortFields = Collections.singletonList(metadataSortField); } Query query = getSearchQuery(context, queryString, null, ListUtils.EMPTY_LIST, sortFields, sortField, pageSize, offset); return list(query); } @Override public List<EPerson> findByGroups(Context context, Set<Group> groups) throws SQLException { Query query = createQuery(context, "SELECT DISTINCT e FROM EPerson e " + "JOIN e.groups g " + "WHERE g.id IN (:idList) "); List<UUID> idList = new ArrayList<>(groups.size()); for (Group group : groups) { idList.add(group.getID()); } query.setParameterList("idList", idList); return list(query); } @Override public List<EPerson> findWithPasswordWithoutDigestAlgorithm(Context context) throws SQLException { Criteria criteria = createCriteria(context, EPerson.class); criteria.add(Restrictions.and( Restrictions.isNotNull("password"), Restrictions.isNull("digestAlgorithm") )); return list(criteria); } @Override public List<EPerson> findNotActiveSince(Context context, Date date) throws SQLException { Criteria criteria = createCriteria(context, EPerson.class); criteria.add(Restrictions.le("lastActive", date)); return list(criteria); } protected Query getSearchQuery(Context context, String queryString, String queryParam, List<MetadataField> queryFields, List<MetadataField> sortFields, String sortField) throws SQLException { return getSearchQuery(context, queryString, queryParam, queryFields, sortFields, sortField, -1, -1); } protected Query getSearchQuery(Context context, String queryString, String queryParam, List<MetadataField> queryFields, List<MetadataField> sortFields, String sortField, int pageSize, int offset) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append(queryString); Set<MetadataField> metadataFieldsToJoin = new LinkedHashSet<>(); metadataFieldsToJoin.addAll(queryFields); metadataFieldsToJoin.addAll(sortFields); if(!CollectionUtils.isEmpty(metadataFieldsToJoin)) { addMetadataLeftJoin(queryBuilder, EPerson.class.getSimpleName().toLowerCase(), metadataFieldsToJoin); } if(queryParam != null) { addMetadataValueWhereQuery(queryBuilder, queryFields, "like", EPerson.class.getSimpleName().toLowerCase() + ".email like :queryParam"); } if(!CollectionUtils.isEmpty(sortFields)) { addMetadataSortQuery(queryBuilder, sortFields, Collections.singletonList(sortField)); } Query query = createQuery(context, queryBuilder.toString()); if (pageSize > 0) { query.setMaxResults(pageSize); } if (offset > 0) { query.setFirstResult(offset); } if(StringUtils.isNotBlank(queryParam)) { query.setParameter("queryParam", "%"+queryParam.toLowerCase()+"%"); } for (MetadataField metadataField : metadataFieldsToJoin) { query.setParameter(metadataField.toString(), metadataField.getID()); } return query; } @Override public List<EPerson> findAllSubscribers(Context context) throws SQLException { return list(createQuery(context, "SELECT DISTINCT e from Subscription s join s.ePerson e")); } @Override public int countRows(Context context) throws SQLException { return count(createQuery(context, "SELECT count(*) FROM EPerson")); } }