Created
April 8, 2016 21:23
-
-
Save marktriggs/fd1ade789b92da44b3b9d1912223a494 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| commit a8a3464cd1e64603b5100f667b90ad1e252b8356 | |
| Author: [email protected] <[email protected]@66ffb92e-73f9-0310-93c1-f5514f145a0a> | |
| Date: Fri Sep 4 03:37:48 2015 +0000 | |
| CLASSES-1879 First round of HIGHLY EXPERIMENTAL orphan-dealing-with changes | |
| git-svn-id: https://source.sakaiproject.org/svn/msub/nyu.edu/10.4/trunk@321065 66ffb92e-73f9-0310-93c1-f5514f145a0a | |
| diff --git a/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/service/LessonBuilderEntityProducer.java b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/service/LessonBuilderEntityProducer.java | |
| index e039b6d..fe770da 100644 | |
| --- a/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/service/LessonBuilderEntityProducer.java | |
| +++ b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/service/LessonBuilderEntityProducer.java | |
| @@ -92,6 +92,7 @@ import org.sakaiproject.lessonbuildertool.cc.Parser; | |
| import org.sakaiproject.lessonbuildertool.cc.PrintHandler; | |
| import org.sakaiproject.lessonbuildertool.cc.ZipLoader; | |
| import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean; | |
| +import org.sakaiproject.lessonbuildertool.tool.beans.OrphanPageFinder; | |
| import org.sakaiproject.site.api.Group; | |
| import org.sakaiproject.site.api.Site; | |
| import org.sakaiproject.site.api.SitePage; | |
| @@ -522,6 +523,10 @@ public class LessonBuilderEntityProducer extends AbstractEntityProvider | |
| //prepare the buffer for the results log | |
| StringBuilder results = new StringBuilder(); | |
| + // Orphaned pages need not apply! | |
| + SimplePageBean simplePageBean = makeSimplePageBean(siteId); | |
| + OrphanPageFinder orphanFinder = simplePageBean.getOrphanFinder(siteId); | |
| + | |
| try | |
| { | |
| Site site = siteService.getSite(siteId); | |
| @@ -533,12 +538,21 @@ public class LessonBuilderEntityProducer extends AbstractEntityProvider | |
| Element lessonbuilder = doc.createElement(LESSONBUILDER); | |
| + int orphansSkipped = 0; | |
| + | |
| List<SimplePage> sitePages = simplePageToolDao.getSitePages(siteId); | |
| if (sitePages != null && !sitePages.isEmpty()) { | |
| - for (SimplePage page: sitePages) | |
| + for (SimplePage page: sitePages) { | |
| + if (!orphanFinder.isOrphan(page.getPageId())) { | |
| addPage(doc, lessonbuilder, page, site); | |
| + } else { | |
| + orphansSkipped++; | |
| + } | |
| + } | |
| } | |
| + logger.info("Skipped over " + orphansSkipped + " orphaned pages while archiving site " + siteId); | |
| + | |
| Collection<ToolConfiguration> tools = site.getTools(myToolIds()); | |
| int count = 0; | |
| if (tools != null && !tools.isEmpty()) | |
| diff --git a/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/OrphanPageFinder.java b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/OrphanPageFinder.java | |
| new file mode 100644 | |
| index 0000000..9fbfff7 | |
| --- /dev/null | |
| +++ b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/OrphanPageFinder.java | |
| @@ -0,0 +1,79 @@ | |
| +package org.sakaiproject.lessonbuildertool.tool.beans; | |
| + | |
| +import java.util.ArrayList; | |
| +import java.util.Collection; | |
| +import java.util.HashMap; | |
| +import java.util.HashSet; | |
| +import java.util.List; | |
| +import java.util.Map; | |
| +import java.util.Set; | |
| +import org.sakaiproject.lessonbuildertool.SimplePage; | |
| +import org.sakaiproject.lessonbuildertool.SimplePageItem; | |
| +import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao; | |
| +import org.sakaiproject.lessonbuildertool.tool.producers.PagePickerProducer; | |
| + | |
| +// Code more or less extracted from SimplePageBean | |
| +public class OrphanPageFinder { | |
| + | |
| + private String siteId; | |
| + private Set<Long> orphanedPages; | |
| + private SimplePageToolDao simplePageToolDao; | |
| + private PagePickerProducer pagePickerProducer; | |
| + | |
| + public OrphanPageFinder(String siteId, SimplePageToolDao simplePageToolDao, PagePickerProducer pagePickerProducer) { | |
| + this.siteId = siteId; | |
| + this.orphanedPages = new HashSet<Long>(); | |
| + this.simplePageToolDao = simplePageToolDao; | |
| + this.pagePickerProducer = pagePickerProducer; | |
| + | |
| + loadOrphanedPages(); | |
| + } | |
| + | |
| + public boolean isOrphan(long itemId) { | |
| + return orphanedPages.contains(itemId); | |
| + } | |
| + | |
| + public Collection<Long> getOrphanPageIds() { | |
| + return orphanedPages; | |
| + } | |
| + | |
| + private void loadOrphanedPages() { | |
| + Map<Long,SimplePage> allPagesInSite = new HashMap<Long,SimplePage>(); | |
| + | |
| + // Load our map of all pages | |
| + // | |
| + // This seems a bit wasteful: pagePickerProducer doesn't | |
| + // really need the pages at all (it just uses the keys | |
| + // of this map as a set). Could probably refactor this | |
| + // not to pull all the pages into memory if needed. | |
| + for (SimplePage p: simplePageToolDao.getSitePages(siteId)) { | |
| + allPagesInSite.put(p.getPageId(), p); | |
| + } | |
| + | |
| + // Get a list of the top-level lessons pages | |
| + List<SimplePageItem> topLevelPages = simplePageToolDao.findItemsInSite(siteId); | |
| + Set<Long> topLevelPageIds = new HashSet<Long>(); | |
| + for (SimplePageItem i : topLevelPages) | |
| + topLevelPageIds.add(Long.valueOf(i.getSakaiId())); | |
| + | |
| + | |
| + // Walk from our top-level pages to find all reachable pages | |
| + List<PagePickerProducer.PageEntry> entries = new ArrayList<PagePickerProducer.PageEntry> (); | |
| + Set<Long> sharedPages = new HashSet<Long>(); | |
| + for (SimplePageItem topLevelPage : topLevelPages) { | |
| + pagePickerProducer.findAllPages(topLevelPage, entries, allPagesInSite, topLevelPageIds, sharedPages, 0, true); | |
| + } | |
| + | |
| + // allPagesInSite has been mutated to remove anything | |
| + // that was reachable. The remaining pages might be | |
| + // orphans. | |
| + if (allPagesInSite.size() > 0) { | |
| + for (SimplePage p: allPagesInSite.values()) { | |
| + // non-null owner are student pages (not orphans) | |
| + if(p.getOwner() == null) { | |
| + orphanedPages.add(p.getPageId()); | |
| + } | |
| + } | |
| + } | |
| + } | |
| +} | |
| diff --git a/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/SimplePageBean.java b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/SimplePageBean.java | |
| index c9db050..29a0950 100644 | |
| --- a/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/SimplePageBean.java | |
| +++ b/lessonbuilder/tool/src/java/org/sakaiproject/lessonbuildertool/tool/beans/SimplePageBean.java | |
| @@ -2428,6 +2428,11 @@ public class SimplePageBean { | |
| } | |
| + public OrphanPageFinder getOrphanFinder(String siteId) { | |
| + return new OrphanPageFinder(siteId, simplePageToolDao, pagePickerProducer()); | |
| + } | |
| + | |
| + | |
| public String deleteOrphanPages() { | |
| if (getEditPrivs() != 0) | |
| return "permission-failed"; | |
| @@ -2457,6 +2462,23 @@ public class SimplePageBean { | |
| pagePickerProducer().findAllPages(sitePageItem, entries, pageMap, topLevelPages, sharedPages, 0, true); | |
| } | |
| + OrphanPageFinder orphanFinder = getOrphanFinder(getCurrentSiteId()); | |
| + | |
| + // FIXME: very temporary | |
| + try { | |
| + FileWriter fh = new FileWriter("/var/tmp/orphan_list_" + getCurrentSiteId() + ".txt"); | |
| + | |
| + for (Long pageId : orphanFinder.getOrphanPageIds()) { | |
| + fh.write(String.valueOf(pageId)); | |
| + fh.write("\n"); | |
| + } | |
| + | |
| + fh.close(); | |
| + } catch (IOException e) { | |
| + throw new RuntimeException(e); | |
| + } | |
| + | |
| + | |
| // everything we didn't find should be deleted. It's items remaining in pagemap | |
| List<String> orphans = new ArrayList<String>(); | |
| if (pageMap.size() > 0) { | |
| @@ -2466,10 +2488,24 @@ public class SimplePageBean { | |
| orphans.add(Long.toString(p.getPageId())); | |
| } | |
| } | |
| - // do the deletetion | |
| - // selectedEntities is the argument for deletePages | |
| - selectedEntities = orphans.toArray(selectedEntities); | |
| - deletePages(); | |
| + | |
| + if (orphans.size() != orphanFinder.getOrphanPageIds().size()) { | |
| + throw new RuntimeException("Mismatch in orphan counts"); | |
| + } | |
| + | |
| + for (String oid : orphans) { | |
| + if (!orphanFinder.isOrphan(new Long(oid))) { | |
| + throw new RuntimeException("Orphan missed!"); | |
| + } | |
| + } | |
| + | |
| + // FIXME: disabled temporarily | |
| + if (1 == 0) { | |
| + // do the deletetion | |
| + // selectedEntities is the argument for deletePages | |
| + selectedEntities = orphans.toArray(selectedEntities); | |
| + deletePages(); | |
| + } | |
| } | |
| return "success"; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment