package org.codehaus.plexus.metadata.merge;
/*
* The MIT License
*
* Copyright (c) 2006, 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.
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.codehaus.plexus.util.IOUtil;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
/**
* Base class for common mergers.
*
* @author <a href="mailto:brett@codehaus.org">Brett Porter</a>
*/
public abstract class AbstractMerger
implements Merger
{
/**
* @see org.codehaus.plexus.metadata.merge.Merger#writeMergedDocument(org.jdom.Document,
* java.io.File)
*/
public void writeMergedDocument( Document mergedDocument, File file )
throws IOException
{
if ( !file.getParentFile().exists() )
{
file.getParentFile().mkdirs();
}
XMLOutputter out = new XMLOutputter();
Writer fw = null;
try
{
fw = new OutputStreamWriter( new FileOutputStream( file ), "UTF-8" );
out.output( mergedDocument, fw );
}
finally
{
IOUtil.close( fw );
}
}
public void mergeDescriptors( File outputDescriptor, List<File> descriptors )
throws IOException
{
SAXBuilder builder = new SAXBuilder();
Document finalDoc = null;
for ( File f : descriptors )
{
try
{
Document doc = builder.build( f );
if ( finalDoc != null )
{
// Last specified has dominance
finalDoc = merge( doc, finalDoc );
}
else
{
finalDoc = doc;
}
}
catch ( JDOMException e )
{
throw new IOException( "Invalid input descriptor for merge: " + f + " --> " + e.getMessage() );
}
catch ( MergeException e )
{
throw new IOException( "Error merging descriptor: " + f + " --> " + e.getMessage() );
}
}
if ( finalDoc != null )
{
try
{
writeMergedDocument( finalDoc, outputDescriptor );
}
catch ( IOException e )
{
throw new IOException( "Error writing merged descriptor: " + outputDescriptor );
}
}
}
}