org.pentaho.mantle.client.commands.RestoreFileCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.commands.RestoreFileCommand.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.commands;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.HTML;
import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.filechooser.FileChooserDialog;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.mantle.client.dialogs.OverwritePromptDialog;
import org.pentaho.mantle.client.events.EventBusUtil;
import org.pentaho.mantle.client.events.SolutionFileActionEvent;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;

import java.util.List;

/**
 * @author wseyler
 * 
 */
public class RestoreFileCommand implements Command {
    String moduleBaseURL = GWT.getModuleBaseURL();
    String moduleName = GWT.getModuleName();
    String contextURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf(moduleName));

    List<RepositoryFile> repositoryFiles;

    String fileList;

    String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFileList() {
        return fileList;
    }

    public void setFileList(String fileList) {
        this.fileList = fileList;
    }

    public RestoreFileCommand() {
    }

    /**
     * @param selectedItemsClone
     */
    public RestoreFileCommand(List<RepositoryFile> selectedItemsClone) {
        repositoryFiles = selectedItemsClone;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.google.gwt.user.client.Command#execute()
     */
    @Override
    public void execute() {
        final SolutionFileActionEvent event = new SolutionFileActionEvent();
        event.setAction(this.getClass().getName());
        String temp = "";

        if (repositoryFiles != null) {
            for (RepositoryFile repoFile : repositoryFiles) {
                temp += repoFile.getId() + ","; //$NON-NLS-1$
            }
        }

        // Add file names from js
        temp = temp + fileList;

        // remove trailing ","
        temp = temp.substring(0, temp.length() - 1);

        final String filesList = temp;

        String deleteFilesURL = contextURL + "api/repo/files/restore"; //$NON-NLS-1$
        RequestBuilder deleteFilesRequestBuilder = new RequestBuilder(RequestBuilder.PUT, deleteFilesURL);
        deleteFilesRequestBuilder.setHeader("Content-Type", "text/plain"); //$NON-NLS-1$//$NON-NLS-2$
        deleteFilesRequestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
        try {
            deleteFilesRequestBuilder.sendRequest(filesList, new RequestCallback() {

                @Override
                public void onError(Request request, Throwable exception) {
                    MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("cannotRestore"), //$NON-NLS-1$
                            Messages.getString("couldNotRestoreItem", type), //$NON-NLS-1$
                            false, false, true);
                    dialogBox.center();
                    event.setMessage("cannotRestore");
                    EventBusUtil.EVENT_BUS.fireEvent(event);
                }

                @Override
                public void onResponseReceived(final Request request, final Response response) {
                    if (response.getStatusCode() == Response.SC_OK) {
                        new RefreshRepositoryCommand().execute(false);
                        event.setMessage("Success");
                        EventBusUtil.EVENT_BUS.fireEvent(event);
                    } else if (response.getStatusCode() == Response.SC_CONFLICT
                            || response.getStatusCode() == Response.SC_NOT_ACCEPTABLE) {
                        final int restoreResponseStatusCode = response.getStatusCode();

                        final String userHomeDirUrl = GWT.getHostPageBaseURL() + "api/session/userWorkspaceDir";

                        final RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, userHomeDirUrl);
                        try {
                            // Get user home folder string
                            builder.sendRequest("", new RequestCallback() {
                                @Override
                                public void onResponseReceived(final Request request, final Response response) {
                                    if (response.getStatusCode() == 200) {
                                        // API returns /user/home_folder/workspace
                                        String userHomeFolderPath = response.getText().replaceAll("/workspace", "");
                                        performRestoreToHomeFolder(filesList, restoreResponseStatusCode,
                                                userHomeFolderPath, event);
                                    }
                                }

                                @Override
                                public void onError(Request request, Throwable exception) {
                                    showErrorDialogBox(event);
                                }
                            });
                        } catch (RequestException e) {
                            showErrorDialogBox(event);
                        }
                    } else {
                        MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("cannotRestore"), //$NON-NLS-1$
                                Messages.getString("couldNotRestoreItem", type), //$NON-NLS-1$
                                false, false, true, Messages.getString("close"));
                        dialogBox.center();
                        event.setMessage("Success");
                        FileChooserDialog.setIsDirty(Boolean.TRUE);
                        setBrowseRepoDirty(Boolean.TRUE);
                        EventBusUtil.EVENT_BUS.fireEvent(event);
                    }
                }
            });
        } catch (RequestException e) {
            showErrorDialogBox(event);
        }
    }

    private void performRestoreToHomeFolder(final String filesList, final int restoreResponseStatusCode,
            final String userHomeFolderPath, final SolutionFileActionEvent event) {

        final String encodedUserHomeFolderPath = SolutionBrowserPanel.pathToId(userHomeFolderPath);
        String fileListDescription = "files";
        // if there is one file
        if (filesList.split(",").length == 1) {
            fileListDescription = "file";
        }

        HTML messageTextBox = new HTML();
        String cannotRestoreToOrigFolder = Messages.getString("cannotRestoreToOriginFolder", fileListDescription);
        String restoreToHomeFolder = Messages.getString("restoreToHomeFolder", userHomeFolderPath);

        messageTextBox.setHTML(cannotRestoreToOrigFolder + "<br> <br>" + restoreToHomeFolder + "<br>");
        final PromptDialogBox restoreFileWarningDialogBox = new PromptDialogBox(
                Messages.getString("couldNotWriteToFolder"), "Restore File", "Cancel", true, true);
        restoreFileWarningDialogBox.setContent(messageTextBox);

        final IDialogCallback callback = new IDialogCallback() {

            public void cancelPressed() {
                restoreFileWarningDialogBox.hide();
            }

            public void okPressed() {
                // We can't write to origin file folder, and there are
                // files in homeFolder with same names
                if (restoreResponseStatusCode == Response.SC_CONFLICT) {
                    final OverwritePromptDialog overwriteDialog = new OverwritePromptDialog();
                    final IDialogCallback callback = new IDialogCallback() {
                        public void cancelPressed() {
                            event.setMessage("Cancel");
                            overwriteDialog.hide();
                        }

                        public void okPressed() {
                            String restoreFilesUrl = contextURL + "api/repo/files/restore?overwriteMode=" //$NON-NLS-1$
                                    + overwriteDialog.getOverwriteMode();
                            RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, restoreFilesUrl);
                            try {
                                builder.sendRequest(filesList, new RequestCallback() {
                                    @Override
                                    public void onResponseReceived(Request request, Response response) {
                                        if (response.getStatusCode() == Response.SC_OK) {
                                            new RefreshRepositoryCommand().execute(false);
                                            event.setMessage("Success");
                                            EventBusUtil.EVENT_BUS.fireEvent(event);
                                        } else {
                                            showErrorDialogBox(event);
                                        }
                                    }

                                    @Override
                                    public void onError(Request request, Throwable exception) {
                                        showErrorDialogBox(event);
                                    }
                                });
                            } catch (RequestException e) {
                                showErrorDialogBox(event);
                            }
                        }
                    };
                    overwriteDialog.setCallback(callback);
                    overwriteDialog.center();
                } else if (restoreResponseStatusCode == Response.SC_NOT_ACCEPTABLE) {
                    String moveFilesURL = contextURL + "api/repo/files/" + encodedUserHomeFolderPath + "/move";
                    RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, moveFilesURL);
                    try {
                        builder.sendRequest(filesList, new RequestCallback() {
                            @Override
                            public void onResponseReceived(Request request, Response response) {
                                new RefreshRepositoryCommand().execute(false);
                                event.setMessage("Success");
                                EventBusUtil.EVENT_BUS.fireEvent(event);
                            }

                            @Override
                            public void onError(Request request, Throwable exception) {
                                showErrorDialogBox(event);
                            }
                        });
                    } catch (RequestException e) {
                        showErrorDialogBox(event);
                    }
                }
            }
        };

        restoreFileWarningDialogBox.setCallback(callback);
        restoreFileWarningDialogBox.center();
    }

    public void showErrorDialogBox(SolutionFileActionEvent event) {
        MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                Messages.getString("restoreError"), //$NON-NLS-1$
                false, false, true);
        dialogBox.center();
        event.setMessage(Messages.getString("restoreError"));
        EventBusUtil.EVENT_BUS.fireEvent(event);
    }

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