package org.apache.maven.plugins.ear;

/*
 * 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 org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
import org.codehaus.plexus.util.xml.XMLWriter;

import java.io.File;
import java.io.IOException;
import java.io.Writer;

/**
 * A base class for deployment descriptor file generators.
 * 
 * @author <a href="snicoll@apache.org">Stephane Nicoll</a>
 * @version $Id: AbstractXmlWriter.java 1636449 2014-11-03 21:27:36Z khmarbaise $
 */
abstract class AbstractXmlWriter
{

    private final String encoding;

    protected static final String MODULE_ELEMENT = "module";

    protected static final String SERVICE_ELEMENT = "service";

    AbstractXmlWriter( String encoding )
    {
        this.encoding = encoding;
    }

    protected Writer initializeWriter( final File destinationFile )
        throws EarPluginException
    {
        try
        {
            return WriterFactory.newXmlWriter( destinationFile );
        }
        catch ( IOException ex )
        {
            // CHECKSTYLE_OFF: LineLength
            throw new EarPluginException( "Exception while opening file[" + destinationFile.getAbsolutePath() + "]", ex );
            // CHECKSTYLE_ON: LineLength
        }
    }

    protected XMLWriter initializeXmlWriter( final Writer writer, final String docType )
    {
        return new PrettyPrintXMLWriter( writer, encoding, docType );
    }

    protected void close( Writer closeable )
    {
        if ( closeable == null )
        {
            return;
        }

        try
        {
            closeable.close();
        }
        catch ( Exception e )
        {
            // TODO: warn
        }
    }

    public String getEncoding()
    {
        return encoding;
    }
}
