All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.tools.ant.taskdefs.PreSetDef Maven / Gradle / Ivy

There is a newer version: 1.0-rc5
Show newest version
/*
 * Copyright  2003-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

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.
 * 
 * <presetdef name="my.javac">
 *   <javac deprecation="${deprecation}" debug="${debug}"/>
 * </presetdef>
 * <my.javac srcdir="src" destdir="classes"/>
 * 
* * @since Ant 1.6 */ public class PreSetDef extends AntlibDefinition implements TaskContainer { private UnknownElement nestedTask; private String name; /** * Name of the definition * @param name the name of the definition */ public void setName(String name) { this.name = name; } /** * 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(getURI(), 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); } PreSetDefinition newDef = new PreSetDefinition(def, nestedTask); newDef.setName(name); helper.addDataTypeDefinition(newDef); } /** * This class contains the unknown element and the object * that is predefined. * @see AntTypeDefinition */ public static class PreSetDefinition extends AntTypeDefinition { private AntTypeDefinition parent; private UnknownElement element; /** * Creates a new PresetDefinition instance. * * @param parent The parent of this predefintion. * @param el The predefined attributes, nested elements and text. */ public PreSetDefinition(AntTypeDefinition parent, UnknownElement el) { if (parent instanceof PreSetDefinition) { PreSetDefinition p = (PreSetDefinition) parent; el.applyPreSet(p.element); parent = p.parent; } this.parent = parent; this.element = el; } /** * Override so that it is not allowed * * @param clazz a Class value */ public void setClass(Class clazz) { throw new BuildException("Not supported"); } /** * Override so that it is not allowed * * @param className a String value */ 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. * @param project the current project * @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. * This is a special version of create for IH and UE. * @param project the current project * @return the created object */ public Object createObject(Project project) { Object o = parent.create(project); if (o == null) { return null; } return o; } /** * @return the predefined attributes, elements and text as * a UnknownElement */ public UnknownElement getPreSets() { return element; } /** * Fake create an object, used by IH and UE to see that * this is a predefined object. * * @param project the current project * @return this object */ public Object create(Project project) { return this; } /** * Equality method for this definition * * @param other another definition * @param project the current project * @return true if the definitions are the same */ public boolean sameDefinition(AntTypeDefinition other, Project project) { if (other == null) { return false; } if (other.getClass() != getClass()) { return false; } PreSetDefinition otherDef = (PreSetDefinition) other; if (!parent.sameDefinition(otherDef.parent, project)) { return false; } if (!element.similar(otherDef.element)) { return false; } return true; } /** * Similar method for this definition * * @param other another definition * @param project the current project * @return true if the definitions are the same */ public boolean similarDefinition( AntTypeDefinition other, Project project) { if (other == null) { return false; } if (!other.getClass().getName().equals(getClass().getName())) { return false; } PreSetDefinition otherDef = (PreSetDefinition) other; if (!parent.similarDefinition(otherDef.parent, project)) { return false; } if (!element.similar(otherDef.element)) { return false; } return true; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy