Add new DAOs

After defining the domain classes, we also want some DAOs to persist and delete ACLs.

New Interfaces

BasicAclObjectIdentityDao

package org.appfuse.dao;
 
import org.appfuse.model.acl.BasicAclObjectIdentity;
 
public interface BasicAclObjectIdentityDao extends GenericDao<BasicAclObjectIdentity, Long> {
 
	/**
	 * Saves a object identity to persistent storage
	 * 
	 * @param basicAclObjectIdentity Identity to save
	 */
	public void saveBasicAclObjectIdentity(BasicAclObjectIdentity basicAclObjectIdentity);
 
	/**
	 * Removes an object identity from persistent storage
	 * 
	 * @param id ID of hte identity to remove
	 */
	public void deleteBasicAclObjectIdentity(Long id);
 
	/**
	 * Loads an object identity with the given id from persistent
	 * storage
	 * 
	 * @param id ID of the identity to load
	 * @return An object identity with the given id
	 */
	public BasicAclObjectIdentity getBasicAclObjectIdentity(Long id);
 
	/**
	 * Loads an object identity by a string representing the Object (e.g.
	 * CLASSNAME:PRIMARY_KEY)
	 * 
	 * @param obejctIdentity The identity (e.g. CLASSNAME:PRIMARY_KEY) of the object
	 * @return An object identity
	 */
	public BasicAclObjectIdentity getBasicAclObjectIdentity(String obejctIdentity);
}

BasicAclPermissionDao

package org.appfuse.dao;
 
import java.util.List;
import java.util.Set;
 
import org.acegisecurity.Authentication;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.acl.basic.BasicAclDao;
import org.appfuse.model.acl.BasicAclPermission;
 
public interface BasicAclPermissionDao extends GenericDao<BasicAclPermission, Long>, BasicAclDao {
 
	/**
	 * Saves a permission to the persistent storage
	 * 
	 * @param basicACLPermission Permission to save
	 */
	public void saveBasicAclPermission(BasicAclPermission basicACLPermission);
 
	/**
	 * Loads a permission from persistent storage by id
	 * 
	 * @param id ID of the permission to load
	 * @return A permission with the id id
	 */
	public BasicAclPermission getBasicAclPermission(Long id);
 
	/**
	 * Removes a permission by the id
	 * @param id Id of the permission to delete
	 */
	public void deleteBasicAclPermission(Long id);
 
	/**
	 * Loads all permissions an user represented by the authentication
	 * has on an object represented by the objectIdentity
	 *  
	 * @param objectIdentity String representing an unique instance of a class
	 * @param auth Authentication represetning the user
	 * @return List of permissions a user has on a specific object
	 */
	public Set<BasicAclPermission> getBasicAclPermissions(String objectIdentity, Authentication auth);
 
	/**
	 * Returns a list of permissions an user (and only the user) with the username
	 * username has on an object represented by the objectIdentity
	 * 
	 * @param objectIdentity String representing an unique instance of a class
	 * @param username Username of the user
	 * @return List of permissions a user has directly on an object
	 */
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity, String username);
 
	/**
	 * Returns a list of permissions the Authorities have on an object represented by
	 * the objectIdentity
	 * 
	 * @param objectIdentity String representing an unique instance of a class
	 * @param authorities Array of authorities
	 * @return List of permissions
	 */
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity, GrantedAuthority[] authorities);
 
	/**
	 * Returns all Permissions granted on an object represented by objectIdentity
	 * 
	 * @param objectIdentity String representing an unique instance of a class
	 * @return All Permissions granted on an object represented by objectIdentity
	 */
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity);
 
	/**
	 * Returns all permissions granted for an user with the username username
	 * 
	 * @param username Username of the user 
	 * @return List of permissions
	 */
	public List<BasicAclPermission> getBasicAclPermissionsByUsername(String username);
 
}

Hibernate Implementation

BasicAclObjectIdentityDaoHibernate

package org.appfuse.dao.hibernate;
 
import org.appfuse.dao.BasicAclObjectIdentityDao;
import org.appfuse.dao.hibernate.GenericDaoHibernate;
import org.appfuse.model.acl.BasicAclObjectIdentity;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.springframework.orm.ObjectRetrievalFailureException;
 
