/*******************************************************************************
 * Copyright (c) 2009, 2011 SpringSource, a divison of VMware, 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:
 *     SpringSource, a division of VMware, Inc. - initial API and implementation
 *     SAP AG - moving to Eclipse Libra project and enhancements
 *******************************************************************************/
package org.eclipse.libra.framework.editor.ui.internal.dependencies;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.eclipse.libra.framework.editor.core.model.IBundle;

/**
 * @author Christian Dupuis
 * @author Kaloyan Raev
 */
public class BundleDependencyContentResult {

	private final Set<IBundle> bundles;

	private final Map<Integer, Set<IBundle>> incomingDependencies = new HashMap<Integer, Set<IBundle>>();

	private final Map<Integer, Set<IBundle>> outgoingDependencies = new HashMap<Integer, Set<IBundle>>();

	public BundleDependencyContentResult(Set<IBundle> bundles) {
		this.bundles = bundles;
	}

	public void addIncomingDependency(Integer level, IBundle bundleDependency) {
		if (!incomingDependencies.containsKey(level)) {
			incomingDependencies.put(level, new TreeSet<IBundle>(new Comparator<IBundle>() {

				public int compare(IBundle o1, IBundle o2) {
					return Long.valueOf(o1.getId()).compareTo(Long.valueOf(o2.getId()));
				}
			}));
		}
		incomingDependencies.get(level).add(bundleDependency);
	}

	public void addOutgoingDependency(Integer level, IBundle bundleDependency) {
		if (!outgoingDependencies.containsKey(level)) {
			outgoingDependencies.put(level, new TreeSet<IBundle>(new Comparator<IBundle>() {

				public int compare(IBundle o1, IBundle o2) {
					return Long.valueOf(o1.getId()).compareTo(Long.valueOf(o2.getId()));
				}
			}));
		}
		outgoingDependencies.get(level).add(bundleDependency);
	}

	public Set<IBundle> getBundles() {
		return bundles;
	}

	public Map<Integer, Set<IBundle>> getIncomingDependencies() {
		return incomingDependencies;
	}

	public Map<Integer, Set<IBundle>> getOutgoingDependencies() {
		return outgoingDependencies;
	}

	public Integer getIncomingDegree() {
		int degree = 0;
		for (Integer integer : incomingDependencies.keySet()) {
			degree = Math.max(degree, integer.intValue());
		}
		return Integer.valueOf(degree);
	}

	public Integer getOutgoingDegree() {
		int degree = 0;
		for (Integer integer : outgoingDependencies.keySet()) {
			degree = Math.max(degree, integer.intValue());
		}
		return Integer.valueOf(degree);
	}
}
