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)))));
}
}