diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java new file mode 100644 index 00000000..99e3d1a1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java @@ -0,0 +1,417 @@ +/* + * 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.helper; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.RuntimeConfigurable; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.util.FileUtils; +import org.xml.sax.Attributes; +import org.xml.sax.Locator; + +/** + * Context information for the ant processing. + * + */ +public class AntXMLContext { + /** The project to configure. */ + private Project project; + + /** The configuration file to parse. */ + private File buildFile; + + /** The configuration file to parse. */ + private URL buildFileURL; + + /** Vector with all the targets, in the order they are + * defined. Project maintains a Hashtable, which is not ordered. + * This will allow description to know the original order. + */ + private Vector<Target> targetVector = new Vector<Target>(); + + /** + * Parent directory of the build file. Used for resolving entities + * and setting the project's base directory. + */ + private File buildFileParent; + + /** + * Parent directory of the build file. Used for resolving entities + * and setting the project's base directory. + */ + private URL buildFileParentURL; + + /** Name of the current project */ + private String currentProjectName; + + /** + * Locator for the configuration file parser. + * Used for giving locations of errors etc. + */ + private Locator locator; + + /** + * Target that all other targets will depend upon implicitly. + * + * <p>This holds all tasks and data type definitions that have + * been placed outside of targets.</p> + */ + private Target implicitTarget = new Target(); + + /** Current target ( no need for a stack as the processing model + allows only one level of target ) */ + private Target currentTarget = null; + + /** The stack of RuntimeConfigurable2 wrapping the + objects. + */ + private Vector<RuntimeConfigurable> wStack = new Vector<RuntimeConfigurable>(); + + /** + * Indicates whether the project tag attributes are to be ignored + * when processing a particular build file. + */ + private boolean ignoreProjectTag = false; + + /** Keeps track of prefix -> uri mapping during parsing */ + private Map<String, List<String>> prefixMapping = new HashMap<String, List<String>>(); + + + /** Keeps track of targets in files */ + private Map<String, Target> currentTargets = null; + + /** + * constructor + * @param project the project to which this antxml context belongs to + */ + public AntXMLContext(Project project) { + this.project = project; + implicitTarget.setProject(project); + implicitTarget.setName(""); + targetVector.addElement(implicitTarget); + } + + /** + * sets the build file to which the XML context belongs + * @param buildFile ant build file + */ + public void setBuildFile(File buildFile) { + this.buildFile = buildFile; + if (buildFile != null) { + this.buildFileParent = new File(buildFile.getParent()); + implicitTarget.setLocation(new Location(buildFile.getAbsolutePath())); + try { + setBuildFile(FileUtils.getFileUtils().getFileURL(buildFile)); + } catch (MalformedURLException ex) { + throw new BuildException(ex); + } + } else { + this.buildFileParent = null; + } + } + + /** + * sets the build file to which the XML context belongs + * @param buildFile ant build file + * @since Ant 1.8.0 + */ + public void setBuildFile(URL buildFile) throws MalformedURLException { + this.buildFileURL = buildFile; + this.buildFileParentURL = new URL(buildFile, "."); + if (implicitTarget.getLocation() == null) { + implicitTarget.setLocation(new Location(buildFile.toString())); + } + } + + /** + * find out the build file + * @return the build file to which the xml context belongs + */ + public File getBuildFile() { + return buildFile; + } + + /** + * find out the parent build file of this build file + * @return the parent build file of this build file + */ + public File getBuildFileParent() { + return buildFileParent; + } + + /** + * find out the build file + * @return the build file to which the xml context belongs + * @since Ant 1.8.0 + */ + public URL getBuildFileURL() { + return buildFileURL; + } + + /** + * find out the parent build file of this build file + * @return the parent build file of this build file + * @since Ant 1.8.0 + */ + public URL getBuildFileParentURL() { + return buildFileParentURL; + } + + /** + * find out the project to which this antxml context belongs + * @return project + */ + public Project getProject() { + return project; + } + + /** + * find out the current project name + * @return current project name + */ + public String getCurrentProjectName() { + return currentProjectName; + } + + /** + * set the name of the current project + * @param name name of the current project + */ + public void setCurrentProjectName(String name) { + this.currentProjectName = name; + } + + /** + * get the current runtime configurable wrapper + * can return null + * @return runtime configurable wrapper + */ + public RuntimeConfigurable currentWrapper() { + if (wStack.size() < 1) { + return null; + } + return (RuntimeConfigurable) wStack.elementAt(wStack.size() - 1); + } + + /** + * get the runtime configurable wrapper of the parent project + * can return null + * @return runtime configurable wrapper of the parent project + */ + public RuntimeConfigurable parentWrapper() { + if (wStack.size() < 2) { + return null; + } + return (RuntimeConfigurable) wStack.elementAt(wStack.size() - 2); + } + + /** + * add a runtime configurable wrapper to the internal stack + * @param wrapper runtime configurable wrapper + */ + public void pushWrapper(RuntimeConfigurable wrapper) { + wStack.addElement(wrapper); + } + + /** + * remove a runtime configurable wrapper from the stack + */ + public void popWrapper() { + if (wStack.size() > 0) { + wStack.removeElementAt(wStack.size() - 1); + } + } + + /** + * access the stack of wrappers + * @return the stack of wrappers + */ + public Vector<RuntimeConfigurable> getWrapperStack() { + return wStack; + } + + /** + * add a new target + * @param target target to add + */ + public void addTarget(Target target) { + targetVector.addElement(target); + currentTarget = target; + } + + /** + * get the current target + * @return current target + */ + public Target getCurrentTarget() { + return currentTarget; + } + + /** + * get the implicit target + * @return implicit target + */ + public Target getImplicitTarget() { + return implicitTarget; + } + + /** + * sets the current target + * @param target current target + */ + public void setCurrentTarget(Target target) { + this.currentTarget = target; + } + + /** + * sets the implicit target + * @param target the implicit target + */ + public void setImplicitTarget(Target target) { + this.implicitTarget = target; + } + + /** + * access the vector of targets + * @return vector of targets + */ + public Vector<Target> getTargets() { + return targetVector; + } + + /** + * Scans an attribute list for the <code>id</code> attribute and + * stores a reference to the target object in the project if an + * id is found. + * <p> + * This method was moved out of the configure method to allow + * it to be executed at parse time. + * @param element the current element + * @param attr attributes of the current element + */ + public void configureId(Object element, Attributes attr) { + String id = attr.getValue("id"); + if (id != null) { + project.addIdReference(id, element); + } + } + + /** + * access the locator + * @return locator + */ + public Locator getLocator() { + return locator; + } + + /** + * sets the locator + * @param locator locator + */ + public void setLocator(Locator locator) { + this.locator = locator; + } + + /** + * tells whether the project tag is being ignored + * @return whether the project tag is being ignored + */ + public boolean isIgnoringProjectTag() { + return ignoreProjectTag; + } + + /** + * sets the flag to ignore the project tag + * @param flag to ignore the project tag + */ + public void setIgnoreProjectTag(boolean flag) { + this.ignoreProjectTag = flag; + } + + /** + * Called during parsing, stores the prefix to uri mapping. + * + * @param prefix a namespace prefix + * @param uri a namespace uri + */ + public void startPrefixMapping(String prefix, String uri) { + List<String> list = prefixMapping.get(prefix); + if (list == null) { + list = new ArrayList<String>(); + prefixMapping.put(prefix, list); + } + list.add(uri); + } + + /** + * End of prefix to uri mapping. + * + * @param prefix the namespace prefix + */ + public void endPrefixMapping(String prefix) { + List<String> list = prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return; // Should not happen + } + list.remove(list.size() - 1); + } + + /** + * prefix to namespace uri mapping + * + * @param prefix the prefix to map + * @return the uri for this prefix, null if not present + */ + public String getPrefixMapping(String prefix) { + List<String> list = prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return null; + } + return (String) list.get(list.size() - 1); + } + + /** + * Get the targets in the current source file. + * @return the current targets. + */ + public Map<String, Target> getCurrentTargets() { + return currentTargets; + } + + /** + * Set the map of the targets in the current source file. + * @param currentTargets a map of targets. + */ + public void setCurrentTargets(Map<String, Target> currentTargets) { + this.currentTargets = currentTargets; + } + +} + + |