1 28 29 package com.idaremedia.antx.ownhelpers; 30 31 import java.util.Enumeration ; 32 import java.util.Iterator ; 33 import java.util.Map ; 34 35 import org.apache.tools.ant.BuildException; 36 import org.apache.tools.ant.ComponentHelper; 37 import org.apache.tools.ant.Project; 38 import org.apache.tools.ant.ProjectComponent; 39 import org.apache.tools.ant.ProjectHelper; 40 import org.apache.tools.ant.RuntimeConfigurable; 41 import org.apache.tools.ant.Target; 42 import org.apache.tools.ant.Task; 43 import org.apache.tools.ant.UnknownElement; 44 45 import com.idaremedia.antx.AntX; 46 import com.idaremedia.antx.AntXFixture; 47 import com.idaremedia.antx.FixtureAdministrator; 48 import com.idaremedia.antx.FixtureCore; 49 import com.idaremedia.antx.FixtureOverlays; 50 import com.idaremedia.antx.FixtureIds; 51 import com.idaremedia.antx.apis.Requester; 52 import com.idaremedia.antx.helpers.TaskHandle; 53 import com.idaremedia.antx.helpers.Tk; 54 55 76 77 public final class TaskExaminer implements FixtureCore, FixtureAdministrator 78 { 79 private static final String IAM_= AntX.utilities+"TaskExaminer:"; 80 81 82 85 public static final String ITID= FixtureIds.TASK_EXAMINER; 86 87 88 89 92 private static Task expose(Task t, ProjectComponent wrt) 93 { 94 UnknownElement ue = (UnknownElement)t; 95 t = ue.getTask(); if (t==null) { 97 FixtureOverlays I= FixtureOverlays.getContextInstance(); 98 I.install(ITID,Boolean.TRUE); 99 try { 100 ue.maybeConfigure(); 101 t = ue.getTask(); 102 if (t==null || t==ue) { 103 throw new BuildException 104 (AntX.uistrs().get("task.cant.flip.unknown", 105 ue.getTaskName())); 106 } 107 } finally { 108 FixtureOverlays.uninstallIfIs(ITID,new Requester.ForComponent(wrt),IAM_); 109 } 110 } 111 return t; 112 } 113 114 115 116 122 private static boolean match(Task t, Class [] candidates) 123 { 124 Class cc = trueClass(t); 126 if (cc!=null) { 127 for (int i=0;i<candidates.length;i++) { 128 if (candidates[i].isAssignableFrom(cc)) { 129 return true; 130 } 131 } 132 } 133 return false; 134 } 135 136 137 138 143 private static Map normalize(Map atrs) 144 { 145 Map norm = AntXFixture.newMap(); 146 Iterator itr = atrs.entrySet().iterator(); 147 while (itr.hasNext()) { 148 Map.Entry mE = (Map.Entry )itr.next(); 149 norm.put(Tk.lowercaseFrom(mE.getKey().toString()),mE.getValue()); 150 } 151 atrs.clear(); return norm; 153 } 154 155 156 157 164 private static String tryResolve(final Project P, final String string) 165 { 166 try { 167 return Tk.resolveString(P,string); 168 } catch(BuildException tooSoonX) { 169 return string; 170 } 171 } 172 173 174 175 186 public static Class trueClass(Task t) 187 { 188 AntX.require_(t!=null && t.getProject()!=null,IAM_,"trueClas- inited prxy"); 189 190 if (t instanceof UnknownElement) { 191 UnknownElement ue = (UnknownElement)t; 192 ComponentHelper ch = ComponentHelper.getComponentHelper(t.getProject()); 193 String cn = ProjectHelper.genComponentName(ue.getNamespace(), ue.getTag()); 194 return ch.getComponentClass(cn); 195 } 196 197 return t.getClass(); 198 } 199 200 201 202 214 public static Task trueTask(Task t, ProjectComponent wrt) 215 { 216 AntX.require_(t!=null && wrt!=null, IAM_, 217 "trueTask- nonzro args"); 218 219 if (t instanceof UnknownElement) { 220 t = expose(t,wrt); 221 } 222 return t; 223 } 224 225 226 227 241 public static Task trueTask(Task t, Class [] coi, ProjectComponent wrt) 242 { 243 AntX.require_(t!=null && wrt!=null && coi!=null, IAM_, 244 "trueTask- nonzro args"); 245 246 if ((t instanceof UnknownElement) && match(t,coi)) { 247 t = expose(t,wrt); 248 } 249 return t; 250 } 251 252 253 254 264 public static String trueAttr(Task t, String attr) 265 { 266 AntX.require_(t!=null && attr!=null, IAM_, 267 "trueAttr- nonzro args"); 268 269 String atrvalue=null; 270 271 if (t instanceof UnknownElement) { 272 Map m = ((UnknownElement)t).getWrapper().getAttributeMap(); 273 Object v = m.get(attr); 274 if (v!=null) { 275 atrvalue = v.toString(); 276 } else { 277 m = normalize(m); v = m.get(attr); 279 if (v!=null) { 280 atrvalue = v.toString(); 281 } 282 } 283 m.clear(); m=null; 285 } 286 287 return atrvalue; 288 } 289 290 291 292 304 public static Map trueAttrs(Task t, Map attrs) 305 { 306 AntX.require_(t!=null && attrs!=null, IAM_, 307 "trueAttrs- nonzro args"); 308 309 if (t instanceof UnknownElement) { 310 Map m = ((UnknownElement)t).getWrapper().getAttributeMap(); 311 m = normalize(m); int N=0; 313 Iterator itr= attrs.entrySet().iterator(); 314 while (itr.hasNext()) { 315 Map.Entry mE = (Map.Entry )itr.next(); 316 Object v = m.get(mE.getKey()); 317 if (v!=null) { 318 mE.setValue(v); 319 N++; 320 } 321 } 322 if (N==0) { 323 attrs=null; 324 } 325 m.clear(); m=null; 327 return attrs; 328 } 329 return null; 330 } 331 332 333 334 342 public static boolean ignoreConfigure(Task t) 343 { 344 FixtureOverlays context= FixtureOverlays.getContextInstance(); 345 return ((Boolean )context.nearest(ITID))==Boolean.TRUE; 346 } 347 348 349 350 363 public static Task candidateTask(TaskHandle taskH, Class [] coi, 364 ProjectComponent wrt) 365 { 366 AntX.require_(taskH!=null && wrt!=null && coi!=null, IAM_, 367 "peekTask- nonzro args"); 368 369 Task task = taskH.getTask(); 370 AntX.verify_(task!=null, IAM_, "peekTask- nonzro task"); 371 372 if (match(task,coi) && AntX.STRICT_SCRIPTS) { 373 task = trueTask(task,wrt); 374 taskH.setTask(task); 375 } 376 return task; 377 } 378 379 380 381 388 public static void initTaskFrom(Task implTask, Task ctrlTask) 389 { 390 AntX.require_(implTask!=null && ctrlTask!=null, IAM_, 391 "initTask- nonzro args"); 392 implTask.setProject(ctrlTask.getProject()); 393 implTask.setTaskName(ctrlTask.getTaskName()); 394 implTask.setLocation(ctrlTask.getLocation()); 395 implTask.setOwningTarget(ctrlTask.getOwningTarget()); 396 implTask.init(); 397 } 398 399 400 401 416 public static UnknownElement initUEProxy(UnknownElement ue, String tag, Map attrs, 417 String nsuri, 418 final Project P) 419 { 420 AntX.require_(ue!=null,IAM_,"newUE- nonzro UE obj"); 421 AntX.require_(P!=null,IAM_,"newUE- nonzro proj"); 422 AntX.require_(tag!=null,IAM_,"newUE- nonzro element tag"); 423 424 String qname; 425 if (!Tk.isWhitespace(nsuri)) { 426 qname = nsuri+":"+tag; 427 ue.setNamespace(nsuri); 428 } else { 429 qname = tag; 430 ue.setNamespace(""); } 432 433 ue.setQName(qname); 434 ue.setTaskName(tag); 435 ue.setTaskType(qname); 436 ue.setProject(P); 437 438 dynamicConfigure(ue, tag, attrs); 439 440 return ue; 441 } 442 443 444 445 458 public static UnknownElement newUEProxy(String tag, Map attrs, 459 String nsuri, 460 final Project P) 461 { 462 AntX.require_(P!=null,IAM_,"newUE- nonzro proj"); 463 AntX.require_(tag!=null,IAM_,"newUE- nonzro element tag"); 464 465 UnknownElement ue = new UnknownElement(tag); 466 initUEProxy(ue,tag,attrs,nsuri,P); 467 return ue; 468 } 469 470 471 472 479 public static void dynamicConfigure(Task ue, String tag, Map attrs) 480 { 481 AntX.require_(ue!=null,IAM_,"dynCfg- nonzro element"); 482 AntX.require_(tag!=null,IAM_,"dynCfg- nonzro element tag"); 483 484 RuntimeConfigurable info = new RuntimeConfigurable(ue,tag); 485 486 if (attrs!=null && !attrs.isEmpty()) { 487 Iterator itr= attrs.entrySet().iterator(); 488 while (itr.hasNext()) { 489 Map.Entry mE= (Map.Entry )itr.next(); 490 info.setAttribute((String )mE.getKey(),(String )mE.getValue()); 491 } 492 } 493 } 494 495 496 497 509 public static UnknownElement newUEProxy(String tag, Map attrs, 510 Task nsSource, 511 final Project P) 512 { 513 String nsuri=null; 514 if (nsSource!=null) { 515 nsuri = ProjectHelper.extractUriFromComponentName 516 (nsSource.getTaskType()); 517 } 518 return newUEProxy(tag,attrs,nsuri,P); 519 } 520 521 522 523 529 public static Target newStubTarget(final Project P) 530 { 531 Target dumiTarget = new Target(); 532 dumiTarget.setProject(P); 533 dumiTarget.setName(""); 534 return dumiTarget; 535 } 536 537 538 539 552 public static UnknownElement copyUEProxy(UnknownElement orig, 553 final Project P, Target T, 554 boolean resolveValues) 555 { 556 AntX.require_(orig!=null,IAM_,"copyUE- nonzro source"); 557 UnknownElement copy = new UnknownElement(orig.getTag()); 558 boolean resolve = resolveValues && P!=null; 559 560 copy.setNamespace(orig.getNamespace()); 562 copy.setProject(P); 563 copy.setQName(orig.getQName()); 564 copy.setTaskType(orig.getTaskType()); 565 copy.setTaskName(orig.getTaskName()); 566 copy.setLocation(orig.getLocation()); 567 568 if (T!=null) { 570 copy.setOwningTarget(T); 571 } else if (P!=null && P!=orig.getProject()) { 572 T = newStubTarget(P); copy.setOwningTarget(T); 574 } else { 575 copy.setOwningTarget(orig.getOwningTarget()); 576 } 577 578 RuntimeConfigurable copyconfig= new RuntimeConfigurable(copy,orig.getTaskName()); 580 copyconfig.setPolyType(orig.getWrapper().getPolyType()); 581 Map map = orig.getWrapper().getAttributeMap(); 582 for (Iterator itr= map.entrySet().iterator(); itr.hasNext();) { 583 Map.Entry mE= (Map.Entry )itr.next(); 584 String value = (String )mE.getValue(); 585 if (resolve) { 586 value = tryResolve(P,value); 587 } 588 copyconfig.setAttribute((String )mE.getKey(), value); 589 } 590 map= null; 591 592 String text = orig.getWrapper().getText().toString(); 594 if (resolve) { 595 text = tryResolve(P,text); 596 } 597 copyconfig.addText(text); 598 599 600 Enumeration e = orig.getWrapper().getChildren(); 601 while (e.hasMoreElements()) { 602 RuntimeConfigurable rc = (RuntimeConfigurable)e.nextElement(); 603 UnknownElement childorig = (UnknownElement)rc.getProxy(); 604 UnknownElement childcopy = copyUEProxy(childorig,P,T,resolveValues); 605 copyconfig.addChild(childcopy.getWrapper()); 606 copy.addChild(childcopy); 607 } 608 e= null; 609 610 return copy; 611 } 612 613 614 620 public static UnknownElement copyUEProxy(UnknownElement orig, 621 final Project P, Target T) 622 { 623 return copyUEProxy(orig,P,T,false); 624 } 625 626 627 628 private TaskExaminer() 629 { 630 } 631 } 632 633 634 | Popular Tags |