com.centurylink.mdw.plugin.designer.wizards.ImportProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for com.centurylink.mdw.plugin.designer.wizards.ImportProjectWizard.java

Source

/*
 * Copyright (C) 2017 CenturyLink, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.centurylink.mdw.plugin.designer.wizards;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.ListSelectionDialog;

import com.centurylink.mdw.dataaccess.file.VersionControlGit;
import com.centurylink.mdw.plugin.MdwPlugin;
import com.centurylink.mdw.plugin.PluginMessages;
import com.centurylink.mdw.plugin.designer.DesignerPerspective;
import com.centurylink.mdw.plugin.project.WorkflowProjectManager;
import com.centurylink.mdw.plugin.project.assembly.ProjectImporter;
import com.centurylink.mdw.plugin.project.assembly.ProjectInflator;
import com.centurylink.mdw.plugin.project.model.VcsRepository;
import com.centurylink.mdw.plugin.project.model.WorkflowProject;
import com.centurylink.mdw.plugin.project.model.WorkflowProject.PersistType;
import com.centurylink.mdw.workflow.WorkflowApplication;

public class ImportProjectWizard extends Wizard implements IImportWizard {
    private ImportProjectPage importProjectPage;
    private ImportProjectSelectPage importProjectSelectPage;

    public ImportProjectSelectPage getProjectSelectPage() {
        return importProjectSelectPage;
    }

    private List<WorkflowProject> projectList;

    public List<WorkflowProject> getProjectList() {
        return projectList;
    }

    public void setProjectList(List<WorkflowProject> projects) {
        this.projectList = projects;
    }

    private List<WorkflowProject> projectsToImport;

    public List<WorkflowProject> getProjectsToImport() {
        return projectsToImport;
    }

    public void setProjectsToImport(List<WorkflowProject> projects) {
        this.projectsToImport = projects;
    }

    private WorkflowApplication discoveredWorkflowApp;

    public WorkflowApplication getDiscoveredWorkflowApp() {
        return discoveredWorkflowApp;
    }

    public void setDiscoveredWorkflowApp(WorkflowApplication workflowApp) {
        discoveredWorkflowApp = workflowApp;
    }

    private String errorMessage;

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String msg) {
        this.errorMessage = msg;
    }

    private boolean cancel;

    private IWorkbenchWindow activeWindow;

    public void init(IWorkbench workbench, IStructuredSelection selection) {
        setDefaultPageImageDescriptor(MdwPlugin.getImageDescriptor("icons/mdw_wiz.png"));
        activeWindow = workbench.getActiveWorkbenchWindow();
        projectList = new ArrayList<WorkflowProject>();
    }

    @Override
    public void addPages() {
        importProjectPage = new ImportProjectPage();
        addPage(importProjectPage);
        importProjectSelectPage = new ImportProjectSelectPage();
        addPage(importProjectSelectPage);
    }

    public void initializeProjectSelectPage() {
        importProjectSelectPage.initialize();
    }

    @Override
    public boolean performFinish() {
        if (errorMessage != null) {
            MessageDialog.openError(getShell(), "Import Project", errorMessage);
            return false;
        }

        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
            public void run() {
                List<IProject> existingProjects = new ArrayList<IProject>();
                for (WorkflowProject toImport : projectsToImport) {
                    IProject existing = MdwPlugin.getWorkspaceRoot().getProject(toImport.getName());
                    if (existing != null && existing.exists())
                        existingProjects.add(existing);
                }

                if (!existingProjects.isEmpty()) {
                    String text = "Please confirm that the following workspace projects should be overwritten:";
                    ListSelectionDialog lsd = new ListSelectionDialog(getShell(), existingProjects,
                            new ExistingProjectContentProvider(), new ProjectLabelProvider(), text);
                    lsd.setTitle("Existing Projects");
                    lsd.setInitialSelections(existingProjects.toArray(new IProject[0]));
                    lsd.open();
                    Object[] results = (Object[]) lsd.getResult();
                    if (results == null) {
                        cancel = true;
                        return;
                    }

                    for (IProject existing : existingProjects) {
                        boolean include = false;
                        for (Object included : results) {
                            if (existing.getName().equals(((IProject) included).getName()))
                                include = true;
                        }
                        if (include) {
                            WorkflowProjectManager.getInstance().deleteProject(existing);
                        } else {
                            WorkflowProject toRemove = null;
                            for (WorkflowProject wfp : projectList) {
                                if (wfp.getName().equals(existing.getName())) {
                                    toRemove = wfp;
                                    break;
                                }
                            }
                            if (toRemove != null)
                                projectsToImport.remove(toRemove);
                        }
                    }
                }
            }
        });

        if (cancel)
            return false;

        if (projectsToImport.isEmpty()) {
            MessageDialog.openInformation(getShell(), "Import Projects", "No projects to import.");
            return true;
        }

        try {
            getContainer().run(false, false, new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    monitor.beginTask("Importing MDW project(s)", 100);
                    monitor.worked(20);
                    try {
                        for (WorkflowProject workflowProject : projectsToImport) {
                            if (workflowProject.isFilePersist()) {
                                File projectDir = new File(
                                        ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile() + "/"
                                                + workflowProject.getName());
                                projectDir.mkdir();
                                String repositoryUrl = projectsToImport.get(0).getMdwVcsRepository()
                                        .getRepositoryUrl();
                                if (repositoryUrl != null && repositoryUrl.length() > 0) {
                                    Platform.getBundle("org.eclipse.egit.ui").start(); // avoid
                                                                                       // Eclipse
                                                                                       // default
                                                                                       // Authenticator
                                    workflowProject.setPersistType(PersistType.Git);
                                    workflowProject.getMdwVcsRepository().setProvider(VcsRepository.PROVIDER_GIT);
                                    monitor.subTask("Cloning Git repository for " + workflowProject.getLabel());
                                    monitor.worked(1);
                                    VcsRepository gitRepo = workflowProject.getMdwVcsRepository();
                                    VersionControlGit vcsGit = new VersionControlGit();
                                    String user = null;
                                    String password = null;
                                    if (MdwPlugin.getSettings().isUseDiscoveredVcsCredentials()) {
                                        user = gitRepo.getUser();
                                        password = gitRepo.getPassword();
                                    }
                                    vcsGit.connect(gitRepo.getRepositoryUrl(), user, password, projectDir);
                                    vcsGit.cloneRepo();
                                } else {
                                    File assetDir = new File(projectDir + "/"
                                            + workflowProject.getMdwVcsRepository().getLocalPath());
                                    assetDir.mkdirs();
                                }
                                monitor.worked(40 / projectsToImport.size());
                            }
                            ProjectInflator inflator = new ProjectInflator(workflowProject,
                                    MdwPlugin.getSettings());
                            inflator.inflateRemoteProject(getContainer());
                        }
                    } catch (Exception ex) {
                        throw new InvocationTargetException(ex);
                    }

                    ProjectImporter projectImporter = new ProjectImporter(projectsToImport);
                    projectImporter.doImport();
                    monitor.worked(20);
                    monitor.done();
                }
            });
        } catch (Exception ex) {
            PluginMessages.uiError(ex, "Import Project");
            return false;
        }

        DesignerPerspective.openPerspective(activeWindow);
        return true;
    }

    @Override
    public boolean needsProgressMonitor() {
        return true;
    }

    class ExistingProjectContentProvider implements IStructuredContentProvider {
        @SuppressWarnings("unchecked")
        public Object[] getElements(Object inputElement) {
            List<IProject> wfProjects = (List<IProject>) inputElement;
            return wfProjects.toArray(new IProject[0]);
        }

        public void dispose() {
        }

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

    class ProjectLabelProvider implements ILabelProvider {
        ImageDescriptor descriptor = MdwPlugin.getImageDescriptor("icons/remote_project.gif");
        Image image;

        public ProjectLabelProvider() {
            image = descriptor.createImage();
        }

        public Image getImage(Object element) {
            return image;
        }

        public String getText(Object element) {
            if (element instanceof WorkflowProject)
                return ((WorkflowProject) element).getName();
            else if (element instanceof IProject)
                return ((IProject) element).getName();
            else
                return element.toString();
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
            if (image != null)
                image.dispose();
        }

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

        public void removeListener(ILabelProviderListener listener) {
        }
    }
}