/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 javax.activation; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; /** * @version $Rev$ $Date$ */ public class MimeType implements Externalizable { private static final String SPECIALS = "()<>@,;:\\\"/[]?="; static boolean isSpecial(char c) { return Character.isWhitespace(c) || Character.isISOControl(c) || SPECIALS.indexOf(c) != -1; } private String primaryType = "application"; private String subType = "*"; private final MimeTypeParameterList parameterList = new MimeTypeParameterList();; public MimeType() { } public MimeType(String rawdata) throws MimeTypeParseException { parseMimeType(rawdata); } public MimeType(String primary, String sub) throws MimeTypeParseException { setPrimaryType(primary); setSubType(sub); } public String getPrimaryType() { return primaryType; } public void setPrimaryType(String primary) throws MimeTypeParseException { primaryType = parseToken(primary); } public String getSubType() { return subType; } public void setSubType(String sub) throws MimeTypeParseException { subType = parseToken(sub); } public MimeTypeParameterList getParameters() { return parameterList; } public String getParameter(String name) { return parameterList.get(name); } public void setParameter(String name, String value) { parameterList.set(name, value); } public void removeParameter(String name) { parameterList.remove(name); } public String toString() { return getBaseType() + parameterList.toString(); } public String getBaseType() { return getPrimaryType() + '/' + getSubType(); } public boolean match(MimeType type) { if (!primaryType.equals(type.primaryType)) return false; if ("*".equals(subType)) return true; if ("*".equals(type.subType)) return true; return subType.equals(type.subType); } public boolean match(String rawdata) throws MimeTypeParseException { return match(new MimeType(rawdata)); } public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(toString()); out.flush(); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { try { parseMimeType(in.readUTF()); } catch (MimeTypeParseException mtpex) { throw new IOException(mtpex.getMessage()); } } private void parseMimeType(String rawData) throws MimeTypeParseException { int index = rawData.indexOf('/'); if (index == -1) { throw new MimeTypeParseException("Expected '/'"); } setPrimaryType(rawData.substring(0, index)); int index2 = rawData.indexOf(';', index+1); if (index2 == -1) { setSubType(rawData.substring(index+1)); } else { setSubType(rawData.substring(index+1, index2)); parameterList.parse(rawData.substring(index2)); } } private static String parseToken(String tokenString) throws MimeTypeParseException { tokenString = tokenString.trim(); for (int i=0; i < tokenString.length(); i++) { char c = tokenString.charAt(i); if (isSpecial(c)) { throw new MimeTypeParseException("Special '" + c + "' not allowed in token"); } } return tokenString; } }