Class MimeTokenStream
- java.lang.Object
-
- org.apache.james.mime4j.stream.MimeTokenStream
-
public class MimeTokenStream extends java.lang.Object
Parses MIME (or RFC822) message streams of bytes or characters. The stream is converted into an event stream.
Typical usage:
MimeTokenStream stream = new MimeTokenStream(); InputStream instream = new FileInputStream("mime.msg"); try { stream.parse(instream); for (int state = stream.getState(); state != MimeTokenStream.T_END_OF_STREAM; state = stream.next()) { switch (state) { case MimeTokenStream.T_BODY: System.out.println("Body detected, contents = " + stream.getInputStream() + ", header data = " + stream.getBodyDescriptor()); break; case MimeTokenStream.T_FIELD: System.out.println("Header field detected: " + stream.getField()); break; case MimeTokenStream.T_START_MULTIPART: System.out.println("Multipart message detexted," + " header data = " + stream.getBodyDescriptor()); ... } } } finally { instream.close(); }
Instances of
MimeTokenStream
are reusable: Invoking the methodparse(InputStream)
resets the token streams internal state. However, they are definitely not thread safe. If you have a multi threaded application, then the suggested use is to have one instance per thread.
-
-
Field Summary
Fields Modifier and Type Field Description private BodyDescriptorBuilder
bodyDescBuilder
private MimeConfig
config
private EntityStateMachine
currentStateMachine
private java.util.ArrayDeque<EntityStateMachine>
entities
private FieldBuilder
fieldBuilder
private DecodeMonitor
monitor
private RecursionMode
recursionMode
private MimeEntity
rootentity
private EntityState
state
-
Constructor Summary
Constructors Constructor Description MimeTokenStream()
Constructs a standard (lax) stream.MimeTokenStream(MimeConfig config)
MimeTokenStream(MimeConfig config, DecodeMonitor monitor, BodyDescriptorBuilder bodyDescBuilder)
MimeTokenStream(MimeConfig config, DecodeMonitor monitor, FieldBuilder fieldBuilder, BodyDescriptorBuilder bodyDescBuilder)
MimeTokenStream(MimeConfig config, BodyDescriptorBuilder bodyDescBuilder)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
doParse(java.io.InputStream stream, EntityState start)
BodyDescriptor
getBodyDescriptor()
Gets a descriptor for the current entity.MimeConfig
getConfig()
java.io.InputStream
getDecodedInputStream()
This method returns a transfer decoded stream based on the MIME fields with the standard defaults.Field
getField()
This method is valid, ifgetState()
returnsEntityState.T_FIELD
.java.io.InputStream
getInputStream()
This method returns the raw entity, preamble, or epilogue contents.java.io.Reader
getReader()
Gets a reader configured for the current body or body part.RecursionMode
getRecursionMode()
Gets the current recursion mode.EntityState
getState()
Returns the current state.boolean
isRaw()
Determines if this parser is currently in raw mode.EntityState
next()
This method advances the token stream to the next token.void
parse(java.io.InputStream stream)
Instructs theMimeTokenStream
to parse the given streams contents.Field
parseHeadless(java.io.InputStream stream, java.lang.String contentType)
Instructs theMimeTokenStream
to parse the given content with the content type.void
setRecursionMode(RecursionMode mode)
Sets the current recursion.static java.lang.String
stateToString(EntityState state)
Renders a state as a string suitable for logging.void
stop()
Finishes the parsing and stops reading lines.
-
-
-
Field Detail
-
config
private final MimeConfig config
-
monitor
private final DecodeMonitor monitor
-
fieldBuilder
private final FieldBuilder fieldBuilder
-
bodyDescBuilder
private final BodyDescriptorBuilder bodyDescBuilder
-
entities
private final java.util.ArrayDeque<EntityStateMachine> entities
-
state
private EntityState state
-
currentStateMachine
private EntityStateMachine currentStateMachine
-
recursionMode
private RecursionMode recursionMode
-
rootentity
private MimeEntity rootentity
-
-
Constructor Detail
-
MimeTokenStream
public MimeTokenStream()
Constructs a standard (lax) stream. Optional validation events will be logged only. UseMimeConfig.Builder.setStrictParsing(boolean)
to turn on strict parsing mode and pass the config object toMimeTokenStream(MimeConfig)
to create a stream that strictly validates the input.
-
MimeTokenStream
public MimeTokenStream(MimeConfig config)
-
MimeTokenStream
public MimeTokenStream(MimeConfig config, BodyDescriptorBuilder bodyDescBuilder)
-
MimeTokenStream
public MimeTokenStream(MimeConfig config, DecodeMonitor monitor, BodyDescriptorBuilder bodyDescBuilder)
-
MimeTokenStream
public MimeTokenStream(MimeConfig config, DecodeMonitor monitor, FieldBuilder fieldBuilder, BodyDescriptorBuilder bodyDescBuilder)
-
-
Method Detail
-
parse
public void parse(java.io.InputStream stream)
Instructs theMimeTokenStream
to parse the given streams contents. If theMimeTokenStream
has already been in use, resets the streams internal state.
-
parseHeadless
public Field parseHeadless(java.io.InputStream stream, java.lang.String contentType)
Instructs the
MimeTokenStream
to parse the given content with the content type. The message stream is assumed to have no message header and is expected to begin with a message body. This can be the case when the message content is transmitted using a different transport protocol such as HTTP.If the
MimeTokenStream
has already been in use, resets the streams internal state.- Returns:
- a parsed Field representing the input contentType
-
doParse
private void doParse(java.io.InputStream stream, EntityState start)
-
isRaw
public boolean isRaw()
Determines if this parser is currently in raw mode.- Returns:
true
if in raw mode,false
otherwise.- See Also:
setRecursionMode(RecursionMode)
-
getRecursionMode
public RecursionMode getRecursionMode()
Gets the current recursion mode. The recursion mode specifies the approach taken to parsing parts.RecursionMode.M_RAW
mode does not parse the part at all.RecursionMode.M_RECURSE
mode recursively parses each mail when anmessage/rfc822
part is encountered;RecursionMode.M_NO_RECURSE
does not.
-
setRecursionMode
public void setRecursionMode(RecursionMode mode)
Sets the current recursion. The recursion mode specifies the approach taken to parsing parts.RecursionMode.M_RAW
mode does not parse the part at all.RecursionMode.M_RECURSE
mode recursively parses each mail when anmessage/rfc822
part is encountered;RecursionMode.M_NO_RECURSE
does not.- Parameters:
mode
-RecursionMode.M_RECURSE
,RecursionMode.M_RAW
orRecursionMode.M_NO_RECURSE
-
stop
public void stop()
Finishes the parsing and stops reading lines. NOTE: No more lines will be parsed but the parser will still trigger 'end' events to match previously triggered 'start' events.
-
getState
public EntityState getState()
Returns the current state.
-
getInputStream
public java.io.InputStream getInputStream()
This method returns the raw entity, preamble, or epilogue contents.
This method is valid, if
getState()
returns either ofEntityState.T_RAW_ENTITY
,EntityState.T_PREAMBLE
, orEntityState.T_EPILOGUE
.- Returns:
- Data stream, depending on the current state.
- Throws:
java.lang.IllegalStateException
-getState()
returns an invalid value.
-
getDecodedInputStream
public java.io.InputStream getDecodedInputStream()
This method returns a transfer decoded stream based on the MIME fields with the standard defaults.
This method is valid, if
getState()
returns either ofEntityState.T_RAW_ENTITY
,EntityState.T_PREAMBLE
, orEntityState.T_EPILOGUE
.- Returns:
- Data stream, depending on the current state.
- Throws:
java.lang.IllegalStateException
-getState()
returns an invalid value.
-
getReader
public java.io.Reader getReader() throws java.io.UnsupportedEncodingException
Gets a reader configured for the current body or body part. The reader will return a transfer and charset decoded stream of characters based on the MIME fields with the standard defaults. This is a conveniance method and relies ongetInputStream()
. Consult the javadoc for that method for known limitations.- Returns:
Reader
, not null- Throws:
java.lang.IllegalStateException
-getState()
returns an invalid valuejava.io.UnsupportedEncodingException
- if there is no JVM support for decoding the charset- See Also:
getInputStream()
-
getBodyDescriptor
public BodyDescriptor getBodyDescriptor()
Gets a descriptor for the current entity. This method is valid if
getState()
returns:- Returns:
BodyDescriptor
, not nulls
-
getField
public Field getField()
This method is valid, ifgetState()
returnsEntityState.T_FIELD
.- Returns:
- String with the fields raw contents.
- Throws:
java.lang.IllegalStateException
-getState()
returns another value thanEntityState.T_FIELD
.
-
next
public EntityState next() throws java.io.IOException, MimeException
This method advances the token stream to the next token.- Throws:
java.lang.IllegalStateException
- The method has been called, althoughgetState()
was alreadyEntityState.T_END_OF_STREAM
.java.io.IOException
MimeException
-
stateToString
public static java.lang.String stateToString(EntityState state)
Renders a state as a string suitable for logging.- Parameters:
state
-- Returns:
- rendered as string, not null
-
getConfig
public MimeConfig getConfig()
-
-