src/share/jaxws_classes/com/sun/xml/internal/org/jvnet/mimepull/MIMEParser.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -28,10 +28,11 @@
import java.io.InputStream;
import java.io.IOException;
import java.util.*;
import java.util.logging.Logger;
import java.nio.ByteBuffer;
+import java.util.logging.Level;
/**
* Pull parser for the MIME messages. Applications can use pull API to continue
* the parsing MIME messages lazily.
*
@@ -51,10 +52,12 @@
*/
class MIMEParser implements Iterable<MIMEEvent> {
private static final Logger LOGGER = Logger.getLogger(MIMEParser.class.getName());
+ private static final String HEADER_ENCODING = "ISO8859-1";
+
// Actually, the grammar doesn't support whitespace characters
// after boundary. But the mail implementation checks for it.
// We will only check for these many whitespace characters after boundary
private static final int NO_LWSP = 1000;
private enum STATE {START_MESSAGE, SKIP_PREAMBLE, START_PART, HEADERS, BODY, END_PART, END_MESSAGE}
@@ -104,68 +107,72 @@
* Returns iterator for the parsing events. Use the iterator to advance
* the parsing.
*
* @return iterator for parsing events
*/
+ @Override
public Iterator<MIMEEvent> iterator() {
return new MIMEEventIterator();
}
class MIMEEventIterator implements Iterator<MIMEEvent> {
+ @Override
public boolean hasNext() {
return !parsed;
}
+ @Override
public MIMEEvent next() {
switch(state) {
case START_MESSAGE :
- LOGGER.finer("MIMEParser state="+STATE.START_MESSAGE);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.START_MESSAGE);}
state = STATE.SKIP_PREAMBLE;
return MIMEEvent.START_MESSAGE;
case SKIP_PREAMBLE :
- LOGGER.finer("MIMEParser state="+STATE.SKIP_PREAMBLE);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.SKIP_PREAMBLE);}
skipPreamble();
// fall through
case START_PART :
- LOGGER.finer("MIMEParser state="+STATE.START_PART);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.START_PART);}
state = STATE.HEADERS;
return MIMEEvent.START_PART;
case HEADERS :
- LOGGER.finer("MIMEParser state="+STATE.HEADERS);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.HEADERS);}
InternetHeaders ih = readHeaders();
state = STATE.BODY;
bol = true;
return new MIMEEvent.Headers(ih);
case BODY :
- LOGGER.finer("MIMEParser state="+STATE.BODY);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.BODY);}
ByteBuffer buf = readBody();
bol = false;
return new MIMEEvent.Content(buf);
case END_PART :
- LOGGER.finer("MIMEParser state="+STATE.END_PART);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.END_PART);}
if (done) {
state = STATE.END_MESSAGE;
} else {
state = STATE.START_PART;
}
return MIMEEvent.END_PART;
case END_MESSAGE :
- LOGGER.finer("MIMEParser state="+STATE.END_MESSAGE);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "MIMEParser state={0}", STATE.END_MESSAGE);}
parsed = true;
return MIMEEvent.END_MESSAGE;
default :
throw new MIMEParsingException("Unknown Parser state = "+state);
}
}
+ @Override
public void remove() {
throw new UnsupportedOperationException();
}
}
@@ -314,20 +321,21 @@
break;
}
}
adjustBuf(start+1, len-start-1);
}
- LOGGER.fine("Skipped the preamble. buffer len="+len);
+ if (LOGGER.isLoggable(Level.FINE)) {LOGGER.log(Level.FINE, "Skipped the preamble. buffer len={0}", len);}
}
private static byte[] getBytes(String s) {
char [] chars= s.toCharArray();
int size = chars.length;
byte[] bytes = new byte[size];
- for (int i = 0; i < size;)
+ for (int i = 0; i < size;) {
bytes[i] = (byte) chars[i++];
+ }
return bytes;
}
/**
* Boyer-Moore search method. Copied from java.util.regex.Pattern.java
@@ -407,11 +415,11 @@
/**
* Fills the remaining buf to the full capacity
*/
private void fillBuf() {
- LOGGER.finer("Before fillBuf() buffer len="+len);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "Before fillBuf() buffer len={0}", len);}
assert !eof;
while(len < buf.length) {
int read;
try {
read = in.read(buf, len, buf.length-len);
@@ -419,21 +427,21 @@
throw new MIMEParsingException(ioe);
}
if (read == -1) {
eof = true;
try {
- LOGGER.fine("Closing the input stream.");
+ if (LOGGER.isLoggable(Level.FINE)) {LOGGER.fine("Closing the input stream.");}
in.close();
} catch(IOException ioe) {
throw new MIMEParsingException(ioe);
}
break;
} else {
len += read;
}
}
- LOGGER.finer("After fillBuf() buffer len="+len);
+ if (LOGGER.isLoggable(Level.FINER)) {LOGGER.log(Level.FINER, "After fillBuf() buffer len={0}", len);}
}
private void doubleBuf() {
byte[] temp = new byte[2*len];
System.arraycopy(buf, 0, temp, 0, len);
@@ -482,11 +490,11 @@
if (hdrLen == 0) {
adjustBuf(offset+lwsp, len-offset-lwsp);
return null;
}
- String hdr = new String(buf, offset, hdrLen);
+ String hdr = new String(buf, offset, hdrLen, HEADER_ENCODING);
offset += hdrLen+lwsp;
return hdr;
}
}