/*******************************************************************************
* Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.ide.core.operations.build;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.CoreUtil.option;
import org.eclipse.core.resources.IProject;
import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.launch.LaunchMessages;
import melnorme.lang.ide.core.operations.ILangOperationsListener_Default.IToolOperationMonitor;
import melnorme.lang.ide.core.operations.ToolManager;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildType;
import melnorme.lang.ide.core.operations.build.BuildTargetOperation.BuildOperationParameters;
import melnorme.lang.ide.core.utils.ResourceUtils;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.lang.tooling.bundle.BundleInfo;
import melnorme.lang.tooling.bundle.LaunchArtifact;
import melnorme.lang.tooling.commands.CommandInvocation;
import melnorme.lang.tooling.commands.IVariablesResolver;
import melnorme.lang.utils.validators.AbstractValidator;
import melnorme.lang.utils.validators.ValidationMessages;
import melnorme.utilbox.collections.Indexable;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.misc.Location;
import melnorme.utilbox.status.Severity;
import melnorme.utilbox.status.StatusException;
public class BuildTarget extends AbstractValidator {
public final BuildManager buildMgr = LangCore.getBuildManager();
protected final IProject project;
protected final BundleInfo bundleInfo;
protected final BuildTargetDataView targetData;
protected final BuildType buildType;
protected final BuildConfiguration buildConfiguration;
public static BuildTarget create(IProject project, BundleInfo bundleInfo, BuildTargetDataView buildTargetData,
BuildType buildType, String buildConfigName) throws CommonException {
BuildConfiguration buildConfig = buildType.getValidBuildconfiguration(buildConfigName, bundleInfo);
return new BuildTarget(project, bundleInfo, buildTargetData, buildType, buildConfig);
}
public BuildTarget(IProject project, BundleInfo bundleInfo,
BuildTargetDataView buildTargetData, BuildType buildType,
BuildConfiguration buildConfig) {
this.project = assertNotNull(project);
this.bundleInfo = assertNotNull(bundleInfo);
this.targetData = assertNotNull(buildTargetData.copy());
assertNotNull(buildTargetData.getTargetName());
this.buildType = assertNotNull(buildType);
this.buildConfiguration = assertNotNull(buildConfig);
}
public BuildManager getBuildManager() {
return buildMgr;
}
public IProject getProject() {
return project;
}
@Override
public String toString() {
return project.getName() + "//" + targetData.getTargetName();
}
public Location getProjectLocation() throws CommonException {
return ResourceUtils.getProjectLocation2(project);
}
public String getBuildTargetName() {
return assertNotNull(targetData.getTargetName());
}
public String getTargetName() {
return assertNotNull(targetData.getTargetName());
}
public boolean isNormalBuildEnabled() {
return targetData.isNormalBuildEnabled();
}
public boolean isAutoBuildEnabled() {
return targetData.isAutoBuildEnabled();
}
public BuildTargetDataView getData() {
return targetData;
}
public BuildTargetData getDataCopy() {
return targetData.copy();
}
public String getBuildConfigName() {
return buildConfiguration.getName();
}
public String getBuildTypeName() {
return buildType.getName();
}
public BuildConfiguration getBuildConfiguration() {
return buildConfiguration;
}
public BuildType getBuildType() {
return buildType;
}
public boolean isDefaultBuildType() {
return getBuildType() == buildMgr.getDefaultBuildType();
}
public BundleInfo getBundleInfo() {
return bundleInfo;
}
public BuildTarget getDerivedBuildTarget(BuildTargetData data) {
return new BuildTarget(
getProject(),
getBundleInfo(),
data,
getBuildType(),
getBuildConfiguration()
);
}
/* ----------------- ----------------- */
public String getDefaultBuildCommand() throws StatusException {
try {
return getBuildType().getDefaultCommandLine(this);
} catch(CommonException e) {
throw e.toStatusException();
}
}
public CommandInvocation getEffectiveBuildCommand2() throws StatusException {
CommandInvocation buildCommand = targetData.getBuildCommand();
if(buildCommand != null) {
return buildCommand;
}
return new CommandInvocation(getDefaultBuildCommand());
}
/* ----------------- ----------------- */
public String getEffectiveValidExecutablePath() throws StatusException {
String executablePath = targetData.getExecutablePath();
if(executablePath != null) {
return executablePath;
}
return getDefaultExecutablePath();
}
public String getDefaultExecutablePath() throws StatusException {
LaunchArtifact mainLaunchArtifact = getMainLaunchArtifact();
if(mainLaunchArtifact == null) {
throw new StatusException(LaunchMessages.MSG_BuildTarget_NoExecutableAvailable());
}
return mainLaunchArtifact.getArtifactPath();
}
public Indexable<LaunchArtifact> getSubLaunchArtifacts() throws CommonException {
return getBuildType().getSubTargetLaunchArtifacts(this);
}
public LaunchArtifact getMainLaunchArtifact() throws StatusException {
try {
return getBuildType().getMainLaunchArtifact(this);
} catch(CommonException e) {
throw e.toStatusException();
}
}
public Location getValidExecutableLocation() throws StatusException {
return getValidExecutableLocation(getEffectiveValidExecutablePath());
}
public Location getValidExecutableLocation(String exeFilePathString) throws StatusException {
if(exeFilePathString == null || exeFilePathString.isEmpty()) {
throw new StatusException(LaunchMessages.BuildTarget_NoArtifactPathSpecified);
}
Location exeFileLocation;
try {
exeFileLocation = Location.create(getProjectLocation(), exeFilePathString);
} catch(CommonException e) {
throw e.toStatusException();
}
if(exeFileLocation.toFile().exists() && !exeFileLocation.toFile().isFile()) {
throw new StatusException(Severity.ERROR, ValidationMessages.Location_NotAFile(exeFileLocation));
}
return exeFileLocation;
}
/* ----------------- ----------------- */
public void validateForBuild(ToolManager toolManager) throws StatusException {
IVariablesResolver variablesResolver = toolManager.getVariablesManager(option(getProject()));
getEffectiveBuildCommand2().evaluateCommandArguments(variablesResolver);
getValidExecutableLocation(); // TODO: Build Target Editor validate this
}
public BuildTargetOperation getBuildOperation(ToolManager toolManager, IToolOperationMonitor opMonitor)
throws CommonException {
assertNotNull(opMonitor);
return getBuildType().getBuildOperation(new BuildOperationParameters(opMonitor,
toolManager, getProject(), getBuildTargetName(), getEffectiveBuildCommand2()));
}
}