//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.util;

import java.io.PrintStream;
import java.util.Collection;
import java.util.Iterator;

import org.eclipse.epf.uma.MethodElement;

/**
 * Utility class for debug purpose
 * 
 * @author Weiping Lu
 * @since 1.2
 */
public final class DebugUtil {

	private static PrintStream output;
	private static String prompt = "LD> "; 					//$NON-NLS-1$
	
	public static void setOutput(PrintStream op) {
		output = op;
	}
	
	public static void setPrompt(String pt) {
		prompt = pt;
	}
	
	private static PrintStream out() {
		if (output != null) {
			return output;
		}
		return System.out;
	}
	
	public static void print(String beginTitle, String endTitle, Collection<? extends MethodElement> elements, int ix) {
		if (beginTitle != null) {
			String str = "";				//$NON-NLS-1$
			if (elements == null) {
				str = "null";				//$NON-NLS-1$
			} else if (elements.isEmpty()) {
				str = elements.toString();
			}
			out().println(prompt + beginTitle + str);
		}
		
		if (elements == null) {
			return;
		}
		for (Iterator<? extends MethodElement> it = elements.iterator(); it.hasNext();) {
			MethodElement element = it.next();
			out().println(prompt + toString(element, ix));
		}
		
		if (endTitle != null) {
			out().println(prompt + endTitle);
		}
		out().println("");			//$NON-NLS-1$
	}
	
	public static String toString(MethodElement element, int ix) {
		if (ix == 1) {
			return TngUtil.getLabelWithPath(element);
		} 
		if (ix == 2) {
			return element.eClass().getName() + ", " + 
					element.getGuid() + ", " + TngUtil.getLabelWithPath(element);//$NON-NLS-1$ //$NON-NLS-2$
		}
		return element.toString();
	}	
}