All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.plexus.metadata.DefaultComponentDescriptorWriter Maven / Gradle / Ivy

Go to download

A Maven plugin to generate Plexus Components descriptors from source javadoc tags and Java class annotations.

The newest version!
/*
 * The MIT License
 *
 * Copyright (c) 2007, The Codehaus
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package org.codehaus.plexus.metadata;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

import org.codehaus.plexus.component.repository.ComponentDependency;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.codehaus.plexus.component.repository.ComponentRequirement;
import org.codehaus.plexus.component.repository.ComponentRequirementList;
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
import org.codehaus.plexus.util.xml.XMLWriter;

/**
 * Serializes a {@link ComponentSetDescriptor}.
 *
 * @author Kenney Westerhof
 * @author Jason van Zyl
 * @author Trygve Laugstøl
 */
public class DefaultComponentDescriptorWriter implements ComponentDescriptorWriter {
    private static final String LS = System.getProperty("line.separator");

    public void writeDescriptorSet(
            Writer writer, ComponentSetDescriptor componentSetDescriptor, boolean containerDescriptor)
            throws ComponentDescriptorWriteException, IOException {
        try {
            XMLWriter w = new PrettyPrintXMLWriter(writer);

            w.startElement(containerDescriptor ? "plexus" : "component-set");

            writeComponents(w, componentSetDescriptor.getComponents());

            writeDependencies(w, componentSetDescriptor.getDependencies());

            w.endElement();

            writer.write(LS);

            // Flush, but don't close the writer... we are not its owner
            writer.flush();
        } catch (PlexusConfigurationException e) {
            throw new ComponentDescriptorWriteException("Internal error while writing out the configuration", e);
        }
    }

    private void writeComponents(XMLWriter w, List> componentDescriptors)
            throws ComponentDescriptorWriteException, PlexusConfigurationException {
        if (componentDescriptors == null) {
            return;
        }

        w.startElement("components");

        for (ComponentDescriptor cd : componentDescriptors) {
            w.startElement("component");

            element(w, "role", cd.getRole());

            element(w, "role-hint", cd.getRoleHint());

            element(w, "implementation", cd.getImplementation());

            element(w, "version", cd.getVersion());

            element(w, "component-type", cd.getComponentType());

            element(w, "instantiation-strategy", cd.getInstantiationStrategy());

            element(w, "lifecycle-handler", cd.getLifecycleHandler());

            element(w, "component-profile", cd.getComponentProfile());

            element(w, "component-composer", cd.getComponentComposer());

            element(w, "component-configurator", cd.getComponentConfigurator());

            element(w, "component-factory", cd.getComponentFactory());

            element(w, "description", cd.getDescription());

            element(w, "alias", cd.getAlias());

            element(w, "isolated-realm", Boolean.toString(cd.isIsolatedRealm()));

            writeRequirements(w, cd.getRequirements());

            writeConfiguration(w, cd.getConfiguration());

            w.endElement();
        }

        w.endElement();
    }

    public void writeDependencies(XMLWriter w, List deps) {
        if (deps == null || deps.size() == 0) {
            return;
        }

        w.startElement("dependencies");

        for (ComponentDependency dep : deps) {
            writeDependencyElement(dep, w);
        }

        w.endElement();
    }

    private void writeDependencyElement(ComponentDependency dependency, XMLWriter w) {
        w.startElement("dependency");

        String groupId = dependency.getGroupId();

        element(w, "groupId", groupId);

        String artifactId = dependency.getArtifactId();

        element(w, "artifactId", artifactId);

        String type = dependency.getType();

        if (type != null) {
            element(w, "type", type);
        }

        String version = dependency.getVersion();

        element(w, "version", version);

        w.endElement();
    }

    private void writeRequirements(XMLWriter w, List requirements) {
        if (requirements == null || requirements.size() == 0) {
            return;
        }

        w.startElement("requirements");

        for (ComponentRequirement cr : requirements) {
            w.startElement("requirement");

            element(w, "role", cr.getRole());

            if (cr instanceof ComponentRequirementList) {
                List hints = ((ComponentRequirementList) cr).getRoleHints();

                if (hints != null) {
                    w.startElement("role-hints");

                    for (String roleHint : hints) {
                        w.startElement("role-hint");

                        w.writeText(roleHint);

                        w.endElement();
                    }

                    w.endElement();
                }
            } else {
                // ensure there's no  written, which causes ComponentLookupException
                element(w, "role-hint", "".equals(cr.getRoleHint()) ? null : cr.getRoleHint());
            }

            element(w, "field-name", cr.getFieldName());

            element(w, "optional", cr.isOptional() ? Boolean.TRUE.toString() : null);

            w.endElement();
        }

        w.endElement();
    }

    private void writeConfiguration(XMLWriter w, PlexusConfiguration configuration)
            throws ComponentDescriptorWriteException, PlexusConfigurationException {
        if (configuration == null || configuration.getChildCount() == 0) {
            return;
        }

        if (!configuration.getName().equals("configuration")) {
            throw new ComponentDescriptorWriteException("The root node of the configuration must be 'configuration'.");
        }

        writePlexusConfiguration(w, configuration);
    }

    private void writePlexusConfiguration(XMLWriter xmlWriter, PlexusConfiguration c)
            throws PlexusConfigurationException {
        if (c.getAttributeNames().length == 0 && c.getChildCount() == 0 && c.getValue() == null) {
            return;
        }

        xmlWriter.startElement(c.getName());

        // ----------------------------------------------------------------------
        // Write the attributes
        // ----------------------------------------------------------------------

        String[] attributeNames = c.getAttributeNames();

        for (String attributeName : attributeNames) {
            xmlWriter.addAttribute(attributeName, c.getAttribute(attributeName));
        }

        // ----------------------------------------------------------------------
        // Write the children
        // ----------------------------------------------------------------------

        PlexusConfiguration[] children = c.getChildren();

        if (children.length > 0) {
            for (PlexusConfiguration aChildren : children) {
                writePlexusConfiguration(xmlWriter, aChildren);
            }
        } else {
            String value = c.getValue();

            if (value != null) {
                xmlWriter.writeText(value);
            }
        }

        xmlWriter.endElement();
    }

    private void element(XMLWriter w, String name, String value) {
        if (value == null) {
            return;
        }

        w.startElement(name);

        w.writeText(value);

        w.endElement();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy