/*******************************************************************************
 * 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.details.tree;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.bpel.model.PartnerLink;
import org.eclipse.bpel.model.partnerlinktype.Role;
import org.eclipse.wst.wsdl.PortType;

/**
 * Tree node to represent a PartnerLink model object.
 */
public class PartnerLinkTreeNode extends TreeNode {

	public PartnerLinkTreeNode(PartnerLink partnerLink, boolean isCondensed) {
		super(partnerLink, isCondensed);
	}

	/* ITreeNode */

	@Override
	public Object[] getChildren() {
		
		PartnerLink partnerLink = (PartnerLink)modelObject;
		
		if (partnerLink == null) {
			return EMPTY_ARRAY;
		}
		
		List<PortTypeTreeNode> list = new ArrayList<PortTypeTreeNode>(2);
		
		Role role = partnerLink.getMyRole();
		PortTypeTreeNode node = null;
		PortType portType = null;
		
		if (role != null && !role.eIsProxy() ) {
			portType = (PortType) role.getPortType();
			if (portType != null) {
				node = new PortTypeTreeNode((PortType)role.getPortType(), isCondensed);
				node.setDerivedFromMyRole(true);
				list.add(node);
			}
		}
		
		role = partnerLink.getPartnerRole();
		
		if (role != null && !role.eIsProxy() )  {
			portType = (PortType) role.getPortType();
			if (portType != null) {
				node = new PortTypeTreeNode((PortType)role.getPortType(), isCondensed);
				node.setDerivedFromPartnerRole(true);
				list.add(node);
			}
		}
		
		return list.toArray();
	}

	@Override
	public boolean hasChildren() {
		PartnerLink partnerLink = (PartnerLink)modelObject;
		
		if (partnerLink == null)  {
			return false;
		}
		
		Role role = partnerLink.getMyRole();
		if (role != null && !role.eIsProxy()) {
			return true;
		}
		role = partnerLink.getPartnerRole();
		if (role != null && !role.eIsProxy() ) {
			return true;
		}
		return false;
	}
}
