com.liferay.ide.project.ui.wizard.SDKProjectConvertWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.project.ui.wizard.SDKProjectConvertWizardPage.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.wizard;

import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.project.core.ISDKProjectsImportDataModelProperties;
import com.liferay.ide.project.core.ProjectRecord;
import com.liferay.ide.sdk.core.ISDKConstants;
import com.liferay.ide.ui.util.SWTUtil;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.StatusUtil;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.server.ui.ServerUIUtil;
import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetCreationWizardPage;

/**
 * @author Greg Amerson
 */
@SuppressWarnings("restriction")
public class SDKProjectConvertWizardPage extends DataModelFacetCreationWizardPage
        implements ISDKProjectsImportDataModelProperties {

    protected final class ProjectLabelProvider extends LabelProvider implements IColorProvider {
        public Color getBackground(Object element) {
            return null;
        }

        public Color getForeground(Object element) {
            ProjectRecord projectRecord = (ProjectRecord) element;

            if (projectRecord.hasConflicts()) {
                return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY);
            }

            return null;
        }

        public String getText(Object element) {
            return ((ProjectRecord) element).getProjectLabel();
        }
    }

    public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$

    protected long lastModified;
    protected String lastPath;
    protected CheckboxTreeViewer projectsList;
    protected Text sdkLocation;
    protected Text sdkVersion;
    protected ProjectRecord[] selectedProjects = new ProjectRecord[0];
    protected Combo serverTargetCombo;
    protected IProject[] wsProjects;

    public SDKProjectConvertWizardPage(IDataModel model, String pageName) {
        super(model, pageName);

        setTitle(Msgs.convertProject);

        setDescription(Msgs.convertExistingProject);
    }

    public void updateProjectsList(final String path) {
        // on an empty path empty selectedProjects
        if (path == null || path.length() == 0) {
            setMessage(Msgs.importProjectsDescription);

            selectedProjects = new ProjectRecord[0];

            projectsList.refresh(true);

            projectsList.setCheckedElements(selectedProjects);

            setPageComplete(projectsList.getCheckedElements().length > 0);

            lastPath = path;

            return;
        }

        final File directory = new File(path);

        long modified = directory.lastModified();

        if (path.equals(lastPath) && lastModified == modified) {
            // since the file/folder was not modified and the path did not
            // change, no refreshing is required
            return;
        }

        lastPath = path;

        lastModified = modified;

        final boolean dirSelected = true;
        try {
            getContainer().run(true, true, new IRunnableWithProgress() {
                /*
                 * (non-Javadoc)
                 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org
                 * .eclipse.core.runtime.IProgressMonitor)
                 */
                public void run(IProgressMonitor monitor) {
                    monitor.beginTask(Msgs.searchingMessage, 100);

                    monitor.worked(10);

                    if (dirSelected && directory.isDirectory()) {
                        ProjectRecord[] projectToConvert = (ProjectRecord[]) getDataModel()
                                .getProperty(SELECTED_PROJECTS);

                        IPath dir = new Path(directory.getPath());

                        if (dir.isPrefixOf(projectToConvert[0].getProjectLocation())) {
                            selectedProjects = projectToConvert;
                        } else {
                            selectedProjects = new ProjectRecord[0];
                        }

                    } else {
                        monitor.worked(60);
                    }

                    monitor.done();
                }
            });
        } catch (InvocationTargetException e) {
            IDEWorkbenchPlugin.log(e.getMessage(), e);
        } catch (InterruptedException e) {
            // Nothing to do if the user interrupts.
        }

        projectsList.refresh(true);

        // ProjectRecord[] projects = getProjectRecords();
        // boolean displayWarning = false;
        // for (int i = 0; i < projects.length; i++) {
        // if(projects[i].hasConflicts()) {
        // displayWarning = true;
        // projectsList.setGrayed(projects[i], true);
        // }else {
        // projectsList.setChecked(projects[i], true);
        // }
        // }

        // if (displayWarning) {
        // setMessage(
        // DataTransferMessages.WizardProjectsImportPage_projectsInWorkspace,
        // WARNING);
        // } else {
        // setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
        // }

        if (!CoreUtil.isNullOrEmpty(selectedProjects)) {
            projectsList.setChecked(selectedProjects[0], true);
        }

        setPageComplete(projectsList.getCheckedElements().length > 0);

        if (selectedProjects.length == 0) {
            setMessage(Msgs.noProjectsToImport, WARNING);
        }

        Object[] checkedProjects = projectsList.getCheckedElements();

        if (checkedProjects != null && checkedProjects.length > 0) {
            selectedProjects = new ProjectRecord[checkedProjects.length];

            for (int i = 0; i < checkedProjects.length; i++) {
                selectedProjects[i] = (ProjectRecord) checkedProjects[i];
            }

            getDataModel().setProperty(SELECTED_PROJECTS, selectedProjects);
        }
    }

    // private IProject[] getProjectsInWorkspace() {
    // if (wsProjects == null) {
    // wsProjects =
    // IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getProjects();
    // }
    //
    // return wsProjects;
    // }

    private boolean isLiferaySDKProjectDir(File file) {
        if (file != null && file.isDirectory() && isValidLiferayProjectDir(file)) {
            // check for build.xml and docroot
            File[] contents = file.listFiles();

            boolean hasBuildXml = false;

            boolean hasDocroot = false;

            for (File content : contents) {
                if (content.getName().equals("build.xml") || //$NON-NLS-1$
                        file.getName().endsWith(ISDKConstants.HOOK_PLUGIN_PROJECT_SUFFIX)) {
                    hasBuildXml = true;

                    continue;
                }

                if (content.getName().equals(ISDKConstants.DEFAULT_DOCROOT_FOLDER)) {
                    hasDocroot = true;

                    continue;
                }
            }
            if (hasBuildXml && hasDocroot) {
                return true;
            }
        }

        return false;
    }

    protected boolean collectProjectsFromDirectory(Collection<File> eclipseProjectFiles,
            Collection<File> liferayProjectDirs, File directory,

            Set<String> directoriesVisited, boolean recurse, IProgressMonitor monitor) {

        if (monitor.isCanceled()) {
            return false;
        }

        monitor.subTask(NLS.bind(Msgs.checkingMessage, directory.getPath()));

        File[] contents = directory.listFiles();

        if (contents == null) {
            return false;
        }

        // Initialize recursion guard for recursive symbolic links
        if (directoriesVisited == null) {
            directoriesVisited = new HashSet<String>();

            try {
                directoriesVisited.add(directory.getCanonicalPath());
            } catch (IOException exception) {
                StatusManager.getManager()
                        .handle(StatusUtil.newStatus(IStatus.ERROR, exception.getLocalizedMessage(), exception));
            }
        }

        // first look for project description files
        final String dotProject = IProjectDescription.DESCRIPTION_FILE_NAME;

        for (int i = 0; i < contents.length; i++) {
            File file = contents[i];

            if (isLiferaySDKProjectDir(file)) {
                // recurse to see if it has project file
                int currentSize = eclipseProjectFiles.size();

                collectProjectsFromDirectory(eclipseProjectFiles, liferayProjectDirs, contents[i],
                        directoriesVisited, false, monitor);

                int newSize = eclipseProjectFiles.size();

                if (newSize == currentSize) {
                    liferayProjectDirs.add(file);
                }
            } else if (file.isFile() && file.getName().equals(dotProject)) {
                if (!eclipseProjectFiles.contains(file)) {
                    eclipseProjectFiles.add(file);
                }

                // don't search sub-directories since we can't have nested
                // projects
                return true;
            }
        }

        // no project description found, so recurse into sub-directories
        for (int i = 0; i < contents.length; i++) {
            if (contents[i].isDirectory()) {
                if (!contents[i].getName().equals(METADATA_FOLDER)) {
                    try {
                        String canonicalPath = contents[i].getCanonicalPath();

                        if (!directoriesVisited.add(canonicalPath)) {
                            // already been here --> do not recurse
                            continue;
                        }
                    } catch (IOException exception) {
                        StatusManager.getManager().handle(
                                StatusUtil.newStatus(IStatus.ERROR, exception.getLocalizedMessage(), exception));

                    }

                    // dont recurse directories that we have already determined
                    // are Liferay projects
                    if (!liferayProjectDirs.contains(contents[i]) && recurse) {
                        collectProjectsFromDirectory(eclipseProjectFiles, liferayProjectDirs, contents[i],
                                directoriesVisited, recurse, monitor);
                    }
                }
            }
        }

        return true;
    }

    protected void createProjectsList(Composite workArea) {
        Label title = new Label(workArea, SWT.NONE);

        title.setText(Msgs.importProjectLabel);
        title.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));

        // Composite listComposite = new Composite(workArea, SWT.NONE);
        // GridLayout layout = new GridLayout();
        // layout.numColumns = 2;
        // layout.marginWidth = 0;
        // layout.makeColumnsEqualWidth = false;
        // listComposite.setLayout(layout);

        // GridData gd = new GridData(GridData.GRAB_HORIZONTAL
        // | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
        // gd.grabExcessHorizontalSpace = true;
        // gd.horizontalSpan = 3;
        // listComposite.setLayoutData(gd);

        projectsList = new CheckboxTreeViewer(workArea, SWT.BORDER);

        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);

        gridData.widthHint = new PixelConverter(projectsList.getControl()).convertWidthInCharsToPixels(25);
        gridData.heightHint = new PixelConverter(projectsList.getControl()).convertHeightInCharsToPixels(10);

        projectsList.getControl().setLayoutData(gridData);
        projectsList.setContentProvider(new ITreeContentProvider() {

            public void dispose() {
            }

            public Object[] getChildren(Object parentElement) {
                return null;
            }

            public Object[] getElements(Object inputElement) {
                // return getProjectRecords();
                return (Object[]) getDataModel().getProperty(SELECTED_PROJECTS);
            }

            public Object getParent(Object element) {
                return null;
            }

            public boolean hasChildren(Object element) {
                return false;
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

        });

        projectsList.setLabelProvider(new ProjectLabelProvider());
        projectsList.addCheckStateListener(new ICheckStateListener() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged
             * (org.eclipse.jface.viewers.CheckStateChangedEvent)
             */
            public void checkStateChanged(CheckStateChangedEvent event) {
                ProjectRecord element = (ProjectRecord) event.getElement();

                if (element.hasConflicts()) {
                    projectsList.setChecked(element, false);
                }

                getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements());

                setPageComplete(projectsList.getCheckedElements().length > 0);
            }
        });

        projectsList.setInput(this);
        projectsList.setComparator(new ViewerComparator());
    }

    protected void createSDKLocationField(Composite topComposite) {
        SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKLocationLabel, 1);

        sdkLocation = SWTUtil.createText(topComposite, 2);

        this.synchHelper.synchText(sdkLocation, SDK_LOCATION, null);

    }

    protected void createSDKVersionField(Composite topComposite) {
        SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKVersionLabel, 1);

        sdkVersion = SWTUtil.createText(topComposite, 2);

        this.synchHelper.synchText(sdkVersion, SDK_VERSION, null);

        SWTUtil.createLabel(topComposite, StringPool.EMPTY, 1);
    }

    protected void createTargetRuntimeGroup(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(Msgs.liferayTargetRuntimeLabel);
        label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        serverTargetCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
        serverTargetCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        Button newServerTargetButton = new Button(parent, SWT.NONE);

        newServerTargetButton.setText(Msgs.newButton);
        newServerTargetButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                final DataModelPropertyDescriptor[] preAdditionDescriptors = model
                        .getValidPropertyDescriptors(FACET_RUNTIME);

                boolean isOK = ServerUIUtil.showNewRuntimeWizard(getShell(), getModuleTypeID(), null,
                        "com.liferay."); //$NON-NLS-1$

                if (isOK) {
                    DataModelPropertyDescriptor[] postAdditionDescriptors = model
                            .getValidPropertyDescriptors(FACET_RUNTIME);

                    Object[] preAddition = new Object[preAdditionDescriptors.length];

                    for (int i = 0; i < preAddition.length; i++) {
                        preAddition[i] = preAdditionDescriptors[i].getPropertyValue();
                    }

                    Object[] postAddition = new Object[postAdditionDescriptors.length];

                    for (int i = 0; i < postAddition.length; i++) {
                        postAddition[i] = postAdditionDescriptors[i].getPropertyValue();
                    }

                    Object newAddition = CoreUtil.getNewObject(preAddition, postAddition);

                    if (newAddition != null) { // can this ever be null?
                        model.setProperty(FACET_RUNTIME, newAddition);
                    }
                }
            }
        });

        Control[] deps = new Control[] { newServerTargetButton };

        synchHelper.synchCombo(serverTargetCombo, FACET_RUNTIME, deps);

        if (serverTargetCombo.getSelectionIndex() == -1 && serverTargetCombo.getVisibleItemCount() != 0) {
            serverTargetCombo.select(0);
        }
    }

    @Override
    protected Composite createTopLevelComposite(Composite parent) {
        Composite topComposite = SWTUtil.createTopComposite(parent, 1);

        GridLayout gl = new GridLayout(3, false);
        // gl.marginLeft = 5;
        topComposite.setLayout(gl);
        topComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        createSDKLocationField(topComposite);
        createSDKVersionField(topComposite);

        SWTUtil.createVerticalSpacer(topComposite, 1, 3);

        createProjectsList(topComposite);

        createTargetRuntimeGroup(topComposite);

        return topComposite;
    }

    @Override
    protected void enter() {
        super.enter();

        if (sdkLocation.getText() != null) {
            updateProjectsList(sdkLocation.getText());
        }
    }

    @Override
    protected String[] getValidationPropertyNames() {
        return new String[] { SDK_LOCATION, SDK_VERSION, SELECTED_PROJECTS, FACET_RUNTIME };
    }

    protected boolean isValidLiferayProjectDir(File dir) {
        String name = dir.getName();

        if (name.endsWith(ISDKConstants.PORTLET_PLUGIN_PROJECT_SUFFIX)
                || name.endsWith(ISDKConstants.EXT_PLUGIN_PROJECT_SUFFIX)
                || name.endsWith(ISDKConstants.HOOK_PLUGIN_PROJECT_SUFFIX)) {
            return true;
        }

        return false;
    }

    private static class Msgs extends NLS {
        public static String checkingMessage;
        public static String convertExistingProject;
        public static String convertProject;
        public static String importProjectLabel;
        public static String importProjectsDescription;
        public static String liferayPluginSDKLocationLabel;
        public static String liferayPluginSDKVersionLabel;
        public static String liferayTargetRuntimeLabel;
        public static String newButton;
        public static String noProjectsToImport;
        public static String searchingMessage;

        static {
            initializeMessages(SDKProjectConvertWizardPage.class.getName(), Msgs.class);
        }
    }
}