You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ja...@apache.org on 2011/11/07 18:45:16 UTC

svn commit: r1198837 - in /incubator/rave/trunk/rave-components/rave-core/src: main/java/org/apache/rave/portal/model/ main/java/org/apache/rave/portal/repository/ main/java/org/apache/rave/portal/repository/impl/ main/java/org/apache/rave/portal/secur...

Author: jasha
Date: Mon Nov  7 17:45:15 2011
New Revision: 1198837

URL: http://svn.apache.org/viewvc?rev=1198837&view=rev
Log:
RAVE-317 clean up User data on delete

Modified:
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/User.java
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetPermissionEvaluator.java
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
    incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/UserTest.java
    incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
    incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/User.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/User.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/User.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/User.java Mon Nov  7 17:45:15 2011
@@ -32,6 +32,7 @@ import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.PreRemove;
@@ -41,7 +42,7 @@ import javax.persistence.Transient;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import javax.persistence.ManyToOne;
+import java.util.Collections;
 
 /**
  * {@inheritDoc}
@@ -297,10 +298,10 @@ public class User implements UserDetails
 
     @PreRemove
     public void preRemove() {
-        for(Authority authority : authorities) {
+        for (Authority authority : authorities) {
             authority.removeUser(this);
         }
-        this.authorities = null;
+        this.authorities = Collections.emptyList();
     }
 
     @Override

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java Mon Nov  7 17:45:15 2011
@@ -72,4 +72,11 @@ public interface UserRepository extends 
      *         Useful for paging.
      */
     int getCountByUsernameOrEmail(String searchTerm);
+
+    /**
+     * Deletes the User and all its trails in the database
+     *
+     * @param user {@link User} to delete
+     */
+    void removeUser(User user);
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java Mon Nov  7 17:45:15 2011
@@ -26,6 +26,7 @@ import org.springframework.stereotype.Re
 
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.rave.persistence.jpa.util.JpaUtil.getPagedResultList;
@@ -81,4 +82,39 @@ public class JpaUserRepository extends A
         Number countResult = (Number) query.getSingleResult();
         return countResult.intValue();
     }
+
+    @Override
+    public void removeUser(User user) {
+        final Long userId = user.getEntityId();
+
+        String deleteRegionWidgetPreference = "DELETE FROM REGION_WIDGET_PREFERENCE WHERE REGION_WIDGET_ID IN (";
+        String selectRegionWidget = "SELECT ENTITY_ID FROM REGION_WIDGET WHERE REGION_ID IN (";
+        String deleteRegionWidget = "DELETE FROM REGION_WIDGET WHERE REGION_ID IN (";
+        String selectRegion = "SELECT ENTITY_ID FROM REGION WHERE PAGE_ID IN (";
+        String deleteRegion = "DELETE FROM REGION WHERE PAGE_ID IN (";
+        String selectPage = "SELECT ENTITY_ID FROM PAGE WHERE OWNER_ID = ?";
+        String deletePage = "DELETE FROM PAGE WHERE OWNER_ID = ?";
+
+        String deleteWidgetComment = "DELETE FROM WIDGET_COMMENT WHERE USER_ID = ?";
+        String deleteWidgetRating = "DELETE FROM WIDGET_RATING WHERE USER_ID = ?";
+        String updateWidget = "UPDATE WIDGET SET OWNER_ID = null WHERE OWNER_ID = ?";
+
+        List<String> queryStrings = new ArrayList<String>();
+        queryStrings.add(deleteRegionWidgetPreference + selectRegionWidget + selectRegion + selectPage + ")))");
+        queryStrings.add(deleteRegionWidget + selectRegion + selectPage + "))");
+        queryStrings.add(deleteRegion + selectPage + ")");
+        queryStrings.add(deletePage);
+        queryStrings.add(deleteWidgetComment);
+        queryStrings.add(deleteWidgetRating);
+        queryStrings.add(updateWidget);
+
+        final int userIdParam = 1;
+        for (String queryString : queryStrings) {
+            Query query = manager.createNativeQuery(queryString);
+            query.setParameter(userIdParam, userId);
+            query.executeUpdate();
+        }
+
+        this.delete(user);
+    }
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetPermissionEvaluator.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetPermissionEvaluator.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetPermissionEvaluator.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/security/impl/DefaultWidgetPermissionEvaluator.java Mon Nov  7 17:45:15 2011
@@ -18,8 +18,9 @@
  */
 package org.apache.rave.portal.security.impl;
 
