package edu.harvard.iq.dataverse.privateurl; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.Serializable; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; /** * * PrivateUrlServiceBean depends on Glassfish and Postgres being available and * it is tested with API tests in DatasetIT. Code that can execute without any * runtime dependencies should be put in PrivateUrlUtil so it can be unit * tested. */ @Stateless @Named public class PrivateUrlServiceBean implements Serializable { private static final Logger logger = Logger.getLogger(PrivateUrlServiceBean.class.getCanonicalName()); @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; @EJB DatasetServiceBean datasetServiceBean; @EJB SystemConfig systemConfig; /** * @return A PrivateUrl if the dataset has one or null. */ public PrivateUrl getPrivateUrlFromDatasetId(long datasetId) { RoleAssignment roleAssignment = getPrivateUrlRoleAssignmentFromDataset(datasetServiceBean.find(datasetId)); return PrivateUrlUtil.getPrivateUrlFromRoleAssignment(roleAssignment, systemConfig.getDataverseSiteUrl()); } /** * @return A PrivateUrlUser if one can be found using the token or null. */ public PrivateUrlUser getPrivateUrlUserFromToken(String token) { return PrivateUrlUtil.getPrivateUrlUserFromRoleAssignment(getRoleAssignmentFromPrivateUrlToken(token)); } /** * @return PrivateUrlRedirectData if it can be found using the token or * null. */ public PrivateUrlRedirectData getPrivateUrlRedirectDataFromToken(String token) { return PrivateUrlUtil.getPrivateUrlRedirectData(getRoleAssignmentFromPrivateUrlToken(token)); } /** * @return A RoleAssignment or null. * * @todo This might be a good place for Optional. */ private RoleAssignment getRoleAssignmentFromPrivateUrlToken(String privateUrlToken) { if (privateUrlToken == null) { return null; } TypedQuery<RoleAssignment> query = em.createNamedQuery( "RoleAssignment.listByPrivateUrlToken", RoleAssignment.class); query.setParameter("privateUrlToken", privateUrlToken); try { RoleAssignment roleAssignment = query.getSingleResult(); return roleAssignment; } catch (NoResultException | NonUniqueResultException ex) { return null; } } /** * @param dataset A non-null dataset; * @return A role assignment for a Private URL, if found, or null. * * @todo This might be a good place for Optional. */ private RoleAssignment getPrivateUrlRoleAssignmentFromDataset(Dataset dataset) { if (dataset == null) { return null; } TypedQuery<RoleAssignment> query = em.createNamedQuery( "RoleAssignment.listByAssigneeIdentifier_DefinitionPointId", RoleAssignment.class); PrivateUrlUser privateUrlUser = new PrivateUrlUser(dataset.getId()); query.setParameter("assigneeIdentifier", privateUrlUser.getIdentifier()); query.setParameter("definitionPointId", dataset.getId()); try { return query.getSingleResult(); } catch (NoResultException | NonUniqueResultException ex) { return null; } } }