/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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; /** * Check if classpath attributes have been set. * (to be called before getCpDelegate() is used. * @return true if cpDelegate has been created. */ protected boolean hasCpDelegate() { return cpDelegate != null; } /** * @param reverseLoader if true a delegated loader will take precedence over * the parent * @deprecated since 1.6.x. * 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(); } /** * Set a 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, the specified classpath will be used and registered * with the specified name. * * This allows multiple taskdef/typedef to use the same class loader, * so they can be used together, eliminating 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 (createdLoader == null) { createdLoader = getDelegate().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() * @throws BuildException on error. * @since Ant 1.6 */ public void init() throws BuildException { super.init(); } private ClasspathUtils.Delegate getDelegate() { if (cpDelegate == null) { cpDelegate = ClasspathUtils.getDelegate(this); } return cpDelegate; } }