Question

I have gotten almost a complete API to work, with creating and deleting documents and folders. But I fail at updating documents. It was very easy when using gdata, but since this code has to work on all android devices, I have to use google api java client. Here is a method where I test the updating:

public void updateTest() throws IOException {
    InputStreamContent isContent = new InputStreamContent();
    isContent.inputStream = new ByteArrayInputStream("NEW CONTENT".getBytes("UTF-8"));
    isContent.type = "text/plain";

    HttpRequest request = transport.buildPostRequest();
    request.setUrl("https://docs.google.com/feeds/default/media/document:0A[snip]3Y");

    request.content = isContent;

    // request.headers.set("If-Match", "*");

    try {
        request.execute().parseAs(DocumentListEntry.class);
    } catch (HttpResponseException e) {
        if (Constant.DEBUG) Log.d(TAG, "error: " + e.response.parseAsString());
        throw e;
    } catch (ClientProtocolException e) {
        if (Constant.DEBUG) Log.d(TAG, "error: " + e.getMessage());
        throw e;
    }
}

What happens is that I just create a new document (with the given content, creating a new document works perfect). If I do add the "If-Match: *"-header, I get this exception:

11-19 11:17:16.536: DEBUG/DocsAPI(32195): error: <errors xmlns='http://schemas.google.com/g/2005'>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): <error>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): <domain>GData</domain>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): <code>noPostConcurrency</code>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): <internalReason>POST method does not support concurrency</internalReason>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): </error>
11-19 11:17:16.536: DEBUG/DocsAPI(32195): </errors>
11-19 11:17:16.536: WARN/System.err(32195): com.google.api.client.http.HttpResponseException: 501 Not Implemented
11-19 11:17:16.540: WARN/System.err(32195):     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:209)
...
Was it helpful?

Solution

For updating an existing document you should use PUT command: Updating documents

OTHER TIPS

You first need to query for the file. In the response you want to look for an element among the list of links whose name is "edit-media". You then post to that address.

The code below can be added to Google's sample project docs-v3-atom-oauth-sample from google-client api's website http://code.google.com/p/google-api-java-client/wiki/GoogleAPIs

private String queryRegistryforEditId() {
    String str ="https://docs.google.com/feeds/default/private/full?title=" + URL_FRIENDLY_QUERY_PHRASE;
    DocsUrl url = new DocsUrl(str);

    DocumentListFeed feed;
    try {
        feed = DocumentListFeed.executeGet(transport, url);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }

    //display(feed);
    String ans = null;
    //LIST OF FILES MATCHING QUERY
    for (DocumentListEntry doc : feed.docs) {
        //doc.content.src has url to download file
        //I added src to content class that comes from the sameple code
        Map<String, String> data = retriveDocUsingId(doc.content.src);

        List<Link> lik = doc.links;
        for (Link i : lik) {
            //look for "edit-media" to get url to post edits to file
            if (i.rel.equals("edit-media")) {
                ans = i.href;
                System.out.println(i.href);
            }
        }
        //System.out.println(" doc.title: " + doc.title + " doc.id " + doc.id);
    }
    return ans;
}  

private void updateDocumentText(String edit) {
    HttpRequest request = transport.buildPutRequest();
    request.url = new GoogleUrl(edit);

    GoogleHeaders headers = (GoogleHeaders)transport.defaultHeaders;
    headers.contentType = "text/plain";
    headers.gdataVersion = "3";
    headers.slug = "examplefile";
    headers.ifMatch = "*";      
    request.headers = headers;

    AtomParser parser = new AtomParser();
    parser.namespaceDictionary = Namespace.DICTIONARY;
    transport.addParser(parser);
    File file = new File ("/newfilepath/test233.txt");

    InputStreamContent bContent = new InputStreamContent();
    bContent.type = "text/plain";
    request.content = bContent;

    try {
        bContent.setFileInput(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    com.google.api.client.http.HttpResponse res2;
    try {
        res2 = request.execute();
        System.out.println(res2.parseAsString());
    } catch (HttpResponseException e) {
        try {
            System.out.println(e.response.parseAsString());
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }   
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top