com.liferay.ide.maven.core.MavenProjectRemoteServerPublisher.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.maven.core.MavenProjectRemoteServerPublisher.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.maven.core;

import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.LaunchHelper;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.project.core.util.SearchFilesVisitor;
import com.liferay.ide.server.remote.AbstractRemoteServerPublisher;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.ResolverConfiguration;
import org.eclipse.wst.server.core.model.IModuleResourceDelta;

/**
 * @author Simon Jiang
 * @author Gregory Amerson
 */
public class MavenProjectRemoteServerPublisher extends AbstractRemoteServerPublisher {
    private final String ATTR_GOALS = "M2_GOALS";
    private final String ATTR_POM_DIR = IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY;
    private final String ATTR_PROFILES = "M2_PROFILES";
    private final String ATTR_SKIP_TESTS = "M2_SKIP_TESTS";
    private final String ATTR_UPDATE_SNAPSHOTS = "M2_UPDATE_SNAPSHOTS";
    private final String ATTR_WORKSPACE_RESOLUTION = "M2_WORKSPACE_RESOLUTION";
    private final String LAUNCH_CONFIGURATION_TYPE_ID = "org.eclipse.m2e.Maven2LaunchConfigurationType";

    public MavenProjectRemoteServerPublisher(IProject project) {
        super(project);
    }

    private boolean execMavenLaunch(final IProject project, final String goal, final IMavenProjectFacade facade,
            IProgressMonitor monitor) throws CoreException {
        final ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
        final ILaunchConfigurationType launchConfigurationType = launchManager
                .getLaunchConfigurationType(LAUNCH_CONFIGURATION_TYPE_ID);
        final IPath basedirLocation = project.getLocation();
        final String newName = launchManager.generateLaunchConfigurationName(basedirLocation.lastSegment());

        final ILaunchConfigurationWorkingCopy workingCopy = launchConfigurationType.newInstance(null, newName);
        workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS,
                "-Dmaven.multiModuleProjectDirectory");
        workingCopy.setAttribute(ATTR_POM_DIR, basedirLocation.toString());
        workingCopy.setAttribute(ATTR_GOALS, goal);
        workingCopy.setAttribute(ATTR_UPDATE_SNAPSHOTS, true);
        workingCopy.setAttribute(ATTR_WORKSPACE_RESOLUTION, true);
        workingCopy.setAttribute(ATTR_SKIP_TESTS, true);

