/*! * 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" ), Messages.getString( "couldNotRestoreItem", type ), //$NON-NLS-1$ //$NON-NLS-2$ 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" ), Messages.getString( "couldNotRestoreItem", type ), //$NON-NLS-1$ //$NON-NLS-2$ 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=" + overwriteDialog.getOverwriteMode(); //$NON-NLS-1$ 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" ), Messages.getString( "restoreError" ), //$NON-NLS-1$ //$NON-NLS-2$ 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; }-*/; }