org.pentaho.mantle.client.dialogs.ImportDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.dialogs.ImportDialog.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2016 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.dialogs;

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.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
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 com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.IDialogValidatorCallback;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.gwt.widgets.client.listbox.CustomListBox;
import org.pentaho.gwt.widgets.client.listbox.DefaultListItem;
import org.pentaho.mantle.client.MantleApplication;
import org.pentaho.mantle.client.events.EventBusUtil;
import org.pentaho.mantle.client.events.GenericEvent;
import org.pentaho.mantle.client.messages.Messages;

/**
 * @author wseyler/modifed for Import parameters by tband
 */
@SuppressWarnings("deprecation")
public class ImportDialog extends PromptDialogBox {

    private FormPanel form;
    private final CustomListBox retainOwnershipDropDown = new CustomListBox();
    final CheckBox applyAclPermissions = new CheckBox(Messages.getString("applyAclPermissions"), true);

    /**
     * @param repositoryFile
     */
    public ImportDialog(RepositoryFile repositoryFile, boolean allowAdvancedDialog) {
        super(Messages.getString("import"), Messages.getString("ok"), Messages.getString("cancel"), false, true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

        form = new FormPanel();
        form.addSubmitHandler(new SubmitHandler() {
            @Override
            public void onSubmit(SubmitEvent se) {
                // if no file is selected then do not proceed
                okButton.setEnabled(false);
                cancelButton.setEnabled(false);
                MantleApplication.showBusyIndicator(Messages.getString("pleaseWait"),
                        Messages.getString("importInProgress"));
            }
        });
        form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
            @Override
            public void onSubmitComplete(SubmitCompleteEvent sce) {
                MantleApplication.hideBusyIndicator();
                okButton.setEnabled(false);
                cancelButton.setEnabled(true);
                ImportDialog.this.hide();
                String result = sce.getResults();
                if (result.length() > 5) {
                    HTML messageTextBox = null;
                    if (result.contains("INVALID_MIME_TYPE") == true) {
                        messageTextBox = new HTML(Messages.getString("uploadInvalidFileTypeQuestion", result));
                    } else {
                        logWindow(result, Messages.getString("importLogWindowTitle"));
                    }

                    if (messageTextBox != null) {
                        PromptDialogBox dialogBox = new PromptDialogBox(Messages.getString("uploadUnsuccessful"),
                                Messages.getString("close"), null, true, true);
                        dialogBox.setContent(messageTextBox);
                        dialogBox.center();
                    }
                }

                // if mantle_isBrowseRepoDirty=true: do getChildren call
                // if mantle_isBrowseRepoDirty=false: use stored fileBrowserModel in myself.get("cachedData")
                setBrowseRepoDirty(Boolean.TRUE);

                // BISERVER-9319 Refresh browse perspective after import
                final GenericEvent event = new GenericEvent();
                event.setEventSubType("ImportDialogEvent");
                EventBusUtil.EVENT_BUS.fireEvent(event);
            }
        });

        VerticalPanel rootPanel = new VerticalPanel();

        VerticalPanel spacer = new VerticalPanel();
        spacer.setHeight("10px");
        rootPanel.add(spacer);

        Label fileLabel = new Label(Messages.getString("file") + ":");
        final TextBox importDir = new TextBox();
        rootPanel.add(fileLabel);

        okButton.setEnabled(false);

        final TextBox fileTextBox = new TextBox();
        fileTextBox.setEnabled(false);

        //We use an fileNameOverride because FileUpload can only handle US character set reliably.
        final Hidden fileNameOverride = new Hidden("fileNameOverride");

