/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.processor.xml;
/**
* Utility to print out a {@link Program Program}.
*/
public final class ProgramUtil {
private ProgramUtil() {
}
public static final String programToString(Program program) {
StringBuffer str = new StringBuffer();
int counter = 1;
int tabs = 0;
programToString(program, counter, tabs, str);
return str.toString();
}
/**
* This method calls itself recursively if either a While or If instruction is encountered.
* The sub program(s) from those kinds of instructions are passed, recursively, into this
* method.
*/
private static final int programToString(Program program, int counter, int tabs, StringBuffer str) {
int instructionIndex = 0;
ProcessorInstruction inst = program.getInstructionAt(instructionIndex);
Program subprogram = null;
while(inst != null) {
printLine(counter++, tabs, inst.toString(), str);
if(counter > 1000) {
printLine(counter, tabs, "[OUTPUT TRUNCATED...]", str); //$NON-NLS-1$
break;
}
if (inst instanceof WhileInstruction){
subprogram = ((WhileInstruction)inst).getBlockProgram();
counter = programToString(subprogram, counter, tabs + 1, str);
} else if (inst instanceof IfInstruction){
IfInstruction ifInst = (IfInstruction)inst;
int thenCount = ifInst.getThenCount();
for (int i=0; i<thenCount; i++){
Object cond = ifInst.getThenCondition(i);
if (i==0){
printLine(counter++, tabs, "IF " + cond.toString(), str); //$NON-NLS-1$
} else {
printLine(counter++, tabs, "ELSE IF " + cond.toString(), str); //$NON-NLS-1$
}
if (cond instanceof RecurseProgramCondition){
printLine(counter++, tabs, "THEN [recursive sub Program]", str); //$NON-NLS-1$
} else {
subprogram = ifInst.getThenProgram(i);
printLine(counter++, tabs, "THEN", str); //$NON-NLS-1$
counter = programToString(subprogram, counter, tabs + 1, str);
}
}
subprogram = ifInst.getElseProgram();
if (subprogram != null){
printLine(counter++, tabs, "ELSE", str); //$NON-NLS-1$
counter = programToString(subprogram, counter, tabs + 1, str);
}
}
instructionIndex++;
inst = program.getInstructionAt(instructionIndex);
}
return counter;
}
private static final void printLine(int counter, int tabs, String line, StringBuffer buffer) {
// Pad counter with spaces
String counterStr = "" + counter + ": "; //$NON-NLS-1$ //$NON-NLS-2$
if(counter < 10) {
counterStr += " "; //$NON-NLS-1$
}
if(counterStr.length() == 1) {
counterStr += " "; //$NON-NLS-1$
} else if(counterStr.length() == 2) {
counterStr += " "; //$NON-NLS-1$
}
buffer.append(counterStr + getTab(tabs) + line + "\n"); //$NON-NLS-1$
}
private static final String getTab(int tabs) {
if(tabs == 0) {
return ""; //$NON-NLS-1$
}
StringBuffer str = new StringBuffer();
for(int i=0; i<tabs; i++) {
str.append(" "); //$NON-NLS-1$
}
return str.toString();
}
}