com.amalto.workbench.editors.RoutingEngineV2BrowserMainPage.java Source code

Java tutorial

Introduction

Here is the source code for com.amalto.workbench.editors.RoutingEngineV2BrowserMainPage.java

Source

// ============================================================================
//
// Copyright (C) 2006-2017 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 com.amalto.workbench.editors;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;

import com.amalto.workbench.editors.actions.DeleteItemsAction;
import com.amalto.workbench.editors.actions.EditItemAction;
import com.amalto.workbench.editors.actions.ExecuteRoutingOrdersAction;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
import com.amalto.workbench.models.IXObjectModelListener;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.providers.XObjectBrowserInput;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.utils.XtentisException;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSGetRoutingOrderV2ByCriteriaWithPaging;
import com.amalto.workbench.webservices.WSGetServicesList;
import com.amalto.workbench.webservices.WSRoutingEngineV2Action;
import com.amalto.workbench.webservices.WSRoutingEngineV2ActionCode;
import com.amalto.workbench.webservices.WSRoutingEngineV2Status;
import com.amalto.workbench.webservices.WSRoutingOrderV2;
import com.amalto.workbench.webservices.WSRoutingOrderV2SearchCriteriaWithPaging;
import com.amalto.workbench.webservices.WSRoutingOrderV2Status;
import com.amalto.workbench.webservices.WSServicesListItem;
import com.amalto.workbench.widgets.CalendarSelectWidget;
import com.amalto.workbench.widgets.IPagingListener;
import com.amalto.workbench.widgets.PageingToolBar;
import com.amalto.workbench.widgets.WidgetFactory;

public class RoutingEngineV2BrowserMainPage extends AMainPage implements IXObjectModelListener, IPagingListener {

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

    private static Log log = LogFactory.getLog(RoutingEngineV2BrowserMainPage.class);

    protected static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");//$NON-NLS-1$

    protected Label statusLabel;

    protected Text fromText;

    protected Text toText;

    protected Combo statusCombo;

    protected Text idText;

    protected Combo serviceCombo;

    protected Text anyFieldText;

    protected Text documentTypeText;

    protected TableViewer resultsViewer;

    protected ListViewer wcListViewer;

    protected Button suspendButton;

    private PageingToolBar pageToolBar;

    protected boolean[] ascending = { true, false, false, false };

    private Button stopButton;

    private Button startButton;

    public RoutingEngineV2BrowserMainPage(FormEditor editor) {
        super(editor, RoutingEngineV2BrowserMainPage.class.getName(),
                ((XObjectBrowserInput) editor.getEditorInput()).getName());
        // listen to events
        ((XObjectBrowserInput) editor.getEditorInput()).addListener(this);
    }

