Skip to content
This repository has been archived by the owner on Apr 3, 2018. It is now read-only.

Commit

Permalink
LANG: Minor BuildConfiguration API update.
Browse files Browse the repository at this point in the history
  • Loading branch information
bruno-medeiros committed Aug 20, 2015
1 parent 863ab95 commit f0304ea
Show file tree
Hide file tree
Showing 13 changed files with 140 additions and 70 deletions.
Expand Up @@ -19,10 +19,10 @@
import melnorme.lang.ide.core.BundleInfo; import melnorme.lang.ide.core.BundleInfo;
import melnorme.lang.ide.core.launch.BuildTargetSettingsValidator; import melnorme.lang.ide.core.launch.BuildTargetSettingsValidator;
import melnorme.lang.ide.core.operations.OperationInfo; import melnorme.lang.ide.core.operations.OperationInfo;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.project_model.ProjectBuildInfo; import melnorme.lang.ide.core.project_model.ProjectBuildInfo;
import melnorme.lang.ide.core.tests.BuildTestsHelper; import melnorme.lang.ide.core.tests.BuildTestsHelper;
import melnorme.lang.ide.core.tests.SampleProject; import melnorme.lang.ide.core.tests.SampleProject;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.tests.CommonTest; import melnorme.utilbox.tests.CommonTest;
Expand Down
Expand Up @@ -11,12 +11,12 @@ public class LaunchMessages {
public static final String BuildTarget_NoArtifactPathSpecified = public static final String BuildTarget_NoArtifactPathSpecified =
"No executable path specified for Build Target."; "No executable path specified for Build Target.";


public static String MSG_NoExecutablesAvailable() { public static String MSG_BuildTarget_NoExecutablesAvailable() {
return "No executables available."; return "No executables available from the build target.";
} }


public static String MSG_MultipleExecutablesAvailable() { public static String MSG_BuildTarget_MultipleExecutablesAvailable() {
return "Multiple executables available."; return "Multiple executables available from the build target.";
} }


/* ----------------- ----------------- */ /* ----------------- ----------------- */
Expand Down
Expand Up @@ -37,7 +37,9 @@
import melnorme.lang.ide.core.utils.ProjectValidator; import melnorme.lang.ide.core.utils.ProjectValidator;
import melnorme.lang.ide.core.utils.ResourceUtils; import melnorme.lang.ide.core.utils.ResourceUtils;
import melnorme.lang.ide.core.utils.prefs.StringPreference; import melnorme.lang.ide.core.utils.prefs.StringPreference;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.lang.tooling.bundle.BuildTargetNameParser; import melnorme.lang.tooling.bundle.BuildTargetNameParser;
import melnorme.lang.tooling.bundle.LaunchArtifact;
import melnorme.lang.tooling.data.StatusException; import melnorme.lang.tooling.data.StatusException;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.collections.Collection2; import melnorme.utilbox.collections.Collection2;
Expand Down Expand Up @@ -271,15 +273,20 @@ public String getDefaultBuildOptions(ValidatedBuildTarget validatedBuildTarget)
protected abstract void getDefaultBuildOptions(ValidatedBuildTarget vbt, ArrayList2<String> buildArgs) protected abstract void getDefaultBuildOptions(ValidatedBuildTarget vbt, ArrayList2<String> buildArgs)
throws CommonException; throws CommonException;


public final Indexable<BuildConfiguration> getSubConfigurations(ValidatedBuildTarget vbt) public final Indexable<LaunchArtifact> getLaunchArtifacts(ValidatedBuildTarget vbt)
throws CommonException { throws CommonException {
Indexable<BuildConfiguration> subConfigurations = getSubConfigurations_do(vbt); Indexable<LaunchArtifact> launchArtifacts = getLaunchArtifacts_do(vbt);
assertTrue(subConfigurations.size() >= 1); assertTrue(launchArtifacts.size() >= 1);
return subConfigurations; return launchArtifacts;
} }


public Indexable<BuildConfiguration> getSubConfigurations_do(ValidatedBuildTarget vbt) throws CommonException { public Indexable<LaunchArtifact> getLaunchArtifacts_do(ValidatedBuildTarget vbt) throws CommonException {
return new ArrayList2<>(vbt.getBuildConfiguration()); BuildConfiguration buildConfig = vbt.getBuildConfiguration();
String artifactPath = buildConfig.getArtifactPath();
if(artifactPath == null) {
return new ArrayList2<>();
}
return new ArrayList2<>(new LaunchArtifact(buildConfig.getName(), artifactPath));
} }


public abstract CommonBuildTargetOperation getBuildOperation(ValidatedBuildTarget validatedBuildTarget, public abstract CommonBuildTargetOperation getBuildOperation(ValidatedBuildTarget validatedBuildTarget,
Expand Down Expand Up @@ -309,29 +316,6 @@ public BuildType getBuildType_NonNull(String buildTypeName) throws CommonExcepti
throw new CommonException(BuildManagerMessages.BuildType_NotFound(buildTypeName)); throw new CommonException(BuildManagerMessages.BuildType_NotFound(buildTypeName));
} }


/* ----------------- Build Configuration ----------------- */

public static class BuildConfiguration {

protected final String name;
protected final String artifactPath;

public BuildConfiguration(String name, String artifactPath) {
this.name = assertNotNull(name);
this.artifactPath = artifactPath;
}

public String getName() {
return name;
}

/* FIXME: remove exception */
public String getArtifactPath() throws CommonException {
return artifactPath;
}

}

/* ----------------- Build Target name ----------------- */ /* ----------------- Build Target name ----------------- */


public BuildTargetNameParser getBuildTargetNameParser() { public BuildTargetNameParser getBuildTargetNameParser() {
Expand Down
Expand Up @@ -20,9 +20,9 @@
import melnorme.lang.ide.core.launch.LaunchUtils; import melnorme.lang.ide.core.launch.LaunchUtils;
import melnorme.lang.ide.core.operations.AbstractToolManagerOperation; import melnorme.lang.ide.core.operations.AbstractToolManagerOperation;
import melnorme.lang.ide.core.operations.OperationInfo; import melnorme.lang.ide.core.operations.OperationInfo;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildType; import melnorme.lang.ide.core.operations.build.BuildManager.BuildType;
import melnorme.lang.ide.core.utils.ProgressSubTaskHelper; import melnorme.lang.ide.core.utils.ProgressSubTaskHelper;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;
Expand Down
Expand Up @@ -17,9 +17,10 @@
import melnorme.lang.ide.core.BundleInfo; import melnorme.lang.ide.core.BundleInfo;
import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.launch.LaunchMessages; import melnorme.lang.ide.core.launch.LaunchMessages;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildType; import melnorme.lang.ide.core.operations.build.BuildManager.BuildType;
import melnorme.lang.ide.core.project_model.ProjectBuildInfo; import melnorme.lang.ide.core.project_model.ProjectBuildInfo;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.lang.tooling.bundle.LaunchArtifact;
import melnorme.lang.tooling.data.AbstractValidator2; import melnorme.lang.tooling.data.AbstractValidator2;
import melnorme.utilbox.collections.Indexable; import melnorme.utilbox.collections.Indexable;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;
Expand Down Expand Up @@ -112,19 +113,18 @@ public String getEffectiveValidExecutablePath() throws CommonException {
return executablePath; return executablePath;
} }


Indexable<BuildConfiguration> subConfigurations = getBuildType().getSubConfigurations(this); Indexable<LaunchArtifact> launchArtifacts = getLaunchArtifacts();
if(subConfigurations.size() > 1) { if(launchArtifacts.size() > 1) {
throw new CommonException(LaunchMessages.MSG_MultipleExecutablesAvailable()); throw new CommonException(LaunchMessages.MSG_BuildTarget_MultipleExecutablesAvailable());
} }
executablePath = subConfigurations.get(0).artifactPath; if(launchArtifacts.size() == 0) {
if(executablePath == null) { throw new CommonException(LaunchMessages.MSG_BuildTarget_NoExecutablesAvailable());
throw new CommonException(LaunchMessages.MSG_NoExecutablesAvailable());
} }
return executablePath; return launchArtifacts.get(0).getArtifactPath();
} }


