com.google.sites.liberation.export.Main.java Source code

Java tutorial

Introduction

Here is the source code for com.google.sites.liberation.export.Main.java

Source

/*
 * 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 java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.DataStoreFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.oauth2.Oauth2;
import com.google.gdata.client.sites.SitesService;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.sites.liberation.util.StdOutProgressListener;

/**
 * Processes command line arguments for exporting a site and then
 * calls SiteExporter accordingly.
 * 
 * @author bsimon@google.com (Benjamin Simon)
 */
public class Main {

    private static final Logger LOGGER = Logger.getLogger(Main.class.getCanonicalName());

    @Option(name = "-d", usage = "domain of site")
    private String domain = null;

    @Option(name = "-w", usage = "webspace of site")
    private String webspace = null;

    @Option(name = "-r", usage = "export revisions as well as current content")
    private boolean exportRevisions = false;

    @Option(name = "-f", usage = "directory in which to export")
    private File directory = new File("");

    @Option(name = "-h", usage = "host")
    private String host = "sites.google.com";

    /**
     * Be sure to specify the name of your application. If the application name is {@code null} or
     * blank, the application will log a warning. Suggested format is "MyCompany-ProductName/1.0".
     */
    private static final String APPLICATION_NAME = "sElaiassi-GoogleSiteLiberation/1.0";

    /** Directory to store user credentials. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),
            ".store/GoogleSiteLiberation");

    /**
     * Global instance of the {@link DataStoreFactory}. The best practice is to make it a single
     * globally shared instance across your application.
     */
    private static FileDataStoreFactory dataStoreFactory;

    /** Global instance of the HTTP transport. */
    private static HttpTransport httpTransport;

    private static Oauth2 oauth2;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private static GoogleClientSecrets clientSecrets;

    /** Scope Authorization. */
    private static List<String> SCOPES = Arrays.asList("https://sites.google.com/feeds");

    /** Authorizes the installed application to access user's protected data. 
    * @throws Exception */
    private static Credential authorize() throws Exception {
        // load client secrets
        clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
                new InputStreamReader(Main.class.getResourceAsStream("/client_secrets.json")));
        if (clientSecrets.getDetails().getClientId().startsWith("Enter")
                || clientSecrets.getDetails().getClientSecret().startsWith("Enter")) {
            System.out.println("Enter Client ID and Secret from https://code.google.com/apis/console/ "
                    + "into google-sites-liberation/src/main/resources/client_secrets.json");
            System.exit(1);
        }
        // set up authorization code flow
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY,
                clientSecrets, SCOPES).setDataStoreFactory(dataStoreFactory).setAccessType("offline").build();

        //Loading receiver on 8080 port (you can change this if already in use) 
        LocalServerReceiver localServerReceiver = new LocalServerReceiver.Builder().setPort(8080).build();

        // authorize
        return new AuthorizationCodeInstalledApp(flow, localServerReceiver).authorize("user");
    }

    private void doMain(String[] args) {
        CmdLineParser parser = new CmdLineParser(this);
        Injector injector = Guice.createInjector(new SiteExporterModule());
        SiteExporter siteExporter = injector.getInstance(SiteExporter.class);
        try {
            parser.parseArgument(args);
            if (webspace == null) {
                throw new CmdLineException("Webspace of site not specified!");
            }
            SitesService sitesService = new SitesService("google-sites-liberation");
            httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);

            Credential credential = authorize();
            oauth2 = new Oauth2.Builder(httpTransport, JSON_FACTORY, credential)
                    .setApplicationName(APPLICATION_NAME).build();

            sitesService.setOAuth2Credentials(credential);

            siteExporter.exportSite(host, domain, webspace, exportRevisions, sitesService, directory,
                    new StdOutProgressListener());
        } catch (CmdLineException e) {
            LOGGER.log(Level.SEVERE, e.getMessage());
            parser.printUsage(System.err);
            return;
        } catch (GeneralSecurityException e) {
            LOGGER.log(Level.SEVERE, "Error while setting up the security");
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "Error handling resources files");
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, "Error while getting the AccesToken");
        }
    }

    /**
     * Exports a Site.
     */
    public static void main(String[] args) {
        new Main().doMain(args);
    }
}