You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by pe...@apache.org on 2003/08/14 14:46:02 UTC

cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java PreSetDef.java defaults.properties

peterreilly    2003/08/14 05:46:02

  Modified:    src/main/org/apache/tools/ant/taskdefs defaults.properties
  Added:       src/main/org/apache/tools/ant/taskdefs MacroDef.java
                        MacroInstance.java PreSetDef.java
  Log:
  Adding tasks presetdef and macrodef
  
  Revision  Changes    Path
  1.152     +2 -0      ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
  retrieving revision 1.151
  retrieving revision 1.152
  diff -u -r1.151 -r1.152
  --- defaults.properties	23 Jul 2003 14:12:12 -0000	1.151
  +++ defaults.properties	14 Aug 2003 12:46:01 -0000	1.152
  @@ -76,6 +76,8 @@
   subant=org.apache.tools.ant.taskdefs.SubAnt
   sync=org.apache.tools.ant.taskdefs.Sync
   defaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludes
  +presetdef=org.apache.tools.ant.taskdefs.PreSetDef
  +macrodef=org.apache.tools.ant.taskdefs.MacroDef
   
   # optional tasks
   image=org.apache.tools.ant.taskdefs.optional.image.Image
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/MacroDef.java
  
  Index: MacroDef.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  import java.util.HashMap;
  
  import org.apache.tools.ant.AntTypeDefinition;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.ComponentHelper;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.ProjectHelper;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.TaskContainer;
  import org.apache.tools.ant.UnknownElement;
  
  /**
   * Describe class <code>MacroDef</code> here.
   *
   * @author Peter Reilly
   */
  public class MacroDef extends Task implements AntlibInterface, TaskContainer {
      private UnknownElement nestedTask;
      private String     name;
      private String     componentName;
      private List       params = new ArrayList();
      private Map        elements = new HashMap();
      private String         uri;
  
      /**
       * Name of the definition
       * @param name the name of the definition
       */
       public void setName(String name) {
          this.name = name;
      }
  
      /**
       * The URI for this definition.
       * @param uri the namespace URI
       * @throws BuildException if uri is not allowed
       */
      public void setURI(String uri) throws BuildException {
          if (uri.equals(ProjectHelper.ANT_CORE_URI)) {
              uri = "";
          }
          if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
              throw new BuildException("Attempt to use a reserved URI " + uri);
          }
          this.uri = uri;
      }
  
      /**
       * Set the class loader.
       * Not used
       * @param classLoader a <code>ClassLoader</code> value
       */
      public void setAntlibClassLoader(ClassLoader classLoader) {
          // Ignore
      }
  
      /**
       * Add a nested task to ExtendType
       * @param nestedTask  Nested task/type to extend
       */
      public void addTask(Task nestedTask) {
          if (this.nestedTask != null) {
              throw new BuildException("Only one sequential/Parallel allowed");
          }
          UnknownElement ue = (UnknownElement) nestedTask;
          if (!ue.getNamespace().equals("")
              || (!ue.getTag().equals("sequential")
                  && !ue.getTag().equals("parallel"))) {
              throw new BuildException("Unsupported tag " + ue.getQName());
          }
          this.nestedTask = ue;
      }
  
      /**
       * @return the nested task
       */
      public UnknownElement getNestedTask() {
          return nestedTask;
      }
  
      /**
       * @return the nested Params
       */
      public List getParams() {
          return params;
      }
  
      /**
       * @return the nested elements
       */
      public Map getElements() {
          return elements;
      }
  
      /**
       * Add a param element.
       *
       * @param param a param nested element.
       */
      public void addConfiguredParam(Param param) {
          if (param.getName() == null) {
              throw new BuildException(
                  "the param nested element needed a \"name\" attribute");
          }
          params.add(param);
      }
  
      /**
       * Add an element element.
       *
       * @param element an element nested element.
       */
      public void addConfiguredElement(TemplateElement element) {
          if (element.getName() == null) {
              throw new BuildException(
                  "the element nested element needed a \"name\" attribute");
          }
          elements.put(element.getName(), element);
      }
  
      /**
       * Create a new ant type based on the embedded tasks and types.
       *
       */
      public void execute() {
          if (nestedTask == null) {
              throw new BuildException("Missing nested element");
          }
          if (name == null) {
              throw new BuildException("Name not specified");
          }
  
          name = ProjectHelper.genComponentName(uri, name);
  
          MyAntTypeDefinition def = new MyAntTypeDefinition(this);
          def.setName(name);
          def.setClass(MacroInstance.class);
  
          ComponentHelper helper = ComponentHelper.getComponentHelper(
              getProject());
  
          helper.addDataTypeDefinition(def);
      }
  
  
      /**
       * A nested element for the MacroDef task.
       *
       */
      public static class Param {
          private String name;
          private String defaultValue;
          /**
           * The name of the parameter.
           *
           * @param name the name of the parameter
           */
          public void setName(String name) {
              this.name = name;
          }
  
          /**
           * @return the name of the parameter.
           */
          public String getName() {
              return name;
          }
  
          /**
           * The default value to use if the parameter is not
           * used in the templated instance.
           *
           * @param defaultValue the default value
           */
          public void setDefault(String defaultValue) {
              this.defaultValue = defaultValue;
          }
  
          /**
           * @return the default value, null if not set
           */
          public String getDefault() {
              return defaultValue;
          }
      }
  
      /**
       * A nested element for the MacroDef task.
       *
       */
      public static class TemplateElement {
          private String name;
          private boolean optional = false;
          /**
           * The name of the element.
           *
           * @param name the name of the element.
           */
          public void setName(String name) {
              this.name = name;
          }
  
          /**
           * @return the name of the element.
           */
          public String getName() {
              return name;
          }
  
          /**
           * is this element optional ?
           *
           * @param optional if true this element may be left out, default
           *                 is false.
           */
          public void setOptional(boolean optional) {
              this.optional = optional;
          }
  
          /**
           * @return the optional attribute
           */
          public boolean isOptional() {
              return optional;
          }
      }
  
      /**
       * extends AntTypeDefinition, on create
       * of the object, the template macro definition
       * is given.
       */
      private static class MyAntTypeDefinition extends AntTypeDefinition {
          private MacroDef    template;
  
          /**
           * Creates a new <code>MyAntTypeDefinition</code> instance.
           *
           * @param template a <code>MacroDef</code> value
           */
          public MyAntTypeDefinition(MacroDef template) {
              this.template = template;
          }
  
          /**
           * create an instance of the definition.
           * The instance may be wrapped in a proxy class.
           * @param project the current project
           * @return the created object
           */
          public Object create(Project project) {
              Object o = super.create(project);
              if (o == null) {
                  return null;
              }
              ((MacroInstance) o).setTemplate(template);
              return o;
          }
      }
  }
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java
  
  Index: MacroInstance.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Set;
  import java.util.HashSet;
  import java.util.HashMap;
  import java.util.Hashtable;
  import java.util.Enumeration;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.DynamicConfigurator;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.TaskContainer;
  import org.apache.tools.ant.UnknownElement;
  import org.apache.tools.ant.RuntimeConfigurable;
  
  /**
   * The class to be placed in the ant type definition.
   * It is given a pointer to the template definition,
   * and makes a copy of the unknown element, substituting
   * the the parameter values in attributes and text.
   * @author Peter Reilly
   */
  public class MacroInstance extends Task implements DynamicConfigurator {
      private MacroDef template;
      private Map      map = new HashMap();
      private Map      elements = new HashMap();
      private Hashtable localProperties = new Hashtable();
  
      /**
       * Called from MacroDef.MyAntTypeDefinition#create()
       *
       * @param template a <code>MacroDef</code> value
       */
      protected void setTemplate(MacroDef template) {
          this.template = template;
      }
  
      /**
       * A parameter name value pair as a xml attribute.
       *
       * @param name the name of the attribute
       * @param value the value of the attribute
       */
      public void setDynamicAttribute(String name, String value) {
          map.put(name, value);
      }
  
      /**
       * Add an element.
       * @param name the name of the element
       * @return an inner Element type
       * @throws BuildException if the name is not known or if this element
       *                        has already been seen
       */
      public Object createDynamicElement(String name) throws BuildException {
          if (template.getElements().get(name) == null) {
              throw new BuildException("unsupported element " + name);
          }
          if (elements.get(name) != null) {
              throw new BuildException("Element " + name + " already present");
          }
          Element ret = new Element();
          elements.put(name, ret);
          return ret;
      }
  
      /**
       * Embedded element in macro instance
       */
      public static class Element implements TaskContainer {
          private List unknownElements = new ArrayList();
  
          /**
           * Add an unknown element (to be snipped into the template instance)
           *
           * @param nestedTask an unknown element
           */
          public void addTask(Task nestedTask) {
              unknownElements.add(nestedTask);
          }
  
          /**
           * @return the list of unknown elements
           */
          public List getUnknownElements() {
              return unknownElements;
          }
      }
  
      private static String macroSubs(String s, Map macroMapping) {
          StringBuffer ret = new StringBuffer();
          StringBuffer macroName = new StringBuffer();
          boolean inMacro = false;
          for (int i = 0; i < s.length(); ++i) {
              if (s.charAt(i) == '$') {
                  inMacro = true;
              } else {
                  if (inMacro) {
                      if (s.charAt(i) == '{') {
                          continue;
                      } else if (s.charAt(i) == '}') {
                          String name = macroName.toString();
                          String value = (String) macroMapping.get(name);
                          if (value == null) {
                              ret.append("${" + name + "}");
                          } else {
                              ret.append(value);
                          }
                          macroName = new StringBuffer();
                          inMacro = false;
                      } else {
                          macroName.append(s.charAt(i));
                      }
                  } else {
                      ret.append(s.charAt(i));
                  }
              }
          }
  
          return ret.toString();
      }
  
      private UnknownElement copy(UnknownElement ue) {
          UnknownElement ret = new UnknownElement(ue.getTag());
          ret.setNamespace(ue.getNamespace());
          ret.setProject(getProject());
          ret.setQName(ue.getQName());
          ret.setTaskName(ue.getTaskName());
          ret.setLocation(ue.getLocation());
          ret.setOwningTarget(getOwningTarget());
          RuntimeConfigurable rc = new RuntimeConfigurable(
              ret, ue.getTaskName());
          rc.setPolyType(ue.getWrapper().getPolyType());
          Map map = ue.getWrapper().getAttributeMap();
          for (Iterator i = map.entrySet().iterator(); i.hasNext();) {
              Map.Entry entry = (Map.Entry) i.next();
              rc.setAttribute(
                  (String) entry.getKey(),
                  macroSubs((String) entry.getValue(), localProperties));
          }
          rc.addText(macroSubs(ue.getWrapper().getText().toString(),
                               localProperties));
  
          Enumeration e = ue.getWrapper().getChildren();
          while (e.hasMoreElements()) {
              RuntimeConfigurable r = (RuntimeConfigurable) e.nextElement();
              UnknownElement unknownElement = (UnknownElement) r.getProxy();
              String tag = unknownElement.getTag();
              MacroDef.TemplateElement templateElement =
                  (MacroDef.TemplateElement) template.getElements().get(tag);
              if (templateElement == null) {
                  UnknownElement child = copy(unknownElement);
                  rc.addChild(child.getWrapper());
                  ret.addChild(child);
              } else {
                  Element element = (Element) elements.get(tag);
                  if (element == null) {
                      if (!templateElement.isOptional()) {
                          throw new BuildException(
                              "Required nested element "
                              + templateElement.getName() + " missing");
                      }
                      continue;
                  }
                  for (Iterator i = element.getUnknownElements().iterator();
                       i.hasNext();) {
                      UnknownElement child = (UnknownElement) i.next();
                      rc.addChild(child.getWrapper());
                      ret.addChild(child);
                  }
              }
          }
          return ret;
      }
  
      /**
       * Execute the templates instance.
       * Copies the unknown element, substitutes the parameters,
       * and calls perform on the unknown element.
       *
       */
      public void execute() {
          localProperties = new Hashtable();
          Set copyKeys = new HashSet(map.keySet());
          for (int i = 0; i < template.getParams().size(); ++i) {
              MacroDef.Param param = (MacroDef.Param) template.getParams().get(i);
              String value = (String) map.get(param.getName());
              if (value == null) {
                  value = param.getDefault();
              }
              if (value == null) {
                  throw new BuildException(
                      "required parameter " + param.getName() + " not set");
              }
              localProperties.put(param.getName(), value);
              copyKeys.remove(param.getName());
          }
          if (copyKeys.size() != 0) {
              throw new BuildException(
                  "Unknown attribute" + (copyKeys.size() > 1 ? "s " : " ")
                  + copyKeys);
          }
  
          // need to set the project on unknown element
          UnknownElement c = copy(template.getNestedTask());
          c.init();
          c.perform();
      }
  }
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/PreSetDef.java
  
  Index: PreSetDef.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.tools.ant.AntTypeDefinition;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.ComponentHelper;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.ProjectHelper;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.TaskContainer;
  import org.apache.tools.ant.UnknownElement;
  
  /**
   * The preset definition task generates a new definition
   * based on a current definition with some attributes or
   * elements preset.
   * <pre>
   * &lt;presetdef name="my.javac"&gt;
   *   &lt;javac deprecation="${deprecation}" debug="${debug}"/&gt;
   * &lt;/presetdef&gt;
   * &lt;my.javac srcdir="src" destdir="classes"/&gt;
   * </pre>
   *
   * @author Peter Reilly
   */
  public class PreSetDef extends Task implements AntlibInterface, TaskContainer {
      private UnknownElement nestedTask;
      private String         name;
      private String         componentName;
      private String         uri;
  
      /**
       * Name of the definition
       * @param name the name of the definition
       */
       public void setName(String name) {
          this.name = name;
      }
      /**
       * The URI for this definition.
       * @param uri the namespace URI
       * @throws BuildException if uri is not allowed
       */
      public void setURI(String uri) throws BuildException {
          if (uri.equals(ProjectHelper.ANT_CORE_URI)) {
              uri = "";
          }
          if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
              throw new BuildException("Attempt to use a reserved URI " + uri);
          }
          this.uri = uri;
      }
      /**
       * Set the class loader.
       * Not used
       * @param classLoader a <code>ClassLoader</code> value
       */
      public void setAntlibClassLoader(ClassLoader classLoader) {
          // Ignore
      }
  
  
      /**
       * Add a nested task to predefine attributes and elements on
       * @param nestedTask  Nested task/type to extend
       */
      public void addTask(Task nestedTask) {
          if (this.nestedTask != null) {
              throw new BuildException("Only one nested element allowed");
          }
          if (!(nestedTask instanceof UnknownElement)) {
              throw new BuildException(
                  "addTask called with a task that is not an unknown element");
          }
          this.nestedTask = (UnknownElement) nestedTask;
      }
  
  
      /**
       * make a new definition
       */
      public void execute() {
          if (nestedTask == null) {
              throw new BuildException("Missing nested element");
          }
          if (name == null) {
              throw new BuildException("Name not specified");
          }
  
          name = ProjectHelper.genComponentName(uri, name);
  
          ComponentHelper helper = ComponentHelper.getComponentHelper(
              getProject());
  
          String componentName = ProjectHelper.genComponentName(
              nestedTask.getNamespace(), nestedTask.getTag());
  
          AntTypeDefinition def = helper.getDefinition(componentName);
  
          if (def == null) {
              throw new BuildException(
                  "Unable to find typedef " + componentName);
          }
  
          MyAntTypeDefinition newDef = new MyAntTypeDefinition(def, nestedTask);
  
          newDef.setName(name);
  
          helper.addDataTypeDefinition(newDef);
      }
  
      private static class MyAntTypeDefinition extends AntTypeDefinition {
          AntTypeDefinition parent;
          UnknownElement    element;
  
          public MyAntTypeDefinition(AntTypeDefinition parent, UnknownElement el) {
              this.parent = parent;
              this.element = el;
          }
  
          public void setClass(Class clazz) {
              throw new BuildException("Not supported");
          }
  
          public void setClassName(String className) {
              throw new BuildException("Not supported");
          }
  
          /**
           * get the classname of the definition
           * @return the name of the class of this definition
           */
          public String getClassName() {
              return parent.getClassName();
          }
  
          /**
           * set the adapter class for this definition.
           * NOTE Supported
           * @param adapterClass the adapterClass
           */
          public void setAdapterClass(Class adapterClass) {
              throw new BuildException("Not supported");
          }
  
          /**
           * set the assignable class for this definition.
           * NOT SUPPORTED
           * @param adaptToClass the assignable class
           */
  
          public void setAdaptToClass(Class adaptToClass) {
              throw new BuildException("Not supported");
          }
  
          /**
           * set the classloader to use to create an instance
           * of the definition
           * @param classLoader the classLoader
           */
          public void setClassLoader(ClassLoader classLoader) {
              throw new BuildException("Not supported");
          }
  
          /**
           * get the classloader for this definition
           * @return the classloader for this definition
           */
          public ClassLoader getClassLoader() {
              return parent.getClassLoader();
          }
  
          /**
           * get the exposed class for this definition.
           * @return the exposed class
           */
          public Class getExposedClass(Project project) {
              return parent.getExposedClass(project);
          }
  
          /**
           * get the definition class
           * @param project the current project
           * @return the type of the definition
           */
          public Class getTypeClass(Project project) {
              return parent.getTypeClass(project);
          }
  
  
          /**
           * check if the attributes are correct
           * @param project the current project
           */
          public void checkClass(Project project) {
              parent.checkClass(project);
          }
  
          /**
           * create an instance of the definition.
           * The instance may be wrapped in a proxy class.
           * @param project the current project
           * @return the created object
           */
          public Object create(Project project) {
              Object o = parent.create(project);
              if (o == null) {
                  return null;
              }
              element.configure(o);
              return o;
          }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java PreSetDef.java defaults.properties

Posted by peter reilly <pe...@corvil.com>.
Tis done.
Peter
On Thursday 14 August 2003 14:04, Martijn Kruithof wrote:
> Could please @since 1.6 tags be added to the code?
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java PreSetDef.java defaults.properties

Posted by Martijn Kruithof <ma...@kruithof.xs4all.nl>.
Could please @since 1.6 tags be added to the code?


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java PreSetDef.java defaults.properties

Posted by peter reilly <pe...@corvil.com>.
On Friday 15 August 2003 12:15, Knut Wannheden wrote:
> What's the line:
>
>     if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
>
> in MacroDef#setURI(String) about?  It can surely be written better :-)
opps..
>
> But the code looks like it will be the same for many tasks, so maybe an
> abstract AntlibTask and AntlibTaskContainer would be nice to have.  What do
> you think?
Yes,
the only problem is that I now have
AntlibInterface
   ^
   | implements
   |
   DefBase  (does classpath handling and uri)
   |
   | extends
   | 
   Definer  (this should be typedef, is definer for BC)
   |
   | extends
   |
   Typedef
   |
   | extends
   |
   Taskdef  (sets two attributes)
    
Peter


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java PreSetDef.java defaults.properties

Posted by Knut Wannheden <kn...@paranor.ch>.
What's the line:

    if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {

in MacroDef#setURI(String) about?  It can surely be written better :-)

But the code looks like it will be the same for many tasks, so maybe an
abstract AntlibTask and AntlibTaskContainer would be nice to have.  What do
you think?

--
knut




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org