com.liferay.ide.project.ui.upgrade.animated.FindBreakingChangesPage.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.project.ui.upgrade.animated.FindBreakingChangesPage.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 *******************************************************************************/

package com.liferay.ide.project.ui.upgrade.animated;

import com.liferay.blade.api.Problem;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.project.core.upgrade.FileProblems;
import com.liferay.ide.project.core.upgrade.UpgradeAssistantSettingsUtil;
import com.liferay.ide.project.ui.ProjectUI;
import com.liferay.ide.project.ui.migration.AutoCorrectAction;
import com.liferay.ide.project.ui.migration.AutoCorrectAllAction;
import com.liferay.ide.project.ui.migration.IgnoreAction;
import com.liferay.ide.project.ui.migration.IgnoreAlwaysAction;
import com.liferay.ide.project.ui.migration.MarkDoneAction;
import com.liferay.ide.project.ui.migration.MarkUndoneAction;
import com.liferay.ide.project.ui.migration.MigrationContentProvider;
import com.liferay.ide.project.ui.migration.MigrationLabelProvider;
import com.liferay.ide.project.ui.migration.MigrationProblemsContainer;
import com.liferay.ide.project.ui.migration.MigrationUtil;
import com.liferay.ide.project.ui.migration.MigratorComparator;
import com.liferay.ide.project.ui.migration.ProblemsContainer;
import com.liferay.ide.project.ui.migration.RemoveAction;
import com.liferay.ide.project.ui.migration.RunMigrationToolAction;
import com.liferay.ide.project.ui.pref.MigrationProblemPreferencePage;
import com.liferay.ide.ui.util.SWTUtil;
import com.liferay.ide.ui.util.UIUtil;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Link;
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.ui.ISharedImages;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;

/**
 * @author Andy Wu
 * @author Simon Jiang
 * @author Lovett Li
 * @author Terry Jia
 */
public class FindBreakingChangesPage extends Page implements IDoubleClickListener {

    public static final String ID = "com.liferay.ide.project.ui.findBreakingChangesPage";

    private static final Image IMAGE_CHECKED = ProjectUI.getDefault().getImageRegistry()
            .get(ProjectUI.CHECKED_IMAGE_ID);
    private static final Image IMAGE_UNCHECKED = ProjectUI.getDefault().getImageRegistry()
            .get(ProjectUI.UNCHECKED_IMAGE_ID);

    public static boolean showAll = false;
    private boolean isBrowserMaximized = false;

    MigrationContentProvider migrationContentProvider;

    private SashForm _sashForm;
    private Browser _browser;

    private TableViewer _problemsViewer;
    private MigratorComparator _comparator;
    private TreeViewer _treeViewer;

