You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ca...@apache.org on 2012/05/21 22:22:21 UTC

svn commit: r1341191 - in /rave/trunk: rave-components/rave-core/src/main/java/org/apache/rave/portal/model/ rave-components/rave-core/src/test/java/org/apache/rave/portal/model/ rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/

Author: carlucci
Date: Mon May 21 20:22:20 2012
New Revision: 1341191

URL: http://svn.apache.org/viewvc?rev=1341191&view=rev
Log:
Code in support of RAVE-103: ensure sub pages are sorted according to the PageUser#renderSequence value

Modified:
    rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Page.java
    rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/PageTest.java
    rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/person_profile.jsp

Modified: rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Page.java
URL: http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Page.java?rev=1341191&r1=1341190&r2=1341191&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Page.java (original)
+++ rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/model/Page.java Mon May 21 20:22:20 2012
@@ -29,17 +29,20 @@ import javax.xml.bind.annotation.XmlElem
 import javax.xml.bind.annotation.XmlRootElement;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 /**
  * A page, which consists of regions, and which may be owned by a {@link User} (note the ownership will likely need to
  * become more flexible to enable things like group ownership in the future).
- * 
+ *
  * TODO RAVE-231: not all database providers will be able to support deferrable constraints
  * so for the time being I'm commenting out the owner/render sequence since it
  * will get updated in batches and blow up
  * @UniqueConstraint(columnNames={"owner_id","render_sequence"}
- * 
+ *
  */
 @Entity
 @XmlRootElement
@@ -92,7 +95,7 @@ public class Page implements BasicEntity
     @Column(name = "page_type")
     @Enumerated(EnumType.STRING)
     private PageType pageType;
-    
+
     @OneToMany(targetEntity=PageUser.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="page", orphanRemoval=true)
     private List<PageUser> members;
 
@@ -110,7 +113,7 @@ public class Page implements BasicEntity
 
     public Page() {
     }
-    
+
     public Page(Long entityId) {
         this.entityId = entityId;
     }
@@ -205,7 +208,14 @@ public class Page implements BasicEntity
     }
 
     public List<Page> getSubPages() {
-        return subPages;
+        // we need to manually sort the sub pages due to limitations in JPA's OrderBy annotation dealing with
+        // sub-lists
+        List<Page> orderedSubPages = null;
+        if (this.subPages != null) {
+            orderedSubPages = new ArrayList<Page>(this.subPages);
+            Collections.sort(orderedSubPages, new SubPageComparator());
+        }
+        return orderedSubPages;
     }
 
     public void setSubPages(List<Page> subPages) {
@@ -238,4 +248,43 @@ public class Page implements BasicEntity
     public String toString() {
         return "Page{" + "entityId=" + entityId + ", name=" + name + ", owner=" + owner + ", pageLayout=" + pageLayout + ", pageType=" + pageType + "}";
     }
+
+    /**
+     * Comparator used to sort sub pages.  It looks for PageUser objects representing the sub pages that are owned
+     * by the parent page user, and uses the renderSequence as the sorting field
+     */
+    class SubPageComparator implements Comparator<Page> {
+        @Override
+        public int compare(Page o1, Page o2) {
+            if (o1 == null || o1.getMembers() == null || o1.getMembers().isEmpty()) {
+                return 1;
+            }
+
+            if (o2 == null || o2.getMembers() == null || o2.getMembers().isEmpty()) {
+                return -1;
+            }
+
+            Long o1RenderSequence = null;
+            Long o2RenderSequence = null;
+
+            // find the PageUser object representing the sub page owned by the user
+            for (PageUser pageUser : o1.getMembers()) {
+                if (pageUser.getUser().equals(o1.getOwner())) {
+                    o1RenderSequence = pageUser.getRenderSequence();
+                    break;
+                }
+            }
+
+            // find the PageUser object representing the sub page owned by the user
+            for (PageUser pageUser : o2.getMembers()) {
+                if (pageUser.getUser().equals(o2.getOwner())) {
+                    o2RenderSequence = pageUser.getRenderSequence();
+                    break;
+                }
+            }
+
+            // compare the renderSequences of these two PageUser objects to determine the sort order
+            return o1RenderSequence.compareTo(o2RenderSequence);
+        }
+    }
 }

