Custom Versioning for Google Docs: Handling File Operations on Google App Engine

Knoldus Inc.
Knoldus - Technical Insights
3 min readMay 16, 2011

In the last post you saw how easy it was to use the functionality of GWTUpload and upload the file to the server. In this post we would look at the file handling for Google App Engine.

As you would know that File operations are not allowed on the app engine. You can however, read from a file if it is uploaded as a part of your application war or your application can use the IO classes which are useful for reading from the file system. The whitelisted list of classes is available here, but for us, the following are supported File, FileInputStream, FileReader, or RandomAccessFile.

By default the uploaded files are stored in the session for further processing by the GWTUpload servlet. We get all the files which are present in the session with the following code

[sourcecode language=”java”]
@Override
public String executeAction(HttpServletRequest request, List sessionFiles) throws UploadActionException {
String response = “”;
List<FileItem> itemsTobeUploaded = new ArrayList();
String description = getDescription(request);

for (FileItem item : sessionFiles) {
if (item.isFormField() == false) {
itemsTobeUploaded.add(item);
}
}

for (FileItem fileItem : itemsTobeUploaded) {
try {
documentService.uploadFileToGoogleDocs(fileItem, description);
} catch (Exception e) {
// catch all exceptions here for the purpose of this blogpost
}
}
// / Remove files from session because we have a copy of them
removeSessionFileItems(request);

// / Send your customized message to the client.
return response;
}
[/sourcecode]

As you would notice, we are overriding the executeAction method of the AppEngineUploadAction servlet. Here we are doing processing which is very specific to our application.

Here, we are passing the FileItem to the documentService which would upload the document on Google Docs. FileItem is an apache commons fileupload interface. It represents a file or a form item which was received within a multipart/form-data post request.

The uploadFileToGoogleDocs does some logic with Google Docs which we are not I nterested in right now. That would be the details of the post in which we talk about calling Google Docs from App Engine.

[sourcecode language=”java”]
public boolean uploadFileToGoogleDocs(FileItem file, String description) throws MalformedURLException, IOException, ServiceException {
boolean uploadStatus = false;

//… some logic

uploadNewFile(docsService, file, description);

//… some more logic

}
[/sourcecode]

For now let us look at the details of the uploadNewFile(docsService, file, description); method

[sourcecode language=”java”]
private void uploadNewFile(DocsService docsService, FileItem file, String description) throws AuthenticationException, IOException,
ServiceException, MalformedURLException {
String mimeType = DocumentListEntry.MediaType.fromFileName(file.getName()).getMimeType();

DocumentListEntry newDocument = new DocumentListEntry();
newDocument.setMediaSource(new MediaByteArraySource(file.get(), mimeType));
newDocument.setTitle(new PlainTextConstruct(file.getName()));
newDocument.setDescription(description);
System.out.println(“Uploaded document with description “ + description);
docsService.insert(new URL(DOCUMENT_URL), newDocument);
}
[/sourcecode]

As you would notice that we get the contents of the file not as a file but as a byte[]. We have a method in DocumentListEntry called setMediaSource

setMediaSource
public void setMediaSource(MediaSource mediaSource)
Description copied from interface: IMediaEntry
Sets the MediaSource that contains the media data for the entry.

Through this method, we can set the MediaSource to be a ByteArray. The file.get() method results in a byte[] and the mimeType is easily obtained with file.getName().getMimeType()
Hence we are able to extract the contents of the file from the app engine and pass it onto the Google document service.
In the next post, we would get into the details of Google Document Service and see how we can use it to work with Google Docs.

Inphina, as an expert on Google App Engine and Google Apps has helped more than 10 medium to large organizations help take advantage of the cloud by building, migrating or re-engineering their complex line of business applications to the cloud thereby making significant reductions in their capex expenditure. If you are interested in an assessment send us a mail at cloud@inphina.com

--

--

Knoldus Inc.
Knoldus - Technical Insights

Group of smart Engineers with a Product mindset who partner with your business to drive competitive advantage | www.knoldus.com