package org.jboss.resteasy.util;

import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;

Helper class that picks an object from a MediaType map from a list of sorted acceptable MediaTypes
Author:Bill Burke
Version:$Revision: 1 $
/** * Helper class that picks an object from a MediaType map from a list of sorted acceptable MediaTypes * * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */
public class MediaTypeMatcher<T> { protected Map<MediaType, T> representations; public Map<MediaType, T> getRepresentations() { return representations; } public void setRepresentations(Map<MediaType, T> representations) { this.representations = representations; } public T match(List<MediaType> accepts) { List<WeightedMediaType> convertedAccepts = new ArrayList<WeightedMediaType>(); for (MediaType accept : accepts) convertedAccepts.add(WeightedMediaType.parse(accept)); IdentityHashMap<WeightedMediaType, T> consumesMap = new IdentityHashMap<WeightedMediaType, T>(); for (Map.Entry<MediaType, T> entry : representations.entrySet()) { for (WeightedMediaType accept : convertedAccepts) { if (entry.getKey().isCompatible(accept)) { consumesMap.put(accept, entry.getValue()); break; } } } if (consumesMap.size() == 0) { return null; } if (consumesMap.size() == 1) return consumesMap.values().iterator().next(); ArrayList<WeightedMediaType> consumes = new ArrayList<WeightedMediaType>(); consumes.addAll(consumesMap.keySet()); Collections.sort(consumes); return consumesMap.get(consumes.get(0)); } }