    @Override
    protected void createFormContent(IManagedForm managedForm) {

        try {

            // sets the title
            managedForm.getForm().setText(this.getTitle());

            // get the toolkit
            FormToolkit toolkit = managedForm.getToolkit();

            // get the body
            Composite composite = managedForm.getForm().getBody();
            composite.setLayout(new GridLayout(1, false));

            // Create a Router status holder
            Composite statusComposite = toolkit.createComposite(composite, SWT.NONE);
            statusComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
            statusComposite.setLayout(new GridLayout(5, false));

            // status
            Label descriptionLabel = toolkit.createLabel(statusComposite,
                    Messages.RoutingEngineV2BrowserMainPage_EventManagerStatus, SWT.NULL);
            descriptionLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
            statusLabel = toolkit.createLabel(statusComposite, "                                           ", //$NON-NLS-1$
                    SWT.NULL);
            statusLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
            startButton = toolkit.createButton(statusComposite, BLANK, SWT.PUSH);
            startButton.setImage(ImageCache.getCreatedImage(EImage.RUN_EXC.getPath()));
            startButton.setToolTipText(Messages.RoutingEngineV2BrowserMainPage_Start);
            startButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
            startButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    startSubscriptionEngine();
                    updateButtons();
                };
            });
            stopButton = toolkit.createButton(statusComposite, BLANK, SWT.PUSH);
            stopButton.setImage(ImageCache.getCreatedImage(EImage.STOP.getPath()));
            stopButton.setToolTipText(Messages.RoutingEngineV2BrowserMainPage_Stop);
            stopButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
            stopButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    stopSubscriptionEngine();
                    updateButtons();
                };
            });
            suspendButton = toolkit.createButton(statusComposite, BLANK, SWT.PUSH);
            suspendButton.setImage(ImageCache.getCreatedImage(EImage.SUSPEND.getPath()));
            suspendButton.setToolTipText(Messages.RoutingEngineV2BrowserMainPage_Suspend);
            suspendButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
            suspendButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    suspendSubscriptionEngine();
                    updateButtons();
                };
            });

            Composite separator = toolkit.createCompositeSeparator(composite);
            separator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
            ((GridData) separator.getLayoutData()).heightHint = 2;

            // first Line of routing Orders
            Composite firstLineComposite = toolkit.createComposite(composite);
            firstLineComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
            firstLineComposite.setLayout(new GridLayout(9, false));

            // Routing Orders Label
            Label routingOrdersLabel = toolkit.createLabel(firstLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_RoutingOrders, SWT.NULL);
            routingOrdersLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 9, 1));

            // from
            Label fromLabel = toolkit.createLabel(firstLineComposite, Messages.RoutingEngineV2BrowserMainPage_From,
                    SWT.NULL);
            fromLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            CalendarSelectWidget fromCalendar = new CalendarSelectWidget(toolkit, firstLineComposite, true);
            fromText = fromCalendar.getText();

            // to
            Label toLabel = toolkit.createLabel(firstLineComposite, Messages.RoutingEngineV2BrowserMainPage_To,
                    SWT.NULL);
            toLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            CalendarSelectWidget toCalendar = new CalendarSelectWidget(toolkit, firstLineComposite, false);
            toText = toCalendar.getText();

            Label statusLab = toolkit.createLabel(firstLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_Status, SWT.NULL);
            statusLab.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            statusCombo = new Combo(firstLineComposite, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.MULTI);
            statusCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            statusCombo.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if ((e.stateMask == 0) && (e.character == SWT.CR)) {
                        doSearch();
                    }
                }// keyReleased
            }// keyListener
            );
            statusCombo.add("FAILED");//$NON-NLS-1$
            statusCombo.add("COMPLETED");//$NON-NLS-1$
            statusCombo.select(0);

            // to
            Button bSearch = toolkit.createButton(firstLineComposite, BLANK, SWT.CENTER);
            bSearch.setImage(ImageCache.getCreatedImage(EImage.BROWSE.getPath()));
            bSearch.setToolTipText(Messages.RoutingEngineV2BrowserMainPage_Search);
            bSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            bSearch.addListener(SWT.Selection, new Listener() {

                public void handleEvent(Event event) {
                    pageToolBar.reset();
                    doSearch();
                };
            });

            // Second Line of routing Orders
            Composite searchLineComposite = toolkit.createComposite(composite);
            searchLineComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
            searchLineComposite.setLayout(new GridLayout(4, false));

            // document type
            Label documentTypeLabel = toolkit.createLabel(searchLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_DocumentType, SWT.NULL);
            documentTypeLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            // DocumentType
            documentTypeText = toolkit.createText(searchLineComposite, BLANK, SWT.BORDER);
            documentTypeText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
            ((GridData) documentTypeText.getLayoutData()).widthHint = 120;
            documentTypeText.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if ((e.stateMask == 0) && (e.character == SWT.CR)) {
                        doSearch();
                    }
                }// keyReleased
            }// keyListener
            );
            // ID
            Label idLabel = toolkit.createLabel(searchLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_ItemIDs, SWT.NULL);
            idLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            // ID
            idText = toolkit.createText(searchLineComposite, BLANK, SWT.BORDER);
            idText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
            idText.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if ((e.stateMask == 0) && (e.character == SWT.CR)) {
                        doSearch();
                    }
                }// keyReleased
            }// keyListener
            );

            // service
            Label serviceLabel = toolkit.createLabel(searchLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_Service, SWT.NULL);
            serviceLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            // service
            serviceCombo = new Combo(searchLineComposite, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.MULTI);
            serviceCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            serviceCombo.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if ((e.stateMask == 0) && (e.character == SWT.CR)) {
                        doSearch();
                    }
                }// keyReleased
            }// keyListener
            );
            serviceCombo.add(BLANK);
            // WSServicesListItem[] servicesList = Util.getPort(getXObject()).getServicesList(new
            // WSGetServicesList("en")).getItem();
            List<WSServicesListItem> servicesList = getMDMService().getServicesList(new WSGetServicesList("en")) //$NON-NLS-1$
                    .getItem();

            if ((servicesList != null) && (servicesList.size() > 0)) {
                String[] services = new String[servicesList.size()];
                for (int i = 0; i < servicesList.size(); i++) {
                    services[i] = servicesList.get(i).getJndiName().replaceFirst("amalto/local/service/", BLANK);//$NON-NLS-1$
                }
                Arrays.sort(services);
                for (String service : services) {
                    serviceCombo.add(service);
                }
            }
            serviceCombo.select(0);

            // any Field
            Label anyFieldLabel = toolkit.createLabel(searchLineComposite,
                    Messages.RoutingEngineV2BrowserMainPage_AnyField, SWT.NULL);
            anyFieldLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
            // anyField
            anyFieldText = toolkit.createText(searchLineComposite, BLANK, SWT.BORDER);
            anyFieldText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
            anyFieldText.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if ((e.stateMask == 0) && (e.character == SWT.CR)) {
                        doSearch();
                    }
                }// keyReleased
            }// keyListener
            );

            // pageToolBar
            pageToolBar = new PageingToolBar(composite);
            pageToolBar.getComposite().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 9, 1));
            pageToolBar.getComposite().setVisible(false);
            pageToolBar.setPageingListener(this);

            final Table table = createTable(composite);

            resultsViewer = new TableViewer(table);

            resultsViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
            // ((GridData) resultsViewer.getControl().getLayoutData()).heightHint = 500;
            resultsViewer.setContentProvider(new ArrayContentProvider());
            resultsViewer.setLabelProvider(new ClusterTableLabelProvider());
            resultsViewer.addDoubleClickListener(new IDoubleClickListener() {

                public void doubleClick(DoubleClickEvent event) {
                    resultsViewer.setSelection(event.getSelection());
                    try {
                        new EditItemAction(RoutingEngineV2BrowserMainPage.this.getSite().getShell(), resultsViewer)
                                .run();
                    } catch (Exception e) {
                        MessageDialog.openError(RoutingEngineV2BrowserMainPage.this.getSite().getShell(),
                                Messages._Error, Messages.bind(Messages.RoutingEngineV2BrowserMainPage_ErrorMsg,
                                        e.getClass().getName(), e.getLocalizedMessage()));
                    }
                }
            });

            hookContextMenu();

            managedForm.reflow(true); // nothing will show on the form if not called

            // adapt body add mouse/focus listener for child
            WidgetFactory factory = WidgetFactory.getWidgetFactory();
            factory.adapt(managedForm.getForm().getBody());
            updateButtons();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }// createFormContent

    /**
     * Create the Table
     */
    private Table createTable(Composite parent) {
        int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;

        final Table table = new Table(parent, style);

        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalSpan = 3;
        table.setLayoutData(gridData);

        table.setLinesVisible(true);
        table.setHeaderVisible(true);

        // 1st column
        final TableColumn column0 = new TableColumn(table, SWT.LEFT, 0);
        column0.setText(Messages.RoutingEngineV2BrowserMainPage_Document);
        column0.setWidth(150);
        column0.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[0] = !ascending[0];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(0, ascending[0]));
            }

            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[0] = !ascending[0];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(0, ascending[0]));
                table.setSortColumn(column0);
                if (ascending[0]) {
                    table.setSortDirection(SWT.UP);
                } else {
                    table.setSortDirection(SWT.DOWN);
                }

            }
        });

        // 2nd column
        final TableColumn column1 = new TableColumn(table, SWT.LEFT, 1);
        column1.setText(Messages.RoutingEngineV2BrowserMainPage_Date);
        column1.setWidth(150);
        // Add listener to column so tasks are sorted by description when clicked
        column1.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[1] = !ascending[1];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(1, ascending[1]));
            }

            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[1] = !ascending[1];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(1, ascending[1]));
                table.setSortColumn(column1);
                if (ascending[1]) {
                    table.setSortDirection(SWT.UP);
                } else {
                    table.setSortDirection(SWT.DOWN);
                }

            }
        });

        // 3rd column
        final TableColumn column2 = new TableColumn(table, SWT.LEFT, 2);
        column2.setText(Messages.RoutingEngineV2BrowserMainPage_Service);
        column2.setWidth(100);
        // Add listener to column so tasks are sorted by description when clicked
        column2.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[2] = !ascending[2];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(2, ascending[2]));
            }

            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[2] = !ascending[2];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(2, ascending[2]));
                table.setSortColumn(column2);
                if (ascending[2]) {
                    table.setSortDirection(SWT.UP);
                } else {
                    table.setSortDirection(SWT.DOWN);
                }

            }
        });

        // 4th column
        final TableColumn column3 = new TableColumn(table, SWT.LEFT, 3);
        column3.setText(Messages.RoutingEngineV2BrowserMainPage_Message);
        column3.setWidth(300);
        // Add listener to column so tasks are sorted by description when clicked
        column3.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[3] = !ascending[3];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(3, ascending[3]));
            }

            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
                ascending[3] = !ascending[3];
                RoutingEngineV2BrowserMainPage.this.resultsViewer.setSorter(new TableSorter(3, ascending[3]));

                table.setSortColumn(column3);
                if (ascending[3]) {
                    table.setSortDirection(SWT.UP);
                } else {
                    table.setSortDirection(SWT.DOWN);
                }
            }
        });

        return table;
    }

    @Override
    protected void createCharacteristicsContent(FormToolkit toolkit, Composite charComposite) {
        // Everything is implemented in createFormContent
    }// createCharacteristicsContent

    @Override
    protected void refreshData() {
        try {
            WSRoutingEngineV2Status status = getServerRoutingStatus();
            statusLabel.setText(status.value());

            idText.setFocus();

        } catch (Exception e) {
            updateButtons();
            log.error(e.getMessage(), e);
            if (!Util.handleConnectionException(this.getSite().getShell(), e,
                    Messages.RoutingEngineV2BrowserMainPage_ErrorRefreshingPage)) {
                MessageDialog.openError(this.getSite().getShell(),
                        Messages.RoutingEngineV2BrowserMainPage_ErrorRefreshingPage,
                        Messages.bind(Messages.RoutingEngineV2BrowserMainPage_ErrorRefreshingPageXX,
                                e.getLocalizedMessage()));
            }
        }
    }

    protected WSRoutingEngineV2Status getServerRoutingStatus() throws XtentisException {
        TMDMService service = getMDMService();
        WSRoutingEngineV2Status status = service
                .routingEngineV2Action(new WSRoutingEngineV2Action(WSRoutingEngineV2ActionCode.STATUS));
        return status;
    }

    protected void updateButtons() {
        try {
            WSRoutingEngineV2Status status = getServerRoutingStatus();

            startButton.setEnabled(status != WSRoutingEngineV2Status.RUNNING);
            suspendButton.setEnabled(status != WSRoutingEngineV2Status.SUSPENDED);
            stopButton.setEnabled(status != WSRoutingEngineV2Status.STOPPED);
            statusLabel.setText(status.value());
        } catch (XtentisException e) {
            startButton.setEnabled(true);
            suspendButton.setEnabled(false);
            stopButton.setEnabled(false);
            statusLabel.setText("FAILED"); //$NON-NLS-1$
            log.debug(e.getMessage(), e);
        }
    }

    @Override
    protected void commit() {
        try {
            // Nothing to do
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            MessageDialog.openError(this.getSite().getShell(),
                    Messages.RoutingEngineV2BrowserMainPage_ErrorCommitingPage,
                    Messages.RoutingEngineV2BrowserMainPage_ErrorCommitingPageXX + e.getLocalizedMessage());
        }
    }

    @Override
    protected void createActions() {

    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager();
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
                manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS,
                        new EditItemAction(RoutingEngineV2BrowserMainPage.this.getSite().getShell(),
                                RoutingEngineV2BrowserMainPage.this.resultsViewer));

                manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS,
                        new DeleteItemsAction(RoutingEngineV2BrowserMainPage.this.getSite().getShell(),
                                RoutingEngineV2BrowserMainPage.this,
                                RoutingEngineV2BrowserMainPage.this.resultsViewer));
                manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS,
                        new ExecuteRoutingOrdersAction(RoutingEngineV2BrowserMainPage.this.getSite().getShell(),
                                RoutingEngineV2BrowserMainPage.this,
                                RoutingEngineV2BrowserMainPage.this.resultsViewer, true));
                manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS,
                        new ExecuteRoutingOrdersAction(RoutingEngineV2BrowserMainPage.this.getSite().getShell(),
                                RoutingEngineV2BrowserMainPage.this,
                                RoutingEngineV2BrowserMainPage.this.resultsViewer, false // asynchronously
                ));
            }
        });
        Menu menu = menuMgr.createContextMenu(resultsViewer.getControl());
        resultsViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, resultsViewer);
    }

    protected void fillContextMenu(IMenuManager manager) {
        // IStructuredSelection selection=((IStructuredSelection)viewer.getSelection());

        return;
    }

    public void doSearch() {
        resultsViewer.setInput(getResults());
        resultsViewer.getTable().setFocus();
        pageToolBar.getComposite().setVisible(true);
        pageToolBar.getComposite().layout(true);
        pageToolBar.getComposite().getParent().layout(true);

        doSearchSort();//
    }

    /**
     * this method will be call when search action is activated or page is changed every time
     */
    private void doSearchSort() {
        Table table = resultsViewer.getTable();
        TableColumn sortColumn = table.getSortColumn();
        if (sortColumn != null) {
            List<TableColumn> columns = Arrays.asList(table.getColumns());
            int index = columns.indexOf(sortColumn);
            sort(index, sortColumn);
        }
    }

    private void sort(int index, TableColumn column) {
        resultsViewer.setSorter(new TableSorter(index, ascending[index]));
        Table table = resultsViewer.getTable();
        if (ascending[index]) {
            table.setSortColumn(column);
            table.setSortDirection(SWT.DOWN);
        } else {
            table.setSortColumn(column);
            table.setSortDirection(SWT.UP);
        }
    }

    protected WSRoutingOrderV2[] getResults() {

        Cursor waitCursor = null;

        try {

            Display display = getEditor().getSite().getPage().getWorkbenchWindow().getWorkbench().getDisplay();
            waitCursor = new Cursor(display, SWT.CURSOR_WAIT);
            this.getSite().getShell().setCursor(waitCursor);
            TMDMService service = getMDMService();
            long from = -1;
            long to = -1;
            Pattern pattern = Pattern.compile("^\\d{4}\\d{2}\\d{2} \\d{2}:\\d{2}:\\d{2}$");//$NON-NLS-1$

            if (!BLANK.equals(fromText.getText())) {
                String dateTimeText = fromText.getText().trim();
                Matcher matcher = pattern.matcher(dateTimeText);
                if (!matcher.matches()) {
                    MessageDialog.openWarning(this.getSite().getShell(), Messages.Warning,
                            Messages.RoutingEngineV2BrowserMainPage_FormatIllegal);
                    return new WSRoutingOrderV2[0];
                }
                try {
                    Date d = sdf.parse(fromText.getText());
                    from = d.getTime();
                } catch (ParseException pe) {
                }
            }

            if (!BLANK.equals(toText.getText())) {
                String dateTimeText = toText.getText().trim();
                Matcher matcher = pattern.matcher(dateTimeText);
                if (!matcher.matches()) {
                    MessageDialog.openWarning(this.getSite().getShell(), Messages.Warning,
                            Messages.RoutingEngineV2BrowserMainPage_FormatIllegal);
                    return new WSRoutingOrderV2[0];
                }
                try {
                    Date d = sdf.parse(toText.getText());
                    to = d.getTime();
                } catch (ParseException pe) {
                }
            }

            long timeCreatedMin = -1;
            long timeCreatedMax = -1;
            long timeScheduledMin = -1;
            long timeScheduledMax = -1;
            long timeLastRunStartedMin = -1;
            long timeLastRunStartedMax = -1;
            long timeLastRunCompletedMin = -1;
            long timeLastRunCompletedMax = -1;
            WSRoutingOrderV2Status status = null;

            String statusText = statusCombo.getItem(statusCombo.getSelectionIndex());
            if ("COMPLETED".equals(statusText)) {//$NON-NLS-1$
                timeLastRunCompletedMin = from;
                timeLastRunCompletedMax = to;
                status = WSRoutingOrderV2Status.COMPLETED;
            } else if ("FAILED".equals(statusText)) {//$NON-NLS-1$
                timeLastRunCompletedMin = from;
                timeLastRunCompletedMax = to;
                status = WSRoutingOrderV2Status.FAILED;
            } else {
                throw new XtentisException(Messages.RoutingEngineV2BrowserMainPage_ExceptionInfo + statusText
                        + Messages.RoutingEngineV2BrowserMainPage_ExceptionInfoA);
            }

            String serviceJNDI = serviceCombo.getItem(serviceCombo.getSelectionIndex());
            if (BLANK.equals(serviceJNDI)) {
                serviceJNDI = null;
            }

            int start = pageToolBar.getStart();
            int limit = pageToolBar.getLimit();
            List<WSRoutingOrderV2> wsRoutingOrder = service.getRoutingOrderV2ByCriteriaWithPaging(
                    new WSGetRoutingOrderV2ByCriteriaWithPaging(new WSRoutingOrderV2SearchCriteriaWithPaging("*" //$NON-NLS-1$
                            .equals(anyFieldText.getText()) || BLANK.equals(anyFieldText.getText()) ? null
                                    : anyFieldText.getText(),
                            "*".equals(documentTypeText.getText()) || BLANK.equals(documentTypeText.getText()) //$NON-NLS-1$
                                    ? null : documentTypeText.getText(),
                            "*".equals(idText.getText()) || BLANK.equals(idText.getText()) ? null //$NON-NLS-1$
                                    : idText.getText(),
                            limit, null, null, serviceJNDI, null, start, status, timeCreatedMax, timeCreatedMin,
                            timeLastRunCompletedMax, timeLastRunCompletedMin, timeLastRunStartedMax,
                            timeLastRunStartedMin, timeScheduledMax, timeScheduledMin, true)))
                    .getWsRoutingOrder();

            if (wsRoutingOrder.size() == 1) {
                MessageDialog.openInformation(this.getSite().getShell(),
                        Messages.RoutingEngineV2BrowserMainPage_Info,
                        Messages.RoutingEngineV2BrowserMainPage_SorryNoResult);
                return new WSRoutingOrderV2[0];
            }

            int totalSize = Integer.parseInt(wsRoutingOrder.get(0).getName());

            pageToolBar.setTotalsize(totalSize);
            pageToolBar.refreshUI();

            WSRoutingOrderV2[] resultOrderV2s = new WSRoutingOrderV2[wsRoutingOrder.size() - 1];
            System.arraycopy(wsRoutingOrder.toArray(new WSRoutingOrderV2[0]), 1, resultOrderV2s, 0,
                    resultOrderV2s.length);

            return resultOrderV2s;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            if ((e.getLocalizedMessage() != null) && e.getLocalizedMessage().contains("10000")) {
                MessageDialog.openError(this.getSite().getShell(),
                        Messages.RoutingEngineV2BrowserMainPage_TooManyResults,
                        Messages.RoutingEngineV2BrowserMainPage_ErrorMsg1);
            } else if (!Util.handleConnectionException(this.getSite().getShell(), e, null)) {
                MessageDialog.openError(this.getSite().getShell(), Messages.ErrorTitle1, e.getLocalizedMessage());
            }
            return null;
        } finally {
            try {
                this.getSite().getShell().setCursor(null);
                if (waitCursor != null) {
                    waitCursor.dispose();
                }
            } catch (Exception e) {
                // do nothing
            }
        }

    }

    /*********************************
     * IXObjectModelListener interface
     */
    public void handleEvent(int type, TreeObject parent, TreeObject child) {
        refreshData();
    }

    /***************************************************************
     * Table Label Provider
     *
     * @author bgrieder
     *
     ***************************************************************/
    class ClusterTableLabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            WSRoutingOrderV2 ro = (WSRoutingOrderV2) element;
            switch (columnIndex) {
            case 0:
                return ro.getWsItemPK().getConceptName() + "[" + Util.joinStrings(ro.getWsItemPK().getIds(), ".") //$NON-NLS-1$//$NON-NLS-2$
                        + "]";//$NON-NLS-1$
            case 1:
                Calendar cal = Calendar.getInstance();
                cal.setTimeInMillis(ro.getTimeLastRunCompleted());
                return sdf.format(cal.getTime());
            case 2:
                return ro.getServiceJNDI().replaceFirst("amalto/local/service/", BLANK);//$NON-NLS-1$
            case 3:
                return ro.getMessage();
            default:
                return "???????";//$NON-NLS-1$
            }
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }

    }

    /***************************************************************
     * Table Sorter
     *
     * @author bgrieder
     *
     ***************************************************************/
    class TableSorter extends ViewerSorter {

        int column = 0;

        boolean asc = true;

        public TableSorter(int column, boolean ascending) {
            super();
            this.column = column;
            this.asc = ascending;
        }

        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {
            WSRoutingOrderV2 ro1 = (WSRoutingOrderV2) e1;
            WSRoutingOrderV2 ro2 = (WSRoutingOrderV2) e2;

            int res = 0;

            switch (column) {
            case 0: // id
                String d1 = ro1.getWsItemPK().getConceptName() + "[" //$NON-NLS-1$
                        + Util.joinStrings(ro1.getWsItemPK().getIds(), ".") + "]";//$NON-NLS-1$//$NON-NLS-2$
                String d2 = ro2.getWsItemPK().getConceptName() + "[" //$NON-NLS-1$
                        + Util.joinStrings(ro2.getWsItemPK().getIds(), ".") + "]";//$NON-NLS-1$//$NON-NLS-2$
                res = d1.compareToIgnoreCase(d2);
                break;
            case 1: // date
                if (WSRoutingOrderV2Status.ACTIVE.equals(ro1.getStatus())) {
                    res = (int) (ro1.getTimeCreated() - ro2.getTimeCreated());
                } else {
                    res = (int) (ro1.getTimeLastRunCompleted() - ro2.getTimeLastRunCompleted());
                }
                break;
            case 2: // service
                res = ro1.getServiceJNDI().compareToIgnoreCase(ro2.getServiceJNDI());
                break;
            case 3: // message
                res = ro1.getMessage().compareToIgnoreCase(ro2.getMessage());
                break;
            default:
                res = 0;
            }
            if (asc) {
                return res;
            } else {
                return -res;
            }
        }

    }

    private void startSubscriptionEngine() {
        try {
            WSRoutingEngineV2Status status = getServerRoutingStatus();
            TMDMService service = getMDMService();
            if (status == WSRoutingEngineV2Status.STOPPED) {
                service.routingEngineV2Action(new WSRoutingEngineV2Action(WSRoutingEngineV2ActionCode.START));
            } else if (status == WSRoutingEngineV2Status.SUSPENDED) {
                service.routingEngineV2Action(new WSRoutingEngineV2Action(WSRoutingEngineV2ActionCode.RESUME));
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            if (!Util.handleConnectionException(this.getSite().getShell(), e, null)) {
                MessageDialog.openError(this.getSite().getShell(), Messages._Error,
                        Messages.bind(Messages.RoutingEngineV2BrowserMainPage_ErrorMsg7, e.getLocalizedMessage()));
            }
        }
    }

    private void stopSubscriptionEngine() {
        try {
            TMDMService service = getMDMService();
            service.routingEngineV2Action(new WSRoutingEngineV2Action(WSRoutingEngineV2ActionCode.STOP));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            if (!Util.handleConnectionException(this.getSite().getShell(), e, null)) {
                MessageDialog.openError(this.getSite().getShell(), Messages._Error,
                        Messages.bind(Messages.RoutingEngineV2BrowserMainPage_ErrorMsg8, e.getLocalizedMessage()));
            }
        }
    }

    private void suspendSubscriptionEngine() {
        try {
            TMDMService service = getMDMService();
            service.routingEngineV2Action(new WSRoutingEngineV2Action(WSRoutingEngineV2ActionCode.SUSPEND));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            if (!Util.handleConnectionException(this.getSite().getShell(), e, null)) {
                MessageDialog.openError(this.getSite().getShell(), Messages._Error,
                        Messages.bind(Messages.RoutingEngineV2BrowserMainPage_ErrorMsg9, e.getLocalizedMessage()));
            }
        }
    }

    @Override
    public Object getAdapter(Class adapter) {
        if (adapter == TMDMService.class) {
            TMDMService mdmService = null;
            try {
                mdmService = getMDMService();
            } catch (XtentisException e) {
                log.error(e.getMessage(), e);
            }

            return mdmService;
        }

        return super.getAdapter(adapter);
    }
}