in activation-api-1.1/src/main/java/javax/activation/MailcapCommandMap.java [153:254]
public synchronized void addMailcap(String mail_cap) {
int index = 0;
// skip leading whitespace
index = skipSpace(mail_cap, index);
if (index == mail_cap.length() || mail_cap.charAt(index) == '#') {
return;
}
// get primary type
int start = index;
index = getToken(mail_cap, index);
if (start == index) {
return;
}
String mimeType = mail_cap.substring(start, index);
// skip any spaces after the primary type
index = skipSpace(mail_cap, index);
if (index == mail_cap.length() || mail_cap.charAt(index) == '#') {
return;
}
// get sub-type
if (mail_cap.charAt(index) == '/') {
index = skipSpace(mail_cap, ++index);
start = index;
index = getToken(mail_cap, index);
mimeType = mimeType + '/' + mail_cap.substring(start, index);
} else {
mimeType = mimeType + "/*";
}
// we record all mappings using the lowercase version.
mimeType = mimeType.toLowerCase();
// skip spaces after mime type
index = skipSpace(mail_cap, index);
// expect a ';' to terminate field 1
if (index == mail_cap.length() || mail_cap.charAt(index) != ';') {
return;
}
// ok, we've parsed the mime text field, now parse the view field. If there's something
// there, then we add this to the native text.
index = skipSpace(mail_cap, index + 1);
// if the next encountered text is not a ";", then we have a view. This gets added to the
// native list.
if (index == mail_cap.length() || mail_cap.charAt(index) != ';') {
ArrayList nativeCommandList = (ArrayList)nativeCommands.get(mimeType);
// if this is the first for this mimetype, create a holder
if (nativeCommandList == null) {
nativeCommandList = new ArrayList();
nativeCommands.put(mimeType, nativeCommandList);
}
// now add this as an entry in the list.
nativeCommandList.add(mail_cap);
// now skip forward to the next field marker, if any
index = getMText(mail_cap, index);
}
// we don't know which list this will be added to until we finish parsing, as there
// can be an x-java-fallback-entry parameter that moves this to the fallback list.
List commandList = new ArrayList();
// but by default, this is not a fallback.
boolean fallback = false;
int fieldNumber = 0;
// parse fields
while (index < mail_cap.length() && mail_cap.charAt(index) == ';') {
index = skipSpace(mail_cap, index + 1);
start = index;
index = getToken(mail_cap, index);
String fieldName = mail_cap.substring(start, index).toLowerCase();
index = skipSpace(mail_cap, index);
if (index < mail_cap.length() && mail_cap.charAt(index) == '=') {
index = skipSpace(mail_cap, index + 1);
start = index;
index = getMText(mail_cap, index);
String value = mail_cap.substring(start, index);
index = skipSpace(mail_cap, index);
if (fieldName.startsWith("x-java-") && fieldName.length() > 7) {
String command = fieldName.substring(7);
value = value.trim();
if (command.equals("fallback-entry")) {
if (value.equals("true")) {
fallback = true;
}
}
else {
// create a CommandInfo item and add it the accumulator
CommandInfo info = new CommandInfo(command, value);
commandList.add(info);
}
}
}
}
addCommands(mimeType, commandList, fallback);
}