Class MimeTokenStream
- java.lang.Object
-
- org.apache.james.mime4j.stream.MimeTokenStream
-
public class MimeTokenStream extends java.lang.ObjectParses 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
MimeTokenStreamare 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 BodyDescriptorBuilderbodyDescBuilderprivate MimeConfigconfigprivate EntityStateMachinecurrentStateMachineprivate java.util.ArrayDeque<EntityStateMachine>entitiesprivate FieldBuilderfieldBuilderprivate DecodeMonitormonitorprivate RecursionModerecursionModeprivate MimeEntityrootentityprivate EntityStatestate
-
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 voiddoParse(java.io.InputStream stream, EntityState start)BodyDescriptorgetBodyDescriptor()Gets a descriptor for the current entity.MimeConfiggetConfig()java.io.InputStreamgetDecodedInputStream()This method returns a transfer decoded stream based on the MIME fields with the standard defaults.FieldgetField()This method is valid, ifgetState()returnsEntityState.T_FIELD.java.io.InputStreamgetInputStream()This method returns the raw entity, preamble, or epilogue contents.java.io.ReadergetReader()Gets a reader configured for the current body or body part.RecursionModegetRecursionMode()Gets the current recursion mode.EntityStategetState()Returns the current state.booleanisRaw()Determines if this parser is currently in raw mode.EntityStatenext()This method advances the token stream to the next token.voidparse(java.io.InputStream stream)Instructs theMimeTokenStreamto parse the given streams contents.FieldparseHeadless(java.io.InputStream stream, java.lang.String contentType)Instructs theMimeTokenStreamto parse the given content with the content type.voidsetRecursionMode(RecursionMode mode)Sets the current recursion.static java.lang.StringstateToString(EntityState state)Renders a state as a string suitable for logging.voidstop()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 theMimeTokenStreamto parse the given streams contents. If theMimeTokenStreamhas already been in use, resets the streams internal state.
-
parseHeadless
public Field parseHeadless(java.io.InputStream stream, java.lang.String contentType)
Instructs the
MimeTokenStreamto 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
MimeTokenStreamhas 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:
trueif in raw mode,falseotherwise.- 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_RAWmode does not parse the part at all.RecursionMode.M_RECURSEmode recursively parses each mail when anmessage/rfc822part is encountered;RecursionMode.M_NO_RECURSEdoes not.
-
setRecursionMode
public void setRecursionMode(RecursionMode mode)
Sets the current recursion. The recursion mode specifies the approach taken to parsing parts.RecursionMode.M_RAWmode does not parse the part at all.RecursionMode.M_RECURSEmode recursively parses each mail when anmessage/rfc822part is encountered;RecursionMode.M_NO_RECURSEdoes not.- Parameters:
mode-RecursionMode.M_RECURSE,RecursionMode.M_RAWorRecursionMode.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.UnsupportedEncodingExceptionGets 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.IOExceptionMimeException
-
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()
-
-