package io.takari.maven.plugins.plugin; /* * 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. */ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter; import org.codehaus.plexus.util.xml.XMLWriter; import io.takari.maven.plugins.plugin.model.MojoDescriptor; import io.takari.maven.plugins.plugin.model.MojoParameter; import io.takari.maven.plugins.plugin.model.MojoRequirement; import io.takari.maven.plugins.plugin.model.PluginDependency; import io.takari.maven.plugins.plugin.model.PluginDescriptor; // originally copied from org.apache.maven.tools.plugin.generator.PluginDescriptorGenerator class PluginDescriptorWriter { private static final String encoding = "UTF-8"; public void writeDescriptor(OutputStream outputStream, PluginDescriptor pluginDescriptor) throws IOException { OutputStreamWriter writer = new OutputStreamWriter(outputStream, encoding); XMLWriter w = new PrettyPrintXMLWriter(writer, encoding, null); w.writeMarkup("\n<!-- Generated by takari-plugin-tools -->\n\n"); w.startElement("plugin"); element(w, "name", pluginDescriptor.getName()); element(w, "description", pluginDescriptor.getDescription()); element(w, "groupId", pluginDescriptor.getGroupId()); element(w, "artifactId", pluginDescriptor.getArtifactId()); element(w, "version", pluginDescriptor.getVersion()); element(w, "goalPrefix", pluginDescriptor.getGoalPrefix()); element(w, "isolatedRealm", String.valueOf(pluginDescriptor.isIsolatedRealm())); element(w, "inheritedByDefault", String.valueOf(pluginDescriptor.isInheritedByDefault())); writeMojos(w, pluginDescriptor); writeDependencies(w, pluginDescriptor); w.endElement(); writer.flush(); } private void writeMojos(XMLWriter w, PluginDescriptor pluginDescriptor) { w.startElement("mojos"); List<MojoDescriptor> descriptors = new ArrayList<>(pluginDescriptor.getMojos()); Sorting.sortDescriptors(descriptors); for (MojoDescriptor descriptor : descriptors) { writeMojoDescriptor(descriptor, w); } w.endElement(); } private void writeDependencies(XMLWriter w, PluginDescriptor pluginDescriptor) { w.startElement("dependencies"); List<PluginDependency> deps = pluginDescriptor.getDependencies(); for (PluginDependency dep : deps) { w.startElement("dependency"); element(w, "groupId", dep.getGroupId()); element(w, "artifactId", dep.getArtifactId()); element(w, "type", dep.getType()); element(w, "version", dep.getVersion()); w.endElement(); } w.endElement(); } private void element(XMLWriter w, String name, String value) { if (StringUtils.isNotEmpty(value)) { w.startElement(name); w.writeText(value != null ? value : ""); w.endElement(); } } /** * @param mojoDescriptor not null * @param w not null * @param helpDescriptor will clean html content from description fields */ protected void writeMojoDescriptor(MojoDescriptor mojoDescriptor, XMLWriter w) { w.startElement("mojo"); element(w, "goal", mojoDescriptor.getGoal()); element(w, "description", mojoDescriptor.getDescription()); element(w, "requiresDependencyResolution", mojoDescriptor.getRequiresDependencyResolution()); element(w, "requiresDependencyCollection", mojoDescriptor.getRequiresDependencyCollection()); element(w, "requiresDirectInvocation", String.valueOf(mojoDescriptor.isRequiresDirectInvocation())); element(w, "requiresProject", String.valueOf(mojoDescriptor.isRequiresProject())); element(w, "requiresReports", String.valueOf(mojoDescriptor.isRequiresReports())); element(w, "aggregator", String.valueOf(mojoDescriptor.isAggregator())); element(w, "requiresOnline", String.valueOf(mojoDescriptor.isRequiresOnline())); element(w, "inheritedByDefault", String.valueOf(mojoDescriptor.isInheritedByDefault())); element(w, "phase", mojoDescriptor.getPhase()); element(w, "threadSafe", String.valueOf(mojoDescriptor.isThreadSafe())); element(w, "implementation", mojoDescriptor.getImplementation()); element(w, "language", mojoDescriptor.getLanguage()); element(w, "configurator", mojoDescriptor.getConfigurator()); element(w, "instantiationStrategy", mojoDescriptor.getInstantiationStrategy()); // Strategy for handling repeated reference to mojo in // the calculated (decorated, resolved) execution stack element(w, "executionStrategy", mojoDescriptor.getExecutionStrategy()); // if (StringUtils.isNotEmpty(mojoDescriptor.getExecutePhase())) { // element(w, "executePhase", mojoDescriptor.getExecutePhase()); // } // if (StringUtils.isNotEmpty(mojoDescriptor.getExecuteGoal())) { // element(w, "executeGoal", mojoDescriptor.getExecuteGoal()); // } // if (StringUtils.isNotEmpty(mojoDescriptor.getExecuteLifecycle())) { // element(w, "executeLifecycle", mojoDescriptor.getExecuteLifecycle()); // } // if (StringUtils.isNotEmpty(mojoDescriptor.getComponentComposer())) { // w.startElement("composer"); // w.writeText(mojoDescriptor.getComponentComposer()); // w.endElement(); // } element(w, "since", mojoDescriptor.getSince()); element(w, "deprecated", mojoDescriptor.getDeprecated()); // ---------------------------------------------------------------------- // Parameters // ---------------------------------------------------------------------- Set<MojoParameter> configuration = new LinkedHashSet<MojoParameter>(); w.startElement("parameters"); List<MojoParameter> parameters = new ArrayList<>(mojoDescriptor.getParameters()); Sorting.sortParameters(parameters); for (MojoParameter parameter : parameters) { w.startElement("parameter"); element(w, "name", parameter.getName()); element(w, "alias", parameter.getAlias()); element(w, "type", parameter.getType()); element(w, "since", parameter.getSince()); element(w, "deprecated", parameter.getDeprecated()); element(w, "implementation", parameter.getImplementation()); element(w, "required", Boolean.toString(parameter.isRequired())); element(w, "editable", Boolean.toString(parameter.isEditable())); element(w, "description", parameter.getDescription()); w.endElement(); if (StringUtils.isNotEmpty(parameter.getDefaultValue()) || StringUtils.isNotEmpty(parameter.getExpression())) { configuration.add(parameter); } } w.endElement(); // ---------------------------------------------------------------------- // Configuration // ---------------------------------------------------------------------- if (!configuration.isEmpty()) { w.startElement("configuration"); for (MojoParameter parameter : configuration) { w.startElement(parameter.getName()); String type = parameter.getType(); if (StringUtils.isNotEmpty(type)) { w.addAttribute("implementation", type); } if (parameter.getDefaultValue() != null) { w.addAttribute("default-value", parameter.getDefaultValue()); } if (StringUtils.isNotEmpty(parameter.getExpression())) { w.writeText(parameter.getExpression()); } w.endElement(); } w.endElement(); } List<MojoRequirement> requirements = new ArrayList<>(mojoDescriptor.getRequirements()); if (!requirements.isEmpty()) { Sorting.sortRequirements(requirements); w.startElement("requirements"); for (MojoRequirement requirement : requirements) { w.startElement("requirement"); element(w, "role", requirement.getRole()); element(w, "role-hint", requirement.getRoleHint()); element(w, "field-name", requirement.getFieldName()); w.endElement(); } w.endElement(); } w.endElement(); } }