001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package javax.mail.internet;
021
022 // can be in the form major/minor; charset=jobby
023
024 /**
025 * @version $Rev: 669445 $ $Date: 2008-06-19 06:48:18 -0400 (Thu, 19 Jun 2008) $
026 */
027 public class ContentType {
028 private ParameterList _list;
029 private String _minor;
030 private String _major;
031
032 public ContentType() {
033 // the Sun version makes everything null here.
034 }
035
036 public ContentType(String major, String minor, ParameterList list) {
037 _major = major;
038 _minor = minor;
039 _list = list;
040 }
041
042 public ContentType(String type) throws ParseException {
043 // get a token parser for the type information
044 HeaderTokenizer tokenizer = new HeaderTokenizer(type, HeaderTokenizer.MIME);
045
046 // get the first token, which must be an ATOM
047 HeaderTokenizer.Token token = tokenizer.next();
048 if (token.getType() != HeaderTokenizer.Token.ATOM) {
049 throw new ParseException("Invalid content type");
050 }
051
052 _major = token.getValue();
053
054 // the MIME type must be major/minor
055 token = tokenizer.next();
056 if (token.getType() != '/') {
057 throw new ParseException("Invalid content type");
058 }
059
060
061 // this must also be an atom. Content types are not permitted to be wild cards.
062 token = tokenizer.next();
063 if (token.getType() != HeaderTokenizer.Token.ATOM) {
064 throw new ParseException("Invalid content type");
065 }
066
067 _minor = token.getValue();
068
069 // the remainder is parameters, which ParameterList will take care of parsing.
070 String remainder = tokenizer.getRemainder();
071 if (remainder != null) {
072 _list = new ParameterList(remainder);
073 }
074 }
075
076 public String getPrimaryType() {
077 return _major;
078 }
079
080 public String getSubType() {
081 return _minor;
082 }
083
084 public String getBaseType() {
085 return _major + "/" + _minor;
086 }
087
088 public String getParameter(String name) {
089 return (_list == null ? null : _list.get(name));
090 }
091
092 public ParameterList getParameterList() {
093 return _list;
094 }
095
096 public void setPrimaryType(String major) {
097 _major = major;
098 }
099
100 public void setSubType(String minor) {
101 _minor = minor;
102 }
103
104 public void setParameter(String name, String value) {
105 if (_list == null) {
106 _list = new ParameterList();
107 }
108 _list.set(name, value);
109 }
110
111 public void setParameterList(ParameterList list) {
112 _list = list;
113 }
114
115 public String toString() {
116 if (_major == null || _minor == null) {
117 return null;
118 }
119
120 // We need to format this as if we're doing it to set into the Content-Type
121 // header. So the parameter list gets added on as if the header name was
122 // also included.
123 String baseType = getBaseType();
124 if (_list != null) {
125 baseType += _list.toString(baseType.length() + "Content-Type: ".length());
126 }
127
128 return baseType;
129 }
130
131 public boolean match(ContentType other) {
132 return _major.equalsIgnoreCase(other._major)
133 && (_minor.equalsIgnoreCase(other._minor)
134 || _minor.equals("*")
135 || other._minor.equals("*"));
136 }
137
138 public boolean match(String contentType) {
139 try {
140 return match(new ContentType(contentType));
141 } catch (ParseException e) {
142 return false;
143 }
144 }
145 }