        final FileUpload upload = new FileUpload();
        upload.setName("fileUpload");
        ChangeHandler fileUploadHandler = new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                fileTextBox.setText(upload.getFilename());
                if (!"".equals(importDir.getValue())) {
                    //Set the fileNameOverride because the fileUpload object can only reliably transmit US-ASCII
                    //character set.  See RFC283 section 2.3 for details
                    String fileNameValue = upload.getFilename().replaceAll("\\\\", "/");
                    fileNameValue = fileNameValue.substring(fileNameValue.lastIndexOf("/") + 1);
                    fileNameOverride.setValue(fileNameValue);
                    okButton.setEnabled(true);
                } else {
                    okButton.setEnabled(false);
                }
            }
        };
        upload.addChangeHandler(fileUploadHandler);
        upload.setVisible(false);

        HorizontalPanel fileUploadPanel = new HorizontalPanel();
        fileUploadPanel.add(fileTextBox);
        fileUploadPanel.add(new HTML(" "));

        Button browseButton = new Button(Messages.getString("browse") + "...");
        browseButton.setStyleName("pentaho-button");
        fileUploadPanel.add(browseButton);
        browseButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                setRetainOwnershipState();
                jsClickUpload(upload.getElement());
            }
        });

        rootPanel.add(fileUploadPanel);
        rootPanel.add(upload);

        applyAclPermissions.setName("applyAclPermissions");
        applyAclPermissions.setValue(Boolean.FALSE);
        applyAclPermissions.setFormValue("false");
        applyAclPermissions.setEnabled(true);
        applyAclPermissions.setVisible(false);

        final CheckBox overwriteAclPermissions = new CheckBox(Messages.getString("overwriteAclPermissions"), true);
        overwriteAclPermissions.setName("overwriteAclPermissions");
        applyAclPermissions.setValue(Boolean.FALSE);
        applyAclPermissions.setFormValue("false");
        overwriteAclPermissions.setEnabled(true);
        overwriteAclPermissions.setVisible(false);

        final Hidden overwriteFile = new Hidden("overwriteFile");
        overwriteFile.setValue("true");

        final Hidden logLevel = new Hidden("logLevel");
        logLevel.setValue("ERROR");

        final Hidden retainOwnership = new Hidden("retainOwnership");
        retainOwnership.setValue("true");

        rootPanel.add(applyAclPermissions);
        rootPanel.add(overwriteAclPermissions);
        rootPanel.add(overwriteFile);
        rootPanel.add(logLevel);
        rootPanel.add(retainOwnership);
        rootPanel.add(fileNameOverride);

        spacer = new VerticalPanel();
        spacer.setHeight("4px");
        rootPanel.add(spacer);

        DisclosurePanel disclosurePanel = new DisclosurePanel(Messages.getString("advancedOptions"));
        disclosurePanel.getHeader().setStyleName("gwt-Label");
        disclosurePanel.setVisible(allowAdvancedDialog);
        HorizontalPanel mainPanel = new HorizontalPanel();
        mainPanel.add(new HTML(" "));
        VerticalPanel disclosureContent = new VerticalPanel();

        HTML replaceLabel = new HTML(Messages.getString("fileExists"));
        replaceLabel.setStyleName("gwt-Label");
        disclosureContent.add(replaceLabel);

        final CustomListBox overwriteFileDropDown = new CustomListBox();
        final CustomListBox filePermissionsDropDown = new CustomListBox();

        DefaultListItem replaceListItem = new DefaultListItem(Messages.getString("replaceFile"));
        replaceListItem.setValue("true");
        overwriteFileDropDown.addItem(replaceListItem);
        DefaultListItem doNotImportListItem = new DefaultListItem(Messages.getString("doNotImport"));
        doNotImportListItem.setValue("false");
        overwriteFileDropDown.addItem(doNotImportListItem);
        overwriteFileDropDown.setVisibleRowCount(1);
        disclosureContent.add(overwriteFileDropDown);

        spacer = new VerticalPanel();
        spacer.setHeight("4px");
        disclosureContent.add(spacer);

        HTML filePermissionsLabel = new HTML(Messages.getString("filePermissions"));
        filePermissionsLabel.setStyleName("gwt-Label");
        disclosureContent.add(filePermissionsLabel);

        DefaultListItem usePermissionsListItem = new DefaultListItem(Messages.getString("usePermissions"));
        usePermissionsListItem.setValue("false");
        filePermissionsDropDown.addItem(usePermissionsListItem); // If selected set "overwriteAclPermissions" to
        // false.
        DefaultListItem retainPermissionsListItem = new DefaultListItem(Messages.getString("retainPermissions"));
        retainPermissionsListItem.setValue("true");
        filePermissionsDropDown.addItem(retainPermissionsListItem); // If selected set "overwriteAclPermissions" to
        // true.

        final ChangeListener filePermissionsHandler = new ChangeListener() {
            @Override
            public void onChange(Widget sender) {
                String value = filePermissionsDropDown.getSelectedItem().getValue().toString();

                applyAclPermissions.setValue(Boolean.valueOf(value));
                applyAclPermissions.setFormValue(value);
                overwriteAclPermissions.setFormValue(value);
                overwriteAclPermissions.setValue(Boolean.valueOf(value));
                setRetainOwnershipState();
            }
        };
        filePermissionsDropDown.addChangeListener(filePermissionsHandler);
        filePermissionsDropDown.setVisibleRowCount(1);
        disclosureContent.add(filePermissionsDropDown);

        spacer = new VerticalPanel();
        spacer.setHeight("4px");
        disclosureContent.add(spacer);

        HTML fileOwnershipLabel = new HTML(Messages.getString("fileOwnership"));
        fileOwnershipLabel.setStyleName("gwt-Label");
        disclosureContent.add(fileOwnershipLabel);

        retainOwnershipDropDown.addChangeListener(new ChangeListener() {
            @Override
            public void onChange(Widget sender) {
                String value = retainOwnershipDropDown.getSelectedItem().getValue().toString();
                retainOwnership.setValue(value);
            }
        });
        DefaultListItem keepOwnershipListItem = new DefaultListItem(Messages.getString("keepOwnership"));
        keepOwnershipListItem.setValue("true");
        retainOwnershipDropDown.addItem(keepOwnershipListItem);
        DefaultListItem assignOwnershipListItem = new DefaultListItem(Messages.getString("assignOwnership"));
        assignOwnershipListItem.setValue("false");
        retainOwnershipDropDown.addItem(assignOwnershipListItem);

        retainOwnershipDropDown.setVisibleRowCount(1);
        disclosureContent.add(retainOwnershipDropDown);

        spacer = new VerticalPanel();
        spacer.setHeight("4px");
        disclosureContent.add(spacer);

        ChangeListener overwriteFileHandler = new ChangeListener() {
            @Override
            public void onChange(Widget sender) {
                String value = overwriteFileDropDown.getSelectedItem().getValue().toString();
                overwriteFile.setValue(value);
            }
        };
        overwriteFileDropDown.addChangeListener(overwriteFileHandler);

        HTML loggingLabel = new HTML(Messages.getString("logging"));
        loggingLabel.setStyleName("gwt-Label");
        disclosureContent.add(loggingLabel);

        final CustomListBox loggingDropDown = new CustomListBox();
        loggingDropDown.addChangeListener(new ChangeListener() {
            public void onChange(Widget sender) {
                String value = loggingDropDown.getSelectedItem().getValue().toString();
                logLevel.setValue(value);
            }
        });
        DefaultListItem noneListItem = new DefaultListItem(Messages.getString("none"));
        noneListItem.setValue("ERROR");
        loggingDropDown.addItem(noneListItem);
        DefaultListItem shortListItem = new DefaultListItem(Messages.getString("short"));
        shortListItem.setValue("WARN");
        loggingDropDown.addItem(shortListItem);
        DefaultListItem debugListItem = new DefaultListItem(Messages.getString("verbose"));
        debugListItem.setValue("TRACE");
        loggingDropDown.addItem(debugListItem);
        loggingDropDown.setVisibleRowCount(1);
        disclosureContent.add(loggingDropDown);

        mainPanel.add(disclosureContent);
        disclosurePanel.setContent(mainPanel);
        rootPanel.add(disclosurePanel);

        importDir.setName("importDir");
        importDir.setText(repositoryFile.getPath());
        importDir.setVisible(false);

        rootPanel.add(importDir);

        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);

        setFormAction();

        form.add(rootPanel);

        setContent(form);
    }

    native void jsClickUpload(Element uploadElement)
    /*-{
       uploadElement.click();
    }-*/;

    private static native void logWindow(String innerText, String windowTitle)
    /*-{
       var logWindow = window.open('', '', 'width=640, height=480, location=no, menubar=yes, toolbar=yes', false);
       var htmlText = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
       <html><head><title>' + windowTitle + '</title></head><body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">'
       + innerText + "</body></html>";
       logWindow.document.write(htmlText);
    }-*/;

    private void setFormAction() {
        String moduleBaseURL = GWT.getModuleBaseURL();
        String moduleName = GWT.getModuleName();
        String contextURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf(moduleName));
        String importURL = contextURL + "api/repo/files/import";
        form.setAction(importURL);
    }

    public FormPanel getForm() {
        return form;
    }

    protected void onOk() {
        IDialogCallback callback = this.getCallback();
        IDialogValidatorCallback validatorCallback = this.getValidatorCallback();
        if (validatorCallback == null || (validatorCallback != null && validatorCallback.validate())) {
            try {
                if (callback != null) {
                    setFormAction();
                    callback.okPressed();
                }
            } catch (Throwable dontCare) {
                // ignored
            }
        }
    }

    private static native void setBrowseRepoDirty(boolean isDirty)
    /*-{
        $wnd.mantle_isBrowseRepoDirty = isDirty;
    }-*/;

    // This is a work around of a GWT Widget bug. If you disable a CustomerListBox before
    // it is rendered it will stay two lines even when setVisibleRowCount( 1 ) is called.
    // Furthermore, the listbox will not be resized to fit the text. By forcing the list
    // box to disable during the browse button hander, instead of prior to displaying, we
    // circumvent this problem while still forcing the disabled state, as needed.
    private void setRetainOwnershipState() {
        if (!applyAclPermissions.getValue()) {
            retainOwnershipDropDown.setSelectedIndex(0);
            retainOwnershipDropDown.setEnabled(false);
        } else {
            retainOwnershipDropDown.setEnabled(true);
        }
    }
}