com.google.livingstories.client.contentmanager.ImportManager.java Source code

Java tutorial

Introduction

Here is the source code for com.google.livingstories.client.contentmanager.ImportManager.java

Source

/**
 * Copyright 2010 Google Inc.
 *
 * 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 com.google.livingstories.client.contentmanager;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;

/**
 * Page that handles data import.
 * 
 * See comments in DataImportServlet.java for explanation of
 * how this page helps spread the import work across multiple
 * requests to avoid going over the appengine request timeout.
 */
public class ImportManager extends ManagerPane {
    private FormPanel fileUploadForm;
    private FormPanel progressForm;
    private HTML statusLabel;

    private int progress;

    public ImportManager() {
        final VerticalPanel contentPanel = new VerticalPanel();

        contentPanel.add(createExportLink());
        contentPanel.add(createImportInstructions());
        contentPanel.add(createFileUploadForm());
        contentPanel.add(createProgressForm());

        initWidget(contentPanel);
    }

    private Widget createExportLink() {
        Label titleLabel = new Label("Export");
        titleLabel.setStylePrimaryName("header");

        HTML instructions = new HTML("<a href=\"/export\">Click here</a> to export all living story"
                + " data to a JSON file (does not export user data).");

        VerticalPanel exportPanel = new VerticalPanel();
        exportPanel.add(titleLabel);
        exportPanel.add(instructions);
        return exportPanel;
    }

    private Widget createImportInstructions() {
        Label titleLabel = new Label("Import");
        titleLabel.setStylePrimaryName("header");

        Label instructions = new Label("Import data from a JSON file created via the export link above."
                + " All existing data will be deleted!");

        VerticalPanel exportPanel = new VerticalPanel();
        exportPanel.add(titleLabel);
        exportPanel.add(instructions);
        return exportPanel;
    }

    private Widget createFileUploadForm() {
        fileUploadForm = new FormPanel();
        fileUploadForm.setAction("/import");
        fileUploadForm.setEncoding(FormPanel.ENCODING_MULTIPART);
        fileUploadForm.setMethod(FormPanel.METHOD_POST);

        VerticalPanel fileUploadPanel = new VerticalPanel();
        fileUploadForm.setWidget(fileUploadPanel);

        FileUpload upload = new FileUpload();
        upload.setName("data");
        fileUploadPanel.add(upload);

        CheckBox override = new CheckBox(
                "Check this box if the previous import attempt resulted in " + "an error.");
        override.setName("override");
        override.setFormValue("true");
        fileUploadPanel.add(override);

        Button submit = new Button("Submit");
        submit.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent e) {
                fileUploadForm.submit();
                statusLabel.setHTML("Uploading...");
                progress = 0;
            }
        });
        fileUploadPanel.add(submit);

        fileUploadForm.addSubmitCompleteHandler(new SubmitCompleteHandler() {
            @Override
            public void onSubmitComplete(SubmitCompleteEvent e) {
                processResult(e.getResults());
            }
        });
        return fileUploadForm;
    }

    private Widget createProgressForm() {
        progressForm = new FormPanel();
        progressForm.setAction("/import");
        progressForm.setEncoding(FormPanel.ENCODING_URLENCODED);
        progressForm.setMethod(FormPanel.METHOD_POST);

        VerticalPanel progressPanel = new VerticalPanel();
        progressForm.setWidget(progressPanel);

        statusLabel = new HTML();
        progressPanel.add(statusLabel);

        progressForm.addSubmitCompleteHandler(new SubmitCompleteHandler() {
            @Override
            public void onSubmitComplete(SubmitCompleteEvent e) {
                processResult(e.getResults());
            }
        });
        return progressForm;
    }

    private void processResult(String result) {
        if (result.contains("RUNNING")) {
            progressForm.submit();
            StringBuilder sb = new StringBuilder(result);
            for (int i = 0; i < progress; i++) {
                sb.append(".");
            }
            statusLabel.setHTML(sb.toString());
            progress++;
        } else {
            statusLabel.setHTML(result);
        }
    }
}