/*
 * 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.                                           *
 */
package org.apache.rat.api;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * Describe the MIME content type of a resource.
 */
public class ContentType {
    private final String mediaType;
    private final String subType;
    private final Map<String, String> parameters;

    /**
     * Constructs content types, 
     * performing an necessary conversions.
     * @param mediaType not null
     * @param subType not null
     * @param parameters not null
     */
    public ContentType(final String mediaType, final String subType, final Map<String, String> parameters) {
        super();
        this.mediaType = mediaType.toLowerCase(Locale.US);
        this.subType = subType.toLowerCase(Locale.US);
        this.parameters = new HashMap<String, String>(parameters.size());
        for (Map.Entry<String, String> entry : parameters.entrySet()) {
            this.parameters.put(entry.getKey().toLowerCase(Locale.US), entry.getValue());
        }
    }

    /**
     * Gets the media type,
     * normalised to lower case.
     * @return media type, not null
     */
    public String getMediaType() {
        return mediaType;
    }
    
    /**
     * Gets the media sub type
     * normalised to lower case
     * @return sub type, not null
     */
    public String getSubType() {
        return subType;
    }
    
    /**
     * Gets an immutable map
     * containing all content type parameters 
     * with keys normalised to lower case.
     * @return not null
     */
    public Map<String, String> getParameters() {
        return parameters;
    }
}