public Indexable<BuildConfiguration> getSubConfigurations() throws CommonException { public Indexable<LaunchArtifact> getLaunchArtifacts() throws CommonException {
return getBuildType().getSubConfigurations(this); return getBuildType().getLaunchArtifacts(this);
} }


} }
Expand Up @@ -10,7 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package melnorme.lang.ide.core.project_model; package melnorme.lang.ide.core.project_model;


import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration; import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.utilbox.collections.Indexable; import melnorme.utilbox.collections.Indexable;


public abstract class AbstractBundleInfo { public abstract class AbstractBundleInfo {
Expand Down
Expand Up @@ -17,10 +17,10 @@


import melnorme.lang.ide.core.BundleInfo; import melnorme.lang.ide.core.BundleInfo;
import melnorme.lang.ide.core.operations.build.BuildManager; import melnorme.lang.ide.core.operations.build.BuildManager;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.operations.build.BuildManagerMessages; import melnorme.lang.ide.core.operations.build.BuildManagerMessages;
import melnorme.lang.ide.core.operations.build.BuildTarget; import melnorme.lang.ide.core.operations.build.BuildTarget;
import melnorme.lang.ide.core.operations.build.BuildTarget.BuildTargetData; import melnorme.lang.ide.core.operations.build.BuildTarget.BuildTargetData;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.lang.tooling.data.StatusException; import melnorme.lang.tooling.data.StatusException;
import melnorme.lang.tooling.data.StatusLevel; import melnorme.lang.tooling.data.StatusLevel;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
Expand Down Expand Up @@ -58,10 +58,6 @@ public BundleInfo getBundleInfo() {
return bundleInfo; return bundleInfo;
} }


public Indexable<BuildConfiguration> getBuildConfigs() {
return getBundleInfo().getBuildConfigurations();
}

public Collection2<BuildTarget> getBuildTargets() { public Collection2<BuildTarget> getBuildTargets() {
return buildTargets.getValuesView(); return buildTargets.getValuesView();
} }
Expand Down Expand Up @@ -94,6 +90,10 @@ public ArrayList2<BuildTarget> getEnabledTargets() {
return enabledTargets; return enabledTargets;
} }


