/* * Copyright (C) 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.sites.liberation.export; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.sites.liberation.util.EntryType.isPage; import com.google.common.collect.Lists; import com.google.gdata.client.sites.SitesService; import com.google.gdata.data.sites.BaseContentEntry; import com.google.gdata.data.sites.BasePageEntry; import com.google.inject.Inject; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Exports the history and all of the revisions of a page. * * @author bsimon@google.com (Benjamin Simon) */ final class RevisionsExporterImpl implements RevisionsExporter { private static Logger LOGGER = Logger.getLogger( RevisionsExporterImpl.class.getCanonicalName()); private final AbsoluteLinkConverter linkConverter; private final AppendableFactory appendableFactory; private final FeedProvider feedProvider; private final HistoryExporter historyExporter; private final RevisionExporter revisionExporter; @Inject RevisionsExporterImpl(AbsoluteLinkConverter linkConverter, AppendableFactory appendableFactory, FeedProvider feedProvider, HistoryExporter historyExporter, RevisionExporter revisionExporter) { this.linkConverter = checkNotNull(linkConverter); this.appendableFactory = checkNotNull(appendableFactory); this.feedProvider = checkNotNull(feedProvider); this.historyExporter = checkNotNull(historyExporter); this.revisionExporter = checkNotNull(revisionExporter); } @Override public void exportRevisions(BaseContentEntry<?> page, EntryStore entryStore, File directory, SitesService sitesService, URL siteUrl) { checkNotNull(page, "page"); checkNotNull(directory, "directory"); checkNotNull(sitesService, "sitesService"); File revisionsDirectory = new File(directory, "_revisions"); revisionsDirectory.mkdir(); URL feedUrl; try { feedUrl = new URL(page.getId().replace("content", "revision")); } catch (MalformedURLException e) { LOGGER.log(Level.WARNING, "Invalid revisions URL!", e); return; } List<BaseContentEntry<?>> revisions = Lists.newLinkedList(); for (BaseContentEntry<?> entry : feedProvider.getEntries(feedUrl, sitesService)) { entry.setId(page.getId()); revisions.add(entry); } for (BaseContentEntry<?> revision : revisions) { if (revision.getRevision().getValue() != page.getRevision().getValue()) { if (isPage(revision)) { linkConverter.convertLinks((BasePageEntry<?>) revision, entryStore, siteUrl, true); exportRevision((BasePageEntry<?>) revision, revisionsDirectory); } } } File file = new File(directory, "history.html"); Appendable out = null; try { out = appendableFactory.getAppendable(file); historyExporter.exportHistory(revisions, out); } catch(IOException e) { LOGGER.log(Level.WARNING, "Failed writing to file: " + file, e); } finally { if (out instanceof Closeable) { try { ((Closeable) out).close(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed closing file: " + file, e); } } } } private void exportRevision(BasePageEntry<?> revision, File revisionsDirectory) { int number = revision.getRevision().getValue(); File file = new File(revisionsDirectory, number + ".html"); Appendable out = null; try { out = appendableFactory.getAppendable(file); revisionExporter.exportRevision(revision, out); } catch(IOException e) { LOGGER.log(Level.WARNING, "Failed writing to file: " + file, e); } finally { if (out instanceof Closeable) { try { ((Closeable) out).close(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed closing file: " + file, e); } } } } }