1 11 package org.eclipse.ant.internal.core.ant; 12 13 14 import java.util.ArrayList ; 15 import java.util.Enumeration ; 16 import java.util.HashMap ; 17 import java.util.Hashtable ; 18 import java.util.Iterator ; 19 import java.util.List ; 20 import java.util.Map ; 21 import java.util.Set ; 22 23 import org.apache.tools.ant.BuildEvent; 24 import org.apache.tools.ant.BuildListener; 25 import org.apache.tools.ant.Project; 26 import org.apache.tools.ant.Target; 27 import org.apache.tools.ant.Task; 28 import org.apache.tools.ant.taskdefs.Ant; 29 import org.apache.tools.ant.taskdefs.CallTarget; 30 import org.eclipse.ant.core.AntCorePlugin; 31 import org.eclipse.core.runtime.IProgressMonitor; 32 import org.eclipse.core.runtime.NullProgressMonitor; 33 import org.eclipse.core.runtime.OperationCanceledException; 34 import org.eclipse.core.runtime.SubProgressMonitor; 35 36 39 public class ProgressBuildListener implements BuildListener { 40 41 protected Map projects; 42 protected Project mainProject; 43 protected Project parentProject; 44 private Thread currentTaskThread; 45 46 50 protected class ProjectMonitors { 51 54 private Target mainTarget; 55 private IProgressMonitor mainMonitor; 56 private IProgressMonitor targetMonitor; 57 private IProgressMonitor taskMonitor; 58 59 protected IProgressMonitor getMainMonitor() { 60 return mainMonitor; 61 } 62 63 protected Target getMainTarget() { 64 return mainTarget; 65 } 66 67 protected IProgressMonitor getTargetMonitor() { 68 return targetMonitor; 69 } 70 71 protected IProgressMonitor getTaskMonitor() { 72 return taskMonitor; 73 } 74 75 protected void setMainMonitor(IProgressMonitor mainMonitor) { 76 this.mainMonitor = mainMonitor; 77 } 78 79 protected void setMainTarget(Target mainTarget) { 80 this.mainTarget = mainTarget; 81 } 82 83 protected void setTargetMonitor(IProgressMonitor targetMonitor) { 84 this.targetMonitor = targetMonitor; 85 } 86 87 protected void setTaskMonitor(IProgressMonitor taskMonitor) { 88 this.taskMonitor = taskMonitor; 89 } 90 91 } 92 93 public ProgressBuildListener(Project project, List targetNames, IProgressMonitor monitor) { 94 projects = new HashMap (); 95 mainProject = project; 96 ProjectMonitors monitors = new ProjectMonitors(); 97 if (monitor == null) { 98 monitor= new NullProgressMonitor(); 99 } 100 monitors.setMainMonitor(monitor); 101 projects.put(mainProject, monitors); 102 List targets= new ArrayList (targetNames.size()); 103 for (int i = 0; i < targetNames.size(); i++) { 104 String targetName = (String ) targetNames.get(i); 105 Target target= (Target) mainProject.getTargets().get(targetName); 106 if (target != null) { 107 targets.add(target); 108 } 109 } 110 int work = computeWork(targets); 111 monitors.getMainMonitor().beginTask("", work); } 113 114 117 public void buildStarted(BuildEvent event) { 118 checkCanceled(); 119 } 120 121 protected int computeWork(List targets) { 122 int result = 0; 123 for (int i = 0; i < targets.size(); i++) { 124 result = result + countTarget((Target)targets.get(i), new ArrayList ()); 125 } 126 return result; 127 } 128 129 protected int countTarget(Target target, List alreadySeen) { 130 int result = 1; 131 Project project = target.getProject(); 132 Hashtable targets= project.getTargets(); 133 String targetName; 134 Target dependency; 135 for (Enumeration dependencies = target.getDependencies(); dependencies.hasMoreElements();) { 136 targetName = (String ) dependencies.nextElement(); 137 if (alreadySeen.contains(targetName)) { return result; 139 } 140 alreadySeen.add(targetName); 141 dependency = (Target)targets.get(targetName); 142 if (dependency != null) { 143 result = result + countTarget(dependency, alreadySeen); 144 } 145 } 146 Task[] tasks = target.getTasks(); 148 for (int i = 0; i < tasks.length; i++) { 149 if (tasks[i] instanceof CallTarget) { 150 result = result + (targets.size() - 1); 154 } 155 } 156 return result; 157 } 158 159 162 public void buildFinished(BuildEvent event) { 163 ProjectMonitors monitors = (ProjectMonitors) projects.get(mainProject); 164 monitors.getMainMonitor().done(); 165 Set keys= projects.keySet(); 166 Iterator itr= keys.iterator(); 167 while (itr.hasNext()) { 168 Project project = (Project) itr.next(); 169 project.removeBuildListener(this); 170 project.getReferences().remove(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR); 171 } 172 } 173 174 177 public void targetStarted(BuildEvent event) { 178 checkCanceled(); 179 Project currentProject = event.getProject(); 180 if (currentProject == null) { 181 return; 182 } 183 Target target = event.getTarget(); 184 ProjectMonitors monitors = (ProjectMonitors) projects.get(currentProject); 185 186 if (monitors == null) { 188 monitors = createMonitors(currentProject, target); 189 } 190 191 monitors.setTargetMonitor(subMonitorFor(monitors.getMainMonitor(), 1)); 192 int work = (target != null) ? target.getTasks().length : 100; 193 monitors.getTargetMonitor().beginTask("", work); } 195 196 protected ProjectMonitors createMonitors(Project currentProject, Target target) { 197 ProjectMonitors monitors = new ProjectMonitors(); 198 monitors.setMainTarget(target); 200 List targets= new ArrayList (1); 201 targets.add(target); 202 int work = computeWork(targets); 203 ProjectMonitors parentMonitors = null; 204 if (parentProject == null) { 205 parentMonitors = (ProjectMonitors) projects.get(mainProject); 206 monitors.setMainMonitor(subMonitorFor(parentMonitors.getMainMonitor(), 1)); 207 } else { 208 parentMonitors = (ProjectMonitors) projects.get(parentProject); 209 parentProject = null; 210 monitors.setMainMonitor(subMonitorFor(parentMonitors.getTaskMonitor(), 1)); 211 } 212 monitors.getMainMonitor().beginTask("", work); projects.put(currentProject, monitors); 214 return monitors; 215 } 216 217 220 public void targetFinished(BuildEvent event) { 221 checkCanceled(); 222 Project currentProject = event.getProject(); 223 if (currentProject == null) { 224 return; 225 } 226 ProjectMonitors monitors = (ProjectMonitors) projects.get(currentProject); 227 if (monitors == null) { 228 return; 229 } 230 monitors.getTargetMonitor().done(); 231 if ((currentProject != mainProject) && (monitors.getMainTarget() == event.getTarget())) { 233 monitors.getMainMonitor().done(); 234 projects.remove(currentProject); 235 } 236 } 237 238 241 public void taskStarted(BuildEvent event) { 242 checkCanceled(); 243 Project currentProject = event.getProject(); 244 if (currentProject == null) { 245 return; 246 } 247 currentProject.getReferences().remove(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR); 248 ProjectMonitors monitors = (ProjectMonitors) projects.get(currentProject); 249 if (monitors == null) { 250 return; 251 } 252 Task task = event.getTask(); 253 if (task == null) { 254 return; 255 } 256 currentTaskThread= Thread.currentThread(); 257 monitors.setTaskMonitor(subMonitorFor(monitors.getTargetMonitor(), 1)); 258 monitors.getTaskMonitor().beginTask("", 1); if (task instanceof Ant) { 261 parentProject = currentProject; 262 } else { 263 currentProject.addReference(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR, monitors.getTaskMonitor()); 264 } 265 } 266 267 270 public void taskFinished(BuildEvent event) { 271 checkCanceled(); 272 Project project = event.getProject(); 273 if (project == null) { 274 return; 275 } 276 project.getReferences().remove(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR); 277 ProjectMonitors monitors = (ProjectMonitors) projects.get(project); 278 if (monitors == null) { 279 return; 280 } 281 monitors.getTaskMonitor().done(); 282 currentTaskThread= null; 283 } 284 285 288 public void messageLogged(BuildEvent event) { 289 checkCanceled(); 290 } 291 292 protected void checkCanceled() { 293 if (currentTaskThread != null && currentTaskThread != Thread.currentThread()) { 297 return; 298 } 299 ProjectMonitors monitors = (ProjectMonitors) projects.get(mainProject); 300 if (monitors.getMainMonitor().isCanceled()) { 301 currentTaskThread= null; 302 throw new OperationCanceledException(InternalAntMessages.ProgressBuildListener_Build_cancelled__5); 303 } 304 } 305 306 protected IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) { 307 if (monitor == null) { 308 return new NullProgressMonitor(); 309 } 310 if (monitor instanceof NullProgressMonitor) { 311 return monitor; 312 } 313 return new SubProgressMonitor(monitor, ticks); 314 } 315 } 316 | Popular Tags |