diff --git a/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java b/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java index 3392a85aeda56ffa4affd1c777d0a874412d8709..e9abd50734328365f05cb94bd61fb7af2ab0d359 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/UserBean.java @@ -25,6 +25,7 @@ import com.ibm.icu.util.ULocale; import java.io.IOException; import java.io.InputStream; +import java.math.BigInteger; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; @@ -44,11 +45,7 @@ import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import javax.persistence.*; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; @@ -76,6 +73,7 @@ import org.passay.PropertiesMessageResolver; import org.passay.Rule; import org.passay.RuleResult; import org.passay.WhitespaceRule; +import org.postgresql.util.PSQLException; /** * Handles user stuff, credentials @@ -249,7 +247,9 @@ public class UserBean { UserResources retVal = new UserResources(); retVal.setPois(pointOfInterestBean.getPoisForUser(user)); retVal.setMessageLocales(messageBean.getMessageLocaleList(user)); - retVal.setForecastConfigurations(forecastBean.getForecastConfigurationsForUser(user.getUserId())); + List<ForecastConfiguration> forecastConfigurations = forecastBean.getForecastConfigurationsForUser(user.getUserId()); + forecastConfigurations.addAll(forecastBean.getPrivateForecastConfigurationsForUser(user.getUserId())); + retVal.setForecastConfigurations(forecastConfigurations); List<Observation> observations = observationBean.getObservationsForUser(user); observations.addAll(observationBean.getObservationsLastEditedByUser(user)); observations.addAll(observationBean.getObservationsStatusChangedByUser(user)); @@ -298,6 +298,100 @@ public class UserBean { }); } + + /** + * Brute force removal of all data stored by the user - if possible! + * Resources used by other users are transfered to the organization's archive user + * @param user + */ + public void deleteUserResources(VipsLogicUser user) throws DeleteUserException{ + UserResources userResources = this.getUserResources(user); + VipsLogicUser archiveUser = user.getOrganizationId().getArchiveUser(); + + // Forecast configurations + Query deleteForecastResultCache = em.createNativeQuery("DELETE FROM public.forecast_result_cache WHERE forecast_configuration_id=:forecastConfigurationId"); + Query deleteForecastResult = em.createNativeQuery("DELETE FROM public.forecast_result WHERE forecast_configuration_id=:forecastConfigurationId"); + Query deleteForecastSummary = em.createNativeQuery("DELETE FROM public.forecast_summary WHERE forecast_configuration_id=:forecastConfigurationId"); + for(ForecastConfiguration forecastConfiguration:userResources.getForecastConfigurations()) + { + // Delete: + // Results, including cached results + deleteForecastResult.setParameter("forecastConfigurationId", forecastConfiguration.getForecastConfigurationId()).executeUpdate(); + deleteForecastResultCache.setParameter("forecastConfigurationId", forecastConfiguration.getForecastConfigurationId()).executeUpdate(); + + // Summaries + deleteForecastSummary.setParameter("forecastConfigurationId", forecastConfiguration.getForecastConfigurationId()).executeUpdate(); + + System.out.println("forecastConfiguration " + forecastConfiguration.getForecastConfigurationId() + " should be removed now"); + + // Configurations + em.remove(forecastConfiguration); + + } + + // Observations + List<Observation> transferObservations = new ArrayList<>(); + if(userResources.getObservations() != null) + { + for(Observation obs:userResources.getObservations()) + { + // Delete the observations made by the user + if(obs.getUserId().equals(user.getUserId())) + { + em.remove(obs); + } + else + { + // Transfer edit history for 3rd party observations to archive user + transferObservations.add(obs); + } + } + } + + // Delete POI only if no 3rd parties have used it for placing observations + List<PointOfInterest> undeleteablePOIs = new ArrayList<>(); + Query countObservationsQ = em.createNativeQuery("SELECT count(*) FROM public.observation WHERE location_point_of_interest_id=:pointOfInterestId"); + if(userResources.getPois() != null) + { + for(PointOfInterest poi:userResources.getPois()) + { + countObservationsQ.setParameter("pointOfInterestId", poi.getPointOfInterestId()); + Integer r = ((BigInteger) countObservationsQ.getSingleResult()).intValue(); + if(r == 0) + { + em.remove(poi); + } + else + { + undeleteablePOIs.add(poi); + } + } + } + + // Transfer the POI and observation leftovers IF we have an archive user. Otherwise: Throw error! + if(undeleteablePOIs.size() + transferObservations.size() > 0 && archiveUser == null) + { + throw new DeleteUserException("The user's organization " + user.getOrganizationId().getOrganizationName() + " has no archive user. Can't transfer resources created by the user that are used by others."); + } + for(PointOfInterest poi:undeleteablePOIs) + { + poi.setUser(archiveUser); + } + for(Observation obs: transferObservations) + { + obs.setStatusChangedByUserId(archiveUser.getUserId()); + obs.setLastEditedBy(archiveUser.getUserId()); + } + + + + + // Messages + for(MessageLocale ml:userResources.getMessageLocales()) + { + em.remove(ml); + } + } /** *