protected void processMojoDescriptor()

in maven-plugin-tools-generators/src/main/java/org/apache/maven/tools/plugin/generator/PluginDescriptorFilesGenerator.java [230:617]


    protected void processMojoDescriptor(
            MojoDescriptor mojoDescriptor,
            XMLWriter w,
            DescriptorType type,
            JavadocLinkGenerator javadocLinkGenerator,
            boolean isV4) {
        boolean containsXhtmlTextValues = mojoDescriptor instanceof ExtendedMojoDescriptor
                && ((ExtendedMojoDescriptor) mojoDescriptor).containsXhtmlTextValues();

        w.startElement("mojo");

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        w.startElement("goal");
        w.writeText(mojoDescriptor.getGoal());
        w.endElement();

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        String description = mojoDescriptor.getDescription();

        if (description != null && !description.isEmpty()) {
            w.startElement("description");
            w.writeText(getTextValue(type, containsXhtmlTextValues, mojoDescriptor.getDescription()));
            w.endElement();
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (StringUtils.isNotEmpty(mojoDescriptor.getDependencyResolutionRequired())) {
            GeneratorUtils.element(
                    w,
                    isV4 ? "dependencyResolution" : "requiresDependencyResolution",
                    mojoDescriptor.getDependencyResolutionRequired());
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        GeneratorUtils.element(
                w,
                isV4 ? "directInvocationOnly" : "requiresDirectInvocation",
                String.valueOf(mojoDescriptor.isDirectInvocationOnly()));

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        GeneratorUtils.element(
                w, isV4 ? "projectRequired" : "requiresProject", String.valueOf(mojoDescriptor.isProjectRequired()));

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (!isV4) {
            GeneratorUtils.element(w, "requiresReports", String.valueOf(mojoDescriptor.isRequiresReports()));
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        GeneratorUtils.element(w, "aggregator", String.valueOf(mojoDescriptor.isAggregator()));

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        GeneratorUtils.element(
                w, isV4 ? "onlineRequired" : "requiresOnline", String.valueOf(mojoDescriptor.isOnlineRequired()));

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        GeneratorUtils.element(w, "inheritedByDefault", String.valueOf(mojoDescriptor.isInheritedByDefault()));

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (StringUtils.isNotEmpty(mojoDescriptor.getPhase())) {
            GeneratorUtils.element(w, "phase", mojoDescriptor.getPhase());
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (StringUtils.isNotEmpty(mojoDescriptor.getExecutePhase())) {
            GeneratorUtils.element(w, "executePhase", mojoDescriptor.getExecutePhase());
        }

        if (StringUtils.isNotEmpty(mojoDescriptor.getExecuteGoal())) {
            GeneratorUtils.element(w, "executeGoal", mojoDescriptor.getExecuteGoal());
        }

        if (StringUtils.isNotEmpty(mojoDescriptor.getExecuteLifecycle())) {
            GeneratorUtils.element(w, "executeLifecycle", mojoDescriptor.getExecuteLifecycle());
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        w.startElement("implementation");
        w.writeText(mojoDescriptor.getImplementation());
        w.endElement();

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        w.startElement("language");
        w.writeText(mojoDescriptor.getLanguage());
        w.endElement();

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (StringUtils.isNotEmpty(mojoDescriptor.getComponentConfigurator())) {
            w.startElement("configurator");
            w.writeText(mojoDescriptor.getComponentConfigurator());
            w.endElement();
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (!isV4 && StringUtils.isNotEmpty(mojoDescriptor.getComponentComposer())) {
            w.startElement("composer");
            w.writeText(mojoDescriptor.getComponentComposer());
            w.endElement();
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (!isV4) {
            w.startElement("instantiationStrategy");
            w.writeText(mojoDescriptor.getInstantiationStrategy());
            w.endElement();
        }

        // ----------------------------------------------------------------------
        // Strategy for handling repeated reference to mojo in
        // the calculated (decorated, resolved) execution stack
        // ----------------------------------------------------------------------

        if (!isV4) {
            w.startElement("executionStrategy");
            w.writeText(mojoDescriptor.getExecutionStrategy());
            w.endElement();
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (mojoDescriptor.getSince() != null) {
            w.startElement("since");

            if (StringUtils.isEmpty(mojoDescriptor.getSince())) {
                w.writeText("No version given");
            } else {
                w.writeText(mojoDescriptor.getSince());
            }

            w.endElement();
        }

        // ----------------------------------------------------------------------
        //
        // ----------------------------------------------------------------------

        if (mojoDescriptor.getDeprecated() != null) {
            w.startElement("deprecated");

            if (StringUtils.isEmpty(mojoDescriptor.getDeprecated())) {
                w.writeText("No reason given");
            } else {
                w.writeText(getTextValue(type, containsXhtmlTextValues, mojoDescriptor.getDeprecated()));
            }

            w.endElement();
        }

        // ----------------------------------------------------------------------
        // Extended (3.0) descriptor
        // ----------------------------------------------------------------------

        if (mojoDescriptor instanceof ExtendedMojoDescriptor) {
            ExtendedMojoDescriptor extendedMojoDescriptor = (ExtendedMojoDescriptor) mojoDescriptor;
            if (extendedMojoDescriptor.getDependencyCollectionRequired() != null) {
                GeneratorUtils.element(
                        w,
                        isV4 ? "dependencyCollection" : "requiresDependencyCollection",
                        extendedMojoDescriptor.getDependencyCollectionRequired());
            }
            if (!isV4) {
                GeneratorUtils.element(w, "threadSafe", String.valueOf(extendedMojoDescriptor.isThreadSafe()));
            }
        }

        // ----------------------------------------------------------------------
        // Parameters
        // ----------------------------------------------------------------------

        List<Parameter> parameters = mojoDescriptor.getParameters();

        w.startElement("parameters");

        Map<String, Requirement> requirements = new LinkedHashMap<>();

        Set<Parameter> configuration = new LinkedHashSet<>();

        if (parameters != null) {
            if (type == DescriptorType.LIMITED_FOR_HELP_MOJO) {
                PluginUtils.sortMojoParameters(parameters);
            }

            for (Parameter parameter : parameters) {
                String expression = getExpression(parameter);

                if ((expression != null && !expression.isEmpty()) && expression.startsWith("${component.")) {
                    // treat it as a component...a requirement, in other words.

                    // remove "component." plus expression delimiters
                    String role = expression.substring("${component.".length(), expression.length() - 1);

                    String roleHint = null;

                    int posRoleHintSeparator = role.indexOf('#');
                    if (posRoleHintSeparator > 0) {
                        roleHint = role.substring(posRoleHintSeparator + 1);

                        role = role.substring(0, posRoleHintSeparator);
                    }

                    // TODO: remove deprecated expression
                    requirements.put(parameter.getName(), new Requirement(role, roleHint));
                } else if (parameter.getRequirement() != null) {
                    requirements.put(parameter.getName(), parameter.getRequirement());
                }
                // don't show readonly parameters in help
                else if (type != DescriptorType.LIMITED_FOR_HELP_MOJO || parameter.isEditable()) {
                    // treat it as a normal parameter.

                    w.startElement("parameter");

                    GeneratorUtils.element(w, "name", parameter.getName());

                    if (parameter.getAlias() != null) {
                        GeneratorUtils.element(w, "alias", parameter.getAlias());
                    }

                    writeParameterType(w, type, javadocLinkGenerator, parameter, mojoDescriptor.getGoal());

                    if (parameter.getSince() != null) {
                        w.startElement("since");

                        if (StringUtils.isEmpty(parameter.getSince())) {
                            w.writeText("No version given");
                        } else {
                            w.writeText(parameter.getSince());
                        }

                        w.endElement();
                    }

                    if (parameter.getDeprecated() != null) {
                        if (StringUtils.isEmpty(parameter.getDeprecated())) {
                            GeneratorUtils.element(w, "deprecated", "No reason given");
                        } else {
                            GeneratorUtils.element(
                                    w,
                                    "deprecated",
                                    getTextValue(type, containsXhtmlTextValues, parameter.getDeprecated()));
                        }
                    }

                    if (!isV4 && parameter.getImplementation() != null) {
                        GeneratorUtils.element(w, "implementation", parameter.getImplementation());
                    }

                    GeneratorUtils.element(w, "required", Boolean.toString(parameter.isRequired()));

                    GeneratorUtils.element(w, "editable", Boolean.toString(parameter.isEditable()));

                    GeneratorUtils.element(
                            w, "description", getTextValue(type, containsXhtmlTextValues, parameter.getDescription()));

                    if (isV4) {
                        if (StringUtils.isNotEmpty(parameter.getExpression())) {
                            GeneratorUtils.element(w, "expression", parameter.getExpression());
                        }
                        if (StringUtils.isNotEmpty(parameter.getDefaultValue())) {
                            GeneratorUtils.element(w, "defaultValue", parameter.getDefaultValue());
                        }
                    } else {
                        if (StringUtils.isNotEmpty(parameter.getDefaultValue())
                                || StringUtils.isNotEmpty(parameter.getExpression())) {
                            configuration.add(parameter);
                        }
                    }

                    w.endElement();
                }
            }
        }

        w.endElement();

        // ----------------------------------------------------------------------
        // Configuration
        // ----------------------------------------------------------------------

        if (!configuration.isEmpty()) {
            w.startElement("configuration");

            for (Parameter parameter : configuration) {
                if (type == DescriptorType.LIMITED_FOR_HELP_MOJO && !parameter.isEditable()) {
                    // don't show readonly parameters in help
                    continue;
                }

                w.startElement(parameter.getName());

                // strip type by parameter type (generics) information
                String parameterType = StringUtils.chomp(parameter.getType(), "<");
                if (parameterType != null && !parameterType.isEmpty()) {
                    w.addAttribute("implementation", parameterType);
                }

                if (parameter.getDefaultValue() != null) {
                    w.addAttribute("default-value", parameter.getDefaultValue());
                }

                if (StringUtils.isNotEmpty(parameter.getExpression())) {
                    w.writeText(parameter.getExpression());
                }

                w.endElement();
            }

            w.endElement();
        }

        // ----------------------------------------------------------------------
        // Requirements
        // ----------------------------------------------------------------------

        if (!requirements.isEmpty() && type != DescriptorType.LIMITED_FOR_HELP_MOJO) {
            w.startElement("requirements");

            for (Map.Entry<String, Requirement> entry : requirements.entrySet()) {
                String key = entry.getKey();
                Requirement requirement = entry.getValue();

                w.startElement("requirement");

                GeneratorUtils.element(w, "role", requirement.getRole());

                if (StringUtils.isNotEmpty(requirement.getRoleHint())) {
                    GeneratorUtils.element(w, "role-hint", requirement.getRoleHint());
                }

                GeneratorUtils.element(w, "field-name", key);

                w.endElement();
            }

            w.endElement();
        }

        w.endElement();
    }