/*******************************************************************************
 * Copyright (c) 2006 University College London Software Systems Engineering
 * 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:
 * 	Bruno Wassermann - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.runtimes.utils;

import org.eclipse.bpel.model.PartnerLink;
import org.eclipse.bpel.model.Scope;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;

/**
 * A bunch of helper methods to support runtime providers get data from the 
 * BPEL model. 
 *
 * @author Bruno Wassermann, written 11 May 2007
 */
public class BPELModelUtils {

	/**
	 * Return an <code>EList</code> containing all partnerLink elements defined
	 * on Scopes in this process.
	 * 
	 * @param process <code>EObject</code> representing the Process element
	 * @return <code>EList</code> containing all <code>PartnerLink</code>s 
	 * defined on any Scopes (or none)
	 */
	public static EList<PartnerLink> getScopePartnerLinks(final EObject process) {
		TreeIterator<EObject> contents = process.eAllContents();
		EList<PartnerLink> results = new BasicEList<PartnerLink>();
		
		while (contents.hasNext()) {
			EObject obj = contents.next();
			
			if (obj instanceof Scope) {
				results.addAll(((Scope) obj).getPartnerLinks().getChildren());
			}	
		}
		return results;
	}
}
