org.apache.directory.studio.ldapbrowser.ui.wizards.BatchOperationWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.ldapbrowser.ui.wizards.BatchOperationWizard.java

Source

/*
 *  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"), //$NON-NLS-1$
                                        path);
                                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;
    }
}