public Indexable<BuildConfiguration> getBuildConfigs() {
return getBundleInfo().getBuildConfigurations();
}

public BuildConfiguration getBuildConfiguration_nonNull(String buildConfigName) throws CommonException { public BuildConfiguration getBuildConfiguration_nonNull(String buildConfigName) throws CommonException {
for(BuildConfiguration buildConfig : getBuildConfigs()) { for(BuildConfiguration buildConfig : getBuildConfigs()) {
if(buildConfig.getName().equals(buildConfigName)) { if(buildConfig.getName().equals(buildConfigName)) {
Expand Down
Expand Up @@ -39,6 +39,8 @@
import melnorme.lang.ide.core.operations.build.ValidatedBuildTarget; import melnorme.lang.ide.core.operations.build.ValidatedBuildTarget;
import melnorme.lang.ide.core.project_model.LangBundleModel; import melnorme.lang.ide.core.project_model.LangBundleModel;
import melnorme.lang.ide.core.project_model.ProjectBuildInfo; import melnorme.lang.ide.core.project_model.ProjectBuildInfo;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.lang.tooling.bundle.LaunchArtifact;
import melnorme.lang.tooling.data.StatusLevel; import melnorme.lang.tooling.data.StatusLevel;
import melnorme.lang.utils.ProcessUtils; import melnorme.lang.utils.ProcessUtils;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
Expand Down Expand Up @@ -148,13 +150,13 @@ protected String getGoPackageSpec(IProject project, String goPackageSpec) throws
} }


@Override @Override
public Indexable<BuildConfiguration> getSubConfigurations_do(ValidatedBuildTarget vbt) throws CommonException { public Indexable<LaunchArtifact> getLaunchArtifacts_do(ValidatedBuildTarget vbt) throws CommonException {
Location binFolderLocation = getBinFolderLocation(vbt); Location binFolderLocation = getBinFolderLocation(vbt);


String binFilePath = getBinFilePath(getValidGoPackageName(vbt.getBuildConfigName())); String binFilePath = getBinFilePath(getValidGoPackageName(vbt.getBuildConfigName()));
String exePath = binFolderLocation.resolve(binFilePath + MiscUtil.getExecutableSuffix()).toString(); String exePath = binFolderLocation.resolve(binFilePath + MiscUtil.getExecutableSuffix()).toString();
return new ArrayList2<>( return new ArrayList2<>(
new BuildConfiguration(vbt.getBuildConfigName(), exePath) new LaunchArtifact(vbt.getBuildConfigName(), exePath)
); );
} }


Expand Down Expand Up @@ -334,8 +336,8 @@ protected String[] getBuildCommand() {
} }


@Override @Override
public Indexable<BuildConfiguration> getSubConfigurations_do(ValidatedBuildTarget vbt) throws CommonException { public Indexable<LaunchArtifact> getLaunchArtifacts_do(ValidatedBuildTarget vbt) throws CommonException {
throw new CommonException("This configuration does not produce executable artifacts."); return new ArrayList2<>();
} }


@Override @Override
Expand Down
2 changes: 1 addition & 1 deletion plugin_ide.core/src/melnorme/lang/ide/core/BundleInfo.java
@@ -1,7 +1,7 @@
package melnorme.lang.ide.core; package melnorme.lang.ide.core;


import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.project_model.AbstractBundleInfo; import melnorme.lang.ide.core.project_model.AbstractBundleInfo;
import melnorme.lang.tooling.bundle.BuildConfiguration;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.collections.Indexable; import melnorme.utilbox.collections.Indexable;


Expand Down
Expand Up @@ -30,7 +30,6 @@


import melnorme.lang.ide.core.launch.BuildTargetLaunchSettings; import melnorme.lang.ide.core.launch.BuildTargetLaunchSettings;
import melnorme.lang.ide.core.operations.build.BuildManager; import melnorme.lang.ide.core.operations.build.BuildManager;
import melnorme.lang.ide.core.operations.build.BuildManager.BuildConfiguration;
import melnorme.lang.ide.core.operations.build.BuildManagerMessages; import melnorme.lang.ide.core.operations.build.BuildManagerMessages;
import melnorme.lang.ide.core.operations.build.BuildTarget; import melnorme.lang.ide.core.operations.build.BuildTarget;
import melnorme.lang.ide.core.operations.build.BuildTarget.BuildTargetData; import melnorme.lang.ide.core.operations.build.BuildTarget.BuildTargetData;
Expand All @@ -42,6 +41,7 @@
import melnorme.lang.ide.ui.navigator.LangNavigatorActionProvider.ViewPartActionGroup; import melnorme.lang.ide.ui.navigator.LangNavigatorActionProvider.ViewPartActionGroup;
import melnorme.lang.ide.ui.operations.EclipseJobUIOperation; import melnorme.lang.ide.ui.operations.EclipseJobUIOperation;
import melnorme.lang.ide.ui.utils.UIOperationsStatusHandler; import melnorme.lang.ide.ui.utils.UIOperationsStatusHandler;
import melnorme.lang.tooling.bundle.LaunchArtifact;
import melnorme.lang.tooling.data.StatusException; import melnorme.lang.tooling.data.StatusException;
import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.collections.Collection2; import melnorme.utilbox.collections.Collection2;
Expand Down Expand Up @@ -94,9 +94,12 @@ protected void addLaunchActions(IMenuManager menu, BuildTargetElement buildTarge
try { try {
ValidatedBuildTarget validatedBuildTarget = buildTargetElement.getValidatedBuildTarget(); ValidatedBuildTarget validatedBuildTarget = buildTargetElement.getValidatedBuildTarget();


Indexable<BuildConfiguration> subConfigurations = validatedBuildTarget.getSubConfigurations(); Indexable<LaunchArtifact> launchArtifacts = validatedBuildTarget.getLaunchArtifacts();
if(subConfigurations.size() > 1) { if(launchArtifacts.size() == 0) {
addRunDebugMenu(menu, buildTargetElement, subConfigurations); return;
}
if(launchArtifacts.size() > 1) {
addRunDebugMenu(menu, buildTargetElement, launchArtifacts);
return; return;
} }


Expand All @@ -110,21 +113,17 @@ protected void addLaunchActions(IMenuManager menu, BuildTargetElement buildTarge
} }


protected void addRunDebugMenu(IMenuManager menu, BuildTargetElement buildTargetElement, protected void addRunDebugMenu(IMenuManager menu, BuildTargetElement buildTargetElement,
Indexable<BuildConfiguration> subConfigurations) { Indexable<LaunchArtifact> launchArtifacts) {
MenuManager runMenu = new MenuManager("Run"); MenuManager runMenu = new MenuManager("Run");
MenuManager debugMenu = new MenuManager("Debug"); MenuManager debugMenu = new MenuManager("Debug");


for(BuildConfiguration subConfig : subConfigurations) { for(LaunchArtifact launchArtifact : launchArtifacts) {


String artifactPath; String label = launchArtifact.getName();
try { String artifactPath = launchArtifact.getArtifactPath();
artifactPath = subConfig.getArtifactPath();
} catch(CommonException e) {
continue;
}


runMenu.add(new LaunchBuildTargetAction(buildTargetElement, true, artifactPath, subConfig.getName())); runMenu.add(new LaunchBuildTargetAction(buildTargetElement, true, artifactPath, label));
debugMenu.add(new LaunchBuildTargetAction(buildTargetElement, false, artifactPath, subConfig.getName())); debugMenu.add(new LaunchBuildTargetAction(buildTargetElement, false, artifactPath, label));
} }


menu.add(runMenu); menu.add(runMenu);
Expand Down
@@ -0,0 +1,33 @@
/*******************************************************************************
* 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.tooling.bundle;

import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;

public class BuildConfiguration {

protected final String name;
protected final String artifactPath;

public BuildConfiguration(String name, String artifactPath) {
this.name = assertNotNull(name);
this.artifactPath = artifactPath;
}

public String getName() {
return name;
}

public String getArtifactPath() {
return artifactPath;
}

}
@@ -0,0 +1,33 @@
/*******************************************************************************
* 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.tooling.bundle;

import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;

public class LaunchArtifact {

protected final String name;
protected final String artifactPath;

public LaunchArtifact(String name, String artifactPath) {
this.name = assertNotNull(name);
this.artifactPath = assertNotNull(artifactPath);
}

public String getName() {
return name;
}

public String getArtifactPath() {
return artifactPath;
}

}
19 changes: 19 additions & 0 deletions plugin_tooling/src-util/melnorme/utilbox/misc/PathUtil.java
Expand Up @@ -12,6 +12,7 @@


import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail; import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail;


import java.io.File;
import java.nio.file.InvalidPathException; import java.nio.file.InvalidPathException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
Expand Down Expand Up @@ -76,4 +77,22 @@ public static Path toPath(Location location) {
return location == null ? null : location.toPath(); return location == null ? null : location.toPath();
} }


/* ----------------- ----------------- */

public static String concatenatePath(String basePath, String subPath) {
return concatenatePath(basePath, subPath, File.separator);
}

/** Concatenate a basepath with a subpath.
* This method is notable for not using the {@link Path} API, therefore it works even on invalid paths. */
public static String concatenatePath(String basePath, String subPath, String separator) {
if(basePath.isEmpty()) {
return subPath;
}
if(!basePath.endsWith(separator)) {
basePath += separator;
}
return basePath + subPath;
}

} }

0 comments on commit f0304ea

Please sign in to comment.