/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.wink.example.googledocs;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.cli.ParseException;
import org.apache.wink.client.ClientConfig;
import org.apache.wink.client.ClientResponse;
import org.apache.wink.client.ClientWebException;
import org.apache.wink.client.Resource;
import org.apache.wink.client.RestClient;
import org.apache.wink.common.model.synd.SyndEntry;
import org.apache.wink.common.model.synd.SyndFeed;
import org.apache.wink.common.model.synd.SyndLink;
import org.apache.wink.common.model.synd.SyndPerson;
public class GoogleDocsClient {
private final static String lineSeparator = System.getProperty("line.separator");
private final String URL =
"http://docs.google.com/feeds/documents/private/full/";
private RestClient restClient;
private CLIHelper cliHelper;
/**
* main
*/
public static void main(String[] args) {
CLIHelper cliHelper = new CLIHelper();
if (args.length < 1) {
cliHelper.printHelp();
} else {
try {
cliHelper.init(args);
} catch (ParseException e) {
System.out.println(e.getMessage());
cliHelper.printHelp();
}
new GoogleDocsClient(cliHelper).run();
}
}
private GoogleDocsClient(CLIHelper cliHelper) {
ClientConfig config = new ClientConfig();
if (cliHelper.hasProxy()) {
config.proxyHost(cliHelper.getProxyHost());
config.proxyPort(Integer.valueOf(cliHelper.getProxyPort()));
}
// add google authentication handler
config.handlers(new GoogleAuthHandler(cliHelper.getEmail(), cliHelper.getPassword()));
restClient = new RestClient(config);
this.cliHelper = cliHelper;
}
private void run() {
try {
if (cliHelper.isList()) {
String listFiles = listFiles();
System.out.println(listFiles);
} else if (cliHelper.isUpload()) {
String filename = cliHelper.getUploadFilename();
String uploadFile = uploadFile(filename);
System.out.println("Uploaded: " + uploadFile);
} else if (cliHelper.isDelete()) {
String id = cliHelper.getDeleteId();
delete(id);
System.out.println(id + " deleted.");
} else {
System.out.println("Nothing to do.");
}
} catch (ClientWebException e) {
// error during client invocation
// usually it happens when status code starting with 400 or 500 is
// returned
ClientResponse response = e.getResponse();
System.out.println("Status: " + response.getStatusCode());
System.out.println("Message: " + response.getMessage());
System.out.println("Body: " + response.getEntity(String.class));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* returns list of Google document files, the list is returned as String
*/
public String listFiles() throws ClientWebException {
// create a resource
Resource listOfDocumentsResource = restClient.resource(URL);
// invoke GET on the resource and parse the result as SyndFeed
SyndFeed list = listOfDocumentsResource.get(SyndFeed.class);
// convert SyndFeed to String
return feedToString(list);
}
/**
* delete file
*
* @param id - id as it appears in edit link
*/
public void delete(String id) {
Resource resource = restClient.resource(URL + id);
ClientResponse response = resource.delete(ClientResponse.class);
if (response.getStatusCode() != 200) {
throw new ClientWebException(null, response);
}
}
/**
* Upload a file
*
* @param filename - full filename to upload
* @return location of the uploaded file
* @throws FileNotFoundException - file was not found
* @throws ClientWebException - error occurred during the upload
*/
public String uploadFile(String filename) throws FileNotFoundException, ClientWebException {
Resource listOfDocumentsResource = restClient.resource(URL);
File file = new File(filename);
ClientResponse clientResponse =
listOfDocumentsResource.header("Slug", file.getName())
.contentType(mapContentType(filename)).post(ClientResponse.class,
new FileInputStream(file));
if (clientResponse.getStatusCode() == Status.CREATED.getStatusCode()) {
return clientResponse.getHeaders().getFirst(HttpHeaders.LOCATION);
}
throw new ClientWebException(null, clientResponse);
}
private String mapContentType(String filename) {
String upperFileName = filename.toUpperCase();
if (upperFileName.endsWith("CSV")) {
return "text/csv";
}
if (upperFileName.endsWith("TSV")) {
return "text/tab-separated-values";
}
if (upperFileName.endsWith("TAB")) {
return "text/tab-separated-values";
}
if (upperFileName.endsWith("HTML")) {
return "text/html";
}
if (upperFileName.endsWith("HTM")) {
return "text/html";
}
if (upperFileName.endsWith("DOC")) {
return "application/msword";
}
if (upperFileName.endsWith("ODS")) {
return "application/x-vnd.oasis.opendocument.spreadsheet";
}
if (upperFileName.endsWith("ODT")) {
return "application/vnd.oasis.opendocument.text";
}
if (upperFileName.endsWith("RTF")) {
return "application/rtf";
}
if (upperFileName.endsWith("SXW")) {
return "application/vnd.sun.xml.writer";
}
if (upperFileName.endsWith("TXT")) {
return "text/plain";
}
if (upperFileName.endsWith("XLS")) {
return "application/vnd.ms-excel";
}
if (upperFileName.endsWith("PPT")) {
return "application/vnd.ms-powerpoint";
}
if (upperFileName.endsWith("PPS")) {
return "application/vnd.ms-powerpoint";
}
throw new RuntimeException("Unknown extension.");
}
/**
* converts the SyndFeed to flat list to display it to user
*/
private String feedToString(SyndFeed list) {
StringBuilder buf = new StringBuilder();
for (SyndEntry entry : list.getEntries()) {
buf.append('"');
buf.append(entry.getTitle().getValue());
buf.append('"');
List<SyndPerson> authors = entry.getAuthors();
if (authors.size() > 0) {
buf.append(" by ");
buf.append(authors.get(0).getName());
}
buf.append(" published at ");
buf.append(String.valueOf(entry.getPublished()));
SyndLink edit = null;
for (SyndLink link : entry.getLinks()) {
if (link.getRel().equals("edit")) {
edit = link;
break;
}
}
if (edit != null) {
buf.append(" edit id: ");
buf.append(edit.getHref().substring(URL.length()));
}
buf.append(lineSeparator);
}
return buf.toString();
}
}