        if (facade != null) {
            final ResolverConfiguration configuration = facade.getResolverConfiguration();

            final String selectedProfiles = configuration.getSelectedProfiles();

            if (selectedProfiles != null && selectedProfiles.length() > 0) {
                workingCopy.setAttribute(ATTR_PROFILES, selectedProfiles);
            }

            new LaunchHelper().launch(workingCopy, "run", monitor);

            return true;
        } else {
            return false;
        }
    }

    private String getMavenDeployGoals() {
        return "package war:war";
    }

    private boolean isServiceBuilderProject(IProject project, String pluginType, MavenProject parentProject) {
        final List<IFile> serviceXmls = (new SearchFilesVisitor()).searchFiles(project, "service.xml");

        return serviceXmls != null && serviceXmls.size() > 0
                && pluginType.equalsIgnoreCase(ILiferayMavenConstants.DEFAULT_PLUGIN_TYPE) && parentProject != null;
    }

    @Override
    public void processResourceDeltas(final IModuleResourceDelta[] deltas, ZipOutputStream zip,
            Map<ZipEntry, String> deleteEntries, final String deletePrefix, final String deltaPrefix,
            final boolean adjustGMTOffset) throws IOException, CoreException {
        for (final IModuleResourceDelta delta : deltas) {
            final IResource deltaResource = (IResource) delta.getModuleResource().getAdapter(IResource.class);
            final IProject deltaProject = deltaResource.getProject();
            final IWebProject lrproject = LiferayCore.create(IWebProject.class, deltaProject);

            if (lrproject == null || lrproject.getDefaultDocrootFolder() == null) {
                continue;
            }

            final IFolder webappRoot = lrproject.getDefaultDocrootFolder();
            final int deltaKind = delta.getKind();
            final IPath deltaFullPath = deltaResource.getFullPath();

            boolean deltaZip = false;
            IPath deltaPath = null;

            if (webappRoot != null && webappRoot.exists()) {
                final IPath containerFullPath = webappRoot.getFullPath();

                if (containerFullPath.isPrefixOf(deltaFullPath)) {
                    deltaZip = true;
                    deltaPath = new Path(deltaPrefix + deltaFullPath.makeRelativeTo(containerFullPath));
                }
            }

            if (deltaZip == false && new Path("WEB-INF").isPrefixOf(delta.getModuleRelativePath())) {
                final List<IFolder> folders = CoreUtil.getSourceFolders(JavaCore.create(deltaProject));

                for (IFolder folder : folders) {
                    final IPath folderPath = folder.getFullPath();

                    if (folderPath.isPrefixOf(deltaFullPath)) {
                        deltaZip = true;
                        break;
                    }
                }
            }

            if (deltaZip == false && (deltaKind == IModuleResourceDelta.ADDED
                    || deltaKind == IModuleResourceDelta.CHANGED || deltaKind == IModuleResourceDelta.REMOVED)) {
                final IPath targetPath = JavaCore.create(deltaProject).getOutputLocation();

                deltaZip = true;
                deltaPath = new Path("WEB-INF/classes").append(deltaFullPath.makeRelativeTo(targetPath));
            }

            if (deltaZip) {
                if (deltaKind == IModuleResourceDelta.ADDED || deltaKind == IModuleResourceDelta.CHANGED) {
                    addToZip(deltaPath, deltaResource, zip, adjustGMTOffset);
                } else if (deltaKind == IModuleResourceDelta.REMOVED) {
                    addRemoveProps(deltaPath, deltaResource, zip, deleteEntries, deletePrefix);
                } else if (deltaKind == IModuleResourceDelta.NO_CHANGE) {
                    final IModuleResourceDelta[] children = delta.getAffectedChildren();
                    processResourceDeltas(children, zip, deleteEntries, deletePrefix, deltaPrefix, adjustGMTOffset);
                }
            }
        }
    }

    public IPath publishModuleFull(IProgressMonitor monitor) throws CoreException {
        IPath retval = null;

        if (runMavenGoal(getProject(), monitor)) {
            final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade(getProject(), monitor);
            final MavenProject mavenProject = projectFacade.getMavenProject(monitor);
            final String targetFolder = mavenProject.getBuild().getDirectory();
            final String targetWar = mavenProject.getBuild().getFinalName() + "." + mavenProject.getPackaging();

            retval = new Path(targetFolder).append(targetWar);
        }

        return retval;
    }

    private boolean runMavenGoal(final IProject project, final IProgressMonitor monitor) throws CoreException {
        boolean retval = false;

        final IMavenProjectFacade facade = MavenUtil.getProjectFacade(project, monitor);
        String pluginType = MavenUtil.getLiferayMavenPluginType(facade.getMavenProject(monitor));

        if (pluginType == null) {
            pluginType = ILiferayMavenConstants.DEFAULT_PLUGIN_TYPE;
        }

        final MavenProject parentProject = facade.getMavenProject(monitor).getParent();
        final String goal = getMavenDeployGoals();

        if (isServiceBuilderProject(project, pluginType, parentProject)) {
            retval = execMavenLaunch(ProjectUtil.getProject(parentProject.getName()),
                    " package -am -pl " + project.getName(), MavenUtil.getProjectFacade(project, monitor), monitor);
        } else {
            retval = execMavenLaunch(project, goal, facade, monitor);
        }

        return retval;
    }
}