Skip to content

Instantly share code, notes, and snippets.

@marktriggs
Created April 8, 2016 21:23
Show Gist options
  • Select an option

  • Save marktriggs/fd1ade789b92da44b3b9d1912223a494 to your computer and use it in GitHub Desktop.

Select an option

Save marktriggs/fd1ade789b92da44b3b9d1912223a494 to your computer and use it in GitHub Desktop.
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