/*******************************************************************************
* 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.IBundleProject;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.maven.core.util.DefaultMaven2OsgiConverter;
import com.liferay.ide.project.core.IProjectBuilder;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.server.remote.IRemoteServerPublisher;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.lifecycle.MavenExecutionPlan;
import org.apache.maven.plugin.MojoExecution;
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.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMaven;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
/**
* @author Gregory Amerson
*/
public class MavenBundlePluginProject extends LiferayMavenProject implements IBundleProject
{
private final String[] ignorePaths = new String[] { "target" };
public MavenBundlePluginProject( IProject project )
{
super( project );
}
public <T> T adapt( Class<T> adapterType )
{
T adapter = super.adapt( adapterType );
if( adapter != null )
{
return adapter;
}
final IMavenProjectFacade facade = MavenUtil.getProjectFacade( getProject(), new NullProgressMonitor() );
if( facade != null )
{
if( IProjectBuilder.class.equals( adapterType ) )
{
final IProjectBuilder projectBuilder = new MavenProjectBuilder( getProject() );
return adapterType.cast( projectBuilder );
}
else if( IRemoteServerPublisher.class.equals( adapterType ) )
{
final IRemoteServerPublisher remoteServerPublisher =
new MavenProjectRemoteServerPublisher( getProject() );
return adapterType.cast( remoteServerPublisher );
}
else if( IBundleProject.class.equals( adapterType ) )
{
return adapterType.cast( this );
}
}
return null;
}
@Override
public String getBundleShape()
{
return "jar";
}
@Override
public IFile getDescriptorFile( String name )
{
return getProject().getFile( name );
}
@Override
public IPath getOutputBundle( boolean cleanBuild, IProgressMonitor monitor ) throws CoreException
{
IPath outputJar = null;
final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade( getProject(), monitor );
if( cleanBuild || !isAutoBuild() )
{
this.getProject().build( IncrementalProjectBuilder.CLEAN_BUILD, monitor );
this.getProject().build( IncrementalProjectBuilder.FULL_BUILD, monitor );
execJarMojo(projectFacade, monitor);
}
final MavenProject mavenProject = projectFacade.getMavenProject( monitor );
final String targetName = mavenProject.getBuild().getFinalName() + ".jar";
final String buildDirectory = mavenProject.getBuild().getDirectory();
final File baseDirectory = mavenProject.getBasedir();
final IPath buildDirPath = new Path( buildDirectory );
final IPath baseDirPath = new Path( baseDirectory.toString() );
final IPath relativePath = buildDirPath.makeRelativeTo( baseDirPath );
final IFolder targetFolder = getTargetFolder( getProject(), relativePath );
if( targetFolder.exists() )
{
// targetFolder.refreshLocal( IResource.DEPTH_ONE, monitor );
final IPath targetFile = targetFolder.getRawLocation().append( targetName );
if( targetFile.toFile().exists() )
{
outputJar = targetFile;
}
}
return outputJar;
}
private void execJarMojo(IMavenProjectFacade projectFacade, IProgressMonitor monitor) throws CoreException {
MavenProject mavenProject = projectFacade.getMavenProject();
if (mavenProject == null) {
mavenProject = projectFacade.getMavenProject(monitor);
}
final IMaven maven = MavenPlugin.getMaven();
final MavenExecutionPlan plan = maven.calculateExecutionPlan(mavenProject, Arrays.asList("jar:jar"), true, monitor);
final List<MojoExecution> mojoExecutions = plan.getMojoExecutions();
if (mojoExecutions != null) {
for (MojoExecution mojoExecution : mojoExecutions) {
MavenPlugin.getMaven().execute(mavenProject, mojoExecution, monitor);
}
}
}
private boolean isAutoBuild()
{
return ResourcesPlugin.getWorkspace().getDescription().isAutoBuilding();
}
private IFolder getTargetFolder( IProject project, IPath relativePath )
{
IFolder targetFolder = project.getFolder( relativePath );
if( !targetFolder.exists() )
{
targetFolder = project.getFolder( "target" );
}
return targetFolder;
}
@Override
public String getSymbolicName() throws CoreException
{
String bsn = ProjectUtil.getBundleSymbolicNameFromBND( getProject() );
if( !CoreUtil.empty( bsn ) )
{
return bsn;
}
String retval = null;
final IProgressMonitor monitor = new NullProgressMonitor();
final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade( getProject(), monitor );
final MavenProject mavenProject = projectFacade.getMavenProject( monitor );
final Artifact artifact = mavenProject.getArtifact();
final File file = artifact.getFile();
if( file != null && file.exists() && !artifact.getFile().getName().equals( "classes" ) )
{
retval = new DefaultMaven2OsgiConverter().getBundleSymbolicName( artifact );
}
else
{
// fallback to project name
retval = getProject().getLocation().lastSegment();
}
return retval;
}
@Override
public boolean filterResource( IPath resourcePath )
{
if( filterResource( resourcePath, ignorePaths ) )
{
return true;
}
return false;
}
@Override
public boolean isFragmentBundle()
{
final IFile bndFile = getProject().getFile( "bnd.bnd" );
if( bndFile.exists() )
{
try
{
String content = FileUtil.readContents( bndFile.getContents() );
if( content.contains( "Fragment-Host" ) )
{
return true;
}
}
catch( Exception e )
{
}
}
return false;
}
}