/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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 org.pentaho.di.ui.repository.dialog; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.core.Const; import org.pentaho.di.core.ProgressMonitorAdapter; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleFileException; import org.pentaho.di.core.logging.LogChannelInterface; import org.pentaho.di.core.vfs.KettleVFS; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.imp.ImportRules; import org.pentaho.di.repository.ExportFeedback; import org.pentaho.di.repository.IRepositoryExporter; import org.pentaho.di.repository.IRepositoryExporterFeedback; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.ui.core.dialog.EnterTextDialog; import org.pentaho.di.ui.core.dialog.ErrorDialog; /** * Takes care of displaying a dialog that will handle the wait while we are exporting the complete repository to XML... * * @author Matt * @since 02-jun-2005 */ public class RepositoryExportProgressDialog { private static Class<?> PKG = RepositoryDialogInterface.class; // for i18n purposes, needed by Translator2!! private Shell shell; private Repository rep; private RepositoryDirectoryInterface dir; private String filename; private ImportRules importRules; private LogChannelInterface log; public RepositoryExportProgressDialog( Shell shell, Repository rep, RepositoryDirectoryInterface dir, String filename ) { this( shell, rep, dir, filename, new ImportRules() ); } public RepositoryExportProgressDialog( Shell shell, Repository rep, RepositoryDirectoryInterface dir, String filename, ImportRules importRules ) { this.shell = shell; this.rep = rep; this.dir = dir; this.filename = filename; this.importRules = importRules; this.log = rep.getLog(); } public boolean open() { boolean retval = true; final List<ExportFeedback> list = new ArrayList<ExportFeedback>(); IRepositoryExporter tmpExporter = null; try { tmpExporter = rep.getExporter(); } catch ( KettleException e ) { log.logError( RepositoryExportProgressDialog.class.toString(), "Error creating repository: " + e.toString() ); log.logError( Const.getStackTracker( e ) ); new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExportDialog.ErrorExport.Title" ), BaseMessages .getString( PKG, "RepositoryExportDialog.ErrorExport.Message" ), e ); return false; } final IRepositoryExporter exporter = tmpExporter; // this hack is only to support dog-nail build process for <...> // and keep base interfaces without changes - getExporter should // directly return IRepositoryExporterFeedback. final boolean isFeedback = ( exporter instanceof IRepositoryExporterFeedback ) ? true : false; IRunnableWithProgress op = new IRunnableWithProgress() { public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { try { exporter.setImportRulesToValidate( importRules ); ProgressMonitorAdapter pMonitor = new ProgressMonitorAdapter( monitor ); if ( isFeedback ) { IRepositoryExporterFeedback fExporter = IRepositoryExporterFeedback.class.cast( exporter ); List<ExportFeedback> ret = fExporter.exportAllObjectsWithFeedback( pMonitor, filename, dir, "all" ); list.addAll( ret ); } else { exporter.exportAllObjects( pMonitor, filename, dir, "all" ); } } catch ( KettleException e ) { throw new InvocationTargetException( e, BaseMessages.getString( PKG, "RepositoryExportDialog.Error.CreateUpdate", Const.getStackTracker( e ) ) ); } } }; try { ProgressMonitorDialog pmd = new ProgressMonitorDialog( shell ); pmd.run( true, true, op ); if ( !pmd.getProgressMonitor().isCanceled() && isFeedback ) { // show some results here. IRepositoryExporterFeedback fExporter = IRepositoryExporterFeedback.class.cast( exporter ); showExportResultStatus( list, fExporter.isRulesViolation() ); } } catch ( InvocationTargetException e ) { log.logError( RepositoryExportProgressDialog.class.toString(), "Error creating repository: " + e.toString() ); log.logError( Const.getStackTracker( e ) ); new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExportDialog.ErrorExport.Title" ), BaseMessages .getString( PKG, "RepositoryExportDialog.ErrorExport.Message" ), e ); retval = false; } catch ( InterruptedException e ) { log.logError( RepositoryExportProgressDialog.class.toString(), "Error creating repository: " + e.toString() ); log.logError( Const.getStackTracker( e ) ); new ErrorDialog( shell, BaseMessages.getString( PKG, "RepositoryExportDialog.ErrorExport.Title" ), BaseMessages .getString( PKG, "RepositoryExportDialog.ErrorExport.Message" ), e ); retval = false; } return retval; } void showExportResultStatus( List<ExportFeedback> list, boolean fail ) { String desc = fail ? BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportResultDialog.Fail" ) : BaseMessages .getString( PKG, "RepositoryExportProgressDialog.ExportResultDialog.Succes" ); EnterTextDialog dialog = new EnterTextDialog( shell, BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportResultDialog.Title" ), desc, getExportResultDetails( list, fail ) ); dialog.setReadOnly(); dialog.setModal(); dialog.open(); } /** * * @param list * @param fail * @return */ private String getExportResultDetails( List<ExportFeedback> list, boolean fail ) { StringBuilder sb = new StringBuilder(); for ( ExportFeedback feedback : list ) { if ( fail && ( feedback.getResult() == null || feedback.getResult().isEmpty() ) ) { if ( feedback.isSimpleString() ) { sb.append( feedback.toString() ); } // we do write only not success results in this case. continue; } sb.append( feedback.toString() ); } return sb.toString(); } /** * Check if file is empty, writable, and return message dialogue box if file not empty, null otherwise. * * @param shell * @param log * @param filename * @return */ public static MessageBox checkIsFileIsAcceptable( Shell shell, LogChannelInterface log, String filename ) { MessageBox box = null; // check if file is exists try { // check if file is not empty FileObject output = KettleVFS.getFileObject( filename ); if ( output.exists() ) { if ( !output.isWriteable() ) { box = new MessageBox( shell, SWT.ICON_QUESTION | SWT.APPLICATION_MODAL | SWT.SHEET | SWT.OK | SWT.CANCEL ); box.setText( BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportFileDialog.AreadyExists" ) ); box.setMessage( BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportFileDialog.NoWritePermissions" ) ); return box; } box = new MessageBox( shell, SWT.ICON_QUESTION | SWT.APPLICATION_MODAL | SWT.SHEET | SWT.OK | SWT.CANCEL ); box.setText( BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportFileDialog.AreadyExists" ) ); box.setMessage( BaseMessages.getString( PKG, "RepositoryExportProgressDialog.ExportFileDialog.Overwrite" ) ); } // in case of exception - anyway we will not be able to write into this file. } catch ( KettleFileException e ) { log.logError( "Can't access file: " + filename ); } catch ( FileSystemException e ) { log.logError( "Can't check if file exists/file permissions: " + filename ); } return box; } }