org.talend.sqlbuilder.ui.SQLBuilderDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.sqlbuilder.ui.SQLBuilderDialog.java

Source

// ============================================================================
//
// Copyright (C) 2006-2015 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.sqlbuilder.ui;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressIndicator;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.actions.SelectionProviderAction;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.CorePlugin;
import org.talend.core.database.EDatabase4DriverClassName;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.model.context.ContextUtils;
import org.talend.core.model.metadata.IMetadataConnection;
import org.talend.core.model.metadata.builder.ConvertionHelper;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.connection.MetadataTable;
import org.talend.core.model.metadata.builder.connection.Query;
import org.talend.core.model.metadata.builder.database.DriverShim;
import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.ContextItem;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.RepositoryElementDelta;
import org.talend.core.model.update.RepositoryUpdateManager;
import org.talend.core.sqlbuilder.util.ConnectionParameters;
import org.talend.core.sqlbuilder.util.TextUtil;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.metadata.managment.ui.wizard.metadata.ContextSetsSelectionDialog;
import org.talend.repository.IRepositoryChangedListener;
import org.talend.repository.RepositoryChangedEvent;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.RepositoryNode;
import org.talend.sqlbuilder.Messages;
import org.talend.sqlbuilder.SqlBuilderPlugin;
import org.talend.sqlbuilder.dbstructure.DBTreeProvider.MetadataTableRepositoryObject;
import org.talend.sqlbuilder.dbstructure.RepositoryNodeType;
import org.talend.sqlbuilder.dbstructure.SessionTreeNodeManager;
import org.talend.sqlbuilder.dbstructure.SessionTreeNodeUtils;
import org.talend.sqlbuilder.dbstructure.nodes.INode;
import org.talend.sqlbuilder.editors.MultiPageSqlBuilderEditor;
import org.talend.sqlbuilder.repository.utility.SQLBuilderRepositoryNodeManager;
import org.talend.sqlbuilder.sessiontree.model.SessionTreeNode;
import org.talend.sqlbuilder.util.ImageUtil;
import org.talend.sqlbuilder.util.UIUtils;
import org.talend.utils.sql.ConnectionUtils;

/**
 * This Dialog is used for building sql.
 * 
 * $Id: SQLBuilderDialog.java,v 1.44 2006/11/09 08:44:09 tangfn Exp $
 * 
 */
public class SQLBuilderDialog extends Dialog implements ISQLBuilderDialog, IRepositoryChangedListener {

    private Composite container;

    private boolean readOnly = false;

    // ends
    private boolean isFromRepositoryView = false;

    private DBDetailsComposite dbDetailsComposite;

    private DBStructureComposite structureComposite;

    private SQLBuilderTabComposite editorComposite;

    // Added by Tang Fengneng
    private ConnectionParameters connParameters;

    private RepositoryNode node;

    private RepositoryNode nodeInEditor;

    private DatabaseConnection connection;

    // Ends

    /**
     * The progress indicator control.
     */
    protected ProgressIndicator progressIndicator;

    /**
     * The progress monitor.
     */
    private ProgressMonitor progressMonitor = new ProgressMonitor();

    /**
     * SessionTreeNode Manager.
     */
    SessionTreeNodeManager nodeManager = new SessionTreeNodeManager();

    SQLBuilderRepositoryNodeManager manager = new SQLBuilderRepositoryNodeManager();

    private String selectedContext = null;

    /**
     * Internal progress monitor implementation.
     */
    private class ProgressMonitor implements IProgressMonitorWithBlocking {

        private boolean fIsCanceled;

        protected boolean forked = false;

        protected boolean locked = false;

        public void beginTask(String name, int totalWork) {
            if (progressIndicator == null) {
                return;
            }
            if (progressIndicator.isDisposed()) {
                return;
            }
            if (totalWork == UNKNOWN) {
                progressIndicator.beginAnimatedTask();
            } else {
                progressIndicator.beginTask(totalWork);
            }
        }

        public void done() {
            if (progressIndicator == null) {
                return;
            }
            if (!progressIndicator.isDisposed()) {
                progressIndicator.sendRemainingWork();
                progressIndicator.done();
            }
        }

        public void setTaskName(String name) {
        }

        public boolean isCanceled() {
            return fIsCanceled;
        }

        public void setCanceled(boolean b) {
            fIsCanceled = b;
            if (locked) {
                clearBlocked();
            }
        }

        public void subTask(String name) {
        }

        public void worked(int work) {
            internalWorked(work);
        }

