Updated mongo to support sub page retrieval

git-svn-id: https://svn.apache.org/repos/asf/rave/trunk@1558835 
13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/rave/repo
Commit: http://git-wip-us.apache.org/repos/asf/rave/commit/9e5650f2
Tree: http://git-wip-us.apache.org/repos/asf/rave/tree/9e5650f2
Diff: http://git-wip-us.apache.org/repos/asf/rave/diff/9e5650f2

Branch: refs/heads/angular
Commit: 9e5650f225e9749d402d5712ee6df467b0c6b7d7
Parents: bd5d3af
Author: Matthew B. Franklin <[email protected]>
Authored: Thu Jan 16 15:33:03 2014 +0000
Committer: Matthew B. Franklin <[email protected]>
Committed: Thu Jan 16 15:33:03 2014 +0000

----------------------------------------------------------------------
 .../portal/model/util/MongoDbModelUtil.java     |  2 +
 .../repository/impl/MongoDbPageRepository.java  | 69 +++++++++++++++-----
 2 files changed, 55 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/rave/blob/9e5650f2/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/util/MongoDbModelUtil.java
----------------------------------------------------------------------
diff --git 
a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/util/MongoDbModelUtil.java
 
b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/util/MongoDbModelUtil.java
index c31cff2..3875743 100644
--- 
a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/util/MongoDbModelUtil.java
+++ 
b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/util/MongoDbModelUtil.java
@@ -29,6 +29,8 @@ public class MongoDbModelUtil {
 
     private MongoDbModelUtil(){}
 
+    public static final int MAX_TREE_DEPTH = 4;
+
     public static String generateId() {
         return UUID.randomUUID().toString().replace("-", "_");
     }

http://git-wip-us.apache.org/repos/asf/rave/blob/9e5650f2/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPageRepository.java
----------------------------------------------------------------------
diff --git 
a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPageRepository.java
 
b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPageRepository.java
index 063699d..c251093 100644
--- 
a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPageRepository.java
+++ 
b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPageRepository.java
@@ -26,6 +26,7 @@ import org.apache.rave.portal.model.impl.PageImpl;
 import org.apache.rave.portal.model.impl.PageUserImpl;
 import org.apache.rave.portal.model.impl.RegionImpl;
 import org.apache.rave.portal.model.impl.RegionWidgetImpl;
+import org.apache.rave.portal.model.util.MongoDbModelUtil;
 import org.apache.rave.portal.repository.MongoPageOperations;
 import org.apache.rave.portal.repository.PageRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -107,13 +108,25 @@ public class MongoDbPageRepository implements 
PageRepository {
         return MongoDbPage.class;
     }
 
+    //TODO Change persisted page structure to normalize sub pages
     @Override
     public Page get(String  id) {
-        return template.get(id);
+        Page page = template.get(id);
+        //We have to account for sub pages
+        if(page == null) {
+            page = template.findOne(query(new 
Criteria().orOperator(addSubPageQuery(id))));
+            if(page != null) {
+                page = findSubPage(page, id);
+            }
+        }
+        return page;
     }
 
     @Override
     public Page save(Page item) {
+        while(item.getParentPage() != null) {
+            item = item.getParentPage();
+        }
         return template.save(item);
     }
 
@@ -122,6 +135,21 @@ public class MongoDbPageRepository implements 
PageRepository {
         template.remove(query(where("_id").is(item.getId())));
     }
 
+    @Override
+    public List<Page> getAll() {
+        return template.find(new Query());
+    }
+
+    @Override
+    public List<Page> getLimitedList(int offset, int pageSize) {
+        return template.find(new Query().skip(offset).limit(pageSize));
+    }
+
+    @Override
+    public int getCountAll() {
+        return (int) template.count(new Query());
+    }
+
     private List<Page> sort(List<Page> pages, final String  userId) {
         Collections.sort(pages, new Comparator<Page>() {
             @Override
@@ -155,6 +183,30 @@ public class MongoDbPageRepository implements 
PageRepository {
         return -1;
     }
 
+    private Page findSubPage(Page page, String id) {
+        if(page.getSubPages() != null) {
+            for(Page subPage : page.getSubPages()) {
+                if(subPage.getId().equals(id)) {
+                    return subPage;
+                }
+                Page found = findSubPage(subPage, id);
+                if(found != null) {
+                    return found;
+                }
+            }
+        }
+        return null;
+    }
+
+    private Criteria[] addSubPageQuery(String id) {
+       //TODO Dynamically create the criteria in a loop with a max-depth
+       return new Criteria[] {
+            where("subPages").elemMatch(where("_id").is(id)),
+            
where("subPages").elemMatch(where("subPages").elemMatch(where("_id").is(id))),
+            
where("subPages").elemMatch(where("subPages").elemMatch(where("subPages").elemMatch(where("_id").is(id))))
+       };
+    }
+
     /**
      * convertTemplate: PageTemplate, User -> Page
      * Converts the PageTemplate for Person Profiles into a Person Profile Page
@@ -276,19 +328,4 @@ public class MongoDbPageRepository implements 
PageRepository {
         this.template = template;
     }
 
-
-    @Override
-    public List<Page> getAll() {
-        return template.find(new Query());
-    }
-
-    @Override
-    public List<Page> getLimitedList(int offset, int pageSize) {
-        return template.find(new Query().skip(offset).limit(pageSize));
-    }
-
-    @Override
-    public int getCountAll() {
-        return (int) template.count(new Query());
-    }
 }

Reply via email to