251 lines
6.7 KiB
Java
251 lines
6.7 KiB
Java
/* 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);
|
|
}
|
|
|
|
}
|