From 0b11059dcefa75f2938756608e90c6a8b7df2e22 Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Wed, 27 Feb 2019 16:00:34 -0500 Subject: [PATCH] #5514 update authenticated user to surviving account --- .../iq/dataverse/DataFileServiceBean.java | 1 + .../edu/harvard/iq/dataverse/DatasetLock.java | 9 ++- .../iq/dataverse/DatasetServiceBean.java | 11 ++++ .../dataverse/DatasetVersionServiceBean.java | 10 ++- .../edu/harvard/iq/dataverse/DvObject.java | 4 +- .../iq/dataverse/DvObjectServiceBean.java | 8 +++ .../iq/dataverse/GuestbookResponse.java | 4 ++ .../GuestbookResponseServiceBean.java | 6 ++ .../edu/harvard/iq/dataverse/api/Admin.java | 13 ++-- .../AuthenticationServiceBean.java | 8 +++ .../command/impl/MergeInAccountCommand.java | 62 ++++++++++++++++++- .../savedsearch/SavedSearchServiceBean.java | 11 ++++ .../dataverse/workflows/WorkflowComment.java | 4 ++ 13 files changed, 139 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java index 361695f6037..efa9179cc25 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse; +import edu.harvard.iq.dataverse.authorization.AccessRequest; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.harvest.client.HarvestingClient; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java b/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java index d85bfe3dad7..dc2dc8457cc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetLock.java @@ -50,9 +50,12 @@ */ @Entity @Table(indexes = {@Index(columnList="user_id"), @Index(columnList="dataset_id")}) -@NamedQueries( - @NamedQuery(name="DatasetLock.getLocksByDatasetId", - query="SELECT lock FROM DatasetLock lock WHERE lock.dataset.id=:datasetId") +@NamedQueries({ + @NamedQuery(name = "DatasetLock.getLocksByDatasetId", + query = "SELECT lock FROM DatasetLock lock WHERE lock.dataset.id=:datasetId"), + @NamedQuery(name = "DatasetLock.getLocksByAuthenticatedUserId", + query = "SELECT lock FROM DatasetLock lock WHERE lock.authenticatedUser.id=:authenticatedUserId") +} ) public class DatasetLock implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java index 55f8d1e1a92..bbed846b1f3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java @@ -337,6 +337,17 @@ public boolean checkDatasetLock(Long datasetId) { return lock.size()>0; } + public List getDatasetLocksByUser( AuthenticatedUser user) { + + TypedQuery query = em.createNamedQuery("DatasetLock.getLocksByAuthenticatedUserId", DatasetLock.class); + query.setParameter("authenticatedUserId", user.getId()); + try { + return query.getResultList(); + } catch (javax.persistence.NoResultException e) { + return null; + } + } + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public DatasetLock addDatasetLock(Dataset dataset, DatasetLock lock) { lock.setDataset(dataset); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index 26439db91f0..13545833a78 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -313,7 +313,15 @@ public String getContributorsNames(DatasetVersion version) { } } return contNames; - } + } + + public List getDatasetVersionUsersByAuthenticatedUser(AuthenticatedUser user){ + + TypedQuery typedQuery = em.createQuery("SELECT u from DatasetVersionUser u where u.authenticatedUser.id = :authenticatedUserId r", DatasetVersionUser.class); + typedQuery.setParameter("authenticatedUserId", user.getId()); + return typedQuery.getResultList(); + + } /** * Query to return the last Released DatasetVersion by Persistent ID diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index 6286985ff76..426aa353fcc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -31,7 +31,9 @@ @NamedQuery(name = "DvObject.findByProtocolIdentifierAuthority", query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol"), @NamedQuery(name = "DvObject.findByOwnerId", - query = "SELECT o FROM DvObject o WHERE o.owner.id=:ownerId") + query = "SELECT o FROM DvObject o WHERE o.owner.id=:ownerId"), + @NamedQuery(name = "DvObject.findByAuthenticatedUserId", + query = "SELECT o FROM DvObject o WHERE o.creator.id=:ownerId or o.releaseUser.id=:releaseUserId") }) @Entity // Inheritance strategy "JOINED" will create 4 db tables - diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java index 2ff41ba134a..9b3e6e60d50 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -64,6 +65,13 @@ public List findAll() { public List findByOwnerId(Long ownerId) { return em.createNamedQuery("DvObject.findByOwnerId").setParameter("ownerId", ownerId).getResultList(); } + + public List findByAuthenticatedUserId(AuthenticatedUser user) { + Query query = em.createNamedQuery("DvObject.findByAuthenticatedUserId"); + query.setParameter("ownerId", user.getId()); + query.setParameter("releaseUser", user.getId()); + return query.getResultList(); + } // FIXME This type-by-string has to go, in favor of passing a class parameter. public DvObject findByGlobalId(String globalIdString, String typeString) { diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index fafb1fc5b9b..7d821ce7e07 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -24,6 +24,10 @@ @Index(columnList = "datafile_id"), @Index(columnList = "dataset_id") }) +@NamedQueries( + @NamedQuery(name = "GuestbookResponse.getGuestbookResponseByAuthenticatedUserId", + query = "SELECT gbr FROM GuestbookResponse gbr WHERE gbr.authenticatedUser.id=:authenticatedUserId") +) public class GuestbookResponse implements Serializable { private static final long serialVersionUID = 1L; @Id diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 41feb44d03b..104e1344a6f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -941,4 +941,10 @@ public Long getCountOfAllGuestbookResponses() { return (Long) query.getSingleResult(); } + public List findByAuthenticatedUserId(AuthenticatedUser user) { + Query query = em.createNamedQuery("GuestbookResponse.findByAuthenticatedUserId"); + query.setParameter("authenticatedUser", user.getId()); + return query.getResultList(); + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index 1e62a9acb48..aec4d472c6b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -316,15 +316,18 @@ public Response deleteAuthenticatedUser(@PathParam("identifier") String identifi @PUT @Path("authenticatedUsers/mergeIntoUser/{identifier}") public Response mergeInAuthenticatedUser(@PathParam("identifier") String baseIdentifier, String consumedIdentifier) { - - //TODO: Confirm the baseIdentifier is real before doing command... if(null == baseIdentifier || baseIdentifier.isEmpty()) { return error(Response.Status.BAD_REQUEST, "Base identifier provided to change is empty."); } else if(null == consumedIdentifier || consumedIdentifier.isEmpty()) { return error(Response.Status.BAD_REQUEST, "Identifier to merge in is empty."); } - + + AuthenticatedUser baseAuthenticatedUser = authSvc.getAuthenticatedUser(baseIdentifier); + if (baseAuthenticatedUser == null) { + return error(Response.Status.BAD_REQUEST, "User " + baseIdentifier + " not found in AuthenticatedUser"); + } + AuthenticatedUser consumedAuthenticatedUser = authSvc.getAuthenticatedUser(consumedIdentifier); if (consumedAuthenticatedUser == null) { return error(Response.Status.BAD_REQUEST, "User " + consumedIdentifier + " not found in AuthenticatedUser"); @@ -339,12 +342,12 @@ public Response mergeInAuthenticatedUser(@PathParam("identifier") String baseIde List consumedRAList = roleAssigneeSvc.getAssignmentsFor("@" + consumedIdentifier); //only AuthenticatedUser supported try { - execCommand(new MergeInAccountCommand(createDataverseRequest(consumedAuthenticatedUser), baseIdentifier, consumedIdentifier, consumedAuthenticatedUser, consumedBuiltinUser, baseRAList, consumedRAList)); + execCommand(new MergeInAccountCommand(createDataverseRequest(consumedAuthenticatedUser), baseIdentifier, consumedIdentifier, consumedAuthenticatedUser, consumedBuiltinUser, baseAuthenticatedUser, baseRAList, consumedRAList)); } catch (Exception e){ return error(Response.Status.BAD_REQUEST, "Error calling ChangeUserIdentifierCommand: " + e.getLocalizedMessage()); } - return ok("CHANGEME"); + return ok("Role Assignements for " + consumedIdentifier + " have been merged into " + baseIdentifier + "."); } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java index 0395c2453db..add4ac97f7f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java @@ -30,6 +30,7 @@ import edu.harvard.iq.dataverse.passwordreset.PasswordResetServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; +import edu.harvard.iq.dataverse.workflows.WorkflowComment; import java.sql.Timestamp; import java.util.Arrays; import java.util.Calendar; @@ -52,6 +53,7 @@ import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.PersistenceContext; +import javax.persistence.Query; import javax.persistence.TypedQuery; import javax.validation.ConstraintViolation; import javax.validation.Validation; @@ -871,5 +873,11 @@ public List getAuthenticationProviderIdsSorted() { google.getId() ); } + + public List getWorkflowCommentsByAuthenticatedUser(AuthenticatedUser user){ + Query query = em.createQuery("SELECT wc FROM WorkflowComment wc WHERE wc.authenticatedUser.id = :auid"); + query.setParameter(":auid", user.getId()); + return query.getResultList(); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/MergeInAccountCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/MergeInAccountCommand.java index 77f80503279..21cd256a506 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/MergeInAccountCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/MergeInAccountCommand.java @@ -6,9 +6,12 @@ */ package edu.harvard.iq.dataverse.engine.command.impl; -import edu.harvard.iq.dataverse.Dataverse; +import edu.harvard.iq.dataverse.DatasetLock; +import edu.harvard.iq.dataverse.DatasetVersionUser; import edu.harvard.iq.dataverse.DvObject; +import edu.harvard.iq.dataverse.GuestbookResponse; import edu.harvard.iq.dataverse.RoleAssignment; +import edu.harvard.iq.dataverse.UserNotification; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserLookup; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; @@ -18,6 +21,8 @@ import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; +import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; +import edu.harvard.iq.dataverse.workflows.WorkflowComment; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -35,6 +40,7 @@ public class MergeInAccountCommand extends AbstractVoidCommand { final AuthenticatedUser consumedAU; final BuiltinUser consumedBU; + final AuthenticatedUser ongoingAU; final String baseIdentifier; final String consumedIdentifier; final List baseRAList; @@ -42,7 +48,8 @@ public class MergeInAccountCommand extends AbstractVoidCommand { private static final Logger logger = Logger.getLogger(MergeInAccountCommand.class.getCanonicalName()); - public MergeInAccountCommand(DataverseRequest createDataverseRequest, String baseIdentifier, String consumedIdentifier, AuthenticatedUser consumedAuthenticatedUser, BuiltinUser consumedBuiltinUser, List baseRAList, List consumedRAList) { + public MergeInAccountCommand(DataverseRequest createDataverseRequest, String baseIdentifier, String consumedIdentifier, AuthenticatedUser consumedAuthenticatedUser, + BuiltinUser consumedBuiltinUser, AuthenticatedUser ongoingAU, List baseRAList, List consumedRAList) { super( createDataverseRequest, (DvObject) null @@ -53,6 +60,7 @@ public MergeInAccountCommand(DataverseRequest createDataverseRequest, String bas this.consumedRAList = consumedRAList; this.baseIdentifier = baseIdentifier; this.consumedIdentifier = consumedIdentifier; + this.ongoingAU = ongoingAU; } @Override @@ -85,6 +93,56 @@ protected void executeImpl(CommandContext ctxt) throws CommandException { .executeUpdate(); logger.log(Level.INFO, "Number of roles deleted : ({0})", resultCount); + // DatasetVersionUser + for (DatasetVersionUser user : ctxt.datasetVersion().getDatasetVersionUsersByAuthenticatedUser(consumedAU)) { + user.setAuthenticatedUser(ongoingAU); + ctxt.em().merge(user); + } + + //DatasetLocks + for (DatasetLock lock : ctxt.datasets().getDatasetLocksByUser(consumedAU)) { + lock.setUser(ongoingAU); + ctxt.em().merge(lock); + } + + //DVObjects creator and release + for (DvObject dvo : ctxt.dvObjects().findByAuthenticatedUserId(consumedAU)) { + if (dvo.getCreator().equals(consumedAU)){ + dvo.setCreator(ongoingAU); + } + if (dvo.getReleaseUser().equals(consumedAU)){ + dvo.setReleaseUser(ongoingAU); + } + ctxt.em().merge(dvo); + } + + //GuestbookResponse + for (GuestbookResponse gbr : ctxt.responses().findByAuthenticatedUserId(consumedAU)) { + gbr.setAuthenticatedUser(ongoingAU); + ctxt.em().merge(gbr); + } + + //UserNotification + for (UserNotification note : ctxt.notifications().findByUser(consumedAU.getId())) { + note.setUser(ongoingAU); + ctxt.em().merge(note); + } + + //SavedSearch + for (SavedSearch search : ctxt.savedSearches().findByAuthenticatedUser(consumedAU)) { + search.setCreator(ongoingAU); + ctxt.em().merge(search); + } + + //Workflow Comments + for (WorkflowComment wc : ctxt.authentication().getWorkflowCommentsByAuthenticatedUser(consumedAU)) { + wc.setAuthenticatedUser(ongoingAU); + ctxt.em().merge(wc); + } + + //Access Request is not an entity. May have to update via sql? + + //TODO: Change id or delete all the objects with foreign keys connected to the old identifier. //Refer to the script in /scripts/migration/scrub_duplicate_emails.sql //Those this may be doable via adding the objects to be altered in java and using cascade. diff --git a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java index 70cc384e1d0..75f373a8ffe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java @@ -9,6 +9,7 @@ import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.DvObjectServiceBean; import edu.harvard.iq.dataverse.EjbDataverseEngine; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.search.SearchServiceBean; import edu.harvard.iq.dataverse.search.SolrQueryResponse; @@ -66,6 +67,16 @@ public SavedSearch find(long id) { return null; } } + + public List findByAuthenticatedUser(AuthenticatedUser user) { + TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM SavedSearch AS o WHERE o.creator.id = :id", SavedSearch.class); + typedQuery.setParameter("id", user.getId()); + try { + return typedQuery.getResultList(); + } catch (NoResultException | NonUniqueResultException ex) { + return null; + } + } public List findAll() { TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM SavedSearch AS o ORDER BY o.id", SavedSearch.class); diff --git a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java index b028e5b3915..29c198e5c0e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflows/WorkflowComment.java @@ -110,6 +110,10 @@ public String getMessage() { public AuthenticatedUser getAuthenticatedUser() { return authenticatedUser; } + + public void setAuthenticatedUser(AuthenticatedUser authenticatedUser){ + this.authenticatedUser = authenticatedUser; + } public Timestamp getCreated() { return created;