        public void internalWorked(double work) {
            if (!progressIndicator.isDisposed()) {
                progressIndicator.worked(work);
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked()
         */
        public void clearBlocked() {
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(org.eclipse.core.runtime.IStatus)
         */
        public void setBlocked(IStatus reason) {
            locked = true;
        }
    }

    private String dialogTitle;

    /**
     * Create the dialog.
     * 
     * @param parentShell
     */
    public SQLBuilderDialog(Shell parentShell, String title) {
        this(parentShell);
    }

    public SQLBuilderDialog(Shell parentShell) {
        super(parentShell);
        setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.RESIZE | SWT.MIN | SWT.MAX | SWT.APPLICATION_MODAL);
        parentShell.setImage(ImageUtil.getImage("Images.title")); //$NON-NLS-1$
        SqlBuilderPlugin.getDefault().getRepositoryService().registerRepositoryChangedListener(this);
    }

    public SQLBuilderDialog(Shell parentShell, RepositoryNode node, String selectedContext) {
        super(parentShell);
        this.node = node;
        this.selectedContext = selectedContext;
        setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.RESIZE | SWT.MIN | SWT.MAX | SWT.APPLICATION_MODAL);
        parentShell.setImage(ImageUtil.getImage("Images.title")); //$NON-NLS-1$
        SqlBuilderPlugin.getDefault().getRepositoryService().registerRepositoryChangedListener(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    public void configureShell(Shell shell) {
        super.configureShell(shell);
        // Set the title bar text
        shell.setText(TextUtil.getDialogTitle());
    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     */
    protected Control createDialogArea(Composite parent) {
        container = (Composite) super.createDialogArea(parent);
        // container.setLayout(new GridLayout());

        final SashForm mainSashForm = new SashForm(container, SWT.NONE | SWT.VERTICAL);
        mainSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final SashForm sashFormStructureAndEditor = new SashForm(mainSashForm, SWT.NONE);

        final SashForm sashFormResultAndDetail = new SashForm(mainSashForm, SWT.NONE);
        mainSashForm.setWeights(new int[] { 3, 1 });

        createResult(sashFormResultAndDetail);
        createDetail(sashFormResultAndDetail);
        sashFormResultAndDetail.setWeights(new int[] { 4, 3 });

        createDatabaseStructure(sashFormStructureAndEditor);
        createSQLEditor(sashFormStructureAndEditor);
        sashFormStructureAndEditor.setWeights(new int[] { 4, 6 });

        if (connParameters.isFromRepository() && connParameters.getQueryObject() != null) {
            structureComposite.openNewQueryEditor();
        } else if (connParameters.isFromRepository() && connParameters.getMetadataTable() != null) {
            structureComposite.openNewTableEditor();
        } else {
            structureComposite.openNewEditor();
        }

        // RefreshDetailCompositeAction refreshAction =
        new RefreshDetailCompositeAction(structureComposite.getTreeViewer(), this.getShell());

        return container;

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.sqlbuilder.ui.ISQLBuilderDialog#openEditor(org.talend.repository.model.RepositoryNode,
     * java.util.List, org.talend.sqlbuilder.util.ConnectionParameters, boolean)
     */
    public void openEditor(RepositoryNode node, List<String> repositoryName, ConnectionParameters connParam,
            boolean isDefaultEditor) {
        this.nodeInEditor = node;
        editorComposite.openNewEditor(node, repositoryName, connParam, isDefaultEditor);
    }

    /**
     * Creates the sql detail composite.
     * 
     * @param sashFormResultAndDetail
     */
    private void createDetail(SashForm sashFormResultAndDetail) {
        dbDetailsComposite = new DBDetailsComposite(sashFormResultAndDetail, SWT.BORDER);
    }

    /**
     * Creates the composite to display sql execution result.
     * 
     * @param sashFormResultAndDetail
     */
    private void createResult(SashForm sashFormResultAndDetail) {
        // SQLResultComposite resultView =
        new SQLResultComposite(sashFormResultAndDetail, SWT.BORDER);

    }

    /**
     * Creates the sql editor composite.
     * 
     * @param sashFormStructureAndEditor
     */
    private void createSQLEditor(SashForm sashFormStructureAndEditor) {

        editorComposite = new SQLBuilderTabComposite(sashFormStructureAndEditor, SWT.BORDER, this);
        editorComposite.setReadOnly(readOnly);
    }

    /**
     * Creates composite to display database structure.
     * 
     * @param sashFormStructureAndEditor
     */
    private void createDatabaseStructure(SashForm sashFormStructureAndEditor) {
        // if (connParameters.getMetadataTable() == null || (connParameters.isRepository() &&
        // connParameters.isSchemaRepository())) {
        // structureComposite = new DBStructureComposite(sashFormStructureAndEditor, SWT.BORDER, this);
        // } else {
        BuildInDBStructure buildInDBStructure = new BuildInDBStructure(sashFormStructureAndEditor,
                SWT.NONE | SWT.VERTICAL, this, connParameters);
        structureComposite = buildInDBStructure.getDbstructureCom();
        // }
        structureComposite.setProgressMonitor(this.getProgressMonitor());
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    protected void createButtonsForButtonBar(Composite parent) {
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        parent.setLayoutData(data);

        // increment the number of columns in the button bar
        GridLayout layout = (GridLayout) parent.getLayout();
        layout.makeColumnsEqualWidth = false;
        layout.numColumns = 4;

        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        progressIndicator = new ProgressIndicator(parent);
        progressIndicator.setLayoutData(gd);

        gd = new GridData();
        gd.widthHint = 200;
        Label l = new Label(parent, SWT.NONE);
        l.setLayoutData(gd);

        // OK and Cancel buttons
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);

        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    @Override
    protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
        Button button = new Button(parent, SWT.PUSH);
        button.setText(label);
        button.setFont(JFaceResources.getDialogFont());
        button.setData(new Integer(id));
        button.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent event) {
                buttonPressed(((Integer) event.widget.getData()).intValue());
            }
        });
        if (defaultButton) {
            Shell shell = parent.getShell();
            if (shell != null) {
                shell.setDefaultButton(button);
            }
        }
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        data.widthHint = Math.max(widthHint, minSize.x);
        button.setLayoutData(data);
        return button;
    }

