/* 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.health;
import com.google.gdata.client.health.HealthService;
import sample.util.SimpleCommandLineParser;
import com.google.gdata.data.health.ProfileFeed;
import com.google.gdata.data.health.ProfileEntry;
import com.google.gdata.data.health.RegisterFeed;
import com.google.gdata.data.health.RegisterEntry;
import com.google.gdata.data.Feed;
import com.google.gdata.data.Entry;
import com.google.gdata.data.TextContent;
import com.google.gdata.util.ServiceException;
import com.google.gdata.util.AuthenticationException;
import java.io.PrintStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.logging.ConsoleHandler;
import java.util.List;
import java.util.ArrayList;
/**
* A demo for GData Health API.
*
*
*/
public class HealthDemo {
/** The message for displaying the usage parameters. */
private static final String[] USAGE_MESSAGE = {
"Usage: java HealthDemo.jar --username <user> --password <pass>",
" [--log] Enable logging of requests"
};
/** Help on all available commands. */
private static final String[] COMMAND_HELP_MESSAGE = {
"Commands:",
" profile [[Prints all of user's medical profiles]]",
" register [[Prints all of user's external notices]]",
" exit [[quit sample]]"};
/** Welcome message, introducing the program. */
private static final String[] WELCOME_MESSAGE = {
"This is a demo of the Google health Profile Feed!", "",
"Using this interface, you can view list of Profile entries.",
""};
private static final String FEED_BASE_PATH =
"https://www.google.com/health/feeds/";
private static final String PROFILE_FEED_PATH = FEED_BASE_PATH + "profile/";
private static final String REGISTER_FEED_PATH = FEED_BASE_PATH + "register/";
private static final String PROFILE_LIST_URL_PATH = PROFILE_FEED_PATH + "list";
private HealthService service;
private List<String> profileIds = null;
private PrintStream out;
public HealthDemo() {
}
public HealthDemo(HealthService service, PrintStream outputStream)
throws MalformedURLException {
this.service = service;
this.out = outputStream;
}
private List<String> getAllProfileIds() throws IOException, ServiceException {
if (profileIds != null) {
return profileIds;
}
profileIds = new ArrayList<String>();
Feed profileListFeed = service.getFeed(
new URL(PROFILE_LIST_URL_PATH), Feed.class);
for (Entry profileListEntry : profileListFeed.getEntries()) {
profileIds.add(
((TextContent) profileListEntry.getContent()).
getContent().getPlainText());
}
return profileIds;
}
/**
* Prints the CCR record for specified profile id.
*
* @param profileId for which ccr record is requested
* @throws IOException
* @throws ServiceException
*/
public void showProfileForId(String profileId)
throws IOException, ServiceException {
out.println("CCR records for profile id: " + profileId);
ProfileFeed feed = service.getFeed(
new URL(PROFILE_FEED_PATH + "ui/" + profileId), ProfileFeed.class);
for (ProfileEntry entry : feed.getEntries()) {
out.println(entry.getContinuityOfCareRecord().getXmlBlob().getBlob());
}
}
/**
* Prints notices corresponding to specified profile.
*
* @param profileId whose notices need to be printed.
* @throws IOException
* @throws ServiceException
*/
public void showNoticesForId(String profileId)
throws IOException, ServiceException {
out.println("Notices for profile id: " + profileId);
RegisterFeed feed = service.getFeed(
new URL(REGISTER_FEED_PATH + "ui/" + profileId), RegisterFeed.class);
if (feed.getEntries().size() == 0) {
out.println("There are no notices for this profile");
}
int noticeIndex = 1;
for (RegisterEntry entry : feed.getEntries()) {
out.println(noticeIndex + ")" + entry.getTitle().getPlainText());
noticeIndex++;
}
}
private String selectProfile(BufferedReader reader)
throws IOException, ServiceException {
int profileIndex = 1;
out.println("Please select a profile from the following list: ");
for (String e : getAllProfileIds()) {
out.println(profileIndex++ + ") " + e);
}
int choice = -1;
while (choice < 1 || choice > profileIds.size()) {
out.println("Select a profile: ");
choice = Integer.parseInt(reader.readLine());
}
return getAllProfileIds().get(choice - 1);
}
/**
* Reads and executes one command.
*
* @param reader to read input from the keyboard
* @return false if the user quits, true on exception
*/
private boolean executeCommand(BufferedReader reader) {
for (String s : COMMAND_HELP_MESSAGE) {
out.println(s);
}
System.err.print("Command: ");
try {
String name = reader.readLine();
if (name.equals("profile")) {
showProfileForId(selectProfile(reader));
} else if (name.equals("register")) {
showNoticesForId(selectProfile(reader));
} else if (name.startsWith("q") || name.startsWith("exit")) {
return false;
} else {
out.println("Unknown command.");
}
} catch (Exception e) {
// Show *exactly* what went wrong.
e.printStackTrace();
}
return true;
}
/**
* Starts up the demo and prompts for commands.
*
* @param username name of user to authenticate (e.g. yourname@gmail.com)
* @param password password to use for authentication
* @throws com.google.gdata.util.AuthenticationException
* if the service is unable to validate the username and password.
*/
private void run(String username, String password)
throws AuthenticationException {
for (String s : WELCOME_MESSAGE) {
out.println(s);
}
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
service.setUserCredentials(username, password);
while (executeCommand(reader)) {
}
}
public static void main(String[] args)
throws IOException, ServiceException {
SimpleCommandLineParser parser = new SimpleCommandLineParser(args);
String username = parser.getValue("username", "user", "u");
String password = parser.getValue("password", "pass", "p");
boolean help = parser.containsKey("help", "h");
if (help || username == null || password == null) {
usage();
System.exit(1);
}
if (parser.containsKey("log", "l")) {
turnOnLogging();
}
HealthDemo demo = new HealthDemo(
new HealthService("Sample Health Client"), System.out);
demo.run(username, password);
}
private static void turnOnLogging() {
// Configure the logging mechanisms
Logger httpLogger =
Logger.getLogger("com.google.gdata.client.http.HttpGDataRequest");
httpLogger.setLevel(Level.ALL);
Logger xmlLogger = Logger.getLogger("com.google.gdata.util.XmlParser");
xmlLogger.setLevel(Level.ALL);
// Create a log handler which prints all log events to the console
ConsoleHandler logHandler = new ConsoleHandler();
logHandler.setLevel(Level.ALL);
httpLogger.addHandler(logHandler);
xmlLogger.addHandler(logHandler);
}
/**
* Prints out the usage.
*/
private static void usage() {
for (String s : USAGE_MESSAGE) {
System.out.println(s);
}
for (String s : WELCOME_MESSAGE) {
System.out.println(s);
}
}
}