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}" />


Reply via email to