001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.taskdefs;
020:
021: import org.apache.tools.ant.AntClassLoader;
022: import org.apache.tools.ant.BuildException;
023: import org.apache.tools.ant.Project;
024: import org.apache.tools.ant.types.Path;
025: import org.apache.tools.ant.types.Reference;
026: import org.apache.tools.ant.util.ClasspathUtils;
027:
028: /**
029: * Base class for Definitions handling uri and class loading.
030: * (This was part of Definer)
031: *
032: * @since Ant 1.6
033: */
034: public abstract class DefBase extends AntlibDefinition {
035: private ClassLoader createdLoader;
036: private ClasspathUtils.Delegate cpDelegate;
037:
038: /**
039: * Check if classpath attributes have been set.
040: * (to be called before getCpDelegate() is used.
041: * @return true if cpDelegate has been created.
042: */
043: protected boolean hasCpDelegate() {
044: return cpDelegate != null;
045: }
046:
047: /**
048: * @param reverseLoader if true a delegated loader will take precedence over
049: * the parent
050: * @deprecated since 1.6.x.
051: * stop using this attribute
052: * @ant.attribute ignore="true"
053: */
054: public void setReverseLoader(boolean reverseLoader) {
055: getDelegate().setReverseLoader(reverseLoader);
056: log(
057: "The reverseloader attribute is DEPRECATED. It will be removed",
058: Project.MSG_WARN);
059: }
060:
061: /**
062: * @return the classpath for this definition
063: */
064: public Path getClasspath() {
065: return getDelegate().getClasspath();
066: }
067:
068: /**
069: * @return the reverse loader attribute of the classpath delegate.
070: */
071: public boolean isReverseLoader() {
072: return getDelegate().isReverseLoader();
073: }
074:
075: /**
076: * Returns the loader id of the class path Delegate.
077: * @return the loader id
078: */
079: public String getLoaderId() {
080: return getDelegate().getClassLoadId();
081: }
082:
083: /**
084: * Returns the class path id of the class path delegate.
085: * @return the class path id
086: */
087: public String getClasspathId() {
088: return getDelegate().getClassLoadId();
089: }
090:
091: /**
092: * Set the classpath to be used when searching for component being defined.
093: *
094: * @param classpath an Ant Path object containing the classpath.
095: */
096: public void setClasspath(Path classpath) {
097: getDelegate().setClasspath(classpath);
098: }
099:
100: /**
101: * Create the classpath to be used when searching for component being
102: * defined.
103: * @return the classpath of the this definition
104: */
105: public Path createClasspath() {
106: return getDelegate().createClasspath();
107: }
108:
109: /**
110: * Set a reference to a classpath to use when loading the files.
111: * To actually share the same loader, set loaderref as well
112: * @param r the reference to the classpath
113: */
114: public void setClasspathRef(Reference r) {
115: getDelegate().setClasspathref(r);
116: }
117:
118: /**
119: * Use the reference to locate the loader. If the loader is not
120: * found, the specified classpath will be used and registered
121: * with the specified name.
122: *
123: * This allows multiple taskdef/typedef to use the same class loader,
124: * so they can be used together, eliminating the need to
125: * put them in the CLASSPATH.
126: *
127: * @param r the reference to locate the loader.
128: * @since Ant 1.5
129: */
130: public void setLoaderRef(Reference r) {
131: getDelegate().setLoaderRef(r);
132: }
133:
134: /**
135: * create a classloader for this definition
136: * @return the classloader from the cpDelegate
137: */
138: protected ClassLoader createLoader() {
139: if (getAntlibClassLoader() != null && cpDelegate == null) {
140: return getAntlibClassLoader();
141: }
142: if (createdLoader == null) {
143: createdLoader = getDelegate().getClassLoader();
144: // need to load Task via system classloader or the new
145: // task we want to define will never be a Task but always
146: // be wrapped into a TaskAdapter.
147: ((AntClassLoader) createdLoader)
148: .addSystemPackageRoot("org.apache.tools.ant");
149: }
150: return createdLoader;
151: }
152:
153: /**
154: * @see org.apache.tools.ant.Task#init()
155: * @throws BuildException on error.
156: * @since Ant 1.6
157: */
158: public void init() throws BuildException {
159: super .init();
160: }
161:
162: private ClasspathUtils.Delegate getDelegate() {
163: if (cpDelegate == null) {
164: cpDelegate = ClasspathUtils.getDelegate(this);
165: }
166: return cpDelegate;
167: }
168: }
|