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>
 */
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 );
    }
}
