/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
package org.eclipse.osbp.bpm.api;

public class BlipBPMOutgoing implements IBlipBPMOutgoing {

	protected final String blipId;
	protected final String bpmId;
	protected final int priority;
	protected final boolean isDefault;
	protected final String testFunction;

	public BlipBPMOutgoing(String blipId, String bpmId, int priority) {
		this.blipId = blipId;
		this.bpmId = bpmId;
		this.priority = priority;
		this.isDefault = true;
		this.testFunction = BlipBaseFunctionGroup.DEFAULT_SEQUENCE_FLOW;
	}

	public BlipBPMOutgoing(String blipId, String bpmId, int priority, String testFunction) {
		this.blipId = blipId;
		this.bpmId = bpmId;
		this.priority = priority;
		this.isDefault = false;
		this.testFunction = testFunction;
	}
	
	@Override
	public String getBlipId() {
		return blipId;
	}
	
	@Override
	public String getBpmId() {
		return bpmId;
	}

	@Override
	public int getPriority() {
		return priority;
	}

	@Override
	public boolean isDefault() {
		return isDefault;
	}

	@Override
	public String getTestFunction() {
		return testFunction;
	}
}