/******************************************************************************* * 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 java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import org.apache.maven.lifecycle.MavenExecutionPlan; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.codehaus.plexus.util.xml.Xpp3DomUtils; 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.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.ICallable; import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.project.IMavenProjectFacade; import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.eclipse.m2e.core.project.ResolverConfiguration; import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant; /** * @author Gregory Amerson */ public abstract class ThemePluginBuildParticipant extends AbstractBuildParticipant { protected final IMaven maven = MavenPlugin.getMaven(); protected final IMavenProjectRegistry projectManager = MavenPlugin.getMavenProjectRegistry(); @Override public Set<IProject> build( int kind, IProgressMonitor monitor ) throws Exception { final IMavenProjectFacade facade = getMavenProjectFacade(); if( ! shouldBuild( kind, facade ) ) { return null; } final ICallable<IStatus> callable = new ICallable<IStatus>() { public IStatus call( IMavenExecutionContext context, IProgressMonitor monitor ) throws CoreException { return executeThemeMojo( facade, context, monitor ); } }; IStatus retval = null; try { retval = executeMaven( facade, callable, monitor ); } catch( Exception e ) { retval = LiferayMavenCore.createErrorStatus( getGoal() + " build error", e ); //$NON-NLS-1$ } if( retval != null && ! retval.isOK() ) { LiferayMavenCore.log( retval ); } try { facade.getProject().refreshLocal( IResource.DEPTH_INFINITE, monitor ); } catch( CoreException e ) { } monitor.worked( 10 ); return null; } protected void configureExecution( IMavenProjectFacade facade, Xpp3Dom config ) { final IPath m2eLiferayFolder = MavenUtil.getM2eLiferayFolder( facade.getMavenProject(), facade.getProject() ); final IPath themeResourcesFolder = m2eLiferayFolder.append( ILiferayMavenConstants.THEME_RESOURCES_FOLDER ); final String targetFolderValue = themeResourcesFolder.toPortableString(); MavenUtil.setConfigValue( config, ILiferayMavenConstants.PLUGIN_CONFIG_WEBAPP_DIR, targetFolderValue ); } protected IStatus executeMaven( final IMavenProjectFacade projectFacade, final ICallable<IStatus> callable, final IProgressMonitor monitor ) throws CoreException { return this.maven.execute ( new ICallable<IStatus>() { public IStatus call( IMavenExecutionContext context, IProgressMonitor monitor ) throws CoreException { return projectManager.execute( projectFacade, callable, monitor ); } }, monitor ); } protected IStatus executeThemeMojo( final IMavenProjectFacade facade, final IMavenExecutionContext context, final IProgressMonitor monitor ) throws CoreException { IStatus retval = null; final List<String> goals = Collections.singletonList( getGoal() ); final MavenProject mavenProject = facade.getMavenProject( monitor ); final MavenExecutionPlan plan = maven.calculateExecutionPlan( mavenProject, goals, true, monitor ); monitor.worked( 10 ); final MojoExecution liferayMojoExecution = MavenUtil.getExecution( plan, ILiferayMavenConstants.LIFERAY_MAVEN_PLUGIN_ARTIFACT_ID ); final Xpp3Dom originalConfig = liferayMojoExecution.getConfiguration(); final Xpp3Dom config = Xpp3DomUtils.mergeXpp3Dom( new Xpp3Dom( "configuration" ), originalConfig ); //$NON-NLS-1$ configureExecution( facade, config ); boolean parentHierarchyLoaded = false; try { parentHierarchyLoaded = MavenUtil.loadParentHierarchy( facade, monitor ); monitor.worked( 10 ); final ResolverConfiguration configuration = facade.getResolverConfiguration(); configuration.setResolveWorkspaceProjects( true ); liferayMojoExecution.setConfiguration( config ); maven.execute( mavenProject, liferayMojoExecution, monitor ); monitor.worked( 50 ); List<Throwable> exceptions = context.getSession().getResult().getExceptions(); if( exceptions.size() == 1 ) { retval = LiferayMavenCore.createErrorStatus( exceptions.get( 0 ) ); } else if( exceptions.size() > 1 ) { List<IStatus> statuses = new ArrayList<IStatus>(); for( Throwable t : exceptions ) { statuses.add( LiferayMavenCore.createErrorStatus( t ) ); } retval = LiferayMavenCore.createMultiStatus( IStatus.ERROR, statuses.toArray( new IStatus[0] ) ); } retval = retval == null ? Status.OK_STATUS : retval; } catch( CoreException e ) { retval = LiferayMavenCore.createErrorStatus( e ); } finally { liferayMojoExecution.setConfiguration( originalConfig ); if( parentHierarchyLoaded ) { mavenProject.setParent( null ); } } return retval; } protected abstract String getGoal(); protected abstract boolean shouldBuild( int kind, IMavenProjectFacade facade ); }