    public FindBreakingChangesPage(Composite parent, int style, LiferayUpgradeDataModel dataModel) {
        super(parent, style, dataModel, FINDBREACKINGCHANGES_PAGE_ID, true);

        final Composite findBreakingchangesContainer = SWTUtil.createComposite(this, 2, 1, GridData.FILL_BOTH, 0,
                0);

        _sashForm = new SashForm(findBreakingchangesContainer, SWT.HORIZONTAL | SWT.H_SCROLL);
        _sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));

        SashForm nestedSashForm = new SashForm(_sashForm, SWT.VERTICAL | SWT.H_SCROLL);
        nestedSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));

        GridData treeData = new GridData(GridData.FILL_BOTH);
        treeData.minimumWidth = 200;
        treeData.heightHint = 200;

        _treeViewer = new TreeViewer(nestedSashForm);

        _treeViewer.getTree().setLayoutData(treeData);

        migrationContentProvider = new MigrationContentProvider();

        _treeViewer.setContentProvider(migrationContentProvider);

        ILabelDecorator decorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
        _treeViewer.setLabelProvider(new DecoratingLabelProvider(new MigrationLabelProvider(), decorator));
        _treeViewer.setInput(getInitialInput());

        MenuManager menuMgr = new MenuManager();
        IAction removeAction = new RemoveAction(_treeViewer);
        menuMgr.add(removeAction);
        Menu menu = menuMgr.createContextMenu(_treeViewer.getTree());

        _treeViewer.getTree().setMenu(menu);
        _treeViewer.expandAll();

        createTableView(nestedSashForm);

        _browser = new Browser(_sashForm, SWT.BORDER);
        _browser.setLayoutData(new GridData(GridData.FILL_BOTH));

        _treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                List<Problem> problems = null;

                if (showAll) {
                    problems = MigrationUtil.getProblemsFromTreeNode(event.getSelection());
                } else {
                    problems = MigrationUtil.getCurrentProblemsFromTreeNode(event.getSelection());
                }

                if (problems != null && problems.size() > 0) {
                    _problemsViewer.setInput(problems.toArray());
                    _problemsViewer.setSelection(new StructuredSelection(problems.get(0)));
                } else {
                    _problemsViewer.setInput(null);
                }
            }
        });

        _problemsViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(final SelectionChangedEvent event) {
                UIUtil.async(new Runnable() {

                    public void run() {
                        updateForm(event);
                    }
                }, 50);
            }
        });

        _treeViewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {
                ISelection selection = event.getSelection();

                if (selection instanceof ITreeSelection) {
                    ITreeSelection treeSelection = (ITreeSelection) selection;

                    Object selectedItem = treeSelection.getFirstElement();

                    if (selectedItem instanceof FileProblems) {
                        MigrationUtil.openEditor((FileProblems) selectedItem);

                        return;
                    } else {
                        TreePath[] paths = treeSelection.getPathsFor(selectedItem);

                        for (int i = 0; i < paths.length; i++) {
                            _treeViewer.setExpandedState(paths[i], !_treeViewer.getExpandedState(paths[i]));
                        }
                    }
                }
            }
        });

        Composite buttonContainer = new Composite(findBreakingchangesContainer, SWT.NONE);
        GridLayout buttonContainerLayout = new GridLayout(1, false);
        buttonContainerLayout.marginHeight = 0;
        buttonContainerLayout.marginWidth = 0;
        buttonContainer.setLayout(buttonContainerLayout);
        buttonContainer.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));

        Button findbreakingchangesButton = new Button(buttonContainer, SWT.NONE);

        findbreakingchangesButton.setImage(getImage("migration-tasks.png"));
        findbreakingchangesButton.setToolTipText("Find Breaking Changes");

        findbreakingchangesButton.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                IViewPart view = UIUtil.findView(UpgradeView.ID);
                new RunMigrationToolAction("Run Migration Tool", view.getViewSite().getShell()).run();
            }
        });

        Button correctAllImportIssuesButton = new Button(buttonContainer, SWT.NONE);

        correctAllImportIssuesButton.setImage(getImage("bandaid.gif"));
        correctAllImportIssuesButton.setToolTipText("Automatically Correct Problems");

        correctAllImportIssuesButton.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                new AutoCorrectAllAction(getInitialInput()).run();
            }
        });

        Button expendAll = new Button(buttonContainer, SWT.NONE);

        expendAll.setImage(getImage("expandall.gif"));
        expendAll.setToolTipText("Expand All");

        expendAll.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                _treeViewer.expandAll();
            }
        });

        Button collapseAll = new Button(buttonContainer, SWT.NONE);

        Image collapseAllImage = PlatformUI.getWorkbench().getSharedImages()
                .getImage(ISharedImages.IMG_ELCL_COLLAPSEALL);

        collapseAll.setImage(collapseAllImage);
        collapseAll.setToolTipText("Collapse All");

        collapseAll.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                _treeViewer.collapseAll();
            }
        });

        Button openIgnoredList = new Button(buttonContainer, SWT.NONE);

        openIgnoredList.setImage(getImage("properties.png"));
        openIgnoredList.setToolTipText("Open Ignored List");

        openIgnoredList.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(parent.getShell(),
                        MigrationProblemPreferencePage.ID, null, null);
                dialog.open();
            }
        });

        Button hideTree = new Button(buttonContainer, SWT.TOGGLE);

        hideTree.setImage(getImage("hide_tree.png"));
        hideTree.setToolTipText("Hide Tree");

        hideTree.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                isBrowserMaximized = !isBrowserMaximized;

                _sashForm.setMaximizedControl(isBrowserMaximized ? _browser : null);
            }
        });

        _sashForm.setWeights(new int[] { 2, 3 });
    }

    private void createColumns(final TableViewer _problemsViewer) {
        final String[] titles = { "Resolved", "Line", "Problem" };
        final int[] bounds = { 65, 55, 200 };

        TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], _problemsViewer);
        col.setEditingSupport(new EditingSupport(_problemsViewer) {

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                return new CheckboxCellEditor(_problemsViewer.getTable());
            }

            @Override
            protected Object getValue(Object element) {
                return ((Problem) element).getStatus() == Problem.STATUS_RESOLVED;
            }

            @Override
            protected void setValue(Object element, Object value) {
                if (value == Boolean.TRUE) {
                    new MarkDoneAction().run((Problem) element, _problemsViewer);
                } else {
                    new MarkUndoneAction().run((Problem) element, _problemsViewer);
                }
            }
        });

        col.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public Image getImage(Object element) {
                Problem p = (Problem) element;

                if (p.getStatus() == Problem.STATUS_RESOLVED) {
                    return IMAGE_CHECKED;
                } else {
                    return IMAGE_UNCHECKED;
                }
            }

            public String getText(Object element) {
                return null;
            }
        });

        col = createTableViewerColumn(titles[1], bounds[1], _problemsViewer);
        col.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                Problem p = (Problem) element;

                return p.lineNumber > -1 ? (p.lineNumber + "") : "";
            }
        });

        col = createTableViewerColumn(titles[2], bounds[2], _problemsViewer);
        col.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                Problem p = (Problem) element;

                return p.title;
            }

            @Override
            public void update(ViewerCell cell) {
                super.update(cell);

                Table table = _problemsViewer.getTable();

                table.getColumn(2).pack();
            }
        });
    }

    public void createTableView(Composite container) {
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.minimumWidth = 200;
        gridData.minimumHeight = 200;

        _problemsViewer = new TableViewer(container,
                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);

        _problemsViewer.getTable().setLayoutData(gridData);

        createColumns(_problemsViewer);

        final Table table = _problemsViewer.getTable();
        table.setHeaderVisible(true);

        _problemsViewer.setContentProvider(ArrayContentProvider.getInstance());
        _problemsViewer.setComparer(null);
        _comparator = new MigratorComparator();
        _problemsViewer.setComparator(_comparator);

        MenuManager menuMgr = new MenuManager();
        IAction markDoneAction = new MarkDoneAction(_problemsViewer);
        IAction markUndoneAction = new MarkUndoneAction(_problemsViewer);
        IAction ignoreAction = new IgnoreAction(_problemsViewer);
        IAction ignoreAlways = new IgnoreAlwaysAction(_problemsViewer);
        IAction autoCorrectAction = new AutoCorrectAction(_problemsViewer);

        menuMgr.add(markDoneAction);
        menuMgr.add(markUndoneAction);
        menuMgr.add(ignoreAction);
        menuMgr.add(autoCorrectAction);
        menuMgr.add(ignoreAlways);
        Menu menu = menuMgr.createContextMenu(table);
        table.setMenu(menu);

        _problemsViewer.addDoubleClickListener(this);
    }

    private TableViewerColumn createTableViewerColumn(String title, int bound, TableViewer viewer) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
        final TableColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setWidth(bound);
        column.setResizable(true);
        column.setMoveable(true);
        column.addSelectionListener(getSelectionAdapter(column, viewer.getTable().indexOf(column)));

        return viewerColumn;
    }

    @Override
    public void doubleClick(DoubleClickEvent event) {
        if (event.getSelection() instanceof IStructuredSelection) {
            final IStructuredSelection ss = (IStructuredSelection) event.getSelection();

            Object element = ss.getFirstElement();

            if (element instanceof Problem) {
                MigrationUtil.openEditor((Problem) element);
            } else if (element instanceof FileProblems) {
                MigrationUtil.openEditor((FileProblems) element);
            }
        }
    }

    private String generateFormText(Problem problem) {
        StringBuilder sb = new StringBuilder();

        sb.append("<form><p>");

        sb.append("<b>Problem:</b> " + problem.title + "<br/><br/>");

        sb.append("<b>Description:</b><br/>");
        sb.append("\t" + problem.summary + "<br/><br/>");

        if (problem.getAutoCorrectContext() != null && problem.autoCorrectContext.length() > 0) {
            sb.append("<a href='autoCorrect'>Correct this problem automatically</a><br/><br/>");
        }

        if (problem.html != null && problem.html.length() > 0) {
            sb.append("<a href='html'>See documentation for how to correct this problem.</a><br/><br/>");
        }

        if (problem.ticket != null && problem.ticket.length() > 0) {
            sb.append("<b>Tickets:</b> " + getLinkTags(problem.ticket) + "<br/><br/>");
        }

        sb.append("</p></form>");

        return sb.toString();
    }

    private Image getImage(String imageName) {
        return ProjectUI.getDefault().getImage(imageName);
    }

    public TableViewer getProblemsViewer() {
        return _problemsViewer;
    }

    public List<ProblemsContainer> getInitialInput() {

        List<ProblemsContainer> _problems = null;

        try {
            MigrationProblemsContainer container = UpgradeAssistantSettingsUtil
                    .getObjectFromStore(MigrationProblemsContainer.class);

            if (container != null) {
                _problems = new ArrayList<>();
                _problems.add(container);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        migrationContentProvider.setProblems(_problems);

        return _problems;
    }

    private String getLinkTags(String ticketNumbers) {
        String[] ticketNumberArray = ticketNumbers.split(",");

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < ticketNumberArray.length; i++) {
            String ticketNumber = ticketNumberArray[i];
            sb.append("<a href='https://issues.liferay.com/browse/");
            sb.append(ticketNumber);
            sb.append("'>");
            sb.append(ticketNumber);
            sb.append("</a>");

            if (ticketNumberArray.length > 1 && i != ticketNumberArray.length - 1) {
                sb.append(",");
            }
        }

        return sb.toString();
    }

    private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) {
        return new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                _comparator.setColumn(index);
                int dir = _comparator.getDirection();
                _problemsViewer.getTable().setSortDirection(dir);
                _problemsViewer.getTable().setSortColumn(column);
                _problemsViewer.refresh();
            }
        };
    }

    public TreeViewer getTreeViewer() {
        return _treeViewer;
    }

    private void updateForm(SelectionChangedEvent event) {
        final ISelection selection = event.getSelection();

        final Problem problem = MigrationUtil.getProblemFromSelection(selection);

        if (problem != null) {
            /*
             * if( Platform.getOS().equals( Platform.OS_LINUX ) ) { _form.setText( generateFormText( problem ), true,
             * false ); } else {
             */
            if (CoreUtil.isNullOrEmpty(problem.html)) {
                _browser.setText(generateFormText(problem));
            } else {
                _browser.setText(problem.html);
            }
            // }
        } else {
            /*
             * if( Platform.getOS().equals( Platform.OS_LINUX ) ) { _form.setText( "", false, false ); } else {
             */
            _browser.setUrl("about:blank");
            // }
        }
    }

    public void createSpecialDescriptor(Composite parent, int style) {
        final String descriptor = "This step will help you to find breaking changes for Java, JSP, XML, and properties files. "
                + "It will not support to find the front-end codes( e.g., javascript, css).\n For service builder, you "
                + "just need to modify the changes on xxxServiceImp.java, xxxFinder.java, xxxModel.java. "
                + "Others will be resovled in the Build Service step.";
        String url = "";

        Link link = SWTUtil.createHyperLink(this, style, descriptor, 1, url);
        link.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1));
    }

    @Override
    public String getPageTitle() {
        return "Find Breaking Changes";
    }

    public boolean getGridLayoutEqualWidth() {
        return false;
    }

    public TableViewer get_problemsViewer() {
        return _problemsViewer;
    }

}