    /**
     * Return the initial size of the dialog.
     */
    protected Point getInitialSize() {
        return new Point(800, 600);
    }

    public SQLBuilderTabComposite getEditorComposite() {
        return editorComposite;
    }

    @Override
    public boolean close() {
        SqlBuilderPlugin.getDefault().getRepositoryService().removeRepositoryChangedListener(this);
        try {
            if (this.nodeInEditor != null) {
                RepositoryNode root = SQLBuilderRepositoryNodeManager.getRoot(this.nodeInEditor);
                if (root != null) {
                    DatabaseConnection connection = (DatabaseConnection) ((ConnectionItem) root.getObject()
                            .getProperty().getItem()).getConnection();
                    shutDownDb(connection);
                }
            }
        } catch (Exception e) {
            ExceptionHandler.process(e);
        }

        clean();
        SQLBuilderRepositoryNodeManager.removeAllRepositoryNodes();
        return super.close();
    }

    private void clean() {
        SessionTreeNodeUtils.dispose();
        nodeManager.clear();
    }

    private void shutDownDb(DatabaseConnection databaseConnection) {
        IMetadataConnection iMetadataConnection = null;
        iMetadataConnection = ConvertionHelper.convert(databaseConnection, false, selectedContext);
        String dbType = iMetadataConnection.getDbType();
        String driverClassName = iMetadataConnection.getDriverClass();
        if (driverClassName.equals(EDatabase4DriverClassName.JAVADB_EMBEDED.getDriverClass())
                || dbType.equals(EDatabaseTypeName.JAVADB_EMBEDED.getDisplayName())
                || dbType.equals(EDatabaseTypeName.JAVADB_DERBYCLIENT.getDisplayName())
                || dbType.equals(EDatabaseTypeName.JAVADB_JCCJDBC.getDisplayName())
                || dbType.equals(EDatabaseTypeName.HSQLDB_IN_PROGRESS.getDisplayName())) {

            String username = iMetadataConnection.getUsername();
            String pwd = iMetadataConnection.getPassword();
            String dbVersion = iMetadataConnection.getDbVersionString();
            String url = iMetadataConnection.getUrl();

            Connection connection = null;
            DriverShim wapperDriver = null;
            try {
                List list = ExtractMetaDataUtils.getInstance().connect(dbType, url, username, pwd, driverClassName,
                        iMetadataConnection.getDriverJarPath(), dbVersion,
                        iMetadataConnection.getAdditionalParams());
                if (list != null && list.size() > 0) {
                    for (int i = 0; i < list.size(); i++) {
                        if (list.get(i) instanceof Connection) {
                            connection = (Connection) list.get(i);
                        }
                        if (list.get(i) instanceof DriverShim) {
                            wapperDriver = (DriverShim) list.get(i);
                        }
                    }
                }
            } catch (Exception e) {
                ExceptionHandler.process(e);
            } finally {
                try {
                    // for derby
                    if (wapperDriver != null) {
                        wapperDriver.connect("jdbc:derby:;shutdown=true", null); //$NON-NLS-1$
                    }
                    if (connection != null) {
                        // for hsqldb in-process
                        ConnectionUtils.closeConnection(connection);
                    }

                } catch (SQLException e) {
                    // exception of shutdown success. no need to catch.
                }

            }
        }

    }

