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

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.commands.SaveCommand.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-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.commands;

import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.filechooser.FileChooser.FileChooserMode;
import org.pentaho.gwt.widgets.client.filechooser.FileChooserDialog;
import org.pentaho.gwt.widgets.client.filechooser.FileChooserListener;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFileTree;
import org.pentaho.gwt.widgets.client.tabs.PentahoTab;
import org.pentaho.gwt.widgets.client.utils.string.StringUtils;
import org.pentaho.mantle.client.MantleApplication;
import org.pentaho.mantle.client.dialogs.WaitPopup;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.objects.SolutionFileInfo;
import org.pentaho.mantle.client.solutionbrowser.RepositoryFileTreeManager;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;
import org.pentaho.mantle.client.solutionbrowser.tabs.IFrameTabPanel;

import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;

public class SaveCommand extends AbstractCommand {

    boolean isSaveAs = false;
    private String name;
    private String path;
    private SolutionFileInfo.Type type;
    private String tabName;
    private String solution;
    private final String spinnerId = "SaveCommand";

    public SaveCommand() {
    }

    public SaveCommand(boolean isSaveAs) {
        this.isSaveAs = isSaveAs;
    }

    protected void performOperation() {
        performOperation(true);
    }

    protected void performOperation(boolean feedback) {
        final SolutionBrowserPanel navigatorPerspective = SolutionBrowserPanel.getInstance();

        retrieveCachedValues(navigatorPerspective.getContentTabPanel().getCurrentFrame());
        boolean forceReload = false;
        if (FileChooserDialog.getIsDirty()) {
            forceReload = true;
            WaitPopup.getInstance().setVisibleById(true, spinnerId);
            FileChooserDialog.setIsDirty(Boolean.FALSE);
        }
        RepositoryFileTreeManager.getInstance().fetchRepositoryFileTree(new AsyncCallback<RepositoryFileTree>() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess(RepositoryFileTree tree) {

                retrieveCachedValues(navigatorPerspective.getContentTabPanel().getCurrentFrame());
                if (isSaveAs || name == null) {
                    String fileDir = "";
                    if (path != null && !StringUtils.isEmpty(path)) {
                        // If has extension
                        if (path.endsWith(name)) {
                            fileDir = path.substring(0, path.lastIndexOf("/"));
                        } else {
                            fileDir = path;
                        }

                    }
                    WaitPopup.getInstance().setVisibleById(false, spinnerId);
                    final FileChooserDialog dialog = new FileChooserDialog(FileChooserMode.SAVE, fileDir, tree,
                            false, true, Messages.getString("save"), Messages.getString("save"), //$NON-NLS-1$//$NON-NLS-2$
                            navigatorPerspective.getSolutionTree().isShowHiddenFiles()); //$NON-NLS-3$
                    dialog.setSubmitOnEnter(MantleApplication.submitOnEnter);
                    if (isSaveAs) {
                        dialog.setTitle(Messages.getString("saveAs")); //$NON-NLS-1$
                        dialog.setText(Messages.getString("saveAs")); //$NON-NLS-1$
                    } else {
                        dialog.setTitle(Messages.getString("save")); //$NON-NLS-1$
                        dialog.setText(Messages.getString("save")); //$NON-NLS-1$
                    }
                    // TODO Uncomment the line below and delete the line after that once gwtwidets have been branched
                    dialog.addFileChooserListener(new FileChooserListener() {

                        public void dialogCanceled() {

                        }

                        @Override
                        public void fileSelected(final RepositoryFile file, String filePath, String fileName,
                                String title) {
                            SaveCommand.this.type = SolutionFileInfo.Type.XACTION;
                            SaveCommand.this.name = fileName;
                            SaveCommand.this.path = filePath;
                            tabName = name;
                            if (tabName.indexOf("analysisview.xaction") != -1) {
                                // trim off the analysisview.xaction from the localized-name
                                tabName = tabName.substring(0, tabName.indexOf("analysisview.xaction") - 1);
                            }

                            JsArrayString extensions = getPossibleExtensions(
                                    navigatorPerspective.getContentTabPanel().getCurrentFrameElementId());
                            final String fileExtension = extensions.length() == 1 ? extensions.get(0) : null;

                            if (dialog.doesSelectedFileExist(fileExtension)) {
                                dialog.hide();
                                PromptDialogBox overWriteDialog = new PromptDialogBox(
                                        Messages.getString("question"), Messages.getString("yes"), //$NON-NLS-1$//$NON-NLS-2$
                                        Messages.getString("no"), //$NON-NLS-1$
                                        false, true);
                                overWriteDialog
                                        .setContent(new Label(Messages.getString("fileExistsOverwrite"), false)); //$NON-NLS-1$
                                overWriteDialog.setCallback(new IDialogCallback() {
                                    public void okPressed() {
                                        if (fileExtension != null && tabName.endsWith(fileExtension)) {
                                            tabName = tabName.substring(0, tabName.lastIndexOf(fileExtension));
                                        }
                                        doSaveAs(navigatorPerspective.getContentTabPanel()
                                                .getCurrentFrameElementId(), name, path, type, true);
                                        Window.setTitle(Messages.getString("productName") + " - " + name); //$NON-NLS-1$ //$NON-NLS-2$
                                        FileChooserDialog.setIsDirty(Boolean.TRUE);
                                        persistFileInfoInFrame();
                                    }

                                    public void cancelPressed() {
                                        dialog.show();
                                    }
                                });
                                overWriteDialog.center();
                            } else {

                                // [Fix for PIR-833]
                                if (file != null && !file.isFolder() && !fileName.equals(title)
                                        && filePath.endsWith(file.getName())) {
                                    SaveCommand.this.path = filePath.substring(0,
                                            filePath.lastIndexOf("/" + file.getName()));
                                }

                                doSaveAs(navigatorPerspective.getContentTabPanel().getCurrentFrameElementId(), name,
                                        path, type, true);
                                Window.setTitle(Messages.getString("productName") + " - " + name); //$NON-NLS-1$ //$NON-NLS-2$
                                persistFileInfoInFrame();
                                // navigatorPerspective.addRecent(fullPathWithName, name);
                                clearValues();
                            }
                        }

                        @Override
                        public void fileSelectionChanged(RepositoryFile file, String filePath, String fileName,
                                String title) {
                            // TODO Auto-generated method stub

                        }

                    });
                    dialog.center();
                } else {
                    doSaveAs(navigatorPerspective.getContentTabPanel().getCurrentFrameElementId(), name, path, type,
                            true);
                    clearValues();
                }
                WaitPopup.getInstance().setVisibleById(false, spinnerId);
            }
        }, forceReload, null, null, SolutionBrowserPanel.getInstance().getSolutionTree().isShowHiddenFiles());
    }

    /**
     * @param elementId
     *          Id of the PUC tab containing the frame to look for a possible extensions callback in
     * @return All possible extensions provided by the frame.
     */
    private native JsArrayString getPossibleExtensions(String elementId)
    /*-{
     var frame = $doc.getElementById(elementId);
      frame = frame.contentWindow;
      frame.focus();
      if (frame.getPossibleFileExtensions) {
        return frame.getPossibleFileExtensions();
      }
      if (frame.gCtrlr.repositoryBrowserController.getPossibleFileExtensions) {
        return frame.gCtrlr.repositoryBrowserController.getPossibleFileExtensions();
      }
      return [];
    }-*/;

    private void persistFileInfoInFrame() {
        SolutionFileInfo fileInfo = new SolutionFileInfo();
        fileInfo.setName(this.name);
        fileInfo.setPath(this.path);
        fileInfo.setType(this.type);
        SolutionBrowserPanel.getInstance().getContentTabPanel().getCurrentFrame().setFileInfo(fileInfo);
    }

    private void clearValues() {
        name = null;
        path = null;
        type = null;
    }

    private void retrieveCachedValues(IFrameTabPanel tabPanel) {
        clearValues();
        SolutionFileInfo info = tabPanel.getFileInfo();
        if (info != null) {
            this.name = info.getName();
            this.path = info.getPath();
            this.type = info.getType();
        }
    }

    private void doSaveAs(String elementId, String filename, String path, SolutionFileInfo.Type type,
            boolean overwrite, boolean showBusy) {
        WaitPopup.getInstance().setVisible(true);
        this.doSaveAs(elementId, filename, path, type, overwrite);
        WaitPopup.getInstance().setVisible(false);
        FileChooserDialog.setIsDirty(Boolean.TRUE);
    }

    private void doSaveAs(String elementId, String filename, String path, SolutionFileInfo.Type type,
            boolean overwrite) {

        String unableToSaveMessage = Messages.getString("unableToSaveMessage");
        String save = Messages.getString("save");
        String error = Messages.getString("error");
        String errorEncounteredWhileSaving = Messages.getString(" error.EncounteredWhileSaving");

        doSaveAsNativeWrapper(elementId, filename, path, type, overwrite, save, unableToSaveMessage, error,
                errorEncounteredWhileSaving);
    }

    /**
     * This method will call saveReportSpecAs(string filename, string solution, string path, bool overwrite)
     * 
     * @param save
     *          - externalize message save
     * @param unableToSaveMessage
     *          - externalize message unable to save
     * @param error
     *          - externalize message error
     * @param errorEncounteredWhileSaving
     *          - externalize message errorEncounteredWhileSaving
     */
    private native void doSaveAsNativeWrapper(String elementId, String filename, String path,
            SolutionFileInfo.Type type, boolean overwrite, String save, String unableToSaveMessage, String error,
            String errorEncounteredWhileSaving)
    /*-{
      var isSavedSuccessfully = true;
      var errorCallback = function() {
        window.parent.mantle_showMessage(save, unableToSaveMessage);
        isSavedSuccessfully = false;
      }
        
      var frame = $doc.getElementById(elementId);
      frame = frame.contentWindow;
      frame.focus();
        
      if(frame.pivot_initialized) {
        // do jpivot save
        var actualFileName = filename;
        if (filename.indexOf("analysisview.xaction") == -1) {
    actualFileName = filename + ".analysisview.xaction";
        } else {
    // trim off the analysisview.xaction from the localized-name
    filename = filename.substring(0, filename.indexOf("analysisview.xaction")-1);
        }
        frame.controller.saveAs(actualFileName, filename, path, overwrite);
      } else if (frame.handle_puc_save) {
        try {
    var result = frame.handle_puc_save(path, filename, overwrite, errorCallback);
    if (isSavedSuccessfully){
      //We need to decode the result, but we double encoded '/' and '\' in URLEncoder.js to work around a Tomcat issue
      var almostDecodedResult = result.replace(/%255C/g, "%5C").replace(/%252F/g, "%2F");
      //Now we decode
      var decodedResult = decodeURIComponent(almostDecodedResult);
      this.@org.pentaho.mantle.client.commands.SaveCommand::doTabRename()();
      //CHECKSTYLE IGNORE LineLength FOR NEXT 2 LINES
      this.@org.pentaho.mantle.client.commands.SaveCommand::addToRecentList(Ljava/lang/String;)(decodedResult);
      this.@org.pentaho.mantle.client.commands.SaveCommand::setDeepLinkUrl(Ljava/lang/String;)(decodedResult);
    }        
        } catch (e) {
    $wnd.mantle_showMessage(error, errorEncounteredWhileSaving + e);
        }
      } else {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        $wnd.mantle_showMessage(error,"The plugin has not defined a handle_puc_save function to handle the save of the content");
      }
      $wnd.mantle_setIsRepoDirty(true);
      $wnd.mantle_isBrowseRepoDirty=true;
    }-*/;

    // used via JSNI
    private void doTabRename() {
        if (tabName != null) { // Save-As does not modify the name of the tab.
            PentahoTab tab = SolutionBrowserPanel.getInstance().getContentTabPanel().getSelectedTab();
            tab.setLabelText(tabName);
            tab.setLabelTooltip(tabName);
        }
    }

    // used via JSNI
    private void addToRecentList(String fullPathWithName) {
        if (fullPathWithName != null && fullPathWithName.contains(name)) {
            SolutionBrowserPanel.getInstance().addRecent(fullPathWithName, name);
        }
    }

    // used via JSNI
    private void setDeepLinkUrl(String fullPathWithName) {
        SolutionBrowserPanel.getInstance().setDeepLinkUrl(fullPathWithName);
    }

}