public void onStartElement()

in src/main/java/org/apache/easyant/core/ant/helper/EasyAntProjectHelper.java [91:254]


        public void onStartElement(String uri, String tag, String qname, Attributes attrs, AntXMLContext context)
                throws SAXParseException {

            String name = null;
            String depends = "";
            String extensionPoint = null;
            String phase = null;
            OnMissingExtensionPoint extensionPointMissing = null;

            Project project = context.getProject();

            Target target;
            if ("extension-point".equals(tag)) {
                target = new ExtensionPoint();
            } else if ("phase".equals(tag)) {
                target = new Phase();
            } else {
                target = new Target();
            }

            target.setProject(project);
            target.setLocation(new Location(context.getLocator()));
            context.addTarget(target);

            for (int i = 0; i < attrs.getLength(); i++) {
                String attrUri = attrs.getURI(i);
                if (attrUri != null && !attrUri.equals("") && !attrUri.equals(uri)) {
                    continue; // Ignore attributes from unknown uris
                }
                String key = attrs.getLocalName(i);
                String value = attrs.getValue(i);

                if (key.equals("name")) {
                    name = value;
                    if ("".equals(name)) {
                        throw new BuildException("name attribute must " + "not be empty");
                    }
                } else if (key.equals("depends")) {
                    depends = value;
                } else if (key.equals("if")) {
                    target.setIf(value);
                } else if (key.equals("unless")) {
                    target.setUnless(value);
                } else if (key.equals("id")) {
                    if (value != null && !value.equals("")) {
                        context.getProject().addReference(value, target);
                    }
                } else if (key.equals("description")) {
                    target.setDescription(value);
                } else if (key.equals("extensionOf")) {
                    extensionPoint = value;
                } else if (key.equals("onMissingExtensionPoint")) {
                    try {
                        extensionPointMissing = OnMissingExtensionPoint.valueOf(value);
                    } catch (IllegalArgumentException e) {
                        throw new BuildException("Invalid onMissingExtensionPoint " + value);
                    }
                } else if (key.equals("phase")) {
                    phase = value;
                } else {
                    throw new SAXParseException("Unexpected attribute \"" + key + "\"", context.getLocator());
                }
            }

            if (name == null) {
                throw new SAXParseException("target element appears without a name attribute", context.getLocator());
            }

            boolean isPhase = target instanceof Phase;

            String prefix = null;
            boolean isInIncludeMode = context.isIgnoringProjectTag() && isInIncludeMode();
            String sep = getCurrentPrefixSeparator();

            if (isInIncludeMode && !isPhase) {
                prefix = getTargetPrefix(context);
                if (prefix == null) {
                    throw new BuildException("can't include build file " + context.getBuildFile()
                            + ", no as attribute has been given" + " and the project tag doesn't"
                            + " specify a name attribute");
                }
                name = prefix + sep + name;
            }

            // Check if this target is in the current build file
            if (context.getCurrentTargets().get(name) != null) {
                throw new BuildException("Duplicate target '" + name + "'", target.getLocation());
            }
            Map<String, Target> projectTargets = project.getTargets();
            boolean usedTarget = false;
            // If the name has not already been defined define it
            if (projectTargets.containsKey(name)) {
                project.log("Already defined in main or a previous import, ignore " + name, Project.MSG_VERBOSE);
            } else {
                target.setName(name);
                context.getCurrentTargets().put(name, target);
                project.addOrReplaceTarget(name, target);
                usedTarget = true;
            }

            if (!depends.isEmpty()) {
                if (!isInIncludeMode) {
                    target.setDepends(depends);
                } else {
                    for (String curTarget : Target.parseDepends(depends, name, "depends")) {
                        if (projectTargets.containsKey(curTarget) && (projectTargets.get(curTarget) instanceof Phase)) {

                            target.addDependency(curTarget);
                        } else {
                            target.addDependency(prefix + sep + curTarget);
                        }
                    }
                }
            }
            if (!isInIncludeMode && context.isIgnoringProjectTag() && (prefix = getTargetPrefix(context)) != null) {
                // In an imported file (and not completely
                // ignoring the project tag or having a preconfigured prefix)
                String newName = prefix + sep + name;
                Target newTarget = usedTarget ? new Target(target) : target;
                newTarget.setName(newName);
                context.getCurrentTargets().put(newName, newTarget);
                project.addOrReplaceTarget(newName, newTarget);
            }
            if (extensionPointMissing != null && extensionPoint == null) {
                throw new BuildException("onMissingExtensionPoint attribute cannot "
                        + "be specified unless extensionOf is specified", target.getLocation());
            }
            if (extensionPoint != null) {
                ProjectHelper helper = ProjectUtils.getConfiguredProjectHelper(context.getProject());
                for (String tgName : Target.parseDepends(extensionPoint, name, "extensionOf")) {
                    if (isInIncludeMode()) {
                        tgName = prefix + sep + tgName;
                    }
                    if (extensionPointMissing == null) {
                        extensionPointMissing = OnMissingExtensionPoint.FAIL;
                    }

                    // defer extensionpoint resolution until the full
                    // import stack has been processed
                    helper.getExtensionStack().add(new String[]{tgName, name, extensionPointMissing.name()});
                }
            }
            if (phase != null) {
                if (!projectTargets.containsKey(phase)) {
                    if (!Project.toBoolean(project.getProperty("audit.mode"))) {
                        throw new BuildException("can't add target " + name + " to phase " + phase
                                + " because the phase" + " is unknown.");
                    } else {
                        Phase p = new Phase();
                        p.setName(phase);
                        project.addTarget(p);
                    }
                }

                Target t = projectTargets.get(phase);
                if (t != null) {
                    if (!(t instanceof Phase)) {
                        throw new BuildException("referenced target " + phase + " is not a phase");
                    }
                    t.addDependency(name);
                }
            }

        }