Modified: rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/PageTest.java
URL: http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/PageTest.java?rev=1341191&r1=1341190&r2=1341191&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/PageTest.java (original)
+++ rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/model/PageTest.java Mon May 21 20:22:20 2012
@@ -25,7 +25,8 @@ import org.junit.Test;
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
 
 /**
  * Tests the Page class.
@@ -42,7 +43,10 @@ public class PageTest {
 	private long renderSequence;
 	private List<Region> regions;
 	private PageUser pageUser;
-	
+
+    private final Long SUB_PAGE_1_ID = 666666L;
+    private final Long SUB_PAGE_2_ID = 121212L;
+
 	@Before
 	public void setup(){
 		page=new Page();
@@ -52,11 +56,41 @@ public class PageTest {
 		testOwner=new User(id);
         parentPage = new Page(parentId);
         subPages = new ArrayList<Page>();
-        subPages.add(new Page());
-        subPages.add(new Page());
+
+        Page subPage1 = new Page();
+        subPage1.setEntityId(SUB_PAGE_1_ID);
+        subPage1.setOwner(testOwner);
+        Page subPage2 = new Page();
+        subPage2.setEntityId(SUB_PAGE_2_ID);
+        subPage2.setOwner(testOwner);
+
+        List<PageUser> pageUsers1 = new ArrayList<PageUser>();
+        PageUser pageUser1 = new PageUser();
+        pageUser1.setUser(testOwner);
+        pageUser1.setPage(subPage1);
+        pageUser1.setRenderSequence(2L);
+        pageUsers1.add(pageUser1);
+        subPage1.setMembers(pageUsers1);
+
+        List<PageUser> pageUsers2 = new ArrayList<PageUser>();
+        PageUser pageUser2 = new PageUser();
+        pageUser2.setUser(new User());
+        pageUser2.setPage(subPage2);
+        pageUser2.setRenderSequence(19L);
+        pageUsers2.add(pageUser2);
+
+        PageUser pageUser3 = new PageUser();
+        pageUser3.setUser(testOwner);
+        pageUser3.setPage(subPage2);
+        pageUser3.setRenderSequence(1L);
+        pageUsers2.add(pageUser3);
+        subPage2.setMembers(pageUsers2);
+
+        subPages.add(subPage1);
+        subPages.add(subPage2);
 		pageLayout=new PageLayout();
 		renderSequence=1223L;
-		
+
 		regions=new ArrayList<Region>();
 		regions.add(new Region());
 		regions.add(new Region());
@@ -68,25 +102,25 @@ public class PageTest {
 		page.setSubPages(subPages);
 		page.setPageLayout(pageLayout);
 		page.setRegions(regions);
-		
+
 		pageUser = new PageUser();
 		pageUser.setPage(page);
 		pageUser.setUser(testOwner);
 		pageUser.setRenderSequence(renderSequence);
 	}
-	
+
 	@After
 	public void tearDown(){
 		page=null;
 	}
-	
+
 	@Test
 	public void testAccessorMethods() {
 		assertTrue(page.getEntityId()==id);
 		assertTrue(page.getName().equals(testName));
 		assertTrue(page.getOwner().equals(testOwner));
 		assertTrue(page.getParentPage().equals(parentPage));
-		assertTrue(page.getSubPages().equals(subPages));
+        assertTrue(page.getSubPages().containsAll(subPages));
 		assertTrue(page.getPageLayout().equals(pageLayout));
 		assertTrue(pageUser.getRenderSequence()==renderSequence);
 	}
@@ -100,4 +134,12 @@ public class PageTest {
 	public void testSubPages(){
 		assertTrue(page.getSubPages().containsAll(subPages));
 	}
+
+    @Test
+    public void testSubPageComparator() {
+        Long previousRenderSequence = -999L;
+        List<Page> subPages = page.getSubPages();
+        assertThat(subPages.get(0).getEntityId(), is(SUB_PAGE_2_ID));
+        assertThat(subPages.get(1).getEntityId(), is(SUB_PAGE_1_ID));
+    }
 }

Modified: rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/person_profile.jsp
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/person_profile.jsp?rev=1341191&r1=1341190&r2=1341191&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/person_profile.jsp (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/layouts/person_profile.jsp Mon May 21 20:22:20 2012
@@ -17,16 +17,17 @@
   specific language governing permissions and limitations
   under the License.
   --%>
+<c:set var="subPages" value="${page.subPages}" />
 <div class="row-fluid" id="personProfileSubPages">
     <ul class="nav nav-tabs outlined">
         <!-- first render the tabs -->
-        <c:forEach var="subPage" items="${page.subPages}" varStatus="subPageStatus">
+        <c:forEach var="subPage" items="${subPages}" varStatus="subPageStatus">
             <li><a href="#tab-${subPage.entityId}" data-toggle="tab"><c:out value="${subPage.name}"/></a></li>
         </c:forEach>
     </ul>
     <!-- now render the sub page bodies -->
     <div class="tab-content outlined">
-    <c:forEach var="subPage" items="${page.subPages}" varStatus="subPageStatus">
+    <c:forEach var="subPage" items="${subPages}" varStatus="subPageStatus">
         <div class="tab-pane" id="tab-${subPage.entityId}">
             <c:forEach var="subPageRegion" items="${subPage.regions}" varStatus="subPageRegionStatus">
                 <rave:region region="${subPageRegion}" regionIdx="${subPageRegionStatus.count}" />