/** * Parse a source xml input. * * @param project the current project * @param source the xml source * @exception BuildException if an error occurs */ public void parse(Project project, Object source) throws BuildException { getImportStack().addElement(source); AntXMLContext context = null; context = (AntXMLContext) project.getReference(REFID_CONTEXT); if (context == null) { context = new AntXMLContext(project); project.addReference(REFID_CONTEXT, context); project.addReference(REFID_TARGETS, context.getTargets()); } if (getImportStack().size() > 1) { // we are in an imported file. context.setIgnoreProjectTag(true); Target currentTarget = context.getCurrentTarget(); Target currentImplicit = context.getImplicitTarget(); Map<String, Target> currentTargets = context.getCurrentTargets(); try { Target newCurrent = new Target(); newCurrent.setProject(project); newCurrent.setName(""); context.setCurrentTarget(newCurrent); context.setCurrentTargets(new HashMap<String, Target>()); context.setImplicitTarget(newCurrent); parse(project, source, new RootHandler(context, mainHandler)); newCurrent.execute(); } finally { context.setCurrentTarget(currentTarget); context.setImplicitTarget(currentImplicit); context.setCurrentTargets(currentTargets); } } else { // top level file context.setCurrentTargets(new HashMap<String, Target>()); parse(project, source, new RootHandler(context, mainHandler)); // Execute the top-level target context.getImplicitTarget().execute(); // resolve extensionOf attributes resolveExtensionOfAttributes(project); } }
/** * Parse a source xml input. * * @param project the current project * @param source the xml source * @exception BuildException if an error occurs */ public void parse(Project project, Object source) throws BuildException { getImportStack().addElement(source); AntXMLContext context = null; context = (AntXMLContext) project.getReference(REFID_CONTEXT); if (context == null) { context = new AntXMLContext(project); project.addReference(REFID_CONTEXT, context); project.addReference(REFID_TARGETS, context.getTargets()); } if (getImportStack().size() > 1) { // we are in an imported file. context.setIgnoreProjectTag(true); Target currentTarget = context.getCurrentTarget(); Target currentImplicit = context.getImplicitTarget(); Map currentTargets = context.getCurrentTargets(); try { Target newCurrent = new Target(); newCurrent.setProject(project); newCurrent.setName(""); context.setCurrentTarget(newCurrent); context.setCurrentTargets(new HashMap()); context.setImplicitTarget(newCurrent); parse(project, source, new RootHandler(context, mainHandler)); newCurrent.execute(); } finally { context.setCurrentTarget(currentTarget); context.setImplicitTarget(currentImplicit); context.setCurrentTargets(currentTargets); } } else { // top level file context.setCurrentTargets(new HashMap()); parse(project, source, new RootHandler(context, mainHandler)); // Execute the top-level target context.getImplicitTarget().execute(); // resolve extensionOf attributes for (Iterator i = getExtensionStack().iterator(); i.hasNext(); ) { String[] extensionInfo = (String[]) i.next(); String tgName = extensionInfo[0]; String name = extensionInfo[1]; OnMissingExtensionPoint missingBehaviour = OnMissingExtensionPoint.valueOf(extensionInfo[2]); Hashtable projectTargets = project.getTargets(); if (!projectTargets.containsKey(tgName)) { String message = "can't add target " + name + " to extension-point " + tgName + " because the extension-point is unknown."; if (missingBehaviour == OnMissingExtensionPoint.FAIL) { throw new BuildException(message); } else if (missingBehaviour == OnMissingExtensionPoint.WARN) { Target target = (Target) projectTargets.get(name); context.getProject().log(target, "Warning: " + message, Project.MSG_WARN); } } else { Target t = (Target) projectTargets.get(tgName); if (!(t instanceof ExtensionPoint)) { throw new BuildException("referenced target " + tgName + " is not an extension-point"); } t.addDependency(name); } } } }
/** * Initialisation routine called after handler creation with the element name and attributes. * This configures the element with its attributes and sets it up with its parent container (if * any). Nested elements are then added later as the parser encounters them. * * @param uri The namespace URI for this element. * @param tag Name of the element which caused this handler to be created. Must not be <code> * null</code>. * @param qname The qualified name for this element. * @param attrs Attributes of the element which caused this handler to be created. Must not be * <code>null</code>. * @param context The current context. * @exception SAXParseException in case of error (not thrown in this implementation) */ public void onStartElement( String uri, String tag, String qname, Attributes attrs, AntXMLContext context) throws SAXParseException { RuntimeConfigurable parentWrapper = context.currentWrapper(); Object parent = null; if (parentWrapper != null) { parent = parentWrapper.getProxy(); } /* UnknownElement is used for tasks and data types - with delayed eval */ UnknownElement task = new UnknownElement(tag); task.setProject(context.getProject()); task.setNamespace(uri); task.setQName(qname); task.setTaskType(ProjectHelper.genComponentName(task.getNamespace(), tag)); task.setTaskName(qname); Location location = new Location( context.getLocator().getSystemId(), context.getLocator().getLineNumber(), context.getLocator().getColumnNumber()); task.setLocation(location); task.setOwningTarget(context.getCurrentTarget()); if (parent != null) { // Nested element ((UnknownElement) parent).addChild(task); } else { // Task included in a target ( including the default one ). context.getCurrentTarget().addTask(task); } context.configureId(task, attrs); // container.addTask(task); // This is a nop in UE: task.init(); RuntimeConfigurable wrapper = new RuntimeConfigurable(task, task.getTaskName()); for (int i = 0; i < attrs.getLength(); i++) { String name = attrs.getLocalName(i); String attrUri = attrs.getURI(i); if (attrUri != null && !attrUri.equals("") && !attrUri.equals(uri)) { name = attrUri + ":" + attrs.getQName(i); } String value = attrs.getValue(i); // PR: Hack for ant-type value // an ant-type is a component name which can // be namespaced, need to extract the name // and convert from qualified name to uri/name if (ANT_TYPE.equals(name) || (ANT_CORE_URI.equals(attrUri) && ANT_TYPE.equals(attrs.getLocalName(i)))) { name = ANT_TYPE; int index = value.indexOf(":"); if (index >= 0) { String prefix = value.substring(0, index); String mappedUri = context.getPrefixMapping(prefix); if (mappedUri == null) { throw new BuildException("Unable to find XML NS prefix \"" + prefix + "\""); } value = ProjectHelper.genComponentName(mappedUri, value.substring(index + 1)); } } wrapper.setAttribute(name, value); } if (parentWrapper != null) { parentWrapper.addChild(wrapper); } context.pushWrapper(wrapper); }