diff src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/DataverseRoleServiceBean.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,244 @@
+package edu.harvard.iq.dataverse;
+
+import edu.harvard.iq.dataverse.authorization.DataverseRole;
+import edu.harvard.iq.dataverse.authorization.RoleAssignee;
+import edu.harvard.iq.dataverse.authorization.users.User;
+import edu.harvard.iq.dataverse.authorization.RoleAssignmentSet;
+import edu.harvard.iq.dataverse.search.IndexResponse;
+import edu.harvard.iq.dataverse.search.SolrIndexServiceBean;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+/**
+ *
+ * @author michael
+ */
+@Stateless
+@Named
+public class DataverseRoleServiceBean implements java.io.Serializable {
+
+    private static final Logger logger = Logger.getLogger(IndexServiceBean.class.getCanonicalName());
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    private EntityManager em;
+      
+    @EJB RoleAssigneeServiceBean roleAssigneeService;
+    @EJB IndexServiceBean indexService;   
+    @EJB SolrIndexServiceBean solrIndexService;
+
+	public DataverseRole save( DataverseRole aRole ) {
+		if ( aRole.getId() == null ) {
+			em.persist(aRole);
+                    /**
+                     * @todo Why would getId be null? Should we call
+                     * indexDefinitionPoint here too?
+                     * A: it's null for new roles.
+                     */
+			return aRole;
+		} else {
+                    DataverseRole merged = em.merge(aRole);
+                    /**
+                     * @todo update permissionModificationTime here.
+                     */
+                    IndexResponse indexDefinitionPountResult = indexDefinitionPoint(merged.getOwner());
+                    logger.info("aRole getId was not null. Indexing result: " + indexDefinitionPountResult);
+                    return merged;
+		}
+	}
+	
+	public RoleAssignment save( RoleAssignment assignment ) {
+		if ( assignment.getId() == null ) {
+			em.persist(assignment);
+			em.flush();
+		} else {
+			assignment = em.merge( assignment );
+		}
+            /**
+             * @todo update permissionModificationTime here.
+             */
+            IndexResponse indexDefinitionPountResult = indexDefinitionPoint(assignment.getDefinitionPoint());
+            logger.fine("output from indexing operations: " + indexDefinitionPountResult);
+                return assignment;
+	}
+
+    private IndexResponse indexDefinitionPoint(DvObject definitionPoint) {
+        /**
+         * @todo Do something with the index response. Was Solr down? Is
+         * everything ok?
+         */
+        IndexResponse indexResponse = solrIndexService.indexPermissionsOnSelfAndChildren(definitionPoint);
+        return indexResponse;
+    }
+
+	public DataverseRole find( Long id ) {
+		return em.find( DataverseRole.class, id );
+	}
+	
+	public List<DataverseRole> findAll() {
+		return em.createNamedQuery("DataverseRole.listAll", DataverseRole.class).getResultList();
+	}
+	
+	public void delete( Long id ) {
+		em.createNamedQuery("DataverseRole.deleteById", DataverseRole.class)
+				.setParameter("id", id)
+				.executeUpdate();
+	}
+	
+	public List<DataverseRole> findByOwnerId( Long ownerId ) {
+		return em.createNamedQuery("DataverseRole.findByOwnerId", DataverseRole.class)
+				.setParameter("ownerId", ownerId)
+				.getResultList();
+	}
+        
+	
+	public List<DataverseRole> findBuiltinRoles() {
+		return em.createNamedQuery("DataverseRole.findBuiltinRoles", DataverseRole.class)
+				.getResultList();
+	}
+        
+	
+	public DataverseRole findBuiltinRoleByAlias(String alias) {
+		return em.createNamedQuery("DataverseRole.findBuiltinRoleByAlias", DataverseRole.class)
+                                .setParameter("alias", alias)
+				.getSingleResult();
+        }
+	
+	public void revoke( Set<DataverseRole> roles, RoleAssignee assignee, DvObject defPoint ) {
+		for ( DataverseRole role : roles ) {
+			em.createNamedQuery("RoleAssignment.deleteByAssigneeIdentifier_RoleIdDefinition_PointId")
+					.setParameter("assigneeIdentifier", assignee.getIdentifier())
+					.setParameter("roleId", role.getId())
+					.setParameter("definitionPointId", defPoint.getId())
+					.executeUpdate();
+			em.refresh(role);
+		}
+		em.refresh(assignee);
+	}
+	
+	public void revoke( RoleAssignment ra ) {
+		if ( ! em.contains(ra) ) {
+			ra = em.merge(ra);
+		}
+		em.remove(ra);
+            /**
+             * @todo update permissionModificationTime here.
+             */
+            IndexResponse indexDefinitionPointResult = indexDefinitionPoint(ra.getDefinitionPoint());
+            logger.fine("indexing operation results: " + indexDefinitionPointResult);
+	}
+	
+	public RoleAssignmentSet roleAssignments( User user, Dataverse dv ) {
+		RoleAssignmentSet retVal = new RoleAssignmentSet(user);
+		while ( dv != null ) {
+			retVal.add( directRoleAssignments(user, dv) );
+			if ( dv.isPermissionRoot() ) break;
+			dv = dv.getOwner();
+		}
+		return retVal;
+	}
+	
+    public List<RoleAssignment> roleAssignments( Long roleId ) {
+        return em.createNamedQuery("RoleAssignment.listByRoleId", RoleAssignment.class)
+                .setParameter("roleId", roleId)
+                .getResultList();
+    }
+    
+	public RoleAssignmentSet assignmentsFor( final User u, final DvObject d ) {
+		return d.accept( new DvObject.Visitor<RoleAssignmentSet>() {
+
+			@Override
+			public RoleAssignmentSet visit(Dataverse dv) {
+				return roleAssignments(u, dv);
+			}
+
+			@Override
+			public RoleAssignmentSet visit(Dataset ds) {
+				RoleAssignmentSet asgn = ds.getOwner().accept(this);
+				asgn.add( directRoleAssignments(u, ds) );
+				return asgn;
+			}
+
+			@Override
+			public RoleAssignmentSet visit(DataFile df) {
+				RoleAssignmentSet asgn = df.getOwner().accept(this);
+				asgn.add( directRoleAssignments(u, df) );
+				return asgn;
+			}
+		});
+	}
+	
+	public Set<RoleAssignment> rolesAssignments( DvObject dv ) {
+		Set<RoleAssignment> ras = new HashSet<>();
+		while ( !dv.isEffectivelyPermissionRoot() ) {
+			ras.addAll( em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class)
+					.setParameter("definitionPointId", dv.getId() ).getResultList() );
+			dv = dv.getOwner();
+		}
+		
+		ras.addAll( em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class)
+					.setParameter("definitionPointId", dv.getId() ).getResultList() );
+		
+		return ras;
+	}
+	
+	/**
+	 * Retrieves the roles assignments for {@code user}, directly on {@code dv}.
+	 * No traversal on the containment hierarchy is done.
+	 * @param roas the user whose roles are given
+	 * @param dvo the object where the roles are defined.
+	 * @return Set of roles defined for the user in the given dataverse.
+	 * @see #roleAssignments(edu.harvard.iq.dataverse.DataverseUser, edu.harvard.iq.dataverse.Dataverse)
+	 */
+	public List<RoleAssignment> directRoleAssignments( RoleAssignee roas, DvObject dvo ) {
+		if ( roas==null ) throw new IllegalArgumentException("RoleAssignee cannot be null");
+		TypedQuery<RoleAssignment> query = em.createNamedQuery(
+				"RoleAssignment.listByAssigneeIdentifier_DefinitionPointId",
+				RoleAssignment.class);
+		query.setParameter("assigneeIdentifier", roas.getIdentifier());
+		query.setParameter("definitionPointId", dvo.getId());
+		return query.getResultList();
+	}
+	
+	/**
+	 * Retrieves the roles assignments for {@code user}, directly on {@code dv}.
+	 * No traversal on the containment hierarchy is done.
+	 * @param dvo the object where the roles are defined.
+	 * @return Set of roles defined for the user in the given dataverse.
+	 * @see #roleAssignments(edu.harvard.iq.dataverse.DataverseUser, edu.harvard.iq.dataverse.Dataverse)
+	 */
+	public List<RoleAssignment> directRoleAssignments( DvObject dvo ) {
+		TypedQuery<RoleAssignment> query = em.createNamedQuery(
+				"RoleAssignment.listByDefinitionPointId",
+				RoleAssignment.class);
+		query.setParameter("definitionPointId", dvo.getId());
+		return query.getResultList();
+	}
+	
+	/**
+	 * Get all the available roles in a given dataverse, mapped by the
+	 * dataverse that defines them. Map entries are ordered by reversed hierarchy 
+	 * (root is always last).
+	 * @param dvId The id of dataverse whose available roles we query
+	 * @return map of available roles.
+	 */
+	public Set<DataverseRole> availableRoles( Long dvId ) {              
+                Dataverse dv = em.find(Dataverse.class, dvId);
+                Set<DataverseRole> roles = dv.getRoles(); 
+                roles.addAll(findBuiltinRoles());
+
+		while ( !dv.isEffectivelyPermissionRoot() ) {
+			dv = dv.getOwner();
+			roles.addAll( dv.getRoles() );
+		}
+		
+		return roles;
+	}                
+}