/* * 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.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.ClasspathUtils; /** * Base class for Definitions * handling uri and class loading. * (This was part of Definer) * * @since Ant 1.6 */ public abstract class DefBase extends AntlibDefinition { private ClassLoader createdLoader; private ClasspathUtils.Delegate cpDelegate; /** * @param reverseLoader if true a delegated loader will take precedence over * the parent * @deprecated stop using this attribute * @ant.attribute ignore="true" */ public void setReverseLoader(boolean reverseLoader) { getDelegate().setReverseLoader(reverseLoader); log("The reverseloader attribute is DEPRECATED. It will be removed", Project.MSG_WARN); } /** * @return the classpath for this definition */ public Path getClasspath() { return getDelegate().getClasspath(); } /** * @return the reverse loader attribute of the classpath delegate. */ public boolean isReverseLoader() { return getDelegate().isReverseLoader(); } /** * Returns the loader id of the class path Delegate. * @return the loader id */ public String getLoaderId() { return getDelegate().getClassLoadId(); } /** * Returns the class path id of the class path delegate. * @return the class path id */ public String getClasspathId() { return getDelegate().getClassLoadId(); } /** * Set the classpath to be used when searching for component being defined * * @param classpath an Ant Path object containing the classpath. */ public void setClasspath(Path classpath) { getDelegate().setClasspath(classpath); } /** * Create the classpath to be used when searching for component being * defined * @return the classpath of the this definition */ public Path createClasspath() { return getDelegate().createClasspath(); } /** * reference to a classpath to use when loading the files. * To actually share the same loader, set loaderref as well * @param r the reference to the classpath */ public void setClasspathRef(Reference r) { getDelegate().setClasspathref(r); } /** * Use the reference to locate the loader. If the loader is not * found, taskdef will use the specified classpath and register it * with the specified name. * * This allow multiple taskdef/typedef to use the same class loader, * so they can be used together. It eliminate the need to * put them in the CLASSPATH. * * @param r the reference to locate the loader. * @since Ant 1.5 */ public void setLoaderRef(Reference r) { getDelegate().setLoaderRef(r); } /** * create a classloader for this definition * @return the classloader from the cpDelegate */ protected ClassLoader createLoader() { if (getAntlibClassLoader() != null && cpDelegate == null) { return getAntlibClassLoader(); } if (cpDelegate == null) { cpDelegate = ClasspathUtils.getDelegate(this); } if (createdLoader == null) { createdLoader = cpDelegate.getClassLoader(); // need to load Task via system classloader or the new // task we want to define will never be a Task but always // be wrapped into a TaskAdapter. ((AntClassLoader) createdLoader) .addSystemPackageRoot("org.apache.tools.ant"); } return createdLoader; } /** * @see org.apache.tools.ant.Task#init() * @since Ant 1.6 */ public void init() throws BuildException { super.init(); } private ClasspathUtils.Delegate getDelegate() { if (cpDelegate == null) { cpDelegate = ClasspathUtils.getDelegate(this); } return cpDelegate; } }