/** * 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.content.dao.impl; import org.apache.commons.collections.ListUtils; import org.dspace.content.Community; import org.dspace.content.MetadataField; import org.dspace.content.dao.CommunityDAO; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Restrictions; import java.sql.SQLException; import java.util.Arrays; import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the Community object. * This class is responsible for all database calls for the Community object and is autowired by spring * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com */ public class CommunityDAOImpl extends AbstractHibernateDSODAO<Community> implements CommunityDAO { protected CommunityDAOImpl() { super(); } /** * Get a list of all communities in the system. These are alphabetically * sorted by community name. * * @param context DSpace context object * @param sortField sort field * * @return the communities in the system * @throws SQLException if database error */ @Override public List<Community> findAll(Context context, MetadataField sortField) throws SQLException { return findAll(context, sortField, null, null); } @Override public List<Community> findAll(Context context, MetadataField sortField, Integer limit, Integer offset) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append("SELECT ").append(Community.class.getSimpleName()).append(" FROM Community as ").append(Community.class.getSimpleName()).append(" "); addMetadataLeftJoin(queryBuilder, Community.class.getSimpleName(), Arrays.asList(sortField)); addMetadataSortQuery(queryBuilder, Arrays.asList(sortField), ListUtils.EMPTY_LIST); Query query = createQuery(context, queryBuilder.toString()); if(offset != null) { query.setFirstResult(offset); } if(limit != null){ query.setMaxResults(limit); } query.setParameter(sortField.toString(), sortField.getID()); return list(query); } @Override public Community findByAdminGroup(Context context, Group group) throws SQLException { Criteria criteria = createCriteria(context, Community.class); criteria.add(Restrictions.eq("admins", group)); return singleResult(criteria); } @Override public List<Community> findAllNoParent(Context context, MetadataField sortField) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append("SELECT community FROM Community as community "); addMetadataLeftJoin(queryBuilder, Community.class.getSimpleName().toLowerCase(), Arrays.asList(sortField)); addMetadataValueWhereQuery(queryBuilder, ListUtils.EMPTY_LIST, null, " community.parentCommunities IS EMPTY"); addMetadataSortQuery(queryBuilder, Arrays.asList(sortField), ListUtils.EMPTY_LIST); Query query = createQuery(context, queryBuilder.toString()); query.setParameter(sortField.toString(), sortField.getID()); return findMany(context, query); } @Override public List<Community> findAuthorized(Context context, EPerson ePerson, List<Integer> actions) throws SQLException { /*TableRowIterator tri = DatabaseManager.query(context, "SELECT \n" + " * \n" + "FROM \n" + " public.eperson, \n" + " public.epersongroup2eperson, \n" + " public.epersongroup, \n" + " public.community, \n" + " public.resourcepolicy\n" + "WHERE \n" + " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + " resourcepolicy.epersongroup_id = epersongroup.eperson_group_id AND\n" + " resourcepolicy.resource_id = community.community_id AND\n" + " ( resourcepolicy.action_id = 3 OR \n" + " resourcepolicy.action_id = 11) AND \n" + " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser().getID()); */ Criteria criteria = createCriteria(context, Community.class); criteria.createAlias("resourcePolicies", "resourcePolicy"); Disjunction actionQuery = Restrictions.or(); for (Integer action : actions) { actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); } criteria.add(Restrictions.and( Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COMMUNITY), Restrictions.eq("resourcePolicy.eperson", ePerson), actionQuery )); return list(criteria); } @Override public List<Community> findAuthorizedByGroup(Context context, EPerson ePerson, List<Integer> actions) throws SQLException { // "SELECT \n" + // " * \n" + // "FROM \n" + // " public.eperson, \n" + // " public.epersongroup2eperson, \n" + // " public.epersongroup, \n" + // " public.community, \n" + // " public.resourcepolicy\n" + // "WHERE \n" + // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + // " resourcepolicy.epersongroup_id = epersongroup.eperson_group_id AND\n" + // " resourcepolicy.resource_id = community.community_id AND\n" + // " ( resourcepolicy.action_id = 3 OR \n" + // " resourcepolicy.action_id = 11) AND \n" + // " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Community c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { Integer action = actions.get(i); if(i != 0) { query.append(" AND "); } query.append("rp.actionId=").append(action); } query.append(" AND rp.resourceTypeId=").append(Constants.COMMUNITY); query.append(" AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in elements(epeople))"); Query hibernateQuery = createQuery(context, query.toString()); hibernateQuery.setParameter("eperson_id", ePerson.getID()); return list(hibernateQuery); } @Override public int countRows(Context context) throws SQLException { return count(createQuery(context, "SELECT count(*) FROM Community")); } }