public EntityStateMachine advance()

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;
    }