282 lines
9.2 KiB
Java
282 lines
9.2 KiB
Java
/* Copyright (c) 2008 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.projecthosting;
|
|
|
|
import com.google.gdata.client.projecthosting.IssuesQuery;
|
|
import com.google.gdata.client.projecthosting.ProjectHostingService;
|
|
import sample.util.SimpleCommandLineParser;
|
|
import com.google.gdata.data.DateTime;
|
|
import com.google.gdata.data.projecthosting.IssuesFeed;
|
|
import com.google.gdata.util.AuthenticationException;
|
|
import com.google.gdata.util.ServiceException;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.IOException;
|
|
import java.io.InputStreamReader;
|
|
import java.net.MalformedURLException;
|
|
|
|
/**
|
|
* A Command-line application using the {@link ProjectHostingClient} to make
|
|
* calls to the Google Code Issue Tracker Data API.
|
|
* The following operations are handled:
|
|
*
|
|
* <ol>
|
|
* <li>Retrieving the list of issues in a project</li>
|
|
* <li>Querying issues with query parameters</li>
|
|
* <li>Retrieving the list of comments in a given issue</li>
|
|
* </ol>
|
|
*
|
|
*
|
|
*/
|
|
public class ProjectHostingReadDemo {
|
|
|
|
/** Disable default public constructor */
|
|
private ProjectHostingReadDemo() {
|
|
}
|
|
|
|
/** Client that provides high level operations of the API */
|
|
private ProjectHostingClient client;
|
|
|
|
private static final String DIVIDER =
|
|
"=====================================================================\n";
|
|
|
|
/**
|
|
* Constructs the command line application.
|
|
*
|
|
* @throws AuthenticationException if authentication fails
|
|
* @throws MalformedURLException if there's a problem with URL
|
|
*/
|
|
public ProjectHostingReadDemo(
|
|
ProjectHostingService service, String project, String username,
|
|
String password) throws AuthenticationException, MalformedURLException {
|
|
client = new ProjectHostingClient(service, project, username, password);
|
|
}
|
|
|
|
/**
|
|
* Main entry point. Parses arguments and creates and invokes the demo.
|
|
*/
|
|
public static void main(String[] arg) throws Exception {
|
|
SimpleCommandLineParser parser = new SimpleCommandLineParser(arg);
|
|
|
|
// Parse command-line flags
|
|
String project = parser.getValue("project");
|
|
String username = parser.getValue("username");
|
|
String password = parser.getValue("password");
|
|
|
|
boolean help = parser.containsKey("help");
|
|
if (help || (project == null)) {
|
|
usage();
|
|
System.exit(help ? 0 : 1);
|
|
}
|
|
|
|
if (username == null) {
|
|
System.out.println(
|
|
"***WARNING*** Unauthenticated user. To see any restricted issues, "
|
|
+ "you must authenticate yourself and have proper permission setting "
|
|
+ "for the project " + project + ".\n"
|
|
+ "You can authenticate yourself by specifying <username> and "
|
|
+ "<password> when you invoke this demo as follows:");
|
|
usage();
|
|
}
|
|
|
|
ProjectHostingService service =
|
|
new ProjectHostingService("projecthosting-read-demo");
|
|
|
|
try {
|
|
new ProjectHostingReadDemo(service, project, username, password).run();
|
|
} catch (AuthenticationException e) {
|
|
System.out.println("The username/password entered is invalid.");
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
/** Input stream for reading user input. */
|
|
private static final BufferedReader IN =
|
|
new BufferedReader(new InputStreamReader(System.in));
|
|
|
|
/**
|
|
* Prompts and returns user input as an integer.
|
|
* It will keep asking until the user provides a valid number.
|
|
*
|
|
* @throws IOException if there is a I/O related problem
|
|
*/
|
|
private static int readInteger(String name) throws IOException {
|
|
while (true) {
|
|
String input = readString(name);
|
|
try {
|
|
return Integer.parseInt(input);
|
|
} catch (NumberFormatException nfe) {
|
|
System.out.println("Invalid number " + input);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prompts and returns user input as a string.
|
|
*
|
|
* @throws IOException if there is a I/O related problem
|
|
*/
|
|
private static String readString(String name) throws IOException {
|
|
System.out.print("Please enter " + name + ": ");
|
|
System.out.flush();
|
|
String result = IN.readLine();
|
|
return result.trim();
|
|
}
|
|
|
|
/**
|
|
* Runs the main loop for reading issues and comments.
|
|
* It offers a choice for users to read issues or a specific issue
|
|
* and its comments and continues to do so until "exit" is selected.
|
|
*
|
|
* @throws IOException if there is a problem communicating with the server
|
|
* @throws ServiceException if the service is unable to handle the request
|
|
*/
|
|
private void run() throws IOException, ServiceException {
|
|
while (true) {
|
|
System.out.println(
|
|
DIVIDER
|
|
+ "Main menu:\n"
|
|
+ "[0] Exit\n"
|
|
+ "[1] Read issues\n"
|
|
+ "[2] Read an issue and its comments");
|
|
int choice = readInteger("action");
|
|
switch (choice) {
|
|
case 0:
|
|
return;
|
|
case 1:
|
|
addAndRunQuery();
|
|
break;
|
|
case 2:
|
|
String issueId = readString("issue ID");
|
|
client.printIssueAndComments(issueId);
|
|
break;
|
|
default:
|
|
System.out.println("Invalid choice " + choice);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Builds and runs a query. The user is prompted to add query parameters
|
|
* until "done" is selected at which point it runs the query and displays
|
|
* issues returned.
|
|
* Choice #1 runs the query and shows the issues returned.
|
|
* Choice #2-13 lets users add query parameters.
|
|
*
|
|
* @throws IOException if there is a problem communicating with the server
|
|
* @throws ServiceException if the service is unable to handle the request
|
|
*/
|
|
private void addAndRunQuery() throws IOException, ServiceException {
|
|
IssuesQuery query = new IssuesQuery(client.getIssuesFeedUrl());
|
|
while (true) {
|
|
System.out.println(
|
|
DIVIDER
|
|
+ "Set query parameters. Choose [1] when you're done.\n"
|
|
+ "[0] Return to the main menu\n"
|
|
+ "[1] Done. Query issues now.\n"
|
|
+ "[2] Set full-text query\n"
|
|
+ "[3] Set published-min\n"
|
|
+ "[4] Set published-max\n"
|
|
+ "[5] Set updated-min\n"
|
|
+ "[6] Set updated-max\n"
|
|
+ "[7] Set start-index\n"
|
|
+ "[8] Set max-results\n"
|
|
+ "[9] Set owner\n"
|
|
+ "[10] Set reporter\n"
|
|
+ "[11] Set status\n"
|
|
+ "[12] Set label\n"
|
|
+ "[13] Set canned-query");
|
|
int choice = readInteger("action");
|
|
switch (choice) {
|
|
case 0:
|
|
return;
|
|
case 1:
|
|
IssuesFeed resultFeed = client.queryIssues(query);
|
|
int numResult = resultFeed.getEntries().size();
|
|
System.out.println(
|
|
"Query returned " + numResult + " matching issues.");
|
|
client.printIssues(resultFeed);
|
|
return;
|
|
case 2:
|
|
String textQuery = readString("full-text query");
|
|
query.setFullTextQuery(textQuery);
|
|
break;
|
|
case 3:
|
|
String publishedMin = readString("published-min");
|
|
query.setPublishedMin(DateTime.parseDate(publishedMin));
|
|
break;
|
|
case 4:
|
|
String publishedMax = readString("published-max");
|
|
query.setPublishedMax(DateTime.parseDate(publishedMax));
|
|
break;
|
|
case 5:
|
|
String updatedMin = readString("updated-min");
|
|
query.setUpdatedMin(DateTime.parseDate(updatedMin));
|
|
break;
|
|
case 6:
|
|
String updatedMax = readString("updated-max");
|
|
query.setUpdatedMax(DateTime.parseDate(updatedMax));
|
|
break;
|
|
case 7:
|
|
int startIndex = readInteger("start-index");
|
|
query.setStartIndex(startIndex);
|
|
break;
|
|
case 8:
|
|
int maxResults = readInteger("max-results");
|
|
query.setMaxResults(maxResults);
|
|
break;
|
|
case 9:
|
|
String owner = readString("owner");
|
|
query.setOwner(owner);
|
|
break;
|
|
case 10:
|
|
String reporter = readString("reporter");
|
|
query.setAuthor(reporter);
|
|
break;
|
|
case 11:
|
|
String status = readString("status");
|
|
query.setStatus(status);
|
|
break;
|
|
case 12:
|
|
String label = readString("label");
|
|
query.setLabel(label);
|
|
break;
|
|
case 13:
|
|
String cannedQuery = readString("canned-query");
|
|
query.setCan(cannedQuery);
|
|
break;
|
|
default:
|
|
System.out.println("Invalid choice " + choice);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints usage of this application.
|
|
*/
|
|
private static void usage() {
|
|
System.out.println(
|
|
"Syntax: ProjectHostingReadDemo --project <project> "
|
|
+ "[--username <username> --password <password>]\n"
|
|
+ "\t<project>\tProject on which the demo will run.\n"
|
|
+ "\t<username>\tGoogle Account username\n"
|
|
+ "\t<password>\tGoogle Account password\n");
|
|
}
|
|
}
|