/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.directory.studio.ldapbrowser.ui.wizards; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileWriter; import org.apache.directory.api.ldap.model.name.Dn; import org.apache.directory.studio.common.ui.CommonUIUtils; import org.apache.directory.studio.connection.core.Connection; import org.apache.directory.studio.connection.ui.RunnableContextRunner; import org.apache.directory.studio.ldapbrowser.common.actions.BrowserSelectionUtils; import org.apache.directory.studio.ldapbrowser.common.actions.CopyAction; import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants; import org.apache.directory.studio.ldapbrowser.core.jobs.ExecuteLdifRunnable; import org.apache.directory.studio.ldapbrowser.core.jobs.SearchRunnable; import org.apache.directory.studio.ldapbrowser.core.jobs.StudioBrowserJob; import org.apache.directory.studio.ldapbrowser.core.model.IAttribute; import org.apache.directory.studio.ldapbrowser.core.model.IBookmark; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.ldapbrowser.core.model.IEntry; import org.apache.directory.studio.ldapbrowser.core.model.ISearch; import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult; import org.apache.directory.studio.ldapbrowser.core.model.IValue; import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants; import org.apache.directory.studio.ldifeditor.editor.LdifEditor; import org.apache.directory.studio.ldifeditor.editor.NonExistingLdifEditorInput; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.texteditor.IDocumentProvider; public class BatchOperationWizard extends Wizard implements INewWizard { /** The connection */ private IBrowserConnection connection; // Wizard pages private BatchOperationApplyOnWizardPage applyOnPage; private BatchOperationTypeWizardPage typePage; private BatchOperationLdifWizardPage ldifPage; private BatchOperationModifyWizardPage modifyPage; private BatchOperationFinishWizardPage finishPage; /** * Creates a new instance of BatchOperationWizard. */ public BatchOperationWizard() { super.setWindowTitle( Messages.getString( "BatchOperationWizard.BatchOperation" ) ); //$NON-NLS-1$ super.setNeedsProgressMonitor( true ); } /** * Gets the id. * * @return the id */ public static String getId() { return BrowserUIConstants.WIZARD_BATCH_OPERATION; } /** * {@inheritDoc} */ public void init( IWorkbench workbench, IStructuredSelection selection ) { // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection() } /** * {@inheritDoc} */ public void addPages() { ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService() .getSelection(); Connection[] connections = BrowserSelectionUtils.getConnections( selection ); ISearch[] searches = BrowserSelectionUtils.getSearches( selection ); IEntry[] entries = BrowserSelectionUtils.getEntries( selection ); ISearchResult[] searchResults = BrowserSelectionUtils.getSearchResults( selection ); IBookmark[] bookmarks = BrowserSelectionUtils.getBookmarks( selection ); IAttribute[] attributes = BrowserSelectionUtils.getAttributes( selection ); IValue[] values = BrowserSelectionUtils.getValues( selection ); // if(searches.length + entries.length + searchResults.length + // bookmarks.length > 0) { if ( connections.length > 0 && connections[0].getConnectionWrapper().isConnected() || searches.length + entries.length + searchResults.length + bookmarks.length + attributes.length + values.length > 0 ) { ISearch search = BrowserSelectionUtils.getExampleSearch( selection ); search.setName( null ); this.connection = search.getBrowserConnection(); applyOnPage = new BatchOperationApplyOnWizardPage( BatchOperationApplyOnWizardPage.class.getName(), this ); addPage( applyOnPage ); typePage = new BatchOperationTypeWizardPage( BatchOperationTypeWizardPage.class.getName(), this ); addPage( typePage ); ldifPage = new BatchOperationLdifWizardPage( BatchOperationLdifWizardPage.class.getName(), this ); addPage( ldifPage ); modifyPage = new BatchOperationModifyWizardPage( BatchOperationModifyWizardPage.class.getName(), this ); addPage( modifyPage ); finishPage = new BatchOperationFinishWizardPage( BatchOperationFinishWizardPage.class.getName() ); addPage( finishPage ); } else { IWizardPage page = new DummyWizardPage(); addPage( page ); } } /** * {@inheritDoc} */ public void createPageControls( Composite pageContainer ) { super.createPageControls( pageContainer ); // set help context ID PlatformUI.getWorkbench().getHelpSystem().setHelp( applyOnPage.getControl(), BrowserUIConstants.PLUGIN_ID + "." + "tools_batchoperation_wizard" ); //$NON-NLS-1$ //$NON-NLS-2$ PlatformUI.getWorkbench().getHelpSystem().setHelp( typePage.getControl(), BrowserUIConstants.PLUGIN_ID + "." + "tools_batchoperation_wizard" ); //$NON-NLS-1$ //$NON-NLS-2$ PlatformUI.getWorkbench().getHelpSystem().setHelp( ldifPage.getControl(), BrowserUIConstants.PLUGIN_ID + "." + "tools_batchoperation_wizard" ); //$NON-NLS-1$ //$NON-NLS-2$ PlatformUI.getWorkbench().getHelpSystem().setHelp( modifyPage.getControl(), BrowserUIConstants.PLUGIN_ID + "." + "tools_batchoperation_wizard" ); //$NON-NLS-1$ //$NON-NLS-2$ PlatformUI.getWorkbench().getHelpSystem().setHelp( finishPage.getControl(), BrowserUIConstants.PLUGIN_ID + "." + "tools_batchoperation_wizard" ); //$NON-NLS-1$ //$NON-NLS-2$ } /** * This private class implements a dummy wizard page that is displayed when no connection is selected. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ class DummyWizardPage extends WizardPage { /** * Creates a new instance of DummyWizardPage. */ protected DummyWizardPage() { super( "" ); //$NON-NLS-1$ super.setTitle( Messages.getString( "BatchOperationWizard.NoConnectionSelected" ) ); //$NON-NLS-1$ super.setDescription( Messages.getString( "BatchOperationWizard.SelectOpenConnection" ) ); //$NON-NLS-1$ // super.setImageDescriptor(BrowserUIPlugin.getDefault().getImageDescriptor(BrowserUIConstants.IMG_ENTRY_WIZARD)); super.setPageComplete( true ); } /** * {@inheritDoc} */ public void createControl( Composite parent ) { Composite composite = new Composite( parent, SWT.NONE ); GridLayout gl = new GridLayout( 1, false ); composite.setLayout( gl ); composite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); setControl( composite ); } } /** * {@inheritDoc} */ public IWizardPage getNextPage( IWizardPage page ) { if ( this.applyOnPage != null ) { if ( page == this.applyOnPage ) { return this.typePage; } else if ( page == this.typePage && this.typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_CREATE_LDIF ) { return this.ldifPage; } else if ( page == this.typePage && this.typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_MODIFY ) { return this.modifyPage; } else if ( page == this.typePage && this.typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_DELETE ) { return this.finishPage; } else if ( page == this.modifyPage ) { return this.finishPage; } else if ( page == this.ldifPage ) { return this.finishPage; } } return null; } /** * {@inheritDoc} */ public boolean canFinish() { if ( this.applyOnPage != null ) { if ( !this.applyOnPage.isPageComplete() ) { return false; } if ( !this.typePage.isPageComplete() ) { return false; } if ( this.typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_CREATE_LDIF && !this.ldifPage.isPageComplete() ) { return false; } if ( this.typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_MODIFY && !this.modifyPage.isPageComplete() ) { return false; } if ( !this.finishPage.isPageComplete() ) { return false; } } return true; } /** * {@inheritDoc} */ public boolean performCancel() { return true; } /** * {@inheritDoc} */ public boolean performFinish() { if ( this.applyOnPage != null ) { this.applyOnPage.saveDialogSettings(); this.finishPage.saveDialogSettings(); // get LDIF String ldifFragment = ""; //$NON-NLS-1$ if ( typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_CREATE_LDIF ) { ldifFragment = this.ldifPage.getLdifFragment(); } else if ( typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_MODIFY ) { ldifFragment = this.modifyPage.getLdifFragment(); } if ( typePage.getOperationType() == BatchOperationTypeWizardPage.OPERATION_TYPE_DELETE ) { ldifFragment = "changetype: delete" + BrowserCoreConstants.LINE_SEPARATOR; //$NON-NLS-1$ } // get DNs Dn[] dns = applyOnPage.getApplyOnDns(); if ( dns == null ) { if ( applyOnPage.getApplyOnSearch() != null ) { ISearch search = applyOnPage.getApplyOnSearch(); if ( search.getBrowserConnection() != null ) { search.setSearchResults( null ); SearchRunnable runnable = new SearchRunnable( new ISearch[] { search } ); IStatus status = RunnableContextRunner.execute( runnable, getContainer(), true ); if ( status.isOK() ) { ISearchResult[] srs = search.getSearchResults(); dns = new Dn[srs.length]; for ( int i = 0; i < srs.length; i++ ) { dns[i] = srs[i].getDn(); } } } } } if ( dns != null ) { StringBuffer ldif = new StringBuffer(); for ( int i = 0; i < dns.length; i++ ) { ldif.append( "dn: " ); //$NON-NLS-1$ ldif.append( dns[i].getName() ); ldif.append( BrowserCoreConstants.LINE_SEPARATOR ); ldif.append( ldifFragment ); ldif.append( BrowserCoreConstants.LINE_SEPARATOR ); } if ( finishPage.getExecutionMethod() == BatchOperationFinishWizardPage.EXECUTION_METHOD_LDIF_EDITOR ) { // Opening an LDIF Editor with the LDIF content try { IEditorInput input = new NonExistingLdifEditorInput(); IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() .openEditor( input, LdifEditor.getId() ); IDocumentProvider documentProvider = ( ( LdifEditor ) editor ).getDocumentProvider(); if ( documentProvider != null ) { IDocument document = documentProvider.getDocument( input ); if ( document != null ) { document.set( ldif.toString() ); } } } catch ( PartInitException e ) { return false; } return true; } else if ( finishPage.getExecutionMethod() == BatchOperationFinishWizardPage.EXECUTION_METHOD_LDIF_FILE ) // TODO { // Saving the LDIF to a file // Getting the shell Shell shell = Display.getDefault().getActiveShell(); // detect IDE or RCP: // check if perspective org.eclipse.ui.resourcePerspective is available boolean isIDE = CommonUIUtils.isIDEEnvironment(); if ( isIDE ) { // Asking the user for the location where to 'save as' the file SaveAsDialog dialog = new SaveAsDialog( shell ); if ( dialog.open() != Dialog.OK ) { return false; } // Getting if the resulting file IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile( dialog.getResult() ); try { // Creating the file if it does not exist if ( !file.exists() ) { file.create( new ByteArrayInputStream( "".getBytes() ), true, null ); //$NON-NLS-1$ } // Saving the LDIF to the file in the workspace file.setContents( new ByteArrayInputStream( ldif.toString().getBytes() ), true, true, new NullProgressMonitor() ); } catch ( Exception e ) { return false; } } else { boolean canOverwrite = false; String path = null; while ( !canOverwrite ) { // Open FileDialog FileDialog dialog = new FileDialog( shell, SWT.SAVE ); path = dialog.open(); if ( path == null ) { return false; } // Check whether file exists and if so, confirm overwrite final File externalFile = new File( path ); if ( externalFile.exists() ) { String question = NLS.bind( Messages .getString( "BatchOperationWizard.TheFileAlreadyExistsReplace" ), path ); //$NON-NLS-1$ MessageDialog overwriteDialog = new MessageDialog( shell, Messages .getString( "BatchOperationWizard.Question" ), null, question, //$NON-NLS-1$ MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 0 ); int overwrite = overwriteDialog.open(); switch ( overwrite ) { case 0: // Yes canOverwrite = true; break; case 1: // No break; case 2: // Cancel default: return false; } } else { canOverwrite = true; } } // Saving the LDIF to the file on disk try { BufferedWriter outFile = new BufferedWriter( new FileWriter( path ) ); outFile.write( ldif.toString() ); outFile.close(); } catch ( Exception e ) { return false; } } return true; } else if ( finishPage.getExecutionMethod() == BatchOperationFinishWizardPage.EXECUTION_METHOD_LDIF_CLIPBOARD ) { // Copying the LDIF to the clipboard CopyAction.copyToClipboard( new Object[] { ldif.toString() }, new Transfer[] { TextTransfer.getInstance() } ); return true; } else if ( finishPage.getExecutionMethod() == BatchOperationFinishWizardPage.EXECUTION_METHOD_ON_CONNECTION ) { // Executing the LDIF on the connection ExecuteLdifRunnable runnable = new ExecuteLdifRunnable( getConnection(), ldif.toString(), true, finishPage.getContinueOnError() ); StudioBrowserJob job = new StudioBrowserJob( runnable ); job.execute(); return true; } } return false; } return true; } /** * Gets the type of the page. * * @return the type of the page */ public BatchOperationTypeWizardPage getTypePage() { return typePage; } /** * Gets the connection. * * @return the connection */ public IBrowserConnection getConnection() { return this.connection; } }