org.wso2.developerstudio.eclipse.ds.capp.refactor.DataServiceRenameParticipant.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.eclipse.ds.capp.refactor.DataServiceRenameParticipant.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.eclipse.ds.capp.refactor;

import org.apache.commons.io.FilenameUtils;
import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.wso2.developerstudio.eclipse.ds.Activator;
import org.wso2.developerstudio.eclipse.ds.refactor.MavenConfigurationFileRenameChange;
import org.wso2.developerstudio.eclipse.ds.util.Messages;
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.file.FileUtils;

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

public class DataServiceRenameParticipant extends RenameParticipant {

    private static IDeveloperStudioLog log = Logger.getLog(Activator.PLUGIN_ID);

    private static final String PARTICIPANT_NAME = "DataServiceRename"; //$NON-NLS-1$
    private static final String ARTIFACT_XML_FILE = "artifact.xml"; //$NON-NLS-1$
    private static final List<String> SKIP_LIST = Arrays.asList("target", "bin", ".svn", ".git"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

    private IFile originalFile;
    private String originalFileFullName;
    private String changedFileFullName;
    private IProject dsProject;

    public RefactoringStatus checkConditions(IProgressMonitor monitor, CheckConditionsContext context)
            throws OperationCanceledException {
        /*
         * Conditions to check: Newly renamed file cannot already exist in the project. Renamed file cannot be equal to
         * the project name itself (to avoid maven build issues).
         */
        if (originalFile != null) {
            List<String> matchingFilesList = new ArrayList<>();
            String fileName = changedFileFullName.substring(0, changedFileFullName.lastIndexOf(".")); //$NON-NLS-1$
            String fileExtension = changedFileFullName.substring(changedFileFullName.lastIndexOf(".") + 1); //$NON-NLS-1$
            FileUtils.getAllExactMatchingFiles(dsProject.getLocation().toOSString(), fileName, fileExtension,
                    matchingFilesList, SKIP_LIST);

            if (!matchingFilesList.isEmpty()) {
                return RefactoringStatus.createFatalErrorStatus("\"" + changedFileFullName + "\"" //$NON-NLS-1$ //$NON-NLS-2$
                        + Messages.DataServiceRenameParticipant_DuplicateFileName);
            } else if (fileName.equalsIgnoreCase(dsProject.getName())) {
                return RefactoringStatus
                        .createFatalErrorStatus(Messages.DataServiceRenameParticipant_EqualsToProjectName);
            }

            return RefactoringStatus.createInfoStatus("Update CApp if it's referred");
        } else {
            return RefactoringStatus
                    .createFatalErrorStatus(Messages.DataServiceRenameParticipant_InvalidResourceType);
        }
    }

    public Change createChange(IProgressMonitor arg0) throws CoreException, OperationCanceledException {
        Change deleteFromPOM = null;
        try {
            deleteFromPOM = deleteFromPOM();
        } catch (Exception e) {
            log.error("Error while Updating the CApp", e);
        }

        return deleteFromPOM;
    }

    private Change deleteFromPOM() throws CoreException {
        IFile pomFile = null;
        CompositeChange deleteChange = new CompositeChange("Update CApp pom.xml");
        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        String changedNameWithoutExtention = FilenameUtils.removeExtension(changedFileFullName);
        String originalNameWithoutExtension = FilenameUtils.removeExtension(originalFileFullName);
        for (IProject project : projects) {
            if (project.isOpen()
                    && project.hasNature("org.wso2.developerstudio.eclipse.distribution.project.nature")) {
                try {
                    pomFile = project.getFile("pom.xml");
                    try {
                        pomFile.refreshLocal(0, new NullProgressMonitor());
                    } catch (Exception ignore) {

                    }
                    MavenProject mavenProject = MavenUtils
                            .getMavenProject(project.getFile("pom.xml").getLocation().toFile());
                    Dependency projectDependency = getDependencyForTheProject(originalFile.getProject());
                    if (originalFile instanceof IFile) {
                        projectDependency.setArtifactId(originalFile.getName().substring(0,
                                originalFile.getName().length() - originalFile.getFileExtension().length() - 1));
                    } else {
                        projectDependency.setArtifactId(originalFile.getName());
                    }
                    List<?> dependencies = mavenProject.getDependencies();
                    for (Iterator<?> iterator = dependencies.iterator(); iterator.hasNext();) {
                        Dependency dependency = (Dependency) iterator.next();
                        if (isDependenciesEqual(projectDependency, dependency)) {
                            deleteChange.add(new MavenConfigurationFileRenameChange("updateCapp", pomFile,
                                    originalNameWithoutExtension, project, changedNameWithoutExtention,
                                    dependency));
                        }
                    }

                } catch (Exception e) {
                    log.error("Error occurred while trying to generate the Refactoring", e);
                } finally {
                    try {
                        if (pomFile != null) {
                            pomFile.refreshLocal(0, new NullProgressMonitor());
                        }
                    } catch (Exception ignore) {

                    }
                }
            }
        }
        return deleteChange;
    }

    private Dependency getDependencyForTheProject(IProject project) throws Exception {

        MavenProject mavenProject = MavenUtils.getMavenProject(project.getFile("pom.xml").getLocation().toFile());
        Dependency dependency = new Dependency();
        if (mavenProject != null) {
            dependency.setGroupId(mavenProject.getGroupId() + ".dataservice");
            dependency.setArtifactId(mavenProject.getArtifactId());
            dependency.setVersion(mavenProject.getVersion());
        }
        return dependency;
    }

    private boolean isDependenciesEqual(Dependency source, Dependency target) {
        return (source.getGroupId().equalsIgnoreCase(target.getGroupId())
                && source.getArtifactId().equalsIgnoreCase(target.getArtifactId())
                && source.getVersion().equalsIgnoreCase(target.getVersion()));
    }

    public String getName() {
        return PARTICIPANT_NAME;
    }

    protected boolean initialize(Object initObject) {
        if (initObject instanceof IFile) {
            originalFile = (IFile) initObject;
            originalFileFullName = originalFile.getName();
            dsProject = originalFile.getProject();

            RenameArguments arguments = getArguments();
            changedFileFullName = arguments.getNewName();

            return true;
        }
        return false;
    }
}