org.eclipse.datatools.engagement.marklogic.ui.wizards.XPathChoosePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.datatools.engagement.marklogic.ui.wizards.XPathChoosePage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2008 Actuate Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *  Actuate Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.datatools.engagement.marklogic.ui.wizards;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.datatools.connectivity.oda.design.DataSetDesign;
import org.eclipse.datatools.connectivity.oda.design.ui.designsession.DesignSessionUtil;
import org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage;
import org.eclipse.datatools.engagement.marklogic.Constants;
import org.eclipse.datatools.engagement.marklogic.ui.UiPlugin;
import org.eclipse.datatools.engagement.marklogic.ui.i18n.Messages;
import org.eclipse.datatools.engagement.marklogic.ui.preference.DataSetPreferencePage;
import org.eclipse.datatools.engagement.marklogic.ui.utils.ExceptionHandler;
import org.eclipse.datatools.engagement.marklogic.ui.utils.IHelpConstants;
import org.eclipse.datatools.engagement.marklogic.ui.utils.XMLRelationInfoUtil;
import org.eclipse.datatools.engagement.marklogic.util.ui.ATreeNode;
import org.eclipse.datatools.engagement.marklogic.util.ui.SchemaPopulationUtil;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;

/**
 * Root xpath choose page. It expands the xml tree list to choose the preferred
 * root path
 */

public class XPathChoosePage extends DataSetWizardPage {
    private String pageDefaultMessage = Messages.getString("wizard.defaultMessage.selectXPath"); //$NON-NLS-1$

    private static final String EMPTY_STRING = ""; //$NON-NLS-1$

    private transient XMLTreeViewer availableXmlTree;
    private transient StyledText xmlPathText;
    private transient Group rightGroup;
    private Menu quickFixMenu;

    private ATreeNode treeNode;
    private TreeItem selectedItem;
    private String xsdFileName;
    private String xmlFileName;
    private String xmlEncoding;
    private String initRootPath;
    private String rootPath;
    private int selectRadioIndex = 1; // default selection is 3

    protected boolean supportsXMLParameter = true;

    /**
     * @param string
     */
    public XPathChoosePage() {
        this(Messages.getString("wizard.title.newDataSet")); //$NON-NLS-1$
    }

    /**
     * @param pageName
     */
    public XPathChoosePage(String pageName) {
        super(pageName);
        this.setTitle(pageName);
        this.setMessage(pageDefaultMessage);
        this.setPageComplete(false);
        this.supportsXMLParameter = true;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#createPageCustomControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPageCustomControl(Composite parent) {
        ScrolledComposite sComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        sComposite.setLayout(new GridLayout());
        sComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
        sComposite.setMinWidth(600);
        sComposite.setExpandHorizontal(true);

        Control control = createPageControl(sComposite);

        if (XMLInformationHolder.hasDestroyed())
            XMLInformationHolder.start(this.getInitializationDesign());
        initializeControl();
        populateXMLTree();

        Point size = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        control.setSize(size.x, size.y);

        sComposite.setContent(control);
        setControl(sComposite);

        XMLRelationInfoUtil.setSystemHelp(getControl(), IHelpConstants.CONEXT_ID_DATASET_XML_XPATH);
    }

