/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.util; import org.everrest.core.impl.header.MediaTypeHelper; import javax.ws.rs.core.MediaType; import java.util.Comparator; import java.util.regex.Matcher; /** * Compare two media types. The main rule for sorting media types is: * <p/> * <li>n/m</li> * <li>n/*</li> * <li>*/*</li> * <p/> */ public class MediaTypeComparator implements Comparator<MediaType> { @Override public int compare(MediaType mediaTypeOne, MediaType mediaTypeTwo) { if (mediaTypeOne.isWildcardType() && !mediaTypeTwo.isWildcardType()) { return 1; } if (mediaTypeOne.isWildcardSubtype() && !mediaTypeTwo.isWildcardSubtype()) { return 1; } if (!mediaTypeOne.isWildcardType() && mediaTypeTwo.isWildcardType()) { return -1; } if (!mediaTypeOne.isWildcardSubtype() && mediaTypeTwo.isWildcardSubtype()) { return -1; } Matcher extSubtypeMatcherOne = MediaTypeHelper.EXT_SUBTYPE_PATTERN.matcher(mediaTypeOne.getSubtype()); Matcher extSubtypeMatcherTwo = MediaTypeHelper.EXT_SUBTYPE_PATTERN.matcher(mediaTypeTwo.getSubtype()); boolean extSubtypeMatcherOneMatches = extSubtypeMatcherOne.matches(); boolean extSubtypeMatcherTwoMatches = extSubtypeMatcherTwo.matches(); if (extSubtypeMatcherOneMatches && !extSubtypeMatcherTwoMatches) { return 1; } if (!extSubtypeMatcherOneMatches && extSubtypeMatcherTwoMatches) { return -1; } extSubtypeMatcherOne = MediaTypeHelper.EXT_PREFIX_SUBTYPE_PATTERN.matcher(mediaTypeOne.getSubtype()); extSubtypeMatcherTwo = MediaTypeHelper.EXT_PREFIX_SUBTYPE_PATTERN.matcher(mediaTypeTwo.getSubtype()); extSubtypeMatcherOneMatches = extSubtypeMatcherOne.matches(); extSubtypeMatcherTwoMatches = extSubtypeMatcherTwo.matches(); if (extSubtypeMatcherOneMatches && !extSubtypeMatcherTwoMatches) { return 1; } if (!extSubtypeMatcherOneMatches && extSubtypeMatcherTwoMatches) { return -1; } extSubtypeMatcherOne = MediaTypeHelper.EXT_SUFFIX_SUBTYPE_PATTERN.matcher(mediaTypeOne.getSubtype()); extSubtypeMatcherTwo = MediaTypeHelper.EXT_SUFFIX_SUBTYPE_PATTERN.matcher(mediaTypeTwo.getSubtype()); extSubtypeMatcherOneMatches = extSubtypeMatcherOne.matches(); extSubtypeMatcherTwoMatches = extSubtypeMatcherTwo.matches(); if (extSubtypeMatcherOneMatches && !extSubtypeMatcherTwoMatches) { return 1; } if (!extSubtypeMatcherOneMatches && extSubtypeMatcherTwoMatches) { return -1; } return toString(mediaTypeOne).compareToIgnoreCase(toString(mediaTypeTwo)); } private String toString(MediaType mime) { return mime.getType() + "/" + mime.getSubtype(); } }