/*******************************************************************************
* 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.gradle.core;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.gradleware.tooling.toolingclient.GradleDistribution;
import com.gradleware.tooling.toolingmodel.repository.FixedRequestAttributes;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.buildship.core.CorePlugin;
import org.eclipse.buildship.core.configuration.GradleProjectNature;
import org.eclipse.buildship.core.configuration.ProjectConfiguration;
import org.eclipse.buildship.core.launch.GradleRunConfigurationAttributes;
import org.eclipse.buildship.core.projectimport.ProjectImportConfiguration;
import org.eclipse.buildship.core.util.file.FileUtils;
import org.eclipse.buildship.core.util.gradle.GradleDistributionWrapper;
import org.eclipse.buildship.core.util.progress.AsyncHandler;
import org.eclipse.buildship.core.util.variable.ExpressionUtils;
import org.eclipse.buildship.core.workspace.NewProjectHandler;
import org.eclipse.buildship.core.workspace.SynchronizeGradleProjectJob;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
/**
* @author Andy Wu
* @author Lovett Li
*/
public class GradleUtil
{
private static GradleRunConfigurationAttributes getRunConfigurationAttributes( IProject project, String task )
{
ProjectConfiguration projectConfiguration =
CorePlugin.projectConfigurationManager().readProjectConfiguration( project );
FixedRequestAttributes attrs = projectConfiguration.getRequestAttributes();
Optional<FixedRequestAttributes> requestAttributes = Optional.of( attrs );
List<String> tasks = new ArrayList<String>();
tasks.add( task );
String projectDirectoryExpression = ExpressionUtils.encodeWorkspaceLocation( project );
boolean isPresent = requestAttributes.isPresent();
GradleDistribution gradleDistribution =
isPresent ? requestAttributes.get().getGradleDistribution() : GradleDistribution.fromBuild();
//String gradleUserHome =
// isPresent ? FileUtils.getAbsolutePath( requestAttributes.get().getGradleUserHome() ).orNull() : null;
String javaHome =
isPresent ? FileUtils.getAbsolutePath( requestAttributes.get().getJavaHome() ).orNull() : null;
List<String> jvmArguments = isPresent ? requestAttributes.get().getJvmArguments() : ImmutableList.<String> of();
List<String> arguments = isPresent ? requestAttributes.get().getArguments() : ImmutableList.<String> of();
boolean showExecutionView = true;
boolean showConsoleView = true;
return GradleRunConfigurationAttributes.with(
tasks, projectDirectoryExpression, gradleDistribution, javaHome, jvmArguments, arguments,
showExecutionView, showConsoleView, true );
}
public static IStatus importGradleProject( File dir, IProgressMonitor monitor ) throws CoreException
{
ProjectImportConfiguration configuration = new ProjectImportConfiguration();
GradleDistributionWrapper from = GradleDistributionWrapper.from( GradleDistribution.fromBuild() );
configuration.setGradleDistribution( from );
configuration.setProjectDir( dir );
configuration.setApplyWorkingSets( false );
SynchronizeGradleProjectJob synchronizeGradleProjectJob = new SynchronizeGradleProjectJob(
configuration.toFixedAttributes(), null, AsyncHandler.NO_OP );
synchronizeGradleProjectJob.setUser( true );
return synchronizeGradleProjectJob.run( monitor );
}
public static boolean isBuildFile( IFile buildFile )
{
return buildFile != null && buildFile.exists() && "build.gradle".equals( buildFile.getName() ) &&
buildFile.getParent() instanceof IProject;
}
public static boolean isGradleProject( Object resource ) throws CoreException
{
IProject project = null;
if( resource instanceof IFile )
{
project = ( (IFile) resource ).getProject();
}
else if( resource instanceof IProject )
{
project = (IProject) resource;
}
return project != null && project.exists() && project.isAccessible() &&
( project.hasNature( GradleProjectNature.ID ) );
}
public static void refreshGradleProject( IProject project )
{
Set<IProject> projects = new HashSet<>();
projects.add( project );
CorePlugin.gradleWorkspaceManager().getCompositeBuild( projects ).synchronize(
NewProjectHandler.IMPORT_AND_MERGE );
}
public static void runGradleTask( IProject project, String task, IProgressMonitor monitor ) throws CoreException
{
ILaunchConfiguration launchConfiguration =
CorePlugin.gradleLaunchConfigurationManager().getOrCreateRunConfiguration(
getRunConfigurationAttributes( project, task ) );
final ILaunchConfigurationWorkingCopy launchConfigurationWC = launchConfiguration.getWorkingCopy();
launchConfigurationWC.setAttribute( "org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND", true );
launchConfigurationWC.setAttribute( "org.eclipse.debug.ui.ATTR_CAPTURE_IN_CONSOLE", true );
launchConfigurationWC.setAttribute( "org.eclipse.debug.ui.ATTR_PRIVATE", true );
launchConfigurationWC.doSave();
launchConfigurationWC.launch( ILaunchManager.RUN_MODE, monitor );
}
}