in core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java [301:377]
public EntityStateMachine advance() throws IOException, MimeException {
switch (state) {
case T_START_MESSAGE:
state = EntityState.T_START_HEADER;
break;
case T_START_BODYPART:
state = EntityState.T_START_HEADER;
break;
case T_START_HEADER:
bodyDescBuilder.reset();
case T_FIELD:
state = nextField() ? EntityState.T_FIELD : EntityState.T_END_HEADER;
break;
case T_END_HEADER:
body = bodyDescBuilder.build();
String mimeType = body.getMimeType();
if (recursionMode == RecursionMode.M_FLAT) {
state = EntityState.T_BODY;
} else if (MimeUtil.isMultipart(mimeType)) {
state = EntityState.T_START_MULTIPART;
clearMimePartStream();
} else if (recursionMode != RecursionMode.M_NO_RECURSE
&& MimeUtil.isMessage(mimeType)) {
state = EntityState.T_BODY;
return nextMessage();
} else {
state = EntityState.T_BODY;
}
break;
case T_START_MULTIPART:
if (dataStream.isUsed()) {
advanceToBoundary();
state = EntityState.T_END_MULTIPART;
break;
} else {
createMimePartStream();
state = EntityState.T_PREAMBLE;
boolean empty = currentMimePartStream.isEmptyStream();
if (!empty) break;
// continue to next state
}
case T_PREAMBLE:
// removed specific code. Fallback to T_IN_BODYPART that
// better handle missing parts.
// Removed the T_IN_BODYPART state (always use T_PREAMBLE)
advanceToBoundary();
if (currentMimePartStream.eof() && !currentMimePartStream.isLastPart()) {
monitor(Event.MIME_BODY_PREMATURE_END);
} else {
if (!currentMimePartStream.isLastPart()) {
clearMimePartStream();
createMimePartStream();
return nextMimeEntity();
}
}
boolean empty = currentMimePartStream.isFullyConsumed();
clearMimePartStream();
state = EntityState.T_EPILOGUE;
if (!empty) break;
// continue to next state
case T_EPILOGUE:
state = EntityState.T_END_MULTIPART;
break;
case T_BODY:
case T_END_MULTIPART:
state = endState;
break;
default:
if (state == endState) {
state = EntityState.T_END_OF_STREAM;
break;
}
throw new IllegalStateException("Invalid state: " + stateToString(state));
}
return null;
}