package org.jboss.resteasy.plugins.delegates; import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages; import org.jboss.resteasy.util.HeaderParameterParser; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.RuntimeDelegate; import java.util.HashMap; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class MediaTypeHeaderDelegate implements RuntimeDelegate.HeaderDelegate { public Object fromString(String type) throws IllegalArgumentException { if (type == null) throw new IllegalArgumentException(Messages.MESSAGES.mediaTypeValueNull()); return parse(type); } /* public static MediaType parse(String type) { String params = null; int idx = type.indexOf(";"); if (idx > -1) { params = type.substring(idx + 1).trim(); type = type.substring(0, idx); } String major = null; String subtype = null; String[] paths = type.split("/"); if (paths.length < 2 && type.equals("*")) { major = "*"; subtype = "*"; } else if (paths.length != 2 || "".equals(paths[0]) || "".equals(paths[1]) || paths[0].contains(" ") || paths[1].contains(" ")) { throw new IllegalArgumentException("Failure parsing MediaType string: " + type); } else if (paths.length == 2) { major = paths[0]; subtype = paths[1]; } if (params != null && !params.equals("")) { HashMap<String, String> typeParams = new HashMap<String, String>(); int start = 0; while (start < params.length()) { start = HeaderParameterParser.setParam(typeParams, params, start); } return new MediaType(major, subtype, typeParams); } else { return new MediaType(major, subtype); } } */ protected static boolean isValid(String str) { if (str == null || str.length() == 0) return false; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case '/': case '\\': case '?': case ':': case '<': case '>': case ';': case '(': case ')': case '@': case ',': case '[': case ']': case '=': return false; default: break; } } return true; } public static MediaType parse(String type) { int typeIndex = type.indexOf('/'); int paramIndex = type.indexOf(';'); String major = null; String subtype = null; if (typeIndex < 0) // possible "*" { major = type; if (paramIndex > -1) { major = major.substring(0, paramIndex); } if (!MediaType.MEDIA_TYPE_WILDCARD.equals(major)) { throw new IllegalArgumentException(Messages.MESSAGES.failureParsingMediaType(type)); } subtype = MediaType.MEDIA_TYPE_WILDCARD; } else { major = type.substring(0, typeIndex); if (paramIndex > -1) { subtype = type.substring(typeIndex + 1, paramIndex); } else { subtype = type.substring(typeIndex + 1); } } if (major.length() < 1 || subtype.length() < 1) { throw new IllegalArgumentException(Messages.MESSAGES.failureParsingMediaType(type)); } if (!isValid(major) || !isValid(subtype)) { throw new IllegalArgumentException(Messages.MESSAGES.failureParsingMediaType(type)); } String params = null; if (paramIndex > -1) params = type.substring(paramIndex + 1); if (params != null && !params.equals("")) { HashMap<String, String> typeParams = new HashMap<String, String>(); int start = 0; while (start < params.length()) { start = HeaderParameterParser.setParam(typeParams, params, start); } return new MediaType(major, subtype, typeParams); } else { return new MediaType(major, subtype); } } private static final char[] quotedChars = "()<>@,;:\\\"/[]?= \t\r\n".toCharArray(); public static boolean quoted(String str) { for (char c : str.toCharArray()) { for (char q : quotedChars) if (c == q) return true; } return false; } public String toString(Object o) { if (o == null) throw new IllegalArgumentException(Messages.MESSAGES.paramNull()); MediaType type = (MediaType) o; StringBuffer buf = new StringBuffer(); buf.append(type.getType().toLowerCase()).append("/").append(type.getSubtype().toLowerCase()); if (type.getParameters() == null || type.getParameters().size() == 0) return buf.toString(); for (String name : type.getParameters().keySet()) { buf.append(';').append(name).append('='); String val = type.getParameters().get(name); if (quoted(val)) buf.append('"').append(val).append('"'); else buf.append(val); } return buf.toString(); } }