/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.depgraph;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import com.opengamma.engine.depgraph.impl.DependencyNodeImpl;
/**
*
*/
public class DependencyNodeFormatter {
/**
* The default width for each level of indentation in the output dependency graph.
*/
public static final int DEFAULT_INDENT_SIZE = 2;
private final int _indentSize;
private final String _indentText;
public DependencyNodeFormatter() {
this(DEFAULT_INDENT_SIZE);
}
public DependencyNodeFormatter(int indentSize) {
if (indentSize < 0) {
throw new IllegalArgumentException("Indent size must not be negative.");
}
_indentSize = indentSize;
_indentText = constructIndentText(indentSize);
}
private static String constructIndentText(int indentSize) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < indentSize; i++) {
sb.append(' ');
}
return sb.toString();
}
/**
* @return the indentSize
*/
public int getIndentSize() {
return _indentSize;
}
/**
* @return the indentText
*/
protected String getIndentText() {
return _indentText;
}
public void format(PrintStream ps, DependencyNode node) {
PrintWriter pw = new PrintWriter(ps);
format(pw, node);
}
public void format(Writer w, DependencyNode node) {
PrintWriter pw = new PrintWriter(w);
format(pw, node);
}
public void format(PrintWriter pw, DependencyNode node) {
format(pw, node, 0);
}
protected void format(PrintWriter pw, DependencyNode node, int indentLevel) {
if (node == null) {
return;
}
for (int i = 0; i < indentLevel; i++) {
pw.print(getIndentText());
}
pw.print(node.toString());
pw.print(" ");
pw.print("producing ");
pw.print(DependencyNodeImpl.getOutputValues(node));
pw.println();
final int count = node.getInputCount();
for (int i = 0; i < count; i++) {
final DependencyNode subNode = node.getInputNode(i);
format(pw, subNode, indentLevel + 1);
}
}
public static String toString(DependencyNode node) {
DependencyNodeFormatter formatter = new DependencyNodeFormatter();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
formatter.format(pw, node);
return sw.toString();
}
}