/* * 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.imprt; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.sites.liberation.util.EntryType.getType; import static com.google.sites.liberation.util.EntryType.isPage; import static com.google.sites.liberation.util.EntryType.ATTACHMENT; import com.google.common.collect.Lists; import com.google.gdata.client.sites.SitesService; import com.google.gdata.data.Content; import com.google.gdata.data.OutOfLineContent; import com.google.gdata.data.media.MediaFileSource; import com.google.gdata.data.media.MediaSource; import com.google.gdata.data.sites.BaseContentEntry; import com.google.gdata.data.sites.BasePageEntry; import com.google.gdata.data.sites.PageName; import com.google.inject.Inject; import com.google.sites.liberation.parsers.PageParser; import com.google.sites.liberation.util.EntryUtils; import java.io.File; import java.net.URL; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Parses a page and its children and uploads them to a feed. * * @author bsimon@google.com (Benjamin Simon) */ final class PageImporterImpl implements PageImporter { private static final Logger LOGGER = Logger.getLogger( PageImporterImpl.class.getCanonicalName()); private final EntryUpdater entryUpdater; private final EntryUploader entryUploader; private final PageParser pageParser; private final RelativeLinkConverter linkConverter; private final RevisionsImporter revisionsImporter; /** * Creates a new PageImporterImpl with the given dependencies. */ @Inject PageImporterImpl(EntryUpdater entryUpdater, EntryUploader entryUploader, PageParser pageParser, RelativeLinkConverter linkConverter, RevisionsImporter revisionsImporter) { this.entryUpdater = checkNotNull(entryUpdater); this.entryUploader = checkNotNull(entryUploader); this.pageParser = checkNotNull(pageParser); this.linkConverter = checkNotNull(linkConverter); this.revisionsImporter = checkNotNull(revisionsImporter); } @Override public BasePageEntry<?> importPage(File directory, boolean importRevisions, List<BasePageEntry<?>> ancestors, URL feedUrl, URL siteUrl, SitesService sitesService) { checkNotNull(directory); File file = new File(directory, "index.html"); if (!file.isFile()) { LOGGER.log(Level.WARNING, "No valid file in directory: " + directory); return null; } List<BaseContentEntry<?>> entries = pageParser.parsePage(file); BasePageEntry<?> page = getFirstPageEntry(entries); if (page == null) { LOGGER.log(Level.WARNING, "No valid page entry!"); return null; } page.setPageName(new PageName(directory.getName())); linkConverter.convertLinks(page, ancestors, siteUrl, false); if (!ancestors.isEmpty()) { EntryUtils.setParent(page, ancestors.get(ancestors.size() - 1)); } BasePageEntry<?> returnedEntry = null; if (importRevisions && new File(directory, "_revisions").isDirectory()) { returnedEntry = revisionsImporter.importRevisions( directory, ancestors, feedUrl, siteUrl, sitesService); } if (returnedEntry == null) { returnedEntry = (BasePageEntry<?>) entryUploader.uploadEntry( page, ancestors, feedUrl, sitesService); } else { returnedEntry = (BasePageEntry<?>) entryUpdater.updateEntry( returnedEntry, page, sitesService); } List<BasePageEntry<?>> newAncestors = Lists.newLinkedList(ancestors); newAncestors.add(returnedEntry); for (BaseContentEntry<?> child : getNonPageEntries(entries)) { if (getType(child) == ATTACHMENT) { if (child.getContent() != null) { String src = ((OutOfLineContent) child.getContent()).getUri(); File attachmentFile = new File(directory, src); MediaSource mediaSource = new MediaFileSource(attachmentFile, "application/octet-stream"); child.setContent((Content) null); child.setMediaSource(mediaSource); } else { System.out.println(child.getTitle().getPlainText()); } } EntryUtils.setParent(child, returnedEntry); entryUploader.uploadEntry(child, newAncestors, feedUrl, sitesService); } return returnedEntry; } private BasePageEntry<?> getFirstPageEntry(List<BaseContentEntry<?>> entries) { for (BaseContentEntry<?> entry : entries) { if (isPage(entry)) { return (BasePageEntry<?>) entry; } } return null; } private List<BaseContentEntry<?>> getNonPageEntries( List<BaseContentEntry<?>> entries) { List<BaseContentEntry<?>> children = Lists.newLinkedList(); for (BaseContentEntry<?> entry : entries) { if (!isPage(entry)) { children.add(entry); } } return children; } }