org.pentaho.di.ui.repository.dialog.SelectDirectoryDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.ui.repository.dialog.SelectDirectoryDialog.java

Source

/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2017 by Hitachi Vantara : 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 org.apache.commons.lang.BooleanUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectory;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.RepositoryExtended;
import org.pentaho.di.ui.core.ConstUI;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.EnterStringDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.gui.WindowProperty;
import org.pentaho.di.ui.repository.RepositoryDirectoryUI;
import org.pentaho.di.ui.trans.step.BaseStepDialog;

import java.util.Collections;
import java.util.Set;

/**
 * This dialog represents an explorer type of interface on a given database connection. It shows the tables defined in
 * the visible schemas or catalogs on that connection. The interface also allows you to get all kinds of information on
 * those tables.
 *
 * @author Matt
 * @since 18-05-2003
 */
public class SelectDirectoryDialog extends Dialog {
    private static Class<?> PKG = RepositoryDialogInterface.class; // for i18n purposes, needed by Translator2!!

    private PropsUI props;
    private Repository rep;
    private Shell shell;

    private Tree wTree;
    private TreeItem tiTree;
    private Button wOK;
    private Button wRefresh;
    private Button wCancel;
    private RepositoryDirectoryInterface selection;
    private Color dircolor;

    private RepositoryDirectoryInterface repositoryTree;

    private boolean readOnly;

    private Set<String> restrictedPaths = Collections.<String>emptySet();

    public void setRestrictedPaths(Set<String> restrictedPaths) {
        this.restrictedPaths = restrictedPaths;
    }

    private boolean isRestrictedPath(String path) {
        return restrictedPaths.contains(path);
    }

    public SelectDirectoryDialog(Shell parent, int style, Repository rep) {
        super(parent, style);
        this.props = PropsUI.getInstance();
        this.rep = rep;

        selection = null;

        readOnly = rep.getSecurityProvider().isReadOnly();
    }

