package org.apache.maven.shared.utils;

/*
 * 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 java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import org.apache.maven.shared.utils.xml.XmlStreamWriter;


import javax.annotation.Nonnull;

/**
 * Utility to create Writers, with explicit encoding choice: platform default,
 * XML, or specified.
 *
 * @author Hervé Boutemy
 * @see java.nio.charset.Charset
 * @see <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/intl/encoding.doc.html">Supported encodings</a>
 * @version $Id$
 */
public class WriterFactory
{
    /**
     * ISO Latin Alphabet #1, also known as ISO-LATIN-1.
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String ISO_8859_1 = "ISO-8859-1";

    /**
     * Seven-bit ASCII, also known as ISO646-US, also known as the Basic Latin block of the Unicode character set.
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String US_ASCII = "US-ASCII";

    /**
     * Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial byte-order mark (either
     * order accepted on input, big-endian used on output).
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String UTF_16 = "UTF-16";

    /**
     * Sixteen-bit Unicode Transformation Format, big-endian byte order.
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String UTF_16BE = "UTF-16BE";

    /**
     * Sixteen-bit Unicode Transformation Format, little-endian byte order.
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String UTF_16LE = "UTF-16LE";

    /**
     * Eight-bit Unicode Transformation Format.
     * Every implementation of the Java platform is required to support this character encoding.
     * @see java.nio.charset.Charset
     */
    public static final String UTF_8 = "UTF-8";

    /**
     * The <code>file.encoding</code> System Property.
     */
    public static final String FILE_ENCODING = System.getProperty( "file.encoding" );

    /**
     * Create a new Writer with XML encoding detection rules.
     *
     * @param out not null output stream.
     * @return an XML writer instance for the output stream.
     * @throws IOException if any.
     * @see XmlStreamWriter
     */
    public static XmlStreamWriter newXmlWriter( @Nonnull OutputStream out )
        throws IOException
    {
        return new XmlStreamWriter( out );
    }

    /**
     * Create a new Writer with XML encoding detection rules.
     *
     * @param file not null file.
     * @return an XML writer instance for the output file.
     * @throws IOException if any.
     * @see XmlStreamWriter
     */
    public static XmlStreamWriter newXmlWriter( @Nonnull File file )
        throws IOException
    {
        return new XmlStreamWriter( file );
    }

    /**
     * Create a new Writer with default platform encoding.
     *
     * @param out not null output stream.
     * @return a writer instance for the output stream using the default platform charset.
     * @see java.nio.charset.Charset#defaultCharset()
     */
    public static Writer newPlatformWriter( @Nonnull OutputStream out )
    {
        return new OutputStreamWriter( out );
    }

    /**
     * Create a new Writer with default platform encoding.
     *
     * @param file not null file.
     * @return a writer instance for the output file using the default platform charset.
     * @throws IOException if any.
     * @see java.nio.charset.Charset#defaultCharset()
     */
    public static Writer newPlatformWriter( @Nonnull File file )
        throws IOException
    {
        return new FileWriter( file );
    }

    /**
     * Create a new Writer with specified encoding.
     *
     * @param out not null output stream.
     * @param encoding not null supported encoding.
     * @return a writer instance for the output stream using the given encoding.
     * @throws UnsupportedEncodingException if any.
     * @see <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/intl/encoding.doc.html">Supported encodings</a>
     */
    public static Writer newWriter( @Nonnull OutputStream out, @Nonnull String encoding )
        throws UnsupportedEncodingException
    {
        return new OutputStreamWriter( out, encoding );
    }

    /**
     * Create a new Writer with specified encoding.
     *
     * @param file not null file.
     * @param encoding not null supported encoding.
     * @return a writer instance for the output file using the given encoding.
     * @throws UnsupportedEncodingException if any.
     * @throws FileNotFoundException if any.
     * @see <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/intl/encoding.doc.html">Supported encodings</a>
     */
    public static Writer newWriter( @Nonnull File file, @Nonnull String encoding )
        throws UnsupportedEncodingException, FileNotFoundException
    {
        return newWriter( new FileOutputStream( file ), encoding );
    }
}
