Author: mfranklin
Date: Tue Oct 16 13:46:17 2012
New Revision: 1398792

URL: http://svn.apache.org/viewvc?rev=1398792&view=rev
Log:
completed RegionWidgetRepository

Modified:
    
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionWidgetRepository.java

Modified: 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionWidgetRepository.java
URL: 
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionWidgetRepository.java?rev=1398792&r1=1398791&r2=1398792&view=diff
==============================================================================
--- 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionWidgetRepository.java
 (original)
+++ 
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionWidgetRepository.java
 Tue Oct 16 13:46:17 2012
@@ -20,12 +20,16 @@
 package org.apache.rave.portal.repository.impl;
 
 import org.apache.rave.portal.model.MongoDbRegionWidget;
+import org.apache.rave.portal.model.Page;
+import org.apache.rave.portal.model.Region;
 import org.apache.rave.portal.model.RegionWidget;
-import org.apache.rave.portal.model.conversion.HydratingConverterFactory;
-import org.apache.rave.portal.repository.PageRepository;
 import org.apache.rave.portal.repository.RegionWidgetRepository;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.List;
+
+import static org.springframework.data.mongodb.core.query.Criteria.where;
 
 /**
 
@@ -33,13 +37,7 @@ import org.springframework.data.mongodb.
 public class MongoDbRegionWidgetRepository implements RegionWidgetRepository {
 
     @Autowired
-    private MongoOperations template;
-
-    @Autowired
-    private PageRepository pageRepository;
-
-    @Autowired
-    private HydratingConverterFactory converter;
+    private MongoPageTemplate template;
 
     @Override
     public Class<? extends RegionWidget> getType() {
@@ -48,16 +46,84 @@ public class MongoDbRegionWidgetReposito
 
     @Override
     public RegionWidget get(long id) {
-        return null;
+        Page page = getPageByRegionWidgetId(id);
+        return getRegionWidgetById(page, id);
     }
 
     @Override
     public RegionWidget save(RegionWidget item) {
-        return null;
+        return item.getId() == null ? addNewRegionWidget(item) : 
updateRegionWidget(item);
     }
 
     @Override
     public void delete(RegionWidget item) {
-        //To change body of implemented methods use File | Settings | File 
Templates.
+        Page page = getPageByRegionWidgetId(item.getId());
+        replaceOrRemoveWidget(page, item, false);
+        template.save(page);
+    }
+
+    private RegionWidget updateRegionWidget(RegionWidget item) {
+        RegionWidget savedWidget;Page page = 
getPageByRegionWidgetId(item.getId());
+        replaceOrRemoveWidget(page, item, true);
+        Page saved = template.save(page);
+        savedWidget = getRegionWidgetById(saved, item.getId());
+        return savedWidget;
+    }
+
+    private RegionWidget addNewRegionWidget(RegionWidget item) {
+        Page page = getPageFromRepository(item);
+        Region parent = getRegionById(item.getRegion().getId(), 
page.getRegions());
+        parent.getRegionWidgets().add(item);
+        Page saved = template.save(page);
+        return getRegionById(parent.getId(), 
saved.getRegions()).getRegionWidgets().get(parent.getRegionWidgets().size() -1);
+    }
+
+    private RegionWidget getRegionWidgetById(Page page, Long id) {
+        for(Region region : page.getRegions()) {
+            for(RegionWidget widget : region.getRegionWidgets()) {
+                if(widget.getId().equals(id)) {
+                    return widget;
+                }
+            }
+        }
+        return null;
+    }
+
+    private int replaceOrRemoveWidget(Page page, RegionWidget item, boolean 
replace) {
+        for(Region region : page.getRegions()) {
+            List<RegionWidget> regionWidgets = region.getRegionWidgets();
+            for(int i=0; i< regionWidgets.size(); i++) {
+                if(regionWidgets.get(i).getId().equals(item.getId())) {
+                    regionWidgets.remove(i);
+                    if(replace) {
+                        regionWidgets.add(i, item);
+                    }
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    private Region getRegionById(Long id, List<Region> regions) {
+        for(Region region: regions) {
+            if(id.equals(region.getId())) {
+                return region;
+            }
+        }
+        return null;
+    }
+
+    private Page getPageFromRepository(RegionWidget item) {
+        if(item.getRegion() != null && item.getRegion().getPage() != null && 
item.getRegion().getPage().getId() != null) {
+            return template.get(item.getRegion().getPage().getId());
+        }
+        else {
+            throw new IllegalStateException("Unable to find page for region");
+        }
+    }
+
+    private Page getPageByRegionWidgetId(long id) {
+        return template.findOne(new 
Query(where("regions").elemMatch(where("regionWidgets").elemMatch(where("_id").is(id)))));
     }
 }


Reply via email to