    @SuppressWarnings("deprecation")
    public RepositoryDirectoryInterface open() {
        dircolor = GUIResource.getInstance().getColorDirectory();

        Shell parent = getParent();
        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
        props.setLook(shell);
        shell.setImage(GUIResource.getInstance().getImageSpoon());
        shell.setText(BaseMessages.getString(PKG, "SelectDirectoryDialog.Dialog.Main.Title"));

        FormLayout formLayout = new FormLayout();
        formLayout.marginWidth = Const.FORM_MARGIN;
        formLayout.marginHeight = Const.FORM_MARGIN;

        shell.setLayout(formLayout);

        // Tree
        wTree = new Tree(shell, SWT.SINGLE | SWT.BORDER);
        props.setLook(wTree);

        try {
            if (rep instanceof RepositoryExtended) {
                RepositoryExtended repositoryExtended = (RepositoryExtended) this.rep;
                repositoryTree = repositoryExtended.loadRepositoryDirectoryTree("/", null, -1,
                        BooleanUtils.isTrue(repositoryExtended.getUserInfo().isAdmin()), true, false);
            } else {
                repositoryTree = this.rep.loadRepositoryDirectoryTree();
            }
        } catch (KettleException e) {
            new ErrorDialog(shell,
                    BaseMessages.getString(PKG, "SelectDirectoryDialog.Dialog.ErrorRefreshingDirectoryTree.Title"),
                    BaseMessages.getString(PKG,
                            "SelectDirectoryDialog.Dialog.ErrorRefreshingDirectoryTree.Message"),
                    e);
            return null;
        }

        if (!getData()) {
            return null;
        }

        // Buttons
        wOK = new Button(shell, SWT.PUSH);
        wOK.setText(BaseMessages.getString(PKG, "System.Button.OK"));

        wRefresh = new Button(shell, SWT.PUSH);
        wRefresh.setText(BaseMessages.getString(PKG, "System.Button.Refresh"));

        wCancel = new Button(shell, SWT.PUSH);
        wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));

        FormData fdTree = new FormData();
        FormData fdOK = new FormData();
        FormData fdRefresh = new FormData();
        FormData fdCancel = new FormData();

        int margin = 10;

        fdTree.left = new FormAttachment(0, 0); // To the right of the label
        fdTree.top = new FormAttachment(0, 0);
        fdTree.right = new FormAttachment(100, 0);
        fdTree.bottom = new FormAttachment(100, -50);
        wTree.setLayoutData(fdTree);

        fdOK.left = new FormAttachment(wTree, 0, SWT.CENTER);
        fdOK.bottom = new FormAttachment(100, -margin);
        wOK.setLayoutData(fdOK);

        fdRefresh.left = new FormAttachment(wOK, 10);
        fdRefresh.bottom = new FormAttachment(100, -margin);
        wRefresh.setLayoutData(fdRefresh);

        fdCancel.left = new FormAttachment(wRefresh, 10);
        fdCancel.bottom = new FormAttachment(100, -margin);
        wCancel.setLayoutData(fdCancel);

        // Add listeners
        wCancel.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                dispose();
            }
        });

        // Add listeners
        wOK.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                handleOK();
            }
        });

        wTree.addSelectionListener(new SelectionAdapter() {
            private String getSelectedPath(SelectionEvent selectionEvent) {
                TreeItem treeItem = (TreeItem) selectionEvent.item;
                String path;
                if (treeItem.getParentItem() == null) {
                    path = treeItem.getText();
                } else {
                    path = ConstUI.getTreePath(treeItem, 0);
                }
                return path;
            }

            private boolean isSelectedPathRestricted(SelectionEvent selectionEvent) {
                String path = getSelectedPath(selectionEvent);
                boolean isRestricted = isRestrictedPath(path);
                return isRestricted;
            }

            public void widgetDefaultSelected(SelectionEvent selectionEvent) {
                if (isSelectedPathRestricted(selectionEvent)) {
                    return;
                }
                handleOK();
            }

            public void widgetSelected(SelectionEvent selectionEvent) {
                boolean restricted = isSelectedPathRestricted(selectionEvent);
                wOK.setEnabled(!restricted);
            }
        });

        wRefresh.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                getData();
            }
        });

        wTree.addMenuDetectListener(new MenuDetectListener() {
            public void menuDetected(MenuDetectEvent e) {
                setTreeMenu();
            }
        });

        BaseStepDialog.setSize(shell);

        shell.open();
        Display display = parent.getDisplay();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        return selection;
    }

    private boolean getData() {
        // Clear the tree top entry
        if (tiTree != null && !tiTree.isDisposed()) {
            tiTree.dispose();
        }

        tiTree = new TreeItem(wTree, SWT.NONE);
        tiTree.setImage(GUIResource.getInstance().getImageFolder());
        RepositoryDirectoryUI.getDirectoryTree(tiTree, dircolor, repositoryTree);
        tiTree.setExpanded(true);

        return true;
    }

    public void setTreeMenu() {
        Menu mTree = null;

        TreeItem[] ti = wTree.getSelection(); // use SWT.SINGLE in wTree!!!!
        if (ti.length == 1) {
            mTree = new Menu(wTree);

            /*
             * NEW Sub-directory
             */
            MenuItem miNew = new MenuItem(mTree, SWT.CASCADE);
            miNew.setText(BaseMessages.getString(PKG, "SelectDirectoryDialog.PopupMenu.Directory.New"));
            miNew.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if (!readOnly) {
                        TreeItem ti = wTree.getSelection()[0];
                        String[] str = ConstUI.getTreeStrings(ti);
                        //
                        // In which directory do we want create a subdirectory?
                        //
                        RepositoryDirectoryInterface dir = repositoryTree.findDirectory(str);
                        if (dir != null) {
                            //
                            // What's the name of the new directory?
                            //
                            EnterStringDialog etd = new EnterStringDialog(shell,
                                    BaseMessages.getString(PKG,
                                            "SelectDirectoryDialog.Dialog.EnterDirectoryName.Title"),
                                    BaseMessages.getString(PKG,
                                            "SelectDirectoryDialog.Dialog.EnterDirectoryName.Message"),
                                    BaseMessages.getString(PKG,
                                            "SelectDirectoryDialog.Dialog.EnterDirectoryName.Default"));
                            String newdir = etd.open();
                            if (newdir != null) {
                                RepositoryDirectory subdir = new RepositoryDirectory(dir, newdir);
                                try {
                                    rep.saveRepositoryDirectory(subdir);
                                    dir.addSubdirectory(subdir);
                                    TreeItem tiNew = new TreeItem(ti, SWT.NONE);
                                    tiNew.setText(newdir);
                                    tiNew.setImage(GUIResource.getInstance().getImageFolder());
                                    wTree.setSelection(new TreeItem[] { tiNew });
                                } catch (Exception exception) {
                                    new ErrorDialog(shell,
                                            BaseMessages.getString(PKG,
                                                    "SelectDirectoryDialog.Dialog.UnableToCreateDirectory.Message"),
                                            BaseMessages.getString(PKG,
                                                    "SelectDirectoryDialog.Dialog.UnableToCreateDirectory.Title"),
                                            exception);
                                }
                            }
                        } else {
                            MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
                            mb.setMessage(BaseMessages.getString(PKG,
                                    "SelectDirectoryDialog.Dialog.UnableToLocateDirectory.Message"));
                            mb.setText(BaseMessages.getString(PKG,
                                    "SelectDirectoryDialog.Dialog.UnableToLocateDirectory.Title"));
                            mb.open();
                        }
                    } else {
                        MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
                        mb.setMessage(BaseMessages.getString(PKG,
                                "SelectDirectoryDialog.Dialog.PermissionDenied.Message1")
                                + (rep.getUserInfo() == null ? "" : rep.getUserInfo().getLogin()) + BaseMessages
                                        .getString(PKG, "SelectDirectoryDialog.Dialog.PermissionDenied.Message2"));
                        mb.setText(
                                BaseMessages.getString(PKG, "SelectDirectoryDialog.Dialog.PermissionDenied.Title"));
                        mb.open();
                    }
                }
            });

            /*
             * RENAME directory
             */
            MenuItem miRen = new MenuItem(mTree, SWT.CASCADE);
            miRen.setText(BaseMessages.getString(PKG, "SelectDirectoryDialog.PopupMenu.Directory.Rename"));
            miRen.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if (!readOnly) {
                        TreeItem ti = wTree.getSelection()[0];
                        String[] str = ConstUI.getTreeStrings(ti);
                        RepositoryDirectoryInterface dir = repositoryTree.findDirectory(str);
                        if (dir != null) {
                            //
                            // What's the new name of the directory?
                            //
                            String oldName = dir.getName();
                            EnterStringDialog etd = new EnterStringDialog(shell, oldName,
                                    BaseMessages.getString(PKG,
                                            "SelectDirectoryDialog.Dialog.EnterDirectoryNewName.Message"),
                                    BaseMessages.getString(PKG,
                                            "SelectDirectoryDialog.Dialog.EnterDirectoryNewName.Title"));
                            String newName = etd.open();
                            if (newName != null && !newName.equals(oldName)) {
                                dir.setName(newName);
                                try {
                                    rep.renameRepositoryDirectory(dir.getObjectId(), dir.getParent(), newName);
                                    ti.setText(newName);
                                    wTree.setSelection(ti);
                                } catch (Exception exception) {
                                    new ErrorDialog(shell, BaseMessages.getString(PKG,
                                            "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Message1")
                                            + oldName + "]" + Const.CR
                                            + BaseMessages.getString(PKG,
                                                    "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Message2"),
                                            BaseMessages.getString(PKG,
                                                    "RepositoryExplorerDialog.Directory.Rename.UnexpectedError.Title"),
                                            exception);
                                }
                            }
                        }
                    }
                }
            });

            MenuItem miDel = new MenuItem(mTree, SWT.CASCADE);
            miDel.setText(BaseMessages.getString(PKG, "SelectDirectoryDialog.PopupMenu.Directory.Delete"));
            miDel.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if (!readOnly) {
                        TreeItem ti = wTree.getSelection()[0];
                        String[] str = ConstUI.getTreeStrings(ti);
                        RepositoryDirectoryInterface dir = repositoryTree.findDirectory(str);
                        if (dir != null) {
                            try {
                                rep.deleteRepositoryDirectory(dir);
                                ti.dispose();
                            } catch (KettleException exception) {
                                new ErrorDialog(shell,
                                        BaseMessages.getString(PKG,
                                                "RepositoryExplorerDialog.Directory.Delete.ErrorRemoving.Title"),
                                        BaseMessages.getString(PKG,
                                                "RepositoryExplorerDialog.Directory.Delete.ErrorRemoving.Message1"),
                                        exception);
                            }
                        }
                    }
                }
            });

        }
        wTree.setMenu(mTree);
    }

    public void dispose() {
        props.setScreen(new WindowProperty(shell));
        shell.dispose();
    }

    public void handleOK() {
        TreeItem[] ti = wTree.getSelection();
        if (ti.length == 1) {
            String[] tree = ConstUI.getTreeStrings(ti[0]);
            selection = repositoryTree.findDirectory(tree);
            dispose();
        }
    }
}