package eu.dnetlib.contract.node;

import java.util.List;

/**
 * Sequence contract definition node.
 * Encapsulates ordered list of {@link IContractDefinitionNode} elements.
 * @author mhorst
 *
 */
public class SEQDefinitionNode extends AbstractContractDefinitionNode implements ISEQDefinitionNode {

	/**
	 * Internal sequence.
	 */
	private List<IContractDefinitionNode> sequence = null;
	
	/**
	 * Default constructor for spring purposes.
	 */
	public SEQDefinitionNode() {
		super();
	}
	
	/**
	 * Constructor with initial sequence.
	 * @param seq
	 */
	public SEQDefinitionNode(List<IContractDefinitionNode> seq) {
		this();
		this.setSequence(seq);
	}
	
	/* (non-Javadoc)
	 * @see eu.dnetlib.contract.def.node.ISEQDefinitionNode#addNode(eu.dnetlib.contract.def.node.IContractDefinitionNode)
	 */
	public void addNode(IContractDefinitionNode node) {
		if (sequence.size()>0) {
//			setting next() pointer of the last element
			IContractDefinitionNode lastNode = sequence.get(sequence.size() -1);
			if (lastNode!=null) {
				lastNode.setNextNode(node);
			}
		}
		this.sequence.add(node);
	}

	/* (non-Javadoc)
	 * @see eu.dnetlib.contract.def.node.ISEQDefinitionNode#getSequence()
	 */
	public List<IContractDefinitionNode> getSequence() {
		return this.sequence;
	}

	/* (non-Javadoc)
	 * @see eu.dnetlib.contract.def.node.ISEQDefinitionNode#setSequence(java.util.List)
	 */
	public void setSequence(List<IContractDefinitionNode> seq) {
		this.sequence = seq;
	}

}
