/*
* 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 <a href="mailto:kenney@neonics.com">Kenney Westerhof</a>
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
* @author <a href="mailto:trygvis@inamo.no">Trygve Laugstøl</a>
*/
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<ComponentDescriptor<?>> 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<ComponentDependency> 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<ComponentRequirement> 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<String> 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
{
element( w, "role-hint", cr.getRoleHint() );
}
element( w, "field-name", cr.getFieldName() );
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();
}
}