/*******************************************************************************
 * Copyright (c) 2007, 2008 Wind River Systems, Inc. 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:
 *    Markus Schorn - initial API and implementation
 *    IBM Corporation
 *******************************************************************************/ 

/* -- ST-Origin --
 * Source folder: org.eclipse.cdt.ui/src
 * Class: org.eclipse.cdt.internal.ui.typehierarchy.THGraphNode
 * Version: 1.7
 */
package org.eclipse.ptp.internal.rdt.core.typehierarchy;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import org.eclipse.cdt.core.model.ICElement;

public class THGraphNode implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private List<THGraphEdge> fOutgoing= Collections.emptyList();
	private List<THGraphEdge> fIncoming= Collections.emptyList();
	private ICElement fElement;
	private ICElement[] fMembers= null;
	
	public THGraphNode(ICElement element) {
		fElement= element;
	}
	
	public void startEdge(THGraphEdge outgoing) {
		fOutgoing= addElement(fOutgoing, outgoing);
	}

	public void endEdge(THGraphEdge incoming) {
		fIncoming= addElement(fIncoming, incoming);
	}
	
	public ICElement getElement() {
		return fElement;
	}

	private List<THGraphEdge> addElement(List<THGraphEdge> list, THGraphEdge elem) {
		switch (list.size()) {
		case 0:
			return Collections.singletonList(elem);
		case 1:
			list= new ArrayList<THGraphEdge>(list);
			list.add(elem);
			return list;
		}
		list.add(elem);
		return list;
	}

	public List<THGraphEdge> getOutgoing() {
		return fOutgoing;
	}
	
	public List<THGraphEdge> getIncoming() {
		return fIncoming;
	}

	public void setMembers(ICElement[] array) {
		fMembers= array;
	}
	
	public ICElement[] getMembers(boolean addInherited) {
		if (!addInherited) {
			return fMembers;
		}
		ArrayList<ICElement> list= new ArrayList<ICElement>();
		collectMembers(new HashSet<THGraphNode>(), list);
		return list.toArray(new ICElement[list.size()]);
	}

	private void collectMembers(HashSet<THGraphNode> visited, List<ICElement> list) {
		if (visited.add(this)) {
			if (fMembers != null) {
				list.addAll(Arrays.asList(fMembers));
			}
			List<THGraphEdge> bases= getOutgoing();
			for (Iterator<THGraphEdge> iterator = bases.iterator(); iterator.hasNext();) {
				THGraphEdge edge = iterator.next();
				edge.getEndNode().collectMembers(visited, list);
			}
		}
	}
	
	@Override
	public String toString() {
		return fElement == null ? null : fElement.toString();
	}
}
