Package sample.gbase.cmdline

Source Code of sample.gbase.cmdline.Command

/* Copyright (c) 2006 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 sample.gbase.cmdline;

import com.google.api.gbase.client.FeedURLFactory;
import com.google.api.gbase.client.GoogleBaseService;
import com.google.gdata.client.Service;
import com.google.gdata.util.AuthenticationException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;


/**
* One command that is part of CustomerTool.
* This class contains code that is common to all
* commands. It deals, in particular, with the creation
* of the GData service object.
*/
abstract class Command {

  /**
   * URL of the google authentication server to use for log in.
   */
  private static final String DEFAULT_AUTH_HOSTNAME = "www.google.com";

  /**
   * Username for google base (e-mail address).
   */
  protected String username;

  /**
   * The user's password.
   */
  protected String password;

  /**
   * Base url of the google base server.
   */
  protected FeedURLFactory urlFactory = FeedURLFactory.getDefault();

  /**
   * Base url of the google authentication server.
   */
  private String authenticationServer = DEFAULT_AUTH_HOSTNAME;

  /**
   * Protocol (http or https) to use to connect to the authentication server.
   */
  private String authenticationProtocol = "https";
 
  /**
   * Developer key used for identification against the Google Base data API
   * servers.
   */
  private String key;

  /**
   * Enables dry-run mode for edit operations.
   */
  private boolean dryRun;

  /**
   * Executes the command.
   *
   * Call this method only after setting the username and password.
   */
  public abstract void execute() throws Exception;

  /**
   * Sets the username, which is required for {@link #execute()} to work.
   */
  public void setUsername(String username) {
    this.username = username;
  }

  /**
   * Sets the password, which is required for {@link #execute()} to work.
   */
  public void setPassword(String password) {
    this.password = password;
  }

  /**
   * Sets the Url of the google base server to connect to.
   */
  public void setGoogleBaseServerUrl(String url) throws MalformedURLException {
    this.urlFactory = new FeedURLFactory(url);
  }

  /**
   * Sets the name of the google authentication server to connect to.
   */
  public void setAuthenticationServerUrl(String urlString)
      throws MalformedURLException {
    URL url = new URL(urlString);
    this.authenticationProtocol = url.getProtocol();
    this.authenticationServer = url.getHost();
    if (url.getPort() != -1) {
      this.authenticationServer += ":" + url.getPort();
    }
  }
 
  public void setKey(String key) {
    this.key = key;
  }

  /**
   * Makes sure username and password have been set.
   */
  public boolean hasAllIdentificationInformation() {
    return username != null && password != null;
  }

  /**
   * Creates the service and sets the username and password for
   * authentication.
   *
   * @return the GData service object to use
   * @throws com.google.gdata.util.AuthenticationException
   *  if authentication failed
   */
  protected GoogleBaseService createService()
      throws AuthenticationException {
    GoogleBaseService service =
        new GoogleBaseService("Google.-CustomerTool-1.0",
                              key,
                              authenticationProtocol,
                              authenticationServer);                                                     
    service.setUserCredentials(username, password);
    return service;
  }

  /**
   * Gets the URL of the customer feed.
   *
   * The feed contains only the items uploaded by this
   * specific customer. This is also the feed that is
   * used to upload customer data.
   *
   * @return the url to the customer feed
   */
  protected URL getCustomerFeedURL() throws MalformedURLException {
    return urlFactory.getItemsFeedURL();
  }

  /**
   * Writes the response (XML feed) to standard output.
   */
  protected void outputRawResponse(Service.GDataRequest request)
      throws IOException {
    InputStream responseStream = request.getResponseStream();
    try {
      copyStreamContent(responseStream, System.out);
    } finally {
      responseStream.close();
    }
    System.out.println();
  }

  /**
   * Reads data from in input stream and write it into an
   * output stream.
   */
  protected void copyStreamContent(InputStream in, OutputStream out)
      throws IOException {
    byte[] buffer = new byte[1024];
    int l;
    while ( (l=in.read(buffer)) > 0 ) {
      out.write(buffer, 0, l);
    }
  }

  /**
   * Reads data from standard input and use it in the request.
   *
   * The data must be the XML feed appropriate for the command.
   * For update, get or insert it should be one Atom XML entry.
   */
  protected void inputRawRequest(Service.GDataRequest request)
      throws IOException {
    OutputStream outputStream = request.getRequestStream();
    try {
      copyStreamContent(System.in, outputStream);
    } finally {
      outputStream.close();
    }
  }

  /**
   * Puts the command in dry-run mode, in which nothing will
   * really happen on the server.
   *
   * @param dryRun
   */
  public void setDryRun(boolean dryRun) {
    this.dryRun = dryRun;
  }

  /**
   * Builds an edit URL from a string, adding the dry-run parameter
   * if necessary.
   *
   * This method is not applicable to query URLs, for which the dry-run
   * parameter is not supported.
   *
   * @param url the original url
   * @return the same URL with maybe some parameters
   * @throws MalformedURLException
   */
  protected URL fixEditUrl(URL url) throws MalformedURLException {
    return fixEditUrl(url.toExternalForm());
  }

  /**
   * Builds an edit URL from a string, adding the dry-run parameter
   * if necessary.
   *
   * This method is not applicable to query URLs, for which the dry-run
   * parameter is not supported.
   *
   * @param url the original url, as a string
   * @return the same URL with maybe some parameters
   * @throws MalformedURLException
   */
  protected URL fixEditUrl(String url) throws MalformedURLException {
    if (dryRun) {
      char separator = url.contains("?") ? '&' : '?';
      url = url + separator + "dry-run=true";
    }
    return new URL(url);
  }

}
TOP

Related Classes of sample.gbase.cmdline.Command

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.