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 java.io.IOException;
022: import java.net.URL;
023: import java.util.ArrayList;
024: import java.util.Iterator;
025: import java.util.List;
026:
027: import org.apache.tools.ant.TaskContainer;
028: import org.apache.tools.ant.BuildException;
029: import org.apache.tools.ant.ComponentHelper;
030: import org.apache.tools.ant.Project;
031: import org.apache.tools.ant.Task;
032: import org.apache.tools.ant.helper.ProjectHelper2;
033: import org.apache.tools.ant.UnknownElement;
034:
035: /**
036: * Antlib task. It does not
037: * occur in an ant build file. It is the root element
038: * an antlib xml file.
039: *
040: * @since Ant 1.6
041: */
042: public class Antlib extends Task implements TaskContainer {
043: //
044: // Static
045: //
046:
047: /** The name of this task */
048: public static final String TAG = "antlib";
049:
050: /**
051: * Static method to read an ant lib definition from
052: * a url.
053: *
054: * @param project the current project
055: * @param antlibUrl the url to read the definitions from
056: * @param uri the uri that the antlib is to be placed in
057: * @return the ant lib task
058: */
059: public static Antlib createAntlib(Project project, URL antlibUrl,
060: String uri) {
061: // Check if we can contact the URL
062: try {
063: antlibUrl.openConnection().connect();
064: } catch (IOException ex) {
065: throw new BuildException("Unable to find " + antlibUrl, ex);
066: }
067: ComponentHelper helper = ComponentHelper
068: .getComponentHelper(project);
069: helper.enterAntLib(uri);
070: try {
071: // Should be safe to parse
072: ProjectHelper2 parser = new ProjectHelper2();
073: UnknownElement ue = parser.parseUnknownElement(project,
074: antlibUrl);
075: // Check name is "antlib"
076: if (!(ue.getTag().equals(TAG))) {
077: throw new BuildException("Unexpected tag "
078: + ue.getTag() + " expecting " + TAG, ue
079: .getLocation());
080: }
081: Antlib antlib = new Antlib();
082: antlib.setProject(project);
083: antlib.setLocation(ue.getLocation());
084: antlib.setTaskName("antlib");
085: antlib.init();
086: ue.configure(antlib);
087: return antlib;
088: } finally {
089: helper.exitAntLib();
090: }
091: }
092:
093: //
094: // Instance
095: //
096: private ClassLoader classLoader;
097: private String uri = "";
098: private List tasks = new ArrayList();
099:
100: /**
101: * Set the class loader for this antlib.
102: * This class loader is used for any tasks that
103: * derive from Definer.
104: *
105: * @param classLoader the class loader
106: */
107: protected void setClassLoader(ClassLoader classLoader) {
108: this .classLoader = classLoader;
109: }
110:
111: /**
112: * Set the URI for this antlib.
113: * @param uri the namespace uri
114: */
115: protected void setURI(String uri) {
116: this .uri = uri;
117: }
118:
119: private ClassLoader getClassLoader() {
120: if (classLoader == null) {
121: classLoader = Antlib.class.getClassLoader();
122: }
123: return classLoader;
124: }
125:
126: /**
127: * add a task to the list of tasks
128: *
129: * @param nestedTask Nested task to execute in antlib
130: */
131: public void addTask(Task nestedTask) {
132: tasks.add(nestedTask);
133: }
134:
135: /**
136: * Execute the nested tasks, setting the classloader for
137: * any tasks that derive from Definer.
138: */
139: public void execute() {
140: for (Iterator i = tasks.iterator(); i.hasNext();) {
141: UnknownElement ue = (UnknownElement) i.next();
142: setLocation(ue.getLocation());
143: ue.maybeConfigure();
144: Object configuredObject = ue.getRealThing();
145: if (configuredObject == null) {
146: continue;
147: }
148: if (!(configuredObject instanceof AntlibDefinition)) {
149: throw new BuildException(
150: "Invalid task in antlib "
151: + ue.getTag()
152: + " "
153: + configuredObject.getClass()
154: + " does not "
155: + "extend org.apache.tools.ant.taskdefs.AntlibDefinition");
156: }
157: AntlibDefinition def = (AntlibDefinition) configuredObject;
158: def.setURI(uri);
159: def.setAntlibClassLoader(getClassLoader());
160: def.init();
161: def.execute();
162: }
163: }
164:
165: }
|