/*
 * Copyright 2016 Deutsche Nationalbibliothek
 *
 * Licensed under the Apache License, Version 2.0 the "License";
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.culturegraph.mf.stream.pipe;

import org.culturegraph.mf.framework.helpers.DefaultStreamPipe;
import org.culturegraph.mf.framework.StreamReceiver;
import org.culturegraph.mf.framework.annotations.Description;
import org.culturegraph.mf.framework.FluxCommand;
import org.culturegraph.mf.framework.annotations.In;
import org.culturegraph.mf.framework.annotations.Out;

/**
 * Defers all stream events until an <i>end-record</i> is received. Once the
 * event is received {@code StreamDeferrer} forwards all events it has received
 * before the <i>end-record</i> event to the next downstream module. The
 * <i>end-record</i> event is forwarded immediately.
 * <p>
 * The {@code StreamDeferrer} is useful when merging two or more streams of
 * events into one. The module is intended to be added at the end of each flow.
 * There it ensures that the events for each record are forwarded consecutively
 * to the merged flow without them being mixed with events belonging to a record
 * from another stream.
 *
 * @author Christoph Böhme
 * @see org.culturegraph.mf.stream.pipe.StreamTee StreamTee, duplicates event
 * streams
 */
@Description("Defers all stream events until an end-record event is received")
@FluxCommand("defer-stream")
@In(StreamReceiver.class)
@Out(StreamReceiver.class)
public class StreamDeferrer extends DefaultStreamPipe<StreamReceiver> {

    private final StreamBuffer buffer = new StreamBuffer();

    @Override
    public void startRecord(final String identifier) {
        buffer.clear();
        buffer.startRecord(identifier);
    }

    @Override
    public void endRecord() {
        buffer.endRecord();
        buffer.replay();
    }

    @Override
    public void startEntity(final String name) {
        buffer.startEntity(name);
    }

    @Override
    public void endEntity() {
        buffer.endEntity();
    }

    @Override
    public void literal(final String name, final String value) {
        buffer.literal(name, value);
    }

    @Override
    protected void onSetReceiver() {
        buffer.setReceiver(getReceiver());
    }

    @Override
    protected void onResetStream() {
        buffer.clear();
    }

    @Override
    protected void onCloseStream() {
        buffer.clear();
    }

}

/*
 * Copyright 2016 Deutsche Nationalbibliothek
 *
 * Licensed under the Apache License, Version 2.0 the "License";
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.culturegraph.mf.stream.pipe;

import org.culturegraph.mf.framework.helpers.DefaultStreamPipe;
import org.culturegraph.mf.framework.StreamReceiver;
import org.culturegraph.mf.framework.annotations.Description;
import org.culturegraph.mf.framework.FluxCommand;
import org.culturegraph.mf.framework.annotations.In;
import org.culturegraph.mf.framework.annotations.Out;

/**
 * Defers all stream events until an <i>end-record</i> is received. Once the
 * event is received {@code StreamDeferrer} forwards all events it has received
 * before the <i>end-record</i> event to the next downstream module. The
 * <i>end-record</i> event is forwarded immediately.
 * <p>
 * The {@code StreamDeferrer} is useful when merging two or more streams of
 * events into one. The module is intended to be added at the end of each flow.
 * There it ensures that the events for each record are forwarded consecutively
 * to the merged flow without them being mixed with events belonging to a record
 * from another stream.
 *
 * @author Christoph Böhme
 */
@Description("Defers all stream events until an end-record event is received")
@FluxCommand("defer-stream")
@In(StreamReceiver.class)
@Out(StreamReceiver.class)
public class StreamDeferrer extends DefaultStreamPipe<StreamReceiver> {

    private final StreamBuffer buffer = new StreamBuffer();

    @Override
    public void startRecord(final String identifier) {
        buffer.clear();
        buffer.startRecord(identifier);
    }

    @Override
    public void endRecord() {
        buffer.endRecord();
        buffer.replay();
    }

    @Override
    public void startEntity(final String name) {
        buffer.startEntity(name);
    }

    @Override
    public void endEntity() {
        buffer.endEntity();
    }

    @Override
    public void literal(final String name, final String value) {
        buffer.literal(name, value);
    }

    @Override
    protected void onSetReceiver() {
        buffer.setReceiver(getReceiver());
    }

    @Override
    protected void onResetStream() {
        buffer.clear();
    }

    @Override
    protected void onCloseStream() {
        buffer.clear();
    }

}

Remove reference to StreamTee