1 28 29 package com.idaremedia.antx.starters; 30 31 import java.util.Map ; 32 33 import org.apache.tools.ant.BuildException; 34 import org.apache.tools.ant.Project; 35 import org.apache.tools.ant.Task; 36 import org.apache.tools.ant.TaskContainer; 37 import org.apache.tools.ant.UnknownElement; 38 import org.apache.tools.ant.taskdefs.MacroDef; 39 40 import com.idaremedia.antx.AssertableLibDefinition; 41 import com.idaremedia.antx.apis.Nameable; 42 import com.idaremedia.antx.helpers.Tk; 43 import com.idaremedia.antx.ownhelpers.TaskExaminer; 44 import com.idaremedia.antx.ownhelpers.UEContainerProxy; 45 46 60 61 public abstract class MacroMaker extends AssertableLibDefinition 62 implements StrictMacroDef, Nameable, TaskContainer 63 { 64 68 public static final String MACRO_TASKNAME="macrodef"; 69 70 71 75 protected MacroMaker(String iam) 76 { 77 super(iam); 78 } 79 80 81 89 protected void initonce() 90 { 91 super.initonce(); 92 if (getMacroImpl()==null) { 93 verifyInProject_("init"); 94 createMacroImpl(); 95 } 96 } 97 98 99 104 public void execute() 105 { 106 executeMacroImpl(); 107 } 108 109 110 114 protected final void executeMacroImpl() 115 { 116 getMacro().execute(); 117 } 118 119 120 125 public void setProject(Project P) 126 { 127 super.setProject(P); 128 if (getMacroImpl()!=null) { 129 getMacroImpl().setProject(P); 130 } 131 } 132 133 134 139 public void setAntlibClassLoader(ClassLoader cL) 140 { 141 super.setAntlibClassLoader(cL); 142 getMacro().setAntlibClassLoader(cL); 143 } 144 145 146 151 public void setURI(String uri) 152 { 153 super.setURI(uri); 154 getMacro().setURI(getURI()); 155 } 156 157 158 164 public final void setName(String name) 165 { 166 require_(!Tk.isWhitespace(name),"setName- nonzro name"); 167 getMacro().setName(name); 168 m_macroName = name; 169 } 170 171 172 176 public final String getName() 177 { 178 return m_macroName; 179 } 180 181 182 189 public void setId(String id) 190 { 191 if (m_macroName==null) { 192 m_macroName = id; 193 } 194 } 195 196 197 203 protected final void addMacroParameter(MacroDef.Attribute attr) 204 { 205 require_(attr!=null,"addAttr- nonzro attr"); 206 getMacro().addConfiguredAttribute(attr); 207 } 208 209 210 218 protected final void addMacroElement(String name, boolean optional) 219 { 220 require_(name!=null,"addElem- nonzro name"); 221 MacroDef.TemplateElement elem = new MacroDef.TemplateElement(); 222 elem.setName(name); 223 elem.setOptional(optional); 224 getMacro().addConfiguredElement(elem); 225 } 226 227 228 239 protected MacroDef createMacroImpl() 240 { 241 Project P= getProject(); 242 MacroDef impl = (MacroDef)P.createTask(MACRO_TASKNAME); 243 impl.setProject(P); 244 impl.setLocation(getLocation()); 245 impl.setOwningTarget(getOwningTarget()); 246 impl.init(); 247 setMacroImpl(impl); 248 return getMacro(); 249 } 250 251 252 260 protected final void setMacroImpl(MacroDef impl) 261 { 262 require_(impl!=null,"setImpl- nonzro impl"); 263 m_macroDefinition = impl; 264 m_macroMainImpl = m_macroDefinition.createSequential(); 265 m_macroMain = m_macroMainImpl; } 267 268 269 274 private MacroDef getMacroImpl() 275 { 276 return m_macroDefinition; 277 } 278 279 280 296 protected final UEContainerProxy installBodyWrap(String tag, 297 Map attrs, 298 boolean inheritNS) 299 { 300 verify_(m_macroMainImpl.getNested().isEmpty(), 301 "instalBodyWrap- none installed"); 302 303 Task nsSource=null; if (inheritNS) { 305 nsSource = this; 306 } 307 UnknownElement rootItem = 308 TaskExaminer.newUEProxy(tag,attrs,nsSource,getProject()); 309 310 m_macroMainImpl.addTask(rootItem); 311 312 UEContainerProxy bodyProxy = new UEContainerProxy(rootItem); 313 m_macroMain = bodyProxy; 314 315 return bodyProxy; 316 } 317 318 319 328 protected final MacroDef getMacro() 329 { 330 ensure_(m_macroDefinition!=null,"macro- inited"); 331 return m_macroDefinition; 332 } 333 334 335 343 protected final TaskContainer getMacroBody() 344 { 345 ensure_(m_macroMain!=null,"macroBody- inited"); 346 return m_macroMain; 347 } 348 349 350 361 public final void addTask(Task task) 362 { 363 require_(task instanceof UnknownElement,"addTask- proxy task"); 364 365 Class taskClass = TaskExaminer.trueClass(task); 366 367 if (taskClass!=null && includeTask(taskClass, task)) { 368 getMacroBody().addTask(task); 369 } else { 370 String ermsg = uistrs().get("macro.nested.task.disallowed", 371 task.getTaskName(), this.getTaskName()); 372 log(ermsg, Project.MSG_ERR); 373 throw new BuildException(ermsg,getLocation()); 374 } 375 } 376 377 378 388 protected boolean includeTask(Class taskClass, Task taskProxy) 389 { 390 return true; 391 } 392 393 394 395 406 protected final UEContainerProxy addImplTask(String tag, Map attrs, 407 boolean inheritNS) 408 { 409 Task nsSource=null; if (inheritNS) { 411 nsSource = this; 412 } 413 UnknownElement implItem = 414 TaskExaminer.newUEProxy(tag,attrs,nsSource,getProject()); 415 416 getMacroBody().addTask(implItem); 417 418 return new UEContainerProxy(implItem); 419 } 420 421 422 private MacroDef m_macroDefinition; 423 private MacroDef.NestedSequential m_macroMainImpl; 424 private TaskContainer m_macroMain; 425 private String m_macroName; 426 } 427 428 429 | Popular Tags |