1 28 29 package com.idaremedia.antx.flowcontrol.call; 30 31 import java.util.Iterator ; 32 import java.util.List ; 33 34 import org.apache.tools.ant.BuildException; 35 import org.apache.tools.ant.ComponentHelper; 36 import org.apache.tools.ant.Project; 37 import org.apache.tools.ant.Task; 38 39 import com.idaremedia.antx.AntXFixture; 40 import com.idaremedia.antx.AntX; 41 import com.idaremedia.antx.helpers.Empties; 42 import com.idaremedia.antx.helpers.SIDs; 43 import com.idaremedia.antx.helpers.Tk; 44 import com.idaremedia.antx.ownhelpers.TaskExaminer; 45 import com.idaremedia.antx.parameters.ExecutionMode; 46 import com.idaremedia.antx.parameters.FixturePassthru; 47 48 87 88 public final class InlineForEachTask extends ForEachTask 89 implements InlinedTarget, InlinedTargetContainer 90 { 91 96 public final static int MAX_SEARCH_DEPTH= 3; 97 98 99 102 public InlineForEachTask() 103 { 104 super(AntX.flow+"foreach"); 105 } 106 107 108 112 public InlineForEachTask(String iam) 113 { 114 super(iam); 115 } 116 117 118 119 124 public void setName(String name) 125 { 126 require_(name!=null,"setName- nonzro name"); 127 m_name = name; 128 } 129 130 131 132 136 public String getName() 137 { 138 return m_name; 139 } 140 141 142 143 149 public void setPassthru(FixturePassthru passthru) 150 { 151 require_(passthru!=null,"setPassthru- nonzro option"); 152 m_passthru = FixturePassthru.from(passthru.getIndex()); } 154 155 156 157 164 public final FixturePassthru getPassthruOption() 165 { 166 return m_passthru; 167 } 168 169 170 171 176 public void setMode(String Xmodestring) 177 { 178 require_(Xmodestring!=null,"setMode- nonzro string"); 179 m_Xmode = ExecutionMode.from(Xmodestring,m_Xmode); 180 if (asMacrodef() && m_name==null) { 181 m_name = SIDs.next("foreach"); 182 m_generatedName = true; 183 } 184 } 185 186 187 188 193 public ExecutionMode getMode() 194 { 195 return m_Xmode; 196 } 197 198 199 200 204 private boolean asMacrodef() 205 { 206 return ExecutionMode.LOCAL.equals(getMode()); 207 } 208 209 210 211 217 public String getMacroNamesList() 218 { 219 return asMacrodef() ? getName()+"_macrodef" : null; 220 } 221 222 223 224 227 public String toString() 228 { 229 return getName(); 230 } 231 232 233 234 239 public void addTask(Task task) 240 { 241 m_nestedTasks.add(task); 242 } 243 244 245 246 249 protected final List getTasksList() 250 { 251 return m_nestedTasks; 252 } 253 254 255 256 260 public Task[] getTasks() 261 { 262 return (Task[])getTasksList().toArray(Empties.EMPTY_TASK_ARRAY); 263 } 264 265 266 267 268 273 protected OverlayParametersHelper getParametersKeeper() 274 { 275 if (m_paramsHelper==null) { 276 m_paramsHelper= new OverlayParametersHelper(getProject()); 277 m_paramsHelper.addOverride(this); 278 } 279 return m_paramsHelper; 280 } 281 282 283 284 288 protected final int getKindOfRunnablesSpecified() 289 { 290 return 1; 291 } 292 293 294 295 300 protected final void performTheTasksList() 301 { 302 Iterator itr = getTasksList().listIterator(); 303 while (itr.hasNext()) { 304 Task nestedTask = (Task)itr.next(); 305 nestedTask.perform(); 306 } 307 } 308 309 310 311 318 protected void verifyCanExecute_(String calr) 319 throws BuildException 320 { 321 if (Tk.isWhitespace(getName())) { 322 String ermsg = getAntXMsg("flow.task.needs.name",getTaskName()); 323 log(ermsg, Project.MSG_ERR); 324 throw new BuildException(ermsg, getLocation()); 325 } 326 327 super.verifyCanExecute_(calr); 328 329 if (asMacrodef()) { 330 if (!m_generatedName) { 331 String ermsg = getAntXMsg("task.unsupported.attr", 332 getTaskName()+"(mode=local)","name"); 333 log(ermsg, Project.MSG_ERR); 334 throw new BuildException(ermsg, getLocation()); 335 } 336 installMacrodef(); 337 } 338 } 339 340 341 342 348 protected List copyOfOrderedTargetCallers() 349 throws BuildException 350 { 351 TargetCaller caller; 352 353 if (asMacrodef()) { 354 verify_(m_macrodefInstalled!=null,"getCalrs- macrodef inited"); 355 MacroInstanceCaller mcaller = new MacroInstanceCaller(this); 356 mcaller.setTarget(m_macrodefInstalled); 357 caller = mcaller; 358 } 359 else { 360 String targetName = StepLauncherCaller.findSpecialTarget(this); 361 caller = StepLauncherCaller.create(this,true,targetName, 362 this.getName(), 363 InlineForEachTask.class.getName(), 364 MAX_SEARCH_DEPTH); 365 } 366 367 transferOverlayParameters(caller); 368 369 List l = AntXFixture.newList(2); 370 l.add(caller); 371 372 return l; 373 } 374 375 376 377 382 public void run() throws BuildException 383 { 384 performTheTasksList(); 385 } 386 387 388 389 394 public void execute() 395 { 396 boolean uninstallMacrodef = asMacrodef(); 397 super.execute(); 398 399 if (uninstallMacrodef) { 400 String macroname = getMacroNamesList(); 401 ComponentHelper ch = ComponentHelper.getComponentHelper(getProject()); 402 Object was = ch.getAntTypeTable().remove(macroname); 403 if (was!=null) { 404 log("Removed macrodef("+macroname+") from type table", 405 Project.MSG_DEBUG); 406 } else { 407 log("Unable to remove macrodef("+macroname+") from type table", 408 Project.MSG_DEBUG); 409 } 410 } 411 } 412 413 414 415 422 private void installMacrodef() 423 { 424 if (m_macrodefInstalled==null) { 425 String macroname = getMacroNamesList(); 426 427 ComponentHelper ch = ComponentHelper.getComponentHelper(getProject()); 428 if (ch.getDefinition(macroname)==null) { 429 InlineForEachMacroDef macrodefFactory = new InlineForEachMacroDef(); 430 TaskExaminer.initTaskFrom(macrodefFactory,this); 431 432 macrodefFactory.setName(macroname); 433 434 Iterator itr = getTasksList().listIterator(); 435 while (itr.hasNext()) { 436 Task nestedTask = (Task)itr.next(); 437 macrodefFactory.addTask(nestedTask); 438 } 439 440 log("Installing macrodef("+macrodefFactory.getName()+ 441 ") as foreach implementation.",Project.MSG_DEBUG); 442 443 macrodefFactory.perform(); 444 445 } else { 446 log("Reusing existing macrodef("+macroname+ 447 ") as foreach implementation.",Project.MSG_DEBUG); 448 } 449 m_macrodefInstalled = macroname; } 451 } 452 453 454 private FixturePassthru m_passthru = FixturePassthru.PROPERTIES; 455 private String m_name; private boolean m_generatedName; 457 private List m_nestedTasks= AntXFixture.newList(10); 458 private ExecutionMode m_Xmode= ExecutionMode.ISOLATED; 459 private String m_macrodefInstalled;} 461 462 463 | Popular Tags |