    /**
     * Returns the progress monitor to use for operations run in this progress dialog.
     * 
     * @return the progress monitor
     */
    public IProgressMonitor getProgressMonitor() {
        return progressMonitor;
    }

    /**
     * Added by Tang Fengneng Sets the connParameters.
     * 
     * @param connParameters the connParameters to set
     */
    public void setConnParameters(ConnectionParameters connParameters) {
        this.connParameters = connParameters;
    }

    public ConnectionParameters getConnParameters() {
        return connParameters;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
     */
    @Override
    public void cancelPressed() {
        super.cancelPressed();
        SQLBuilderRepositoryNodeManager.tList = null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    public void okPressed() {
        // gain the contextmode from sqlbuilder,and set it in connParameters,add by hyWang
        MultiPageSqlBuilderEditor editor = null;
        CTabFolder folder = getEditorComposite().getTabFolder();
        CTabItem[] a = folder.getItems();
        for (int i = 0; i < a.length; i++) {
            CTabItem itm = a[i];
            Object obj = itm.getData("KEY"); //$NON-NLS-1$
            if (obj instanceof MultiPageSqlBuilderEditor) {
                editor = (MultiPageSqlBuilderEditor) obj;
            }
            if (editor != null) {
                if (itm.getData() instanceof Query) {
                    Query q = (Query) itm.getData();
                    connParameters.setIfContextButtonCheckedFromBuiltIn(q.isContextMode());
                }

            }
        }

        if (EParameterFieldType.DBTABLE.equals(connParameters.getFieldType())) {
            final IStructuredSelection selection = (IStructuredSelection) structureComposite.getTreeViewer()
                    .getSelection();
            final Object firstElement = selection.getFirstElement();
            if (firstElement instanceof RepositoryNode) {
                RepositoryNode node = (RepositoryNode) firstElement;
                boolean is = node.getProperties(EProperties.CONTENT_TYPE).equals(RepositoryNodeType.TABLE);
                if (is) {
                    MetadataTableRepositoryObject object = (MetadataTableRepositoryObject) node.getObject();
                    connParameters.setSelectDBTable(object.getSourceName());
                }
            }
        } else {
            String sql = ""; //$NON-NLS-1$
            // sql = editorComposite.getDefaultTabSql();
            sql = editorComposite.getCurrentTabSql();
            // if (ConnectionParameters.isJavaProject()) {
            // sql = sql.replace("\"", "\\" + "\"");
            // } else {
            // sql = sql.replace("'", "\\'");
            // }

            // sql = QueryUtil.checkAndAddQuotes(sql);

            connParameters.setQuery(sql);

            if (connParameters.isFromRepository() && !connParameters.isNodeReadOnly()) {
                List<Query> qs = new ArrayList<Query>();
                boolean isInfo = false;
                final CTabFolder tabFolder = getEditorComposite().getTabFolder();
                final CTabItem[] items = tabFolder.getItems();

                for (int i = 0; i < items.length; i++) {
                    CTabItem item = items[i];
                    final String text = item.getText();
                    boolean isInfo2 = text.length() > 1 && text.substring(0, 1).equals("*"); //$NON-NLS-1$
                    if (isInfo2) {
                        isInfo = true;
                    }
                }
                if (isInfo) {
                    String title = Messages.getString("SQLBuilderDialog.SaveAllQueries.Title"); //$NON-NLS-1$
                    String info = Messages.getString("SQLBuilderDialog.SaveAllQueries.Info"); //$NON-NLS-1$
                    boolean openQuestion = MessageDialog.openQuestion(getShell(), title, info);
                    if (openQuestion) {
                        for (CTabItem item : items) {
                            final String text = item.getText();
                            boolean isInfo2 = text.length() > 1 && text.substring(0, 1).equals("*"); //$NON-NLS-1$
                            if (isInfo2) {
                                MultiPageSqlBuilderEditor meditor = null;
                                Object control = item.getData("KEY"); //$NON-NLS-1$
                                if (control instanceof MultiPageSqlBuilderEditor) {
                                    meditor = (MultiPageSqlBuilderEditor) control;
                                }
                                if (meditor != null) {
                                    RepositoryNode node = null;
                                    node = meditor.getActivePageRepositoryNode();
                                    if (text.substring(1).startsWith(AbstractSQLEditorComposite.QUERY_PREFIX)) {
                                        if (item.getData() instanceof Query) {
                                            Query q = (Query) item.getData();
                                            q.setValue(meditor.getActivePageSqlString());
                                            // add by hyWang
                                            q.setContextMode(meditor.getActiveEditors().getContextmode()
                                                    .getContextmodeaction().isChecked());
                                            qs.add(q);
                                            if (node != null && q != null) {
                                                manager.saveQuery(node, q, null);
                                            }
                                        }
                                    } else {
                                        meditor.getActivePageSaveAsSQLAction().run();
                                    }
                                }
                            }
                        }
                    }
                }
                if (connParameters.getQueryObject() != null) {
                    RepositoryUpdateManager.updateQuery(connParameters.getQueryObject(), node);
                }
            }
        }
        deleteNoUseTable();
        super.okPressed();
    }

    private void deleteNoUseTable() {

        // add for bug TDI-17097
        connection = (DatabaseConnection) SQLBuilderRepositoryNodeManager
                .getItem(SQLBuilderRepositoryNodeManager.getRoot(nodeInEditor)).getConnection();
        if (SQLBuilderRepositoryNodeManager.tList instanceof List) {
            if (SQLBuilderRepositoryNodeManager.tList.size() == 0) {
                SQLBuilderRepositoryNodeManager.tList.addAll(ConnectionHelper.getTables(connection));
            }
        } else {
            SQLBuilderRepositoryNodeManager.tList = new ArrayList<MetadataTable>();
            SQLBuilderRepositoryNodeManager.tList.addAll(ConnectionHelper.getTables(connection));
        }

        if (SQLBuilderRepositoryNodeManager.tList == null || SQLBuilderRepositoryNodeManager.tList.size() == 0) {
            return;
        }

        // changed for bug TDI-19892
        if (node == null) {
            SQLBuilderRepositoryNodeManager.tList = null;
            return;
        }

        IRepositoryViewObject repositoryObject = node.getObject();
        Item item = repositoryObject.getProperty().getItem();
        if (item instanceof DatabaseConnectionItem) {
            manager.deleteNouseTables(((DatabaseConnectionItem) item).getConnection());
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.sqlbuilder.ui.ISQLBuilderDialog#refreshNode(org.talend.repository.model.RepositoryNode)
     */
    public void refreshNode(RepositoryNode node) {
        structureComposite.doRefresh(node);
    }

    /**
     * qianbing class global comment. Refreshes Detail Composite according to selection changing of the database
     * structure viewer. <br/>
     * 
     * $Id: talend-code-templates.xml,v 1.3 2006/11/01 05:38:28 nicolas Exp $
     * 
     */
    public class RefreshDetailCompositeAction extends SelectionProviderAction {

        private Shell shell;

        SessionTreeNode sessionTreeNode;

        DriverShim wapperDriver = null;

        /**
         * qianbing RefreshDetailCompositeAction constructor comment.
         * 
         * @param provider
         */
        public RefreshDetailCompositeAction(ISelectionProvider provider, Shell shell) {
            super(provider, "Refresh DetailComposite"); //$NON-NLS-1$
            this.shell = shell;
        }

        /*
         * (non-Java)
         * 
         * @see
         * org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection
         * )
         */
        public void selectionChanged(final IStructuredSelection selection) {
            if (!selection.isEmpty() && selectedContext == null) {
                RepositoryNode repositoryNode = (RepositoryNode) selection.getFirstElement();
                if (repositoryNode.getObject() != null) {
                    Item item = repositoryNode.getObject().getProperty().getItem();
                    if (item instanceof DatabaseConnectionItem) {
                        org.talend.core.model.metadata.builder.connection.Connection connection = ((DatabaseConnectionItem) item)
                                .getConnection();
                        if (connection.isContextMode()) {
                            ContextItem contextItem = ContextUtils.getContextItemById2(connection.getContextId());
                            if (contextItem != null && connection.isContextMode()) {

                                ContextSetsSelectionDialog setsDialog = new ContextSetsSelectionDialog(shell,
                                        contextItem, false);
                                setsDialog.open();
                                selectedContext = setsDialog.getSelectedContext();
                            }
                        }
                    }
                }
            }
            IRunnableWithProgress progress = new IRunnableWithProgress() {

                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$

                    try {
                        Display.getDefault().asyncExec(new Runnable() {

                            public void run() {
                                INode node = null;
                                String msg = null;
                                if (!selection.isEmpty()) {
                                    try {
                                        final RepositoryNode repositoryNode = (RepositoryNode) selection
                                                .getFirstElement();
                                        if (SQLBuilderRepositoryNodeManager
                                                .getRepositoryType(repositoryNode) == RepositoryNodeType.FOLDER) {
                                            return;
                                        }
                                        sessionTreeNode = nodeManager.getSessionTreeNode(repositoryNode,
                                                selectedContext);
                                        node = nodeManager.convert2INode(repositoryNode, selectedContext,
                                                sessionTreeNode);
                                    } catch (Exception e) {
                                        msg = e.getMessage();
                                        SqlBuilderPlugin.log(msg, e);
                                    }
                                    final INode argNode = node;
                                    final String argMsg = msg;
                                    dbDetailsComposite.setSelectedNode(argNode, argMsg);
                                    // bug 17980
                                    wapperDriver = sessionTreeNode.getWapperDriver();

                                    // bug 20892:specify for derby need close connection,no need to close connection for
                                    // other dbs
                                    // bug 22619 improved by 20892
                                    String dbType = sessionTreeNode.getDatabaseConnection().getDatabaseType();

                                    String driverClassName = sessionTreeNode.getDatabaseConnection()
                                            .getDriverClass();
                                    if (wapperDriver != null && (driverClassName
                                            .equals(EDatabase4DriverClassName.JAVADB_EMBEDED.getDriverClass())
                                            || dbType.equals(EDatabaseTypeName.JAVADB_EMBEDED.getDisplayName())
                                            || dbType.equals(EDatabaseTypeName.JAVADB_DERBYCLIENT.getDisplayName())
                                            || dbType.equals(EDatabaseTypeName.JAVADB_JCCJDBC.getDisplayName()))) {
                                        try {
                                            wapperDriver.connect("jdbc:derby:;shutdown=true", null); //$NON-NLS-1$
                                        } catch (SQLException e) {
                                            // exception of shutdown success. no need to catch.
                                        }
                                    }
                                }
                            }
                        });
                    } finally {
                        monitor.done();
                    }
                }
            };

            UIUtils.runWithProgress(progress, true, getProgressMonitor(), getShell());

        }
    }

    public boolean isFromRepositoryView() {
        return this.isFromRepositoryView;
    }

    public void setFromRepositoryView(boolean isFromRepositoryView) {
        this.isFromRepositoryView = isFromRepositoryView;
    }

    public void repositoryChanged(RepositoryChangedEvent event) {
        clean();
        if (structureComposite != null) {
            structureComposite.updateStructureView(event);
        }
        manager.synchronizeAllSqlEditors(this);
    }

    public void notifySQLBuilder(IRepositoryViewObject o) {
        CorePlugin.getDefault().getRepositoryService().removeRepositoryChangedListener(this);
        CorePlugin.getDefault().getRepositoryService().repositoryChanged(new RepositoryElementDelta(o));
        CorePlugin.getDefault().getRepositoryService().registerRepositoryChangedListener(this);
    }

    /*
     * (non-Java)
     * 
     * @see org.talend.sqlbuilder.ui.ISQLBuilderDialog#openEditor(org.talend.repository.model.RepositoryNode,
     * java.util.List, org.talend.sqlbuilder.util.ConnectionParameters, boolean, java.util.List)
     */
    public void openEditor(RepositoryNode node, List<String> repositoryName, ConnectionParameters connParam,
            boolean isDefaultEditor, List<IRepositoryNode> nodeSel) {
        this.nodeInEditor = node;
        editorComposite.setNodesSel(nodeSel);
        editorComposite.openNewEditor(node, repositoryName, connParam, isDefaultEditor);

    }

    public DBStructureComposite getStructureComposite() {
        return this.structureComposite;
    }

    public void setReadOnly(boolean readOnly) {
        this.readOnly = readOnly;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.talend.sqlbuilder.ui.ISQLBuilderDialog#getSelectedContext()
     */
    public String getSelectedContext() {
        return this.selectedContext;
    }

}