/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.hq.authz.server.session;
import java.util.Collection;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hyperic.hq.authz.shared.AuthzConstants;
import org.hyperic.hq.common.server.session.Crispo;
import org.hyperic.hq.common.server.session.CrispoDAO;
import org.hyperic.hq.dao.HibernateDAO;
import org.hyperic.util.config.ConfigResponse;
import org.hyperic.util.pager.PageControl;
import org.hyperic.util.pager.PageList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class AuthzSubjectDAO
extends HibernateDAO<AuthzSubject> {
private CrispoDAO crispoDao;
private ResourceTypeDAO resourceTypeDAO;
private RoleDAO roleDAO;
private ResourceDAO resourceDAO;
@Autowired
public AuthzSubjectDAO(SessionFactory f, CrispoDAO crispoDAO, ResourceTypeDAO resourceTypeDAO,
ResourceDAO resourceDAO, RoleDAO roleDAO) {
super(AuthzSubject.class, f);
this.crispoDao = crispoDAO;
this.resourceDAO = resourceDAO;
this.resourceTypeDAO = resourceTypeDAO;
this.roleDAO = roleDAO;
}
AuthzSubject create(AuthzSubject creator, String name, boolean active, String dsn, String dept,
String email, String first, String last, String phone, String sms,
boolean html) {
AuthzSubject subject = new AuthzSubject(active, dsn, dept, email, html, first, last, name,
phone, sms, false);
save(subject);
// XXX create resource for owner
ResourceType rt = resourceTypeDAO.findByName(AuthzConstants.subjectResourceTypeName);
if (rt == null) {
throw new IllegalArgumentException("resource type not found " +
AuthzConstants.subjectResourceTypeName);
}
Resource r = resourceDAO.create(rt, resourceDAO.findRootResource(), null, /* No Name? */
creator, subject.getId(), false);
subject.setResource(r);
Role role = roleDAO.findByName(AuthzConstants.creatorRoleName);
if (role == null) {
throw new IllegalArgumentException("role not found " + AuthzConstants.creatorRoleName);
}
subject.addRole(role);
// Insert an empty config response
Crispo c = Crispo.create(new ConfigResponse(), false);
crispoDao.save(c);
subject.setPrefs(c);
save(subject);
return subject;
}
public void remove(AuthzSubject entity) {
Crispo c = entity.getPrefs();
entity.setPrefs(null);
crispoDao.remove(c);
super.remove(entity);
}
public AuthzSubject findByAuth(String name, String dsn) {
String sql = "from AuthzSubject s where s.name=? and s.authDsn=?";
return (AuthzSubject) getSession().createQuery(sql).setString(0, name).setString(1, dsn)
.setCacheable(true).setCacheRegion("AuthzSubject.findByAuth").uniqueResult();
}
public AuthzSubject findByName(String name) {
String sql = "from AuthzSubject where name=?";
return (AuthzSubject) getSession().createQuery(sql).setString(0, name).setCacheable(true)
.setCacheRegion("AuthzSubject.findByName").uniqueResult();
}
private Criteria findMatchingNameCriteria(String name) {
name = '%' + name + '%';
return createCriteria().add(
Restrictions.or(Restrictions.ilike("name", name), Restrictions.or(Restrictions.ilike(
"firstName", name), Restrictions.ilike("lastName", name)))).add(
Restrictions.eq("system", Boolean.FALSE));
}
public PageList<AuthzSubject> findMatchingName(String name, PageControl pc) {
Integer count = (Integer) findMatchingNameCriteria(name).setProjection(
Projections.rowCount()).uniqueResult();
Criteria crit = findMatchingNameCriteria(name).addOrder(Order.asc("sortName"));
return getPagedResult(crit, count, pc);
}
/**
* Create the criteria used by findById_orderName() because Criteria does
* not yet support Cloneable
*/
private Criteria findById_orderNameCriteria(Integer[] ids) {
return createCriteria().add(Restrictions.in("id", ids));
}
public PageList<AuthzSubject> findById_orderName(Integer[] ids, PageControl pc) {
Integer count = (Integer) findById_orderNameCriteria(ids).setProjection(
Projections.rowCount()).uniqueResult();
Criteria crit = findById_orderNameCriteria(ids).addOrder(
pc.isAscending() ? Order.asc("sortName") : Order.desc("sortName"));
return getPagedResult(crit, count, pc);
}
public Collection<AuthzSubject> findByIds(Integer[] ids) {
final Criteria criteria = findById_orderNameCriteria(ids);
final List<AuthzSubject> list = criteria.list();
return list;
}
public Collection findAll_order(boolean isRoot, String col, boolean asc, Collection excludes) {
Criteria criteria = createCriteria();
if (isRoot) {
Disjunction disjunctions = Restrictions.disjunction();
disjunctions.add(Restrictions.eq("system", Boolean.FALSE));
disjunctions.add(Restrictions.eq("id", AuthzConstants.rootSubjectId));
criteria.add(disjunctions);
} else {
criteria.add(Restrictions.eq("system", Boolean.FALSE));
}
criteria.addOrder(asc ? Order.asc(col) : Order.desc(col));
if (excludes != null && excludes.size() > 0) {
criteria.add(Restrictions.not(Restrictions.in("id", excludes)));
}
return criteria.list();
}
public Collection<AuthzSubject> findAll_orderName(Collection excludes, boolean asc) {
return findAll_order(false, "sortName", asc, excludes);
}
public Collection<AuthzSubject> findAll_orderFirstName(Collection excludes, boolean asc) {
return findAll_order(false, "firstName", asc, excludes);
}
public Collection<AuthzSubject> findAll_orderLastName(Collection excludes, boolean asc) {
return findAll_order(false, "lastName", asc, excludes);
}
public Collection<AuthzSubject> findAllRoot_orderName(Collection excludes, boolean asc) {
return findAll_order(true, "sortName", asc, excludes);
}
public Collection<AuthzSubject> findAllRoot_orderFirstName(Collection excludes, boolean asc) {
return findAll_order(true, "firstName", asc, excludes);
}
public Collection<AuthzSubject> findAllRoot_orderLastName(Collection excludes, boolean asc) {
return findAll_order(true, "lastName", asc, excludes);
}
public Collection<AuthzSubject> findByRoleId_orderName(Integer roleId, boolean asc) {
return getSession().createQuery(
"select s from AuthzSubject s join fetch s.roles r " + "where r.id = ? and " +
"(s.system = false or s.id = " + AuthzConstants.rootSubjectId +
") order by s.sortName " + (asc ? "asc" : "desc")).setInteger(0, roleId.intValue())
.list();
}
public Collection<AuthzSubject> findByNotRoleId_orderName(Integer roleId, boolean asc) {
return getSession().createQuery(
"select distinct s from AuthzSubject s, Role r " + "where r.id = ? and s.id not in " +
"(select id from r.subjects) and " + "s.system = false order by s.sortName " +
(asc ? "asc" : "desc")).setInteger(0, roleId.intValue()).list();
}
}