/*******************************************************************************
 * Copyright (c) 2005, 2012 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.details.providers;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.bpel.model.PartnerLink;
import org.eclipse.bpel.model.partnerlinktype.Role;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.emf.ecore.EObject;

import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.PortType;

/**
 * Content provider for PortTypes.
 * 
 * Expects a Role or a Definition or a context as input.
 */
public class PortTypeContentProvider extends AbstractContentProvider  {

	@Override
	public void collectElements(Object input, List list)  {
		
		if (input instanceof Definition) {
			Definition defn = (Definition) input;
			list.addAll ( defn.getEPortTypes() );
			
		} else if (input instanceof PortType) {
			
			PortType pt = (PortType) input;
			collectElements ( pt.eContainer(), list );
			
		} else if (input instanceof Role) {
		
			Role role = (Role) input;
			PortType portType = ModelHelper.getRolePortType(role);
			if (portType != null) {
				list.add ( portType );
			}
			
		} else if (input instanceof EObject) {
			EObject eObj = (EObject) input;
			
			// everything else is expected to be a Process or something inside a Process.			
			PartnerLink[] partnerLinks = BPELUtil.getVisiblePartnerLinks( eObj );			
			Set portTypeSet = new HashSet();
			for (int i = 0; i<partnerLinks.length; i++) {
				PortType pt = ModelHelper.getPartnerPortType(partnerLinks[i], ModelHelper.INCOMING);
				if (pt != null) {
					if (portTypeSet.add(pt)) {
						list.add(pt);
					}
				}
				pt = ModelHelper.getPartnerPortType(partnerLinks[i], ModelHelper.OUTGOING);
				if (pt != null) {
					if (portTypeSet.add(pt)) {
						list.add(pt);
					}
				}
			}
			
		}
	}
}