-import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.model.Widget;
+import org.apache.rave.portal.model.WidgetStatus;
 import org.apache.rave.portal.repository.WidgetRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +31,6 @@ import org.springframework.stereotype.Co
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.rave.portal.model.WidgetStatus;
 
 @Component
 public class DefaultWidgetPermissionEvaluator extends AbstractModelPermissionEvaluator<Widget>{
@@ -130,7 +130,7 @@ public class DefaultWidgetPermissionEval
     // returns a trusted Widget object, either from the WidgetRepository, or the
     // cached container list
     private Widget getTrustedWidget(long widgetId, List<Widget> trustedWidgetContainer) {
-        Widget widget = null;
+        Widget widget;
         if (trustedWidgetContainer.isEmpty()) {
             widget = widgetRepository.get(widgetId);
             trustedWidgetContainer.add(widget);
@@ -144,7 +144,10 @@ public class DefaultWidgetPermissionEval
     // if trustedDomainObject is false, pull the entity from the database first to ensure
     // the model object is trusted and hasn't been modified
     private boolean isWidgetOwner(Authentication authentication, Widget widget, List<Widget> trustedWidgetContainer, boolean trustedDomainObject) {
-        Widget trustedWidget = null;
+        if (widget.getOwner() == null) {
+            return false;
+        }
+        Widget trustedWidget;
         if (trustedDomainObject) {
             trustedWidget = widget;
         } else {
@@ -162,7 +165,7 @@ public class DefaultWidgetPermissionEval
     }
     
     private boolean isPublishedWidget(Widget widget, List<Widget> trustedWidgetContainer, boolean trustedDomainObject) {
-        Widget trustedWidget = null;
+        Widget trustedWidget;
         if (trustedDomainObject) {
             trustedWidget = widget;
         } else {
@@ -172,7 +175,7 @@ public class DefaultWidgetPermissionEval
     }    
 
     private boolean verifyRaveSecurityContext(Authentication authentication, RaveSecurityContext raveSecurityContext) {
-        Class<?> clazz = null;
+        Class<?> clazz;
         try {
            clazz = Class.forName(raveSecurityContext.getType());
         } catch (ClassNotFoundException ex) {

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java Mon Nov  7 17:45:15 2011
@@ -19,10 +19,8 @@
 
 package org.apache.rave.portal.service.impl;
 
-import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.util.SearchResult;
-import org.apache.rave.portal.repository.PageRepository;
 import org.apache.rave.portal.repository.UserRepository;
 import org.apache.rave.portal.service.UserService;
 import org.slf4j.Logger;
@@ -50,12 +48,9 @@ public class DefaultUserService implemen
 
     private final UserRepository userRepository;
 
-    private final PageRepository pageRepository;
-
     @Autowired
-    public DefaultUserService(UserRepository userRepository, PageRepository pageRepository) {
+    public DefaultUserService(UserRepository userRepository) {
         this.userRepository = userRepository;
-        this.pageRepository = pageRepository;
     }
 
     @Override
@@ -169,10 +164,7 @@ public class DefaultUserService implemen
         if (user == null) {
             return;
         }
-        for (Page page : pageRepository.getAllPages(userId)) {
-            pageRepository.delete(page);
-        }
-        userRepository.delete(user);
+        userRepository.removeUser(user);
     }
 
 }
\ No newline at end of file

Modified: incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/UserTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/UserTest.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/UserTest.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/UserTest.java Mon Nov  7 17:45:15 2011
@@ -21,6 +21,10 @@ package org.apache.rave.portal.model;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -99,4 +103,27 @@ public class UserTest {
         assertTrue("Account and credential expirations handled correctly", !user2.isAccountNonExpired() && !user2.isCredentialsNonExpired());
     }
 
+    @Test
+    public void preRemove() {
+        User user = new User(123L, "DummyUser");
+
+        Collection<Authority> authorities = new ArrayList<Authority>();
+        Authority authority = new Authority();
+        authority.setEntityId(456L);
+        authority.setAuthority("DummyAuthority");
+        authority.addUser(user);
+        authorities.add(authority);
+
+        user.addAuthority(authority);
+
+        assertFalse(user.getAuthorities().isEmpty());
+        assertEquals(authorities, user.getAuthorities());
+        assertEquals(user, authority.getUsers().iterator().next());
+
+        user.preRemove();
+
+        assertTrue(user.getAuthorities().isEmpty());
+        assertTrue(authority.getUsers().isEmpty());
+    }
+
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java Mon Nov  7 17:45:15 2011
@@ -21,7 +21,10 @@ package org.apache.rave.portal.repositor
 
 import junit.framework.Assert;
 import org.apache.rave.portal.model.Authority;
+import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.repository.AuthorityRepository;
+import org.apache.rave.portal.repository.UserRepository;
 import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,10 +35,10 @@ import org.springframework.transaction.a
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
 import java.util.List;
 
-import org.apache.rave.portal.repository.AuthorityRepository;
-import org.apache.rave.portal.repository.UserRepository;
+import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
@@ -163,4 +166,21 @@ public class JpaUserRepositoryTest {
         int count = repository.getCountByUsernameOrEmail(searchTerm);
         assertTrue(count > 1);
     }
+
+    @Test
+    public void removeUser() {
+        User user = repository.get(USER_ID);
+        assertNotNull(user);
+        final TypedQuery<Page> pageQuery = manager.createNamedQuery("Page.getByUserId", Page.class);
+        pageQuery.setParameter("userId", USER_ID);
+        List<Page> pages = pageQuery.getResultList();
+        assertFalse("User has pages", pages.isEmpty());
+
+        repository.removeUser(user);
+
+        user = repository.get(USER_ID);
+        assertNull(user);
+        pages = pageQuery.getResultList();
+        assertTrue("User has no pages", pages.isEmpty());
+    }
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java?rev=1198837&r1=1198836&r2=1198837&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java Mon Nov  7 17:45:15 2011
@@ -23,7 +23,6 @@ import org.apache.rave.portal.model.Auth
 import org.apache.rave.portal.model.Page;
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.util.SearchResult;
-import org.apache.rave.portal.repository.PageRepository;
 import org.apache.rave.portal.repository.UserRepository;
 import org.apache.rave.portal.service.UserService;
 import org.junit.After;
@@ -41,7 +40,6 @@ import org.springframework.security.core
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
@@ -59,15 +57,13 @@ public class DefaultUserServiceTest {
     private static final Long USER_ID = 1234L;
     private UserService service;
     private UserRepository userRepository;
-    private PageRepository pageRepository;
     private static final String USER_NAME = "1234";
     private static final String USER_EMAIL = "test@test.com";
 
     @Before
     public void setup() {
         userRepository = createNiceMock(UserRepository.class);
-        pageRepository = createMock(PageRepository.class);
-        service = new DefaultUserService(userRepository, pageRepository);
+        service = new DefaultUserService(userRepository);
     }
 
     @After
@@ -247,14 +243,12 @@ public class DefaultUserServiceTest {
         Page page = new Page(1L, user);
         List<Page> pages = new ArrayList<Page>();
         pages.add(page);
-        expect(pageRepository.getAllPages(USER_ID)).andReturn(pages);
         expect(userRepository.get(USER_ID)).andReturn(user).times(1);
-        pageRepository.delete(page);
         expectLastCall();
-        replay(userRepository, pageRepository);
+        replay(userRepository);
 
         service.deleteUser(USER_ID);
-        verify(userRepository, pageRepository);
+        verify(userRepository);
 
         assertTrue("Deleted", true);
     }