From 77d9a2e79b8e1581e8ef2da4d4fe618cd9e49c27 Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Mon, 24 Apr 2006 14:13:06 +0000 Subject: [PATCH] Progress Monitor support for internal builder --- .../internal/buildmodel/CommandBuilder.java | 27 ++++++- .../buildmodel/DescriptionBuilder.java | 73 ++++++++++++++++--- .../internal/buildmodel/StepBuilder.java | 51 +++++++++++-- .../core/GeneratedMakefileBuilder.java | 17 +++-- 4 files changed, 140 insertions(+), 28 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java index 0582ae28aba..e91bdcfe888 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java @@ -82,6 +82,10 @@ public class CommandBuilder implements IBuildModelBuilder { public int build(OutputStream out, OutputStream err, IProgressMonitor monitor){ + //TODO: should we display the command line here? + monitor.beginTask("", getNumCommands()); //$NON-NLS-1$ + monitor.subTask(""/*getCommandLine()*/); //$NON-NLS-1$ + CommandLauncher launcher = new CommandLauncher(); int status = STATUS_OK; @@ -99,8 +103,7 @@ public class CommandBuilder implements IBuildModelBuilder { //wrapping out and err streams to avoid their closure int st = launcher.waitAndRead(wrap(out), wrap(err), - new SubProgressMonitor(monitor, - IProgressMonitor.UNKNOWN)); + new SubProgressMonitor(monitor, getNumCommands())); switch(st){ case CommandLauncher.OK: if(fProcess.exitValue() != 0) @@ -124,6 +127,8 @@ public class CommandBuilder implements IBuildModelBuilder { printMessage(fErrMsg, out); break; } + + monitor.done(); return status; } @@ -158,4 +163,22 @@ public class CommandBuilder implements IBuildModelBuilder { } + public int getNumCommands() { + return 1; + } + + protected String getCommandLine() { + StringBuffer buf = new StringBuffer(); + if (fCmd != null) { + buf.append(fCmd.getCommand().toOSString()); + String args[] = fCmd.getArgs(); + for (int i = 0; i < args.length; i++) { + buf.append(' '); + buf.append(args[i]); + } + buf.append(LINE_SEPARATOR); + } + return buf.toString(); + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java index addac8a418c..1c8a8fa267d 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/DescriptionBuilder.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.managedbuilder.internal.buildmodel; import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription; @@ -19,6 +21,8 @@ import org.eclipse.cdt.managedbuilder.buildmodel.IStepVisitor; 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.SubProgressMonitor; /** * @@ -36,19 +40,27 @@ public class DescriptionBuilder implements IBuildModelBuilder { private IPath fCWD; private boolean fBuildIncrementaly; private boolean fResumeOnErrs; + private Map fStepToStepBuilderMap = new HashMap(); + private int fNumCommands = -1; + private GenDirInfo fDir; private class BuildStepVisitor implements IStepVisitor{ private OutputStream fOut; private OutputStream fErr; private IProgressMonitor fMonitor; - private GenDirInfo fDir = new GenDirInfo(fDes.getConfiguration()); private int fStatus; + private boolean fBuild; public BuildStepVisitor(OutputStream out, OutputStream err, IProgressMonitor monitor){ + this(out, err, monitor, true); + } + + public BuildStepVisitor(OutputStream out, OutputStream err, IProgressMonitor monitor, boolean build){ fOut = out; fErr = err; fMonitor = monitor; fStatus = STATUS_OK; + fBuild = build; } /* (non-Javadoc) @@ -64,19 +76,23 @@ public class DescriptionBuilder implements IBuildModelBuilder { && (!fBuildIncrementaly || action.needsRebuild())){ if(DbgUtil.DEBUG) DbgUtil.trace("step " + DbgUtil.stepName(action) + " needs rebuild" ); - StepBuilder builder = new StepBuilder(action, fCWD, fResumeOnErrs, fDir); + StepBuilder builder = getStepBuilder(action);//new StepBuilder(action, fCWD, fResumeOnErrs, fDir); - switch(builder.build(fOut, fErr, fMonitor)){ - case STATUS_OK: + if(fBuild){ + switch(builder.build(fOut, fErr, new SubProgressMonitor(fMonitor, builder.getNumCommands()))){ + case STATUS_OK: + break; + case STATUS_CANCELLED: + fStatus = STATUS_CANCELLED; + break; + case STATUS_ERROR_BUILD: + case STATUS_ERROR_LAUNCH: + default: + fStatus = STATUS_ERROR_BUILD; break; - case STATUS_CANCELLED: - fStatus = STATUS_CANCELLED; - break; - case STATUS_ERROR_BUILD: - case STATUS_ERROR_LAUNCH: - default: - fStatus = STATUS_ERROR_BUILD; - break; + } + } else { + fNumCommands += builder.getNumCommands(); } } @@ -105,6 +121,7 @@ public class DescriptionBuilder implements IBuildModelBuilder { fCWD = cwd; fBuildIncrementaly = buildIncrementaly; fResumeOnErrs = resumeOnErrs; + fDir = new GenDirInfo(fDes.getConfiguration()); if(fCWD == null) fCWD = fDes.getDefaultBuildDirLocation(); @@ -116,6 +133,10 @@ public class DescriptionBuilder implements IBuildModelBuilder { public int build(OutputStream out, OutputStream err, IProgressMonitor monitor){ + //TODO: should we specify some task name here? + monitor.beginTask("", getNumCommands()); //$NON-NLS-1$ + monitor.subTask(""); //$NON-NLS-1$ + BuildStepVisitor visitor = new BuildStepVisitor(out, err, monitor); try { BuildDescriptionManager.accept(visitor, @@ -123,7 +144,35 @@ public class DescriptionBuilder implements IBuildModelBuilder { } catch (CoreException e) { return STATUS_ERROR_LAUNCH; } + + monitor.done(); + return visitor.fStatus; } + + public int getNumCommands() { + if(fNumCommands == -1){ + fNumCommands = 0; + BuildStepVisitor visitor = new BuildStepVisitor(null, null, new NullProgressMonitor(), false); + try { + BuildDescriptionManager.accept(visitor, + fDes, true); + } catch (CoreException e) { + //TODO: report an error + } + if(DbgUtil.DEBUG) + DbgUtil.trace("Description Builder: total work = " + fNumCommands); //$NON-NLS-1$ + } + return fNumCommands; + } + + protected StepBuilder getStepBuilder(IBuildStep step){ + StepBuilder b = (StepBuilder)fStepToStepBuilderMap.get(step); + if(b == null){ + b = new StepBuilder(step, fCWD, fResumeOnErrs, fDir); + fStepToStepBuilderMap.put(step, b); + } + return b; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java index 62ebe40545e..fa5fdd261b2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/StepBuilder.java @@ -23,6 +23,8 @@ 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.SubProgressMonitor; /** * @@ -39,6 +41,8 @@ public class StepBuilder implements IBuildModelBuilder { private IPath fCWD; private GenDirInfo fDirs; private boolean fResumeOnErrs; + private int fNumCommands = -1; + private CommandBuilder fCommandBuilders[]; public StepBuilder(IBuildStep step){ this(step, null); @@ -66,18 +70,23 @@ public class StepBuilder implements IBuildModelBuilder { */ public int build(OutputStream out, OutputStream err, IProgressMonitor monitor){ + + monitor.beginTask("", getNumCommands()); //$NON-NLS-1$ + monitor.subTask(""); //$NON-NLS-1$ + int status = STATUS_OK; - IBuildCommand cmds[] = fStep.getCommands(fCWD, null, null, true); - if(cmds != null){ - createOutDirs(monitor); + CommandBuilder bs[] = getCommandBuilders(); + if(bs.length > 0){ + //TODO: monitor + createOutDirs(new NullProgressMonitor()); for(int i = 0; - i < cmds.length + i < bs.length && status != STATUS_CANCELLED && (fResumeOnErrs || status == STATUS_OK); i++){ - CommandBuilder builder = new CommandBuilder(cmds[i]); - switch(builder.build(out, err, monitor)){ + CommandBuilder builder = bs[i]; + switch(builder.build(out, err, new SubProgressMonitor(monitor, builder.getNumCommands()))){ case STATUS_OK: break; case STATUS_CANCELLED: @@ -92,8 +101,10 @@ public class StepBuilder implements IBuildModelBuilder { break; } } - status = postProcess(status, monitor); + //TODO: monitor + status = postProcess(status, new NullProgressMonitor()); } + monitor.done(); return status; } @@ -166,4 +177,30 @@ public class StepBuilder implements IBuildModelBuilder { fDirs.createDir(rcs[i], monitor); } } + + public int getNumCommands() { + if(fNumCommands == -1){ + CommandBuilder bs[] = getCommandBuilders(); + fNumCommands = 0; + for(int i = 0; i < bs.length; i++){ + fNumCommands += bs[i].getNumCommands(); + } + } + return fNumCommands; + } + + protected CommandBuilder[] getCommandBuilders(){ + if(fCommandBuilders == null){ + IBuildCommand cmds[] = fStep.getCommands(fCWD, null, null, true); + if(cmds == null) + fCommandBuilders = new CommandBuilder[0]; + else { + fCommandBuilders = new CommandBuilder[cmds.length]; + for(int i = 0; i < cmds.length; i++){ + fCommandBuilders[i] = new CommandBuilder(cmds[i]); + } + } + } + return fCommandBuilders; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index 0d76f0faee3..42254346a1e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -1188,6 +1188,13 @@ public class GeneratedMakefileBuilder extends ACBuilder { if (monitor == null) { monitor = new NullProgressMonitor(); } + + String[] msgs = new String[2]; + msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER); + msgs[1] = currentProject.getName(); + + monitor.beginTask("", 1000); //$NON-NLS-1$ + monitor.subTask(ManagedMakeMessages.getFormattedString(MAKE, msgs)); try { int flags = 0; @@ -1200,12 +1207,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { IBuildDescription des = BuildDescriptionManager.createBuildDescription(cfg, delta, flags); - IBuildModelBuilder builder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr); - - String[] msgs = new String[2]; - msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER); - msgs[1] = currentProject.getName(); - monitor.subTask(ManagedMakeMessages.getFormattedString(MAKE, msgs)); + DescriptionBuilder builder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr); // Get a build console for the project StringBuffer buf = new StringBuffer(); @@ -1247,7 +1249,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { // until we explicitly close it. See bug#123302. OutputStream epmOutputStream = epm.getOutputStream(); - int status = builder.build(epmOutputStream, epmOutputStream, monitor); + int status = builder.build(epmOutputStream, epmOutputStream, new SubProgressMonitor(monitor, 1000)); //no refresh is needed since the builder now performs //a refresh automatically after each build step @@ -1310,6 +1312,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { forgetLastBuiltState(); } finally { getGenerationProblems().clear(); + monitor.done(); } } }