    /**
     * initial the info after create the control
     * 
     */
    private void initializeControl() {
        xsdFileName = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_SCHEMA_FILELIST);
        xmlFileName = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_FILELIST);
        xmlEncoding = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_ENCODINGLIST);

        String queryText = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_RELATIONINFORMATION);

        String tableName = XMLRelationInfoUtil.getTableName(queryText);
        if (tableName != null)
            rootPath = XMLRelationInfoUtil.getXPathExpression(queryText, tableName);
        else
            rootPath = EMPTY_STRING;

        backupRootPath();
        if (rootPath != null && rootPath.length() > 0)
            xmlPathText.setText(rootPath);
    }

    private void backupRootPath() {
        initRootPath = rootPath;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#refresh(org.eclipse.datatools.connectivity.oda.design.DataSetDesign)
     */
    protected void refresh(DataSetDesign dataSetDesign) {
        pageDefaultMessage = Messages.getString("xPathChoosePage.messages.elementSelection.label"); //$NON-NLS-1$
        if (XMLInformationHolder.hasDestroyed())
            XMLInformationHolder.start(dataSetDesign);

        refresh();
        if (getMessageType() == IMessageProvider.NONE) {
            setMessage(pageDefaultMessage);
        }
    }

    protected void refresh() {
        boolean needsRefresh = false;
        if (!valueEquals(xsdFileName,
                XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_SCHEMA_FILELIST))) {
            xsdFileName = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_SCHEMA_FILELIST);
            needsRefresh = true;
        }
        if (!valueEquals(xmlFileName, XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_FILELIST))) {
            xmlFileName = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_FILELIST);
            needsRefresh = true;
        }
        if (!valueEquals(xmlEncoding, XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_ENCODINGLIST))) {
            xmlEncoding = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_ENCODINGLIST);
            needsRefresh = true;
        }

        if (needsRefresh) {
            refreshControls();
        }
    }

    private void refreshControls() {
        populateXMLTree();
        backupRootPath();
        this.availableXmlTree.getSingleButton().setEnabled(false);
        setMessage(pageDefaultMessage);
    }

    private boolean valueEquals(String value1, String value2) {
        if (value1 == null) {
            return value2 == null;
        }
        return value1.equals(value2);
    }

    /**
    * 
    * @param parent
    * @return
    */
    public Control createPageControl(Composite parent) {
        pageDefaultMessage = Messages.getString("wizard.defaultMessage.selectXPath"); //$NON-NLS-1$
        this.setMessage(pageDefaultMessage);
        Composite composite = new Composite(parent, SWT.NONE);

        FormLayout layout = new FormLayout();
        composite.setLayout(layout);

        createLeftGroup(composite);
        availableXmlTree.getSingleButton().addSelectionListener(new SelectionAdapter() {

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent e) {

                RowMappingDialog dialog = new RowMappingDialog(
                        PlatformUI.getWorkbench().getDisplay().getActiveShell(),
                        Messages.getString("RowMappingDialog.title"), //$NON-NLS-1$
                        selectedItem, selectRadioIndex, rootPath, supportsXMLParameter);
                if (dialog.open() == Window.OK) {
                    rootPath = dialog.getSelectedPath();
                    selectRadioIndex = dialog.getSelectIndex();
                    xmlPathText.setText(rootPath);
                }
            }
        });

        createRightGroup(composite);
        return composite;
    }

    /**
     * create left group composite
     * @param composite2
     */
    private void createLeftGroup(Composite composite2) {
        availableXmlTree = new XMLTreeViewer(composite2, false);
        availableXmlTree.getSingleButton()
                .setToolTipText(Messages.getString("xPathChoosePage.messages.btnAdd.tooltip")); //$NON-NLS-1$
        availableXmlTree.getTree().addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                TreeItem items[] = availableXmlTree.getTree().getSelection();
                selectedItem = null;
                for (int i = 0; i < items.length; i++) {
                    selectedItem = items[0];
                    if (items[i].getGrayed()) {
                        availableXmlTree.getTree().setRedraw(false);
                        availableXmlTree.getTree().deselectAll();
                        availableXmlTree.getTree().setRedraw(true);
                        availableXmlTree.getTree().redraw();
                    }
                }
                if (selectedItem != null)
                    availableXmlTree.getSingleButton().setEnabled(true);
                else
                    availableXmlTree.getSingleButton().setEnabled(false);
            }
        });
    }

    /**
     * create right group composite
     * @param composite2
     */
    private void createRightGroup(Composite composite2) {
        FormData data = new FormData();
        data.top = new FormAttachment(0, 5);
        data.left = new FormAttachment(availableXmlTree.getBtnComposite(), 5);
        data.right = new FormAttachment(100, -5);
        data.bottom = new FormAttachment(100, -5);
        rightGroup = new Group(composite2, SWT.NONE);

        rightGroup.setLayout(new FormLayout());
        rightGroup.setText(Messages.getString("xPathChoosePage.messages.elementSelection.label")); //$NON-NLS-1$
        rightGroup.setLayoutData(data);

        data = new FormData();
        data.top = new FormAttachment(0, 5);
        data.left = new FormAttachment(0, 5);
        data.right = new FormAttachment(100, -5);

        final Label label = new Label(rightGroup, SWT.NONE);
        label.setText(Messages.getString("xPathChoosePage.messages.xPathExpression")); //$NON-NLS-1$
        label.setLayoutData(data);

        data = new FormData();
        data.top = new FormAttachment(0, 25);
        data.left = new FormAttachment(0, 5);
        data.right = new FormAttachment(100, -5);
        xmlPathText = new StyledText(rightGroup, SWT.BORDER);
        xmlPathText.setLayoutData(data);
        xmlPathText.setOrientation(SWT.LEFT_TO_RIGHT);
        xmlPathText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                rootPath = xmlPathText.getText().trim();
                updatePageStatus();
            }
        });

        if (supportsXMLParameter) {
            createQuickFixMenu();

            xmlPathText.addMenuDetectListener(new MenuDetectListener() {

                public void menuDetected(MenuDetectEvent event) {
                    quickFixMenu.setLocation(event.x, event.y);
                    quickFixMenu.setVisible(true);

                    updateMenuItemStatus(xmlPathText);
                }
            });
        }

    }

    private void createQuickFixMenu() {
        quickFixMenu = new Menu(xmlPathText);
        MenuItem createItem = new MenuItem(quickFixMenu, SWT.PUSH);
        createItem.setText(Messages.getString("ColumnMappingDialog.MenuItem.CreateParameter")); //$NON-NLS-1$
        createItem.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent event) {
                createXMLParameter(xmlPathText);
            }

            public void widgetDefaultSelected(SelectionEvent event) {

            }
        });

        MenuItem deleteItem = new MenuItem(quickFixMenu, SWT.PUSH);
        deleteItem.setText(Messages.getString("ColumnMappingDialog.MenuItem.DeleteParameter")); //$NON-NLS-1$
        deleteItem.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent event) {
                deleteXMLParameter(xmlPathText);
            }

            public void widgetDefaultSelected(SelectionEvent event) {

            }
        });

        updateMenuItemStatus(xmlPathText);

    }

    private void updateMenuItemStatus(StyledText text) {
        String selectionText = text.getSelectionText().trim();

        boolean deleteEnabled = selectionText.length() > 0
                && selectionText.startsWith(Constants.CONST_PARAMETER_START)
                && selectionText.endsWith(Constants.CONST_PARAMETER_END);

        quickFixMenu.getItem(0).setEnabled(selectionText.length() > 0 && !deleteEnabled);
        quickFixMenu.getItem(1).setEnabled(deleteEnabled);

    }

    private void createXMLParameter(StyledText text) {
        String selectedValue = text.getSelectionText();
        String changedValue = Constants.CONST_PARAMETER_START + selectedValue + Constants.CONST_PARAMETER_END;
        resetXPathText(text, changedValue);
    }

    private void resetXPathText(StyledText text, String changedValue) {
        String xpathString = text.getText().trim();
        String result = xpathString.substring(0, text.getSelection().x) + changedValue
                + xpathString.substring(text.getSelection().y);
        text.setText(result);
    }

    private void deleteXMLParameter(StyledText text) {
        String selectedValue = text.getSelectionText();
        String changedValue = selectedValue.substring(2, selectedValue.length() - 2);

        resetXPathText(text, changedValue);
    }

    /**
     * populate xml tree
     * 
     */
    private void populateXMLTree() {
        try {
            this.availableXmlTree.getTree().removeAll();
            if ((xsdFileName == null || xsdFileName.trim().length() == 0)
                    && (xmlFileName == null || xmlFileName.trim().length() == 0)) {
                return;
            }

            int numberOfElement = 0;
            Preferences preferences = UiPlugin.getDefault().getPluginPreferences();
            if (preferences.contains(DataSetPreferencePage.USER_MAX_NUM_OF_ELEMENT_PASSED)) {
                numberOfElement = preferences.getInt(DataSetPreferencePage.USER_MAX_NUM_OF_ELEMENT_PASSED);
            } else {
                numberOfElement = DataSetPreferencePage.DEFAULT_MAX_NUM_OF_ELEMENT_PARSED;
                preferences.setValue(DataSetPreferencePage.USER_MAX_NUM_OF_ELEMENT_PASSED, numberOfElement);
            }
            // TODO for migrate into ODA3.0, the relative path is not
            // supported
            // Object url = this.dataSetHandle.getModuleHandle(
            // ).findResource( fileName,IResourceLocator.LIBRARY );
            //            
            // if( url != null )
            treeNode = SchemaPopulationUtil.getSchemaTree(xsdFileName, xmlFileName, xmlEncoding, numberOfElement,
                    DesignSessionUtil.createRuntimeResourceIdentifiers(getHostResourceIdentifiers()));
            if (treeNode == null || treeNode.getChildren() == null || treeNode.getChildren().length == 0) {
                OdaException ex = new OdaException(Messages.getString("dataset.error.populateXMLTree")); //$NON-NLS-1$
                ExceptionHandler.showException(getShell(), Messages.getString("error.label"), //$NON-NLS-1$
                        ex.getMessage(), ex);
                this.setErrorMessage(Messages.getString("dataset.error.CannotPopulateXMLTree")); //$NON-NLS-1$
                setPageComplete(false);
            } else {
                availableXmlTree.populateTree(treeNode, this.rootPath, false, false);
            }
        } catch (Exception e) {
            ExceptionHandler.showException(getShell(), Messages.getString("error.label"), //$NON-NLS-1$
                    e.getMessage(), e);
            this.setErrorMessage(Messages.getString("dataset.error.CannotPopulateXMLTree")); //$NON-NLS-1$
            setPageComplete(false);
        }
    }

    /**
     * set page status based on row number
     * 
     */
    private void updatePageStatus() {
        if ((xsdFileName == null || xsdFileName.trim().length() == 0)
                && (xmlFileName == null || xmlFileName.trim().length() == 0)) {
            this.setErrorMessage(Messages.getString("xPathChoosePage.messages.noURLOfSourceOrSchema")); //$NON-NLS-1$
            setPageComplete(false);
        } else if (!isRootPathValid()) {
            this.setMessage(Messages.getFormattedString("error.invalidXpath", //$NON-NLS-1$
                    new Object[] { rootPath == null ? EMPTY_STRING : rootPath }), IMessageProvider.ERROR);
            setPageComplete(false);
        } else {
            if (initRootPath != null && !initRootPath.equals(EMPTY_STRING) && !initRootPath.equals(rootPath)) {
                setMessage(Messages.getString("xPathChoosePage.messages.xpathChange"), //$NON-NLS-1$
                        INFORMATION);
            } else {
                setMessage(pageDefaultMessage);
            }
            setPageComplete(true);
        }
    }

    private boolean isRootPathValid() {
        return rootPath != null && rootPath.trim().length() > 0;
    }

    /**
     * when XPath text has changed, reset the dataSetHandle.CONST_PROP_XPATH
     * 
     */
    private void resetXPathPropInHandle(String pathStr) {
        if (pathStr != null && pathStr.trim().length() > 0) {
            XMLInformationHolder.setPropertyValue(Constants.CONST_PROP_XPATH, pathStr);
            // The relation information should be changed
            if (XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_TABLE_NAME) != null) {
                String relationInfo = (String) XMLInformationHolder
                        .getPropertyValue(Constants.CONST_PROP_RELATIONINFORMATION);

                if (relationInfo == null || relationInfo.trim().length() == 0)
                    return;
                String tableName = XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_TABLE_NAME);
                String infoStr = XMLRelationInfoUtil.replaceXpathExpression(tableName, relationInfo, pathStr);

                XMLInformationHolder.setPropertyValue(Constants.CONST_PROP_RELATIONINFORMATION, infoStr);
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.IWizardPage#getNextPage()
     */
    public IWizardPage getNextPage() {
        if (isValid()) {
            IWizardPage page = super.getNextPage();
            if (page instanceof ColumnMappingPage) {
                ((ColumnMappingPage) page).refresh();
            }
            return page;
        } else
            return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
     */
    public boolean canFlipToNextPage() {
        if (rootPath == null || rootPath.trim().length() == 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * the xpath expression is valid or not
     * @return
     */
    private boolean isValid() {
        if (this.getControl() == null || this.getControl().isDisposed())
            return true;

        if (!isRootPathValid()) {
            this.setMessage(Messages.getString("error.invalidXpath"), IMessageProvider.ERROR); //$NON-NLS-1$
            return false;
        } else {
            resetXPathPropInHandle(rootPath);
            return true;
        }
    }

    /*
    * (non-Javadoc)
    * 
    * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#collectDataSetDesign(org.eclipse.datatools.connectivity.oda.design.DataSetDesign)
    */
    protected DataSetDesign collectDataSetDesign(DataSetDesign design) {
        try {
            resetXPathPropInHandle(rootPath);
            savePage(design);
        } catch (OdaException e) {
        }
        return design;
    }

    /**
      * Updates the given dataSetDesign with the query and its metadata defined
      * in this page.
      * 
      * @param dataSetDesign
      * @throws OdaException 
      */
    private void savePage(DataSetDesign dataSetDesign) throws OdaException {
        if (XMLInformationHolder.hasDestroyed())
            return;
        if (dataSetDesign != null && getQueryText(dataSetDesign) != null && !getQueryText(dataSetDesign)
                .equals(XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_RELATIONINFORMATION))) {
            setQueryText(dataSetDesign,
                    XMLInformationHolder.getPropertyValue(Constants.CONST_PROP_RELATIONINFORMATION));
            updateDesign(dataSetDesign);
        }
    }

    protected void updateDesign(DataSetDesign dataSetDesign) {
        DataSetDesignPopulator.populateMetaData(dataSetDesign);
    }

    protected String getQueryText(DataSetDesign dataSetDesign) {
        return dataSetDesign.getQueryText();
    }

    protected void setQueryText(DataSetDesign dataSetDesign, String queryText) {
        dataSetDesign.setQueryText(queryText);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#canLeave()
     */
    protected boolean canLeave() {
        return isValid();
    }

    /*
    * (non-Javadoc)
    * 
    * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
    */
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        getControl().setFocus();
    }

    /*
     * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#cleanup()
     */
    protected void cleanup() {
        XMLInformationHolder.destory();
    }

}