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

Commit

Permalink
LANG: Refactor BuildManager, added BuildType.
Browse files Browse the repository at this point in the history
  • Loading branch information
bruno-medeiros committed Jul 23, 2015
1 parent 58c5e12 commit 99ee9cc
Show file tree
Hide file tree
Showing 22 changed files with 402 additions and 212 deletions.
Expand Up @@ -29,17 +29,17 @@ public class BuildTargetsSerializer_Test extends CommonTest {
public void testname() throws Exception { testname$(); }
public void testname$() throws Exception {
testSerialize(new ArrayList2<>());
testSerialize(new ArrayList2<>(createBuildTarget(true, null, "-opt")));
testSerialize(new ArrayList2<>(createBuildTarget(true, "", "-opt")));
testSerialize(new ArrayList2<>(createBuildTarget(false, "", null)));
testSerialize(new ArrayList2<>(
createBuildTarget(false, null, ""),
createBuildTarget(false, "", ""),
createBuildTarget(true, "blah", "-opt"),
createBuildTarget(true, "xxx", null)
));
}

protected BuildTarget createBuildTarget(boolean enabled, String name, String buildOptions) {
return LangCore.getBuildManager()
.createBuildTarget(name, BuildTargetsSerializer.DUMMY_BUILD_CONFIG, enabled, buildOptions);
protected BuildTarget createBuildTarget(boolean enabled, String targetName, String buildOptions) {
return LangCore.getBuildManager().createBuildTarget(targetName, enabled, buildOptions);
}

protected void testSerialize(ArrayList2<BuildTarget> buildTargets) {
Expand Down
Expand Up @@ -149,6 +149,14 @@ public static void deleteResource(IResource resource) throws CoreException {
resource.delete(false, new NullProgressMonitor());
}

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

public static IProject createLangProject(String projectName, boolean overwrite) throws CoreException {
IProject project = ResourceUtils.createAndOpenProject(projectName, overwrite);
setupLangProject(project, false);
return project;
}

public static void setupLangProject(IProject project) throws CoreException {
setupLangProject(project, true);
}
Expand Down
Expand Up @@ -22,13 +22,19 @@
public class BuildTargetValidator extends AbstractValidator2 {

protected final BuildManager buildManager;
protected boolean definedTargetsOnly;

public BuildTargetValidator() {
this(LangCore.getBuildManager());
this(true);
}

public BuildTargetValidator(BuildManager buildManager) {
public BuildTargetValidator(boolean definedTargetsOnly) {
this(LangCore.getBuildManager(), definedTargetsOnly);
}

public BuildTargetValidator(BuildManager buildManager, boolean definedTargetsOnly) {
this.buildManager = buildManager;
this.definedTargetsOnly = definedTargetsOnly;
}

public BuildTarget getBuildTarget(IProject project, String buildTargetName)
Expand All @@ -39,7 +45,11 @@ public BuildTarget getBuildTarget(IProject project, String buildTargetName)

ProjectBuildInfo buildInfo = buildManager.getValidBuildInfo(project);

BuildTarget buildTarget = buildInfo.getBuildTarget(buildTargetName);
BuildTarget buildTarget =
definedTargetsOnly ?
buildInfo.getDefinedBuildTarget(buildTargetName) :
buildInfo.getBuildTargetFor(buildTargetName);

if(buildTarget == null) {
throw error(LaunchMessages.PROCESS_LAUNCH_NoSuchBuildTarget);
}
Expand Down
Expand Up @@ -59,7 +59,7 @@ protected ProjectValidator getProjectValidator() {
/* ----------------- ----------------- */

public BuildTargetValidator getBuildTargetValidator() {
return new BuildTargetValidator();
return new BuildTargetValidator(false);
}

public BuildTarget getBuildTarget() throws CoreException, CommonException {
Expand All @@ -82,7 +82,7 @@ public Path getExecutableFilePath(BuildTarget buildTarget, String exePathString)

Path artifactPath = null;
if(buildTarget != null) {
artifactPath = buildTarget.getBuildConfig().getArtifactPath();
artifactPath = buildTarget.getArtifactPath(getProject());
}
if(artifactPath == null) {
throw error(LaunchMessages.PROCESS_LAUNCH_CouldNotDetermineExeLocation);
Expand Down
Expand Up @@ -10,6 +10,8 @@
*******************************************************************************/
package melnorme.lang.ide.core.operations.build;

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

import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map.Entry;
Expand All @@ -20,8 +22,8 @@

import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.operations.OperationInfo;
import melnorme.lang.ide.core.operations.build.BuildTarget.BuildType;
import melnorme.lang.ide.core.project_model.AbstractBundleInfo;
import melnorme.lang.ide.core.project_model.AbstractBundleInfo.BuildConfiguration;
import melnorme.lang.ide.core.project_model.IProjectModelListener;
import melnorme.lang.ide.core.project_model.LangBundleModel;
import melnorme.lang.ide.core.project_model.ProjectBasedModel;
Expand Down Expand Up @@ -150,28 +152,52 @@ protected void loadProjectBuildInfo(IProject project, AbstractBundleInfo bundleI
}
}

Indexable<BuildConfiguration> buildConfigs = bundleInfo.getBuildConfigurations();

ArrayList2<BuildTarget> buildTargets = new ArrayList2<>();

boolean isFirstConfig = true;
for(BuildConfiguration buildConfig : buildConfigs) {
addBuildTargetFromConfig(buildTargets, buildConfig, currentBuildInfo, isFirstConfig);
isFirstConfig = false;

Indexable<String> buildConfigs = bundleInfo.getBuildConfigurations();
for(String buildConfig : buildConfigs) {

Indexable<BuildType> buildTypes = getBuildTypes();
for (BuildType buildType : buildTypes) {

addBuildTargetFromConfig(buildTargets, buildConfig, buildType, currentBuildInfo, isFirstConfig);
isFirstConfig = false;
}

}

ProjectBuildInfo newBuildInfo = new ProjectBuildInfo(this, project, buildTargets);
setProjectBuildInfo(project, newBuildInfo);
}

protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, BuildConfiguration buildConfig,
ProjectBuildInfo currentBuildInfo, boolean isFirstConfig) {
String name = buildConfig.getName();
addBuildTargetFromConfig(buildTargets, buildConfig, currentBuildInfo, isFirstConfig, name);
protected final Indexable<BuildType> getBuildTypes() {
Indexable<BuildType> buildTypes = getBuildTypes_do();
assertTrue(buildTypes.size() > 0);
return buildTypes;
}

protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, BuildConfiguration buildConfig,
ProjectBuildInfo currentBuildInfo, boolean isFirstConfig, String targetName) {
protected abstract Indexable<BuildType> getBuildTypes_do();

public BuildType getBuildType_NonNull(String buildTypeName) throws CommonException {
if(buildTypeName == null) {
return getBuildTypes().get(0);
}

for(BuildType buildType : getBuildTypes()) {
if(buildType.getName().equals(buildTypeName)) {
return buildType;
}
}
throw new CommonException(BuildManagerMessages.Error_NoSuchBuildType(buildTypeName));
}

protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, String buildConfig,
BuildType buildType, ProjectBuildInfo currentBuildInfo, boolean isFirstConfig) {

String targetName = buildConfig + BuildTarget.BUILD_TYPE_NAME_SEPARATOR + buildType.getName();

BuildTarget oldBuildTarget = currentBuildInfo == null ?
null :
currentBuildInfo.getDefinedBuildTarget(targetName);
Expand All @@ -181,18 +207,17 @@ protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, Bu

if(oldBuildTarget == null) {
enabled = isFirstConfig;
buildOptions = getDefaultBuildOptions(targetName);
buildOptions = null;
} else {
enabled = oldBuildTarget.isEnabled();
buildOptions = oldBuildTarget.getBuildOptions();
}

buildTargets.add(createBuildTarget(targetName, buildConfig, enabled, buildOptions));
buildTargets.add(createBuildTarget(targetName, enabled, buildOptions));
}

@SuppressWarnings("unused")
public String getDefaultBuildOptions(String buildTargetName) {
return "";
public BuildTarget createBuildTarget(String targetName, boolean enabled, String buildOptions) {
return new BuildTarget(targetName, enabled, buildOptions);
}

public ProjectBuildInfo setProjectBuildInfo(IProject project, ProjectBuildInfo newProjectBuildInfo) {
Expand All @@ -216,11 +241,6 @@ public BuildTarget getBuildTargetFor(ProjectBuildInfo projectBuildInfo, String t
return projectBuildInfo.getDefinedBuildTarget(targetName);
}

public BuildTarget createBuildTarget(String targetName, BuildConfiguration buildConfig,
boolean enabled, String buildOptions) {
return new BuildTarget(targetName, buildConfig, enabled, buildOptions);
}

/* ----------------- Build operations ----------------- */

public IBuildTargetOperation newProjectBuildOperation(IProject project, boolean fullBuild) throws CommonException {
Expand Down
Expand Up @@ -28,4 +28,8 @@ public interface BuildManagerMessages {

public String MSG_Starting_LANG_Build = "Starting {0} build";

}
public static String Error_NoSuchBuildType(String buildTypeString) {
return "No such build type: `" + buildTypeString + "`.";
}

}
Expand Up @@ -14,37 +14,38 @@
import static melnorme.utilbox.core.CoreUtil.areEqual;
import static melnorme.utilbox.misc.StringUtil.nullAsEmpty;

import melnorme.lang.ide.core.project_model.AbstractBundleInfo.BuildConfiguration;
import java.nio.file.Path;

import org.eclipse.core.resources.IProject;

import melnorme.lang.ide.core.LangCore;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.misc.HashcodeUtil;
import melnorme.utilbox.misc.StringUtil;

public class BuildTarget {

protected final String targetName;
protected final BuildConfiguration buildConfig;
protected final boolean enabled;
protected final String buildOptions;
public static final String BUILD_TYPE_NAME_SEPARATOR = "#";

public BuildTarget(String targetName, BuildConfiguration buildConfig, boolean enabled, String buildOptions) {
this.targetName = nullAsEmpty(targetName);
this.buildConfig = assertNotNull(buildConfig);
this.enabled = enabled;
this.buildOptions = nullAsEmpty(buildOptions);
public static String getBuildConfigString(String targetName) {
return StringUtil.substringUntilMatch(targetName, BuildTarget.BUILD_TYPE_NAME_SEPARATOR);
}

public String getTargetName() {
return targetName;
public static String getBuildTypeString(String targetName) {
return StringUtil.segmentAfterMatch(targetName, BuildTarget.BUILD_TYPE_NAME_SEPARATOR);
}

public BuildConfiguration getBuildConfig() {
return buildConfig;
}

public boolean isEnabled() {
return enabled;
}
protected final String buildConfiguration;
protected final String buildTypeName;
protected final boolean enabled;
protected final String buildOptions;

public String getBuildOptions() {
return buildOptions;
public BuildTarget(String targetName, boolean enabled, String buildOptions) {
assertNotNull(targetName);
this.buildConfiguration = nullAsEmpty(getBuildConfigString(targetName));
this.buildTypeName = getBuildTypeString(targetName);
this.enabled = enabled;
this.buildOptions = buildOptions;
}

@Override
Expand All @@ -55,16 +56,79 @@ public boolean equals(Object obj) {
BuildTarget other = (BuildTarget) obj;

return
areEqual(targetName, other.targetName) &&
areEqual(buildConfiguration, other.buildConfiguration) &&
areEqual(buildTypeName, other.buildTypeName) &&
areEqual(enabled, other.enabled) &&
areEqual(buildOptions, other.buildOptions);
}

@Override
public int hashCode() {
return HashcodeUtil.combinedHashCode(targetName, enabled, buildOptions);
return HashcodeUtil.combinedHashCode(buildConfiguration, buildTypeName, enabled, buildOptions);
}

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

public String getBuildConfiguration() {
return buildConfiguration;
}

public boolean isEnabled() {
return enabled;
}

public String getBuildOptions() {
return buildOptions;
}

public String getBuildTypeName() {
return buildTypeName;
}

public String getTargetName() {
return buildConfiguration + StringUtil.prefixStr(BUILD_TYPE_NAME_SEPARATOR, buildTypeName);
}

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

public static abstract class BuildType {

protected final String name;

public BuildType(String name) {
this.name = assertNotNull(name);
}

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

public String getName() {
return name;
}

public abstract String getDefaultBuildOptions(BuildTarget buildTarget, IProject project)
throws CommonException;

public abstract Path getArtifactPath(BuildTarget buildTarget, IProject project)
throws CommonException;

}

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

protected BuildManager getBuildManager() {
return LangCore.getBuildManager();
}

protected BuildType getBuildType() throws CommonException {
return getBuildManager().getBuildType_NonNull(getBuildTypeName());
}

public String getDefaultBuildOptions(IProject project) throws CommonException {
return getBuildType().getDefaultBuildOptions(this, project);
}

public Path getArtifactPath(IProject project) throws CommonException {
return getBuildType().getArtifactPath(this, project);
}

}

0 comments on commit 99ee9cc

Please sign in to comment.