org.wso2.developerstudio.msf4j.artifact.util.MSF4JDependencyResolverJob.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.msf4j.artifact.util.MSF4JDependencyResolverJob.java

Source

/*
 * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 * 
 * 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 org.wso2.developerstudio.msf4j.artifact.util;

import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.API;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.API_EXCEPTION_JAVA;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.API_ORIGIN_FILTER_JAVA;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.API_RESPONSE_MESSAGE_JAVA;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.GEN_DIRECTORY;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.JAVA_DIRECTORY;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.MAIN_DIRECTORY;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.MAVEN2_PROJECT_NATURE;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.MSF4J_PROJECT_NATURE;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.NOT_FOUND_EXCEPTION_JAVA;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.OK_BUTTON;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.RESOURCES_DIRECTORY;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.SRC_DIRECTORY;
import static org.wso2.developerstudio.msf4j.artifact.util.MSF4JArtifactConstants.WEBAPP_DIRECTORY;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.progress.UIJob;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
import org.wso2.developerstudio.eclipse.maven.util.MavenUtils;
import org.wso2.developerstudio.eclipse.utils.jdt.JavaUtils;
import org.wso2.developerstudio.eclipse.utils.project.ProjectUtils;
import org.wso2.developerstudio.msf4j.artifact.Activator;
import org.wso2.developerstudio.msf4j.artifact.model.MSF4JProjectModel;

public class MSF4JDependencyResolverJob extends Job {

    MSF4JProjectModel msf4jArtifactModel;
    private static IDeveloperStudioLog log = Logger.getLog(Activator.PLUGIN_ID);
    private static final String PERSPECTIVE_ID = "org.eclipse.ui.articles.perspective.msf4jperspective";

    public MSF4JDependencyResolverJob(String name, MSF4JProjectModel projectModel) {
        super(name);
        this.msf4jArtifactModel = projectModel;
    }

    @Override
    protected IStatus run(IProgressMonitor monitor) {
        try {
            projectDependencyResolver(monitor);
            final IWorkbench workbench = PlatformUI.getWorkbench();
            new UIJob("Switching perspectives") {
                @Override
                public IStatus runInUIThread(IProgressMonitor monitor) {
                    try {
                        workbench.showPerspective(PERSPECTIVE_ID, workbench.getActiveWorkbenchWindow());
                    } catch (WorkbenchException e) {
                        return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error while switching perspectives",
                                e);
                    }
                    return Status.OK_STATUS;
                }
            }.run(new NullProgressMonitor());

        } catch (CoreException | IOException e) {
            log.error("error in resolving project dependencies", e);
            Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
            MessageDialog errorDialog = new MessageDialog(shell, "Error", null,
                    "Error while creating MSF4J project for given Swagger API", MessageDialog.ERROR,
                    new String[] { OK_BUTTON }, 0);
            errorDialog.open();
            return Status.CANCEL_STATUS;
        }
        return Status.OK_STATUS;
    }

    private void projectDependencyResolver(IProgressMonitor monitor)
            throws CoreException, IOException, JavaModelException {
        MSF4JProjectImporter msf4jProjectImporter = new MSF4JProjectImporter();
        File pomFile = new File(msf4jArtifactModel.getProjectFolder().getPath() + File.separator + "pom.xml");
        msf4jProjectImporter.importMSF4JProject(msf4jArtifactModel, msf4jArtifactModel.getCreatedProjectFile(),
                pomFile, monitor);

        IWorkspaceRoot myWorkspaceRoot = resourceAlteration();

        // refresh the workspace after deleting files from the file
        // system
        myWorkspaceRoot.refreshLocal(0, new NullProgressMonitor());
    }

    private IWorkspaceRoot resourceAlteration() throws IOException, CoreException, JavaModelException {
        // Renaming generated folder structure to match with WSO2
        // conventional directory structure
        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
        IProject project = workspace.getProject(msf4jArtifactModel.getProjectName());
        msf4jArtifactModel.setProject(project);
        IFolder resourceFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                MAIN_DIRECTORY);
        File resourcePhysicalFolder = resourceFolder.getRawLocation().makeAbsolute().toFile();
        File newResourcePhysicalFolder = new File(
                resourcePhysicalFolder.getParent() + File.separator + RESOURCES_DIRECTORY);
        resourcePhysicalFolder.renameTo(newResourcePhysicalFolder);

        IFolder sourceFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                GEN_DIRECTORY);
        File sourcePhysicalFolder = sourceFolder.getRawLocation().makeAbsolute().toFile();
        File newSourcePhysicalFolder = new File(sourcePhysicalFolder.getParent() + File.separator + MAIN_DIRECTORY);
        sourcePhysicalFolder.renameTo(newSourcePhysicalFolder);

        // Moving src/resources to src/main
        resourceFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                RESOURCES_DIRECTORY);
        resourcePhysicalFolder = resourceFolder.getRawLocation().makeAbsolute().toFile();
        sourceFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                MAIN_DIRECTORY);
        sourcePhysicalFolder = sourceFolder.getRawLocation().makeAbsolute().toFile();
        FileUtils.moveDirectoryToDirectory(resourcePhysicalFolder, sourcePhysicalFolder, true);

        // Adding Java support to the source folder src/main/java
        // delete the project target folder
        IFolder targetFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(),
                MSF4JArtifactConstants.TRGET_DIRECTORY);
        targetFolder.delete(true, new NullProgressMonitor());
        IFolder mainFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                MAIN_DIRECTORY, JAVA_DIRECTORY);
        JavaUtils.addJavaSupportAndSourceFolder(msf4jArtifactModel.getProject(), mainFolder);

        // removing the webapps folder generated by the tool
        IFolder webAppFolder = ProjectUtils.getWorkspaceFolder(msf4jArtifactModel.getProject(), SRC_DIRECTORY,
                MAIN_DIRECTORY, RESOURCES_DIRECTORY, WEBAPP_DIRECTORY);
        File webAppPhysicalFolder = webAppFolder.getRawLocation().makeAbsolute().toFile();
        if (webAppPhysicalFolder.exists()) {
            FileUtils.forceDelete(webAppPhysicalFolder);
        }

        // removing unnecessary classes generated by the tool
        IProject newMSF4JProject = workspace.getProject(msf4jArtifactModel.getProject().getName());
        String[] filesToBeDeleted = { NOT_FOUND_EXCEPTION_JAVA, API_ORIGIN_FILTER_JAVA, API_RESPONSE_MESSAGE_JAVA,
                API_EXCEPTION_JAVA };

        for (String fileToBeDeleted : filesToBeDeleted) {
            IResource originFilterFile = newMSF4JProject
                    .getFile(SRC_DIRECTORY + File.separator + MAIN_DIRECTORY + File.separator + JAVA_DIRECTORY
                            + File.separator + msf4jArtifactModel.getPackageName().replace(".", File.separator)
                            + File.separator + API + File.separator + fileToBeDeleted);
            File fileToDelete = originFilterFile.getRawLocation().makeAbsolute().toFile();
            if (fileToDelete.exists()) {
                FileUtils.forceDelete(fileToDelete);
            }
        }
        ProjectUtils.addNatureToProject(project, false, MAVEN2_PROJECT_NATURE);
        ProjectUtils.addNatureToProject(project, false, MSF4J_PROJECT_NATURE);
        project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
        return workspace;
    }
}