package org.codehaus.plexus.configuration.io;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class XmlPlexusConfigurationWriter
implements PlexusConfigurationWriter
{
public void write( OutputStream outputStream, PlexusConfiguration configuration )
throws IOException
{
write( new OutputStreamWriter( outputStream, "UTF-8" ), configuration );
}
public void write( Writer writer, PlexusConfiguration configuration )
throws IOException
{
int depth = 0;
display( configuration, writer, depth );
}
private void display( PlexusConfiguration c, Writer w, int depth )
throws IOException
{
int count = c.getChildCount();
if ( count == 0 )
{
displayTag( c, w, depth );
}
else
{
indent( depth, w );
w.write( '<' );
w.write( c.getName() );
attributes( c, w );
w.write( '>' );
w.write( '\n' );
for ( int i = 0; i < count; i++ )
{
PlexusConfiguration child = c.getChild( i );
display( child, w, depth + 1 );
}
indent( depth, w );
w.write( '<' );
w.write( '/' );
w.write( c.getName() );
w.write( '>' );
w.write( '\n' );
}
}
private void displayTag( PlexusConfiguration c, Writer w, int depth )
throws IOException
{
String value = c.getValue( null );
if ( value != null )
{
indent( depth, w );
w.write( '<' );
w.write( c.getName() );
attributes( c, w );
w.write( '>' );
w.write( c.getValue( null ) );
w.write( '<' );
w.write( '/' );
w.write( c.getName() );
w.write( '>' );
w.write( '\n' );
}
else
{
indent( depth, w );
w.write( '<' );
w.write( c.getName() );
attributes( c, w );
w.write( '/' );
w.write( '>' );
w.write( "\n" );
}
}
private void attributes( PlexusConfiguration c, Writer w )
throws IOException
{
String[] names = c.getAttributeNames();
for ( int i = 0; i < names.length; i++ )
{
w.write( ' ' );
w.write( names[i] );
w.write( '=' );
w.write( '"' );
w.write( c.getAttribute( names[i], null ) );
w.write( '"' );
}
}
private void indent( int depth, Writer w )
throws IOException
{
for ( int i = 0; i < depth; i++ )
{
w.write( ' ' );
}
}
}