LoadOdtFromGoogle.java
- package org.jbehave.core.io.google;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.List;
- import com.google.gdata.client.DocumentQuery;
- import com.google.gdata.client.docs.DocsService;
- import com.google.gdata.data.MediaContent;
- import com.google.gdata.data.docs.DocumentListEntry;
- import com.google.gdata.data.docs.DocumentListFeed;
- import com.google.gdata.data.media.MediaSource;
- import com.google.gdata.util.AuthenticationException;
- import com.google.gdata.util.ServiceException;
- import org.jbehave.core.io.odf.LoadOdtFromURL;
- public class LoadOdtFromGoogle extends LoadOdtFromURL {
- private static final DocsService DEFAULT_DOCS_SERVICE = new DocsService("jbehave");
- private static final String DEFAULT_FEED_URI = "https://docs.google.com/feeds/default/private/full/";
- private final DocsService service;
- private final String feedURI;
- public LoadOdtFromGoogle(String username, String password) {
- this(username, password, DEFAULT_FEED_URI);
- }
- public LoadOdtFromGoogle(String username, String password, String feedURI) {
- this(username, password, feedURI, DEFAULT_DOCS_SERVICE);
- }
- public LoadOdtFromGoogle(String username, String password, String feedURI, DocsService service) {
- this.service = service;
- this.feedURI = feedURI;
- try {
- service.setUserCredentials(username, password);
- } catch (AuthenticationException e) {
- throw new GoogleAccessFailed(username, e);
- }
- }
- @Override
- protected InputStream resourceAsStream(String title) throws IOException {
- try {
- return documentAsStream(exportURL(title));
- } catch (ServiceException e) {
- throw new IOException(e);
- }
- }
- private String exportURL(String title) throws IOException, ServiceException {
- DocumentQuery query = documentQuery(title);
- List<DocumentListEntry> entries = service.getFeed(query, DocumentListFeed.class).getEntries();
- if (entries.isEmpty()) {
- throw new GoogleDocumentNotFound(title);
- }
- return ((MediaContent) entries.get(0).getContent()).getUri() + "&exportFormat=odt";
- }
- DocumentQuery documentQuery(String title) throws MalformedURLException {
- DocumentQuery query = new DocumentQuery(new URL(feedURI));
- query.setTitleQuery(title);
- query.setTitleExact(true);
- query.setMaxResults(1);
- return query;
- }
- private InputStream documentAsStream(String url) throws IOException {
- try {
- MediaSource ms = service.getMedia(mediaContent(url));
- return ms.getInputStream();
- } catch (ServiceException e) {
- throw new GoogleMediaExportFailed(url, e);
- }
- }
- MediaContent mediaContent(String url) {
- MediaContent mc = new MediaContent();
- mc.setUri(url);
- return mc;
- }
- @SuppressWarnings("serial")
- public static class GoogleAccessFailed extends RuntimeException {
- public GoogleAccessFailed(String username, Throwable cause) {
- super("Google access failed for user " + username, cause);
- }
- }
- @SuppressWarnings("serial")
- public static class GoogleDocumentNotFound extends RuntimeException {
- public GoogleDocumentNotFound(String title) {
- super("Failed to find Google document from " + title);
- }
- }
- @SuppressWarnings("serial")
- public static class GoogleMediaExportFailed extends RuntimeException {
- public GoogleMediaExportFailed(String url, Throwable cause) {
- super("Failed to export Google media from " + url, cause);
- }
- }
- }