/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.javascript.commonjs.module.provider;

import java.io.Serializable;
import java.util.StringTokenizer;

/**
 * Breaks a "contentType; charset=encoding" MIME type into content type and encoding parts.
 *
 * @author Attila Szegedi
 * @version $Id: ParsedContentType.java,v 1.3 2011/04/07 20:26:12 hannes%helma.at Exp $
 */
public final class ParsedContentType implements Serializable {
    private static final long serialVersionUID = 1L;
    private final String contentType;
    private final String encoding;

    /**
     * Creates a new parsed content type.
     *
     * @param mimeType the full MIME type; typically the value of the "Content-Type" header of some
     *     MIME-compliant message. Can be null.
     */
    public ParsedContentType(String mimeType) {
        String contentType = null;
        String encoding = null;
        if (mimeType != null) {
            StringTokenizer tok = new StringTokenizer(mimeType, ";");
            if (tok.hasMoreTokens()) {
                contentType = tok.nextToken().trim();
                while (tok.hasMoreTokens()) {
                    String param = tok.nextToken().trim();
                    if (param.startsWith("charset=")) {
                        encoding = param.substring(8).trim();
                        int l = encoding.length();
                        if (l > 0) {
                            if (encoding.charAt(0) == '"') {
                                encoding = encoding.substring(1);
                            }
                            if (encoding.charAt(l - 1) == '"') {
                                encoding = encoding.substring(0, l - 1);
                            }
                        }
                        break;
                    }
                }
            }
        }
        this.contentType = contentType;
        this.encoding = encoding;
    }

    /**
     * Returns the content type (without charset declaration) of the MIME type.
     *
     * @return the content type (without charset declaration) of the MIME type. Can be null if the
     *     MIME type was null.
     */
    public String getContentType() {
        return contentType;
    }

    /**
     * Returns the character encoding of the MIME type.
     *
     * @return the character encoding of the MIME type. Can be null when it is not specified.
     */
    public String getEncoding() {
        return encoding;
    }
}
