diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java new file mode 100644 index 00000000..8ff836a3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java @@ -0,0 +1,184 @@ +/* + * 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 java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +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.ProjectHelperRepository; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.TaskContainer; +import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.types.resources.URLResource; + + +/** + * Antlib task. It does not + * occur in an ant build file. It is the root element + * an antlib xml file. + * + * @since Ant 1.6 + */ +public class Antlib extends Task implements TaskContainer { + // + // Static + // + + /** The name of this task */ + public static final String TAG = "antlib"; + + /** + * Static method to read an ant lib definition from + * a url. + * + * @param project the current project + * @param antlibUrl the url to read the definitions from + * @param uri the uri that the antlib is to be placed in + * @return the ant lib task + */ + public static Antlib createAntlib(Project project, URL antlibUrl, + String uri) { + // Check if we can contact the URL + try { + URLConnection conn = antlibUrl.openConnection(); + conn.setUseCaches(false); + conn.connect(); + } catch (IOException ex) { + throw new BuildException( + "Unable to find " + antlibUrl, ex); + } + ComponentHelper helper = + ComponentHelper.getComponentHelper(project); + helper.enterAntLib(uri); + URLResource antlibResource = new URLResource(antlibUrl); + try { + // Should be safe to parse + ProjectHelper parser = null; + Object p = + project.getReference(ProjectHelper.PROJECTHELPER_REFERENCE); + if (p instanceof ProjectHelper) { + parser = (ProjectHelper) p; + if (!parser.canParseAntlibDescriptor(antlibResource)) { + parser = null; + } + } + if (parser == null) { + ProjectHelperRepository helperRepository = + ProjectHelperRepository.getInstance(); + parser = helperRepository.getProjectHelperForAntlib(antlibResource); + } + UnknownElement ue = + parser.parseAntlibDescriptor(project, antlibResource); + // Check name is "antlib" + if (!(ue.getTag().equals(TAG))) { + throw new BuildException( + "Unexpected tag " + ue.getTag() + " expecting " + + TAG, ue.getLocation()); + } + Antlib antlib = new Antlib(); + antlib.setProject(project); + antlib.setLocation(ue.getLocation()); + antlib.setTaskName("antlib"); + antlib.init(); + ue.configure(antlib); + return antlib; + } finally { + helper.exitAntLib(); + } + } + + // + // Instance + // + private ClassLoader classLoader; + private String uri = ""; + private List<Object> tasks = new ArrayList<Object>(); + + /** + * Set the class loader for this antlib. + * This class loader is used for any tasks that + * derive from Definer. + * + * @param classLoader the class loader + */ + protected void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + /** + * Set the URI for this antlib. + * @param uri the namespace uri + */ + protected void setURI(String uri) { + this.uri = uri; + } + + private ClassLoader getClassLoader() { + if (classLoader == null) { + classLoader = Antlib.class.getClassLoader(); + } + return classLoader; + } + + /** + * add a task to the list of tasks + * + * @param nestedTask Nested task to execute in antlib + */ + public void addTask(Task nestedTask) { + tasks.add(nestedTask); + } + + /** + * Execute the nested tasks, setting the classloader for + * any tasks that derive from Definer. + */ + public void execute() { + //TODO handle tasks added via #addTask() + for (Iterator<Object> i = tasks.iterator(); i.hasNext();) { + UnknownElement ue = (UnknownElement) i.next(); + setLocation(ue.getLocation()); + ue.maybeConfigure(); + Object configuredObject = ue.getRealThing(); + if (configuredObject == null) { + continue; + } + if (!(configuredObject instanceof AntlibDefinition)) { + throw new BuildException( + "Invalid task in antlib " + ue.getTag() + + " " + configuredObject.getClass() + " does not " + + "extend org.apache.tools.ant.taskdefs.AntlibDefinition"); + } + AntlibDefinition def = (AntlibDefinition) configuredObject; + def.setURI(uri); + def.setAntlibClassLoader(getClassLoader()); + def.init(); + def.execute(); + } + } + +} |