package org.etk.core.rest.impl.header;
import java.util.Map;
import java.util.Map.Entry;
import java.text.ParseException;
import javax.ws.rs.core.MediaType;
public class MediaTypeHeaderDelegate extends AbstractHeaderDelegate<MediaType> {
@Override
public MediaType fromString(String header) throws IllegalArgumentException {
if (header == null)
throw new IllegalArgumentException();
try {
int p = header.indexOf('/');
int col = header.indexOf(';');
String type = null;
String subType = null;
if (p < 0 && col < 0) //no '/' and ';'
return new MediaType(header, null);
else if (p > 0 && col < 0)
return new MediaType(HeaderHelper.removeWhitespaces(header.substring(0, p)),
HeaderHelper.removeWhitespaces(header.substring(p + 1)));
else if (p < 0 && col > 0) { //there is no '/' but present ';'
type = HeaderHelper.removeWhitespaces(header.substring(0, col));
} else {//presents '/' and ';'
type = HeaderHelper.removeWhitespaces(header.substring(0, p));
subType = header.substring(p + 1, col);
}
Map<String, String> m = new HeaderParameterParser().parse(header);
return new MediaType(type, subType, m);
} catch(ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public String toString(MediaType mime) {
StringBuffer sb = new StringBuffer();
sb.append(mime.getType()).append('/').append(mime.getSubtype());
for (Entry<String, String> entry : mime.getParameters().entrySet()) {
sb.append(';').append(entry.getKey()).append('=');
HeaderHelper.appendWithQuote(sb, entry.getValue());
}
return sb.toString();
}
@Override
public Class<MediaType> support() {
return MediaType.class;
}
}