/*
 * Copyright 2013, 2014 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.converter;

import org.culturegraph.mf.framework.DefaultObjectPipe;
import org.culturegraph.mf.framework.ObjectReceiver;
import org.culturegraph.mf.framework.annotations.Description;
import org.culturegraph.mf.framework.annotations.FluxCommand;
import org.culturegraph.mf.framework.annotations.In;
import org.culturegraph.mf.framework.annotations.Out;


/**
 * Adds a String preamle and/or epilogue to the stream
 *
 * @author Markus Geipel
 *
 */
@Description("Adds a String preamle and/or epilogue to the stream")
@In(String.class)
@Out(String.class)
@FluxCommand("add-preamble-epilogue")
public final class PreambleEpilogueAdder extends DefaultObjectPipe<String, ObjectReceiver<String>> {

	private String preamble = "";
	private String epilogue = "";
	private boolean init = true;

	public void setEpilogue(final String epilogue) {
		this.epilogue = epilogue;
	}

	public void setPreamble(final String preamble) {
		this.preamble = preamble;
	}

	@Override
	public void process(final String obj) {
		if(init){
			getReceiver().process(preamble);
			init = false;
		}
		getReceiver().process(obj);
	}

	@Override
	protected void onCloseStream() {
		if(!epilogue.isEmpty()){
			getReceiver().process(epilogue);
		}
	}
}

/*
 * Copyright 2016 Christoph Böhme
 * Copyright 2013, 2014 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.converter;

import org.culturegraph.mf.framework.DefaultObjectPipe;
import org.culturegraph.mf.framework.ObjectReceiver;
import org.culturegraph.mf.framework.annotations.Description;
import org.culturegraph.mf.framework.annotations.FluxCommand;
import org.culturegraph.mf.framework.annotations.In;
import org.culturegraph.mf.framework.annotations.Out;


/**
 * Emits a <i>preamble</i> string before the first string object in the
 * stream and an <i>epilogue</i> string before the end of the stream.
 * <p>
 * The preamble and epilogue strings are only emitted if an object is received.
 * If the preamble or epilogue string is empty, the respective string is not
 * emitted.
 *
 * @author Markus Geipel
 * @author Christoph Böhme
 *
 */
@Description("Adds a String preamle and/or epilogue to the stream")
@In(String.class)
@Out(String.class)
@FluxCommand("add-preamble-epilogue")
public final class PreambleEpilogueAdder extends DefaultObjectPipe<String, ObjectReceiver<String>> {

	private String preamble = "";
	private String epilogue = "";

	private boolean objectsReceived = false;

	/**
	 * Sets the <i>preamble</i> string which is emitted before the first object.
	 * <p>
	 * The default preamble is an empty string. That means by default no
	 * preamble is emitted.
	 * <p>
	 * The parameter may only be changed before the first object is processed
	 * otherwise the change has no effect.
	 *
	 * @param preamble the preamble string
	 */
	public void setPreamble(final String preamble) {
		this.preamble = preamble;
	}

	public String getPreamble() {
		return preamble;
	}

	/**
	 * Sets the <i>epilogue</i> string which is emitted after the last object.
	 * <p>
	 * The default epilogue string is an empty string. That means by default no
	 * epilogue is emitted.
	 * <p>
	 * The parameter may be changed at any time. Its becomes effective when a
	 * <i>close-stream</i> event is received.
	 *
	 * @param epilogue the epilogue string
	 */
	public void setEpilogue(final String epilogue) {
		this.epilogue = epilogue;
	}

	public String getEpilogue() {
		return epilogue;
	}

	@Override
	public void process(final String obj) {
		if(!objectsReceived && !preamble.isEmpty()) {
			getReceiver().process(preamble);
		}
		objectsReceived = true;
		getReceiver().process(obj);
	}

	@Override
	protected void onCloseStream() {
		if(objectsReceived && !epilogue.isEmpty()) {
			getReceiver().process(epilogue);
		}
	}

	@Override
	protected void onResetStream() {
		objectsReceived = false;
	}

}

Improve behaviour and Javadoc of PreambleEpilogueAdder