public class BasicAclObjectIdentityDaoHibernate extends
		GenericDaoHibernate<BasicAclObjectIdentity, Long> implements
		BasicAclObjectIdentityDao {
 
	public BasicAclObjectIdentityDaoHibernate() {
		super(BasicAclObjectIdentity.class);
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclObjectIdentityDao#saveBasicAclObjectIdentity(org.appfuse.model.acl.BasicAclObjectIdentity)
	 */
	public void saveBasicAclObjectIdentity(
			BasicAclObjectIdentity basicAclObjectIdentity) {
		getHibernateTemplate().saveOrUpdate(basicAclObjectIdentity);
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclObjectIdentityDao#deleteBasicAclObjectIdentity(java.lang.Long)
	 */
	public void deleteBasicAclObjectIdentity(Long id) {
		getHibernateTemplate().delete(getBasicAclObjectIdentity(id));
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclObjectIdentityDao#getBasicAclObjectIdentity(java.lang.Long)
	 */
	public BasicAclObjectIdentity getBasicAclObjectIdentity(Long id) {
		BasicAclObjectIdentity basicAclObjectIdentity =
			(BasicAclObjectIdentity) getHibernateTemplate().get(BasicAclObjectIdentity.class, id);
 
		if (basicAclObjectIdentity == null) {
			log.warn("Uh oh, BasicAclObjectIdentity with id ['" + id + "'] not found...");
			throw new ObjectRetrievalFailureException(BasicAclObjectIdentity.class, id);
		}
 
		return basicAclObjectIdentity;
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclObjectIdentityDao#getBasicAclObjectIdentity(java.lang.String)
	 */
	public BasicAclObjectIdentity getBasicAclObjectIdentity(String objectIdentity) {
		Query query = getSessionFactory().getCurrentSession().createQuery(
			"select acl from BasicAclObjectIdentity as acl where acl.objectIdentity = :identity");
		query.setParameter("identity", objectIdentity, Hibernate.STRING);
 
		Object result = query.uniqueResult();
 
		if (result == null) {
			throw new ObjectRetrievalFailureException(BasicAclObjectIdentity.class, objectIdentity);
		}
 
		return (BasicAclObjectIdentity) result;
	}
}

BasicAclPermissionDaoHibernate

package org.appfuse.dao.hibernate;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import org.acegisecurity.Authentication;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.acl.basic.AclObjectIdentity;
import org.acegisecurity.acl.basic.BasicAclEntry;
import org.acegisecurity.userdetails.UserDetails;
import org.appfuse.dao.BasicAclPermissionDao;
import org.appfuse.model.acl.BasicAclObjectIdentity;
import org.appfuse.model.acl.BasicAclPermission;
import org.hibernate.Hibernate;
import org.hibernate.Query;
 
public class BasicAclPermissionDaoHibernate extends GenericDaoHibernate<BasicAclPermission, Long>
		implements BasicAclPermissionDao {
 
 
	public BasicAclPermissionDaoHibernate() {
		super(BasicAclPermission.class);
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#saveBasicAclPermission(org.appfuse.model.acl.BasicAclPermission)
	 */
	public void saveBasicAclPermission(BasicAclPermission basicACLPermission) {
		getHibernateTemplate().saveOrUpdate(basicACLPermission);
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermission(java.lang.Long)
	 */
	public BasicAclPermission getBasicAclPermission(Long id) {
		return (BasicAclPermission) getHibernateTemplate().get(
				BasicAclPermission.class, id);
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#deleteBasicAclPermission(java.lang.Long)
	 */
	public void deleteBasicAclPermission(Long id) {
		getHibernateTemplate().delete(getBasicAclPermission(id));
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermissions(java.lang.String, org.acegisecurity.Authentication)
	 */
	public Set<BasicAclPermission> getBasicAclPermissions(String objectIdentity, Authentication auth) {
		Set<BasicAclPermission> toReturn = new HashSet<BasicAclPermission>();
		String username = "";
		if (auth.getPrincipal() instanceof String) {
			username = (String) auth.getPrincipal();
		} else if (auth.getPrincipal() instanceof UserDetails) {
			username = ((UserDetails) auth.getPrincipal()).getUsername();
		}
 
		List<BasicAclPermission> userpermissions = getBasicAclPermissions(objectIdentity, username);
		toReturn.addAll(userpermissions);
		List<BasicAclPermission> authorityPermissions = getBasicAclPermissions(objectIdentity, auth.getAuthorities());
		toReturn.addAll(authorityPermissions);
 
		if (log.isDebugEnabled()) {
			log.debug("Found [ " + toReturn.size() + "] permissions for auth [" + auth +  "]");
		}
		return toReturn;
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermissions(java.lang.String, java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity, String username) {
		String queryString = "from BasicAclPermission as p WHERE p.basicAclObjectIdentity.objectIdentity = :identity " +
				" AND p.objRecipient = :username";
 
		Query query = getSessionFactory().getCurrentSession().createQuery(queryString);
		query.setParameter("identity", objectIdentity, Hibernate.STRING);
		query.setParameter("username", username, Hibernate.STRING);
 
		List<BasicAclPermission> usernameResults = query.list();
		return usernameResults;
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermissions(java.lang.String, org.acegisecurity.GrantedAuthority[])
	 */
	@SuppressWarnings("unchecked")
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity, GrantedAuthority[] authorities) {
 
		// no authorities? -> no need to query
		if (authorities.length < 1) {
			return new ArrayList<BasicAclPermission>();
		}
 
		// construct role parameters for one single query, to lower the performance
		// impact in environments with many roles per user
		StringBuffer sb = new StringBuffer(50);
		for (int i = 0; i < authorities.length; i++) {
			sb.append(":rolename");
			sb.append(i);
			sb.append(", ");
		}
		sb.setLength(sb.length() - 2);
 
		String queryString = "from BasicAclPermission as p WHERE p.basicAclObjectIdentity.objectIdentity = :identity " +
				" AND p.objRecipient in (" + sb.toString() + ")";
 
		Query query = getSessionFactory().getCurrentSession().createQuery(queryString);
		query.setParameter("identity", objectIdentity, Hibernate.STRING);
		for (int i = 0; i < authorities.length; i++) {
			query.setParameter("rolename" + i, authorities[i].getAuthority(), Hibernate.STRING);
		}
		List<BasicAclPermission> toReturn = query.list();
		return toReturn;
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermissions(java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public List<BasicAclPermission> getBasicAclPermissions(String objectIdentity) {
		String queryString = "from BasicAclPermission as p where p.basicAclObjectIdentity.objectIdentity = :identity";
		Query query = getSessionFactory().getCurrentSession().createQuery(queryString);
		query.setParameter("identity", objectIdentity, Hibernate.STRING);
		List<BasicAclPermission> results = query.list();
		return results;
	}
 
	/* (non-Javadoc)
	 * @see org.appfuse.dao.BasicAclPermissionDao#getBasicAclPermissionsByUsername(java.lang.String)
	 */
	@SuppressWarnings("unchecked")
	public List<BasicAclPermission> getBasicAclPermissionsByUsername(String username) {
		String queryString = "select permission from BasicAclPermission as permission where permission.objRecipient = :username";
		Query query = getSessionFactory().getCurrentSession().createQuery(queryString);
		query.setParameter("username", username, Hibernate.STRING);
		List<BasicAclPermission> results = query.list();
		if (log.isDebugEnabled()) {
			log.debug("Found [" + results.size() + "] BasicACLPermissions for user [" + username + "]");
		}
		return results;
	}
 
	/* (non-Javadoc)
	 * @see org.acegisecurity.acl.basic.BasicAclDao#getAcls(org.acegisecurity.acl.basic.AclObjectIdentity)
	 */
	public BasicAclEntry[] getAcls(AclObjectIdentity aclObjectIdentity) {
		if (aclObjectIdentity instanceof BasicAclObjectIdentity) {
			BasicAclObjectIdentity oid = (BasicAclObjectIdentity) aclObjectIdentity;
			List<BasicAclPermission> entries = getBasicAclPermissions(oid.toString());
			return (BasicAclEntry[]) entries.toArray(new BasicAclEntry[] {});
		}
		return null;
	}
}

Define DAOs on the context

For being able to use the DAOs, they have to be defined in applicationContext.xml:

<bean id="basicAclObjectIdentityDao" class="org.appfuse.dao.hibernate.BasicAclObjectIdentityDaoHibernate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
 
<bean id="basicAclPermissionDao" class="org.appfuse.dao.hibernate.BasicAclPermissionDaoHibernate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
Recent changes RSS feed Creative Commons License Donate Driven by DokuWiki