Package com.semagia.atomico.server.utils

Source Code of com.semagia.atomico.server.utils.MediaTypeUtils

/*
* Copyright 2008 - 2010 Lars Heuer (heuer[at]semagia.com). All rights reserved.
*
* Licensed 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 com.semagia.atomico.server.utils;

import java.util.List;

import com.semagia.atomico.MediaType;

/**
*
*
* @author Lars Heuer (heuer[at]semagia.com) <a href="http://www.semagia.com/">Semagia</a>
*/
public final class MediaTypeUtils {

    private MediaTypeUtils() {
        // noop.
    }

    /**
     * Returns that media type which is most suitable to satisfy the client's
     * preference.
     *
     * @param supportedMediaTypes The supported media types (server-side).
     * @param acceptedMediaTypes The preferred media types (client-side).
     * @return A media type which may satisfy the client or {@code null} if no
     *          suitable media type was found.
     */
    public static MediaType getPreferredMediaType(
            List<MediaType> supportedMediaTypes,
            List<MediaType> acceptedMediaTypes) {
        if (acceptedMediaTypes.isEmpty()) {
            return supportedMediaTypes.get(0);
        }
        int bestMatchCount = -1;
        MediaType bestMatch = null;
        for (MediaType mt: acceptedMediaTypes) {
            String type = mt.getType();
            String subType = mt.getSubtype();
            if (bestMatch == null && "*".equals(type) && "*".equals(subType)) {
                bestMatch = supportedMediaTypes.get(0);
                continue;
            }
            for (MediaType supportedMediaType: supportedMediaTypes) {
                int matchCount = 0;
                if (type.equals(supportedMediaType.getType())) {
                    ++matchCount;
                }
                else {
                    --matchCount;
                }
                if (subType.equals(supportedMediaType.getSubtype())) {
                    ++matchCount;
                }
                else {
                    --matchCount;
                }
                if (bestMatchCount < matchCount) {
                    bestMatchCount = matchCount;
                    bestMatch = supportedMediaType;
                }
            }
        }
        return bestMatch;
    }

    /**
     * Returns that media type which is most suitable to satisfy the client's
     * preference.
     *
     * If no suitable media type was found, the {@code defaultMediaType}
     * is returned (may be {@code null}).
     *
     * @param supportedMediaTypes The supported media types (server-side).
     * @param acceptedMediaTypes The preferred media types (client-side).
     * @return A media type which may satisfy the client or {@code defaultMediaType}
     *          if no suitable media type was found.
     */
    public static MediaType getPreferredMediaType(final List<MediaType> supportedMediaTypes, final List<MediaType> acceptedMediaTypes, final MediaType defaultMediaType) {
        final MediaType mediaType = getPreferredMediaType(supportedMediaTypes, acceptedMediaTypes);
        return mediaType != null ? mediaType : defaultMediaType;
    }

}
TOP

Related Classes of com.semagia.atomico.server.utils.MediaTypeUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.