package com.google.sites.liberation.imprt; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.Lists; import com.google.gdata.client.sites.SitesService; import com.google.gdata.data.sites.BasePageEntry; import com.google.gdata.util.common.base.Nullable; import com.google.inject.Inject; import com.google.sites.liberation.util.ProgressListener; import com.google.sites.liberation.util.UrlUtils; import java.io.File; import java.net.URL; import java.util.List; /** * Implements {@link SiteImporter} to import an entire site. * * @author bsimon@google.com (Benjamin Simon) */ final class SiteImporterImpl implements SiteImporter { private final PageImporter pageImporter; /** * Creates a new SiteImporterImpl with the given dependencies. */ @Inject SiteImporterImpl(PageImporter pageImporter) { this.pageImporter = checkNotNull(pageImporter); } @Override public void importSite(String host, @Nullable String domain, String webspace, boolean importRevisions, SitesService sitesService, File rootDirectory, ProgressListener progressListener) { URL feedUrl = UrlUtils.getFeedUrl(host, domain, webspace); URL siteUrl = UrlUtils.getSiteUrl(host, domain, webspace); progressListener.setStatus("Scanning directory."); int numPages = getNumPages(rootDirectory); List<BasePageEntry<?>> ancestors = Lists.newLinkedList(); for (File subDirectory : rootDirectory.listFiles()) { if (subDirectory.isDirectory() && !subDirectory.getName().startsWith("_")) { importPage(subDirectory, importRevisions, ancestors, feedUrl, siteUrl, sitesService, progressListener, numPages); } } progressListener.setProgress(1.0); progressListener.setStatus("Import complete."); } private void importPage(File pageDirectory, boolean importRevisions, List<BasePageEntry<?>> ancestors, URL feedUrl, URL siteUrl, SitesService sitesService, ProgressListener progressListener, int numPages) { File file = new File(pageDirectory, "index.html"); if (file.isFile()) { progressListener.setStatus("Importing page: " + pageDirectory.getName()); BasePageEntry<?> page = pageImporter.importPage(pageDirectory, importRevisions, ancestors, feedUrl, siteUrl, sitesService); progressListener.setProgress(progressListener.getProgress() + 1.0/numPages); if (page != null) { List<BasePageEntry<?>> newAncestors = Lists.newLinkedList(ancestors); newAncestors.add(page); for (File subDirectory : pageDirectory.listFiles()) { if (subDirectory.isDirectory() && !subDirectory.getName().startsWith("_")) { importPage(subDirectory, importRevisions, newAncestors, feedUrl, siteUrl, sitesService, progressListener, numPages); } } } } } private int getNumPages(File directory) { int num = 0; for (File subDirectory : directory.listFiles()) { if (subDirectory.isDirectory() && !subDirectory.getName().startsWith("_")) { if (new File(subDirectory, "index.html").isFile()) { num += 1 + getNumPages(subDirectory); } } } return num; } }