/******************************************************************************* * 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; } }