burrito.client.widgets.blobstore.BlobStoreUploader.java Source code

Java tutorial

Introduction

Here is the source code for burrito.client.widgets.blobstore.BlobStoreUploader.java

Source

/**
 * Copyright 2011 Henric Persson (henric.persson@gmail.com)
 * 
 * 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 burrito.client.widgets.blobstore;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
import burrito.client.widgets.services.BlobService;
import burrito.client.widgets.services.BlobServiceAsync;

public class BlobStoreUploader extends Composite {
    private FormPanel form = new FormPanel();
    private BlobServiceAsync service = GWT.create(BlobService.class);
    private FileUpload file = new FileUpload();
    private Image progress = new Image(GWT.getModuleBaseURL() + "images/loading.gif");

    public BlobStoreUploader(final AsyncCallback<String> callback) {
        this(null, null, callback);
    }

    public BlobStoreUploader(Integer requiredWidth, Integer requiredHeight, final AsyncCallback<String> callback) {
        FlowPanel inner = new FlowPanel();
        inner.add(file);
        file.setName("file");
        file.addChangeHandler(new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent event) {
                getUploadURLAndPost();
            }
        });
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);
        if (requiredWidth != null) {
            inner.add(new Hidden("width", String.valueOf(requiredWidth)));
        }
        if (requiredHeight != null) {
            inner.add(new Hidden("height", String.valueOf(requiredHeight)));
        }
        form.addSubmitHandler(new SubmitHandler() {

            @Override
            public void onSubmit(SubmitEvent event) {
                file.setVisible(false);
                progress.setVisible(true);
            }
        });

        form.addSubmitCompleteHandler(new SubmitCompleteHandler() {

            @Override
            public void onSubmitComplete(SubmitCompleteEvent event) {
                file.setVisible(true);
                progress.setVisible(false);
                String results = event.getResults().replaceAll("<.*?>", ""); // sometime, <pre> tags are added by the browser
                if (results.contains("OK#")) {
                    String blobStoreKey = results.replace("OK#", "");
                    callback.onSuccess(blobStoreKey);
                } else {
                    Window.alert(results);
                    callback.onFailure(new RuntimeException("Failure response from server"));
                }
            }
        });
        progress.setVisible(false);
        inner.add(progress);

        form.add(inner);
        initWidget(form);
    }

    protected void getUploadURLAndPost() {
        service.getBlobStoreUploadURL(new AsyncCallback<String>() {

            @Override
            public void onSuccess(String uploadURL) {
                doPost(uploadURL);
            }

            @Override
            public void onFailure(Throwable caught) {
                throw new RuntimeException("Failed to get upload URL", caught);
            }
        });
    }

    protected void doPost(String uploadURL) {
        form.setAction(uploadURL);
        form.submit();
    }
}