Applying patch from Stanton Sievers for RAVE-1086 git-svn-id: https://svn.apache.org/repos/asf/rave/trunk@1569475 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/b806acb8 Tree: http://git-wip-us.apache.org/repos/asf/rave/tree/b806acb8 Diff: http://git-wip-us.apache.org/repos/asf/rave/diff/b806acb8 Branch: refs/heads/angular Commit: b806acb86764b36af321f50daed07ca9ddffced6 Parents: 902753c Author: Matthew B. Franklin <[email protected]> Authored: Tue Feb 18 18:58:10 2014 +0000 Committer: Matthew B. Franklin <[email protected]> Committed: Tue Feb 18 18:58:10 2014 +0000 ---------------------------------------------------------------------- .../portal/service/impl/DefaultPageService.java | 127 ++++++++++++------- .../service/impl/DefaultPageServiceTest.java | 44 ++++--- .../impl/MongoDbRegionRepository.java | 37 +++++- 3 files changed, 142 insertions(+), 66 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/rave/blob/b806acb8/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java ---------------------------------------------------------------------- diff --git a/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java b/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java index 5b35b37..fadc1cf 100644 --- a/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java +++ b/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java @@ -40,6 +40,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -166,47 +168,7 @@ public class DefaultPageService implements PageService { @Override @Transactional public Page addNewSubPage(String pageName, String pageLayoutCode, Page parentPage) { - User user = userService.getAuthenticatedUser(); - PageLayout pageLayout = pageLayoutRepository.getByPageLayoutCode(pageLayoutCode); - - // Create regions - List<Region> regions = new ArrayList<Region>(); - List<Page> parentsSubPages = new ArrayList<Page>(); - int regionCount; - for (regionCount = 0; regionCount < pageLayout.getNumberOfRegions(); regionCount++) { - Region region = new RegionImpl(); - region.setRenderOrder(regionCount); - // TODO: this should eventually be defined by the PageTemplateRegion.locked field - region.setLocked(false); - regions.add(region); - } - - // Create a Page object and register it. - long renderSequence = (parentPage.getSubPages() != null) ? parentPage.getSubPages().size() + 1 : 1; - Page page = new PageImpl(); - page.setName(pageName); - page.setOwnerId(user.getId()); - page.setPageLayout(pageLayout); - page.setRegions(regions); - // set this as a "sub-page" page type - page.setPageType(PageType.SUB_PAGE.toString()); - - PageUser pageUser = new PageUserImpl(page.getOwnerId(), page, renderSequence); - pageUser.setPageStatus(PageInvitationStatus.OWNER); - List<PageUser> members = new ArrayList<PageUser>(); - members.add(pageUser); - page.setMembers(members); - - // Properly sets both sides of the circular parent-child reference - page.setParentPage(parentPage); - if (parentPage.getSubPages() != null){ - parentsSubPages = parentPage.getSubPages(); - } - parentsSubPages.add(page); - parentPage.setSubPages(parentsSubPages); - pageRepository.save(page); - - return page; + return addNewSubPage(userService.getAuthenticatedUser(), pageName, pageLayoutCode, parentPage); } @Override @@ -373,12 +335,31 @@ public class DefaultPageService implements PageService { // try to use the original page name if none supplied pageName = page.getName(); } - Page clonedPage = addNewUserPage(userService.getUserById(userId), pageName, page.getPageLayout().getCode()); - // populate all the widgets in cloned page from original - for(int i=0; i<page.getRegions().size(); i++){ - for(int j=0; j<page.getRegions().get(i).getRegionWidgets().size(); j++){ - String widgetId = page.getRegions().get(i).getRegionWidgets().get(j).getWidgetId(); - addWidgetToPageRegion(clonedPage.getId(), widgetId, clonedPage.getRegions().get(i).getId()); + User user = userService.getUserById(userId); + Page clonedPage = addNewUserPage(user, pageName, page.getPageLayout().getCode()); + if (page.getRegions().size() == 0) { + // Don't want regions on the cloned page either + // TODO: Move this into the addNewUserPage functionality + List<Region> emptyRegions = Lists.newArrayList(); + clonedPage.setRegions(emptyRegions); + clonedPage = pageRepository.save(clonedPage); + } + cloneRegionWidgets(page, clonedPage); + List<Page> subPages = page.getSubPages(); + for(Page subPage : subPages) { + clonedPage = getFromRepository(clonedPage.getId(), pageRepository); + Page updatedPage = addNewSubPage(user, subPage.getName(), subPage.getPageLayout().getCode(), clonedPage); + Page clonedSubPage = null; + for (Page newSubPage : updatedPage.getSubPages()) { + // This is the only way to find the subpage we just created such that it is actually populated with region ids + if (newSubPage.getName().equals(subPage.getName()) && + newSubPage.getPageLayout().getCode().equals(subPage.getPageLayout().getCode())) { + clonedSubPage = newSubPage; + break; + } + } + if (clonedSubPage != null) { + cloneRegionWidgets(subPage, clonedSubPage); } } clonedPage.setProperties(page.getProperties()); @@ -637,6 +618,47 @@ public class DefaultPageService implements PageService { return pageRepository.save(page); } + private Page addNewSubPage(User user, String pageName, String pageLayoutCode, Page parentPage) { + PageLayout pageLayout = pageLayoutRepository.getByPageLayoutCode(pageLayoutCode); + + // Create regions + List<Region> regions = new ArrayList<Region>(); + List<Page> parentsSubPages = new ArrayList<Page>(); + int regionCount; + for (regionCount = 0; regionCount < pageLayout.getNumberOfRegions(); regionCount++) { + Region region = new RegionImpl(); + region.setRenderOrder(regionCount); + // TODO: this should eventually be defined by the PageTemplateRegion.locked field + region.setLocked(false); + regions.add(region); + } + + // Create a Page object and register it. + long renderSequence = (parentPage.getSubPages() != null) ? parentPage.getSubPages().size() + 1 : 1; + Page page = new PageImpl(); + page.setName(pageName); + page.setOwnerId(user.getId()); + page.setPageLayout(pageLayout); + page.setRegions(regions); + // set this as a "sub-page" page type + page.setPageType(PageType.SUB_PAGE.toString()); + + PageUser pageUser = new PageUserImpl(page.getOwnerId(), page, renderSequence); + pageUser.setPageStatus(PageInvitationStatus.OWNER); + List<PageUser> members = new ArrayList<PageUser>(); + members.add(pageUser); + page.setMembers(members); + + // Properly sets both sides of the circular parent-child reference + page.setParentPage(parentPage); + if (parentPage.getSubPages() != null){ + parentsSubPages = parentPage.getSubPages(); + } + parentsSubPages.add(page); + parentPage.setSubPages(parentsSubPages); + return pageRepository.save(page); + } + private void updatePageRenderSequences(List<PageUser> pages) { if (pages != null && !pages.isEmpty()) { for (int i = 0; i < pages.size(); i++) { @@ -724,4 +746,15 @@ public class DefaultPageService implements PageService { // also traverse up and make sure its region is also not locked verifyRegionIsNotLocked(regionWidget.getRegion()); } + + private void cloneRegionWidgets(Page sourcePage, Page destinationPage) { + // populate all the widgets in cloned page from original + for (int i=0; i < sourcePage.getRegions().size(); i++) { + // Walk through this list in reverse order so the widgets get laid our correctly + for (int j=sourcePage.getRegions().get(i).getRegionWidgets().size() - 1; j >= 0; j--) { + String widgetId = sourcePage.getRegions().get(i).getRegionWidgets().get(j).getWidgetId(); + addWidgetToPageRegion(destinationPage.getId(), widgetId, destinationPage.getRegions().get(i).getId()); + } + } + } } http://git-wip-us.apache.org/repos/asf/rave/blob/b806acb8/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultPageServiceTest.java ---------------------------------------------------------------------- diff --git a/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultPageServiceTest.java b/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultPageServiceTest.java index e419112..1646fc6 100644 --- a/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultPageServiceTest.java +++ b/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultPageServiceTest.java @@ -361,24 +361,31 @@ public class DefaultPageServiceTest { final String PARENT_PAGE_NAME = "my parent page"; final Long EXPECTED_RENDER_SEQUENCE = 1L; final Long EXPECTED_PARENT_RENDER_SEQUENCE = 1L; + + Page parentPage = new PageImpl(); + parentPage.setName(PARENT_PAGE_NAME); + parentPage.setOwnerId(user.getId()); + parentPage.setPageLayout(pageLayout); Page expectedPage = new PageImpl(); expectedPage.setName(PAGE_NAME); expectedPage.setOwnerId(user.getId()); expectedPage.setPageLayout(pageLayout); expectedPage.setRegions(createEmptyRegionList(pageLayout.getNumberOfRegions())); - - Page parentPage = new PageImpl(); - parentPage.setName(PARENT_PAGE_NAME); - parentPage.setOwnerId(user.getId()); - parentPage.setPageLayout(pageLayout); + expectedPage.setPageType(PageType.SUB_PAGE.toString()); + expectedPage.setParentPage(parentPage); + PageUser expectedPageUser = createMock(PageUser.class); + expect(expectedPageUser.getRenderSequence()).andReturn(EXPECTED_RENDER_SEQUENCE); + List<PageUser> pageUsers = Lists.newArrayList(); + pageUsers.add(expectedPageUser); + expectedPage.setMembers(pageUsers); parentPage.setRegions(createEmptyRegionList(pageLayout.getNumberOfRegions())); expect(userService.getAuthenticatedUser()).andReturn(user); expect(pageLayoutRepository.getByPageLayoutCode(PAGE_LAYOUT_CODE)).andReturn(pageLayout); expect(pageRepository.save(expectedPage)).andReturn(expectedPage); - replay(userService, pageLayoutRepository, pageRepository); + replay(userService, pageLayoutRepository, pageRepository, expectedPageUser); Page newPage = pageService.addNewSubPage(PAGE_NAME, PAGE_LAYOUT_CODE, parentPage); assertThat(newPage.getMembers().get(0).getRenderSequence(), is(EXPECTED_RENDER_SEQUENCE)); @@ -388,7 +395,7 @@ public class DefaultPageServiceTest { assertThat(newPage.getParentPage(), is(parentPage)); assertTrue(parentPage.getSubPages().contains(newPage)); - verify(userService, pageLayoutRepository, pageRepository); + verify(userService, pageLayoutRepository, pageRepository, expectedPageUser); } @Test @@ -399,23 +406,30 @@ public class DefaultPageServiceTest { List<Page> existingPages = new ArrayList<Page>(); existingPages.add(new PageImpl()); - Page expectedPage = new PageImpl(); - expectedPage.setName(PAGE_NAME); - expectedPage.setOwnerId(user.getId()); - expectedPage.setPageLayout(pageLayout); - expectedPage.setRegions(createEmptyRegionList(pageLayout.getNumberOfRegions())); - Page parentPage = new PageImpl(); parentPage.setName(PARENT_PAGE_NAME); parentPage.setOwnerId(user.getId()); parentPage.setPageLayout(pageLayout); parentPage.setRegions(createEmptyRegionList(pageLayout.getNumberOfRegions())); parentPage.setSubPages(existingPages); + + Page expectedPage = new PageImpl(); + expectedPage.setName(PAGE_NAME); + expectedPage.setOwnerId(user.getId()); + expectedPage.setPageLayout(pageLayout); + expectedPage.setRegions(createEmptyRegionList(pageLayout.getNumberOfRegions())); + expectedPage.setPageType(PageType.SUB_PAGE.toString()); + expectedPage.setParentPage(parentPage); + PageUser expectedPageUser = createMock(PageUser.class); + expect(expectedPageUser.getRenderSequence()).andReturn(EXPECTED_RENDER_SEQUENCE); + List<PageUser> pageUsers = Lists.newArrayList(); + pageUsers.add(expectedPageUser); + expectedPage.setMembers(pageUsers); expect(userService.getAuthenticatedUser()).andReturn(user); expect(pageLayoutRepository.getByPageLayoutCode(PAGE_LAYOUT_CODE)).andReturn(pageLayout); expect(pageRepository.save(expectedPage)).andReturn(expectedPage); - replay(userService, pageLayoutRepository, pageRepository); + replay(userService, pageLayoutRepository, pageRepository, expectedPageUser); Page newPage = pageService.addNewSubPage(PAGE_NAME, PAGE_LAYOUT_CODE, parentPage); assertThat(newPage.getMembers().get(0).getRenderSequence(), is(EXPECTED_RENDER_SEQUENCE)); @@ -425,7 +439,7 @@ public class DefaultPageServiceTest { assertThat(newPage.getParentPage(), is(parentPage)); assertTrue(parentPage.getSubPages().contains(newPage)); - verify(userService, pageLayoutRepository, pageRepository); + verify(userService, pageLayoutRepository, pageRepository, expectedPageUser); } @Test http://git-wip-us.apache.org/repos/asf/rave/blob/b806acb8/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionRepository.java ---------------------------------------------------------------------- diff --git a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionRepository.java b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionRepository.java index 87c8449..6fe4b0c 100644 --- a/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionRepository.java +++ b/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbRegionRepository.java @@ -64,15 +64,24 @@ public class MongoDbRegionRepository implements RegionRepository { Page page; int index; - if(item.getId() == null) { + String itemId = item.getId(); + if(itemId == null) { page = getPageFromRepository(item); page.getRegions().add(item); index = page.getRegions().size()-1; } else { - page = getPageByRegionId(item.getId()); + page = getPageByRegionId(itemId); index = replaceRegion(page, item); } - Page saved = template.save(page); + // In case we found a subpage + Page parentPage = page.getParentPage(); + Page saved; + if (parentPage != null) { + saved = template.save(parentPage); + saved = findSubpageByRegionId(itemId, saved); + } else { + saved = template.save(page); + } return saved.getRegions().get(index); } @@ -158,7 +167,27 @@ public class MongoDbRegionRepository implements RegionRepository { } private Page getPageByRegionId(String id) { - return template.findOne(new Query(Criteria.where("regions").elemMatch(Criteria.where("_id").is(id)))); + Page page = template.findOne(new Query(Criteria.where("regions").elemMatch(Criteria.where("_id").is(id)))); + if (page != null) { + return page; + } + // Try to find a subpage region + page = template.findOne(new Query(Criteria.where("subPages").elemMatch(Criteria.where("regions").elemMatch(Criteria.where("_id").is(id))))); + return findSubpageByRegionId(id, page); + } + + private Page findSubpageByRegionId(String id, Page page) { + List<Page> subPages = page.getSubPages(); + List<Region> regions; + for (Page subPage : subPages) { + regions = subPage.getRegions(); + for (Region region : regions) { + if (id.equals(region.getId())) { + return subPage; + } + } + } + return null; }
