blob: 5d21e37ebe3552ea366497e6a3d7f041b826cc31 [file] [log] [blame]
/** Copyright (C) Conformiq Software Ltd.
* All rights reserved.
*
* Created Wed Aug 27 16:49:21 2008.
*
* @file TemplateDumper.java
*
* @author Conformiq Software Ltd.
*
*
*/
package com.conformiq.adaptation.ttcn;
import java.math.BigDecimal;
import com.conformiq.qtronic2.QMLArray;
import com.conformiq.qtronic2.QMLArrayType;
import com.conformiq.qtronic2.QMLBoolean;
import com.conformiq.qtronic2.QMLBooleanType;
import com.conformiq.qtronic2.QMLNumber;
import com.conformiq.qtronic2.QMLNumberType;
import com.conformiq.qtronic2.QMLOptional;
import com.conformiq.qtronic2.QMLOptionalType;
import com.conformiq.qtronic2.QMLRecord;
import com.conformiq.qtronic2.QMLRecordField;
import com.conformiq.qtronic2.QMLRecordType;
import com.conformiq.qtronic2.QMLString;
import com.conformiq.qtronic2.QMLStringType;
import com.conformiq.qtronic2.QMLType;
import com.conformiq.qtronic2.QMLTypeVisitor;
import com.conformiq.qtronic2.QMLUnion;
import com.conformiq.qtronic2.QMLValue;
import com.conformiq.qtronic2.QMLValueVisitor;
public class TemplateDumper implements QMLValueVisitor
{
private PrettyPrinter out;
private boolean mUseFractions;
private boolean mEsxpectFloat;
public TemplateDumper(PrettyPrinter out, boolean isUseFractions)
{
this.out = out;
this.mUseFractions = isUseFractions;
}
@Override
public void visit(QMLRecord r)
{
if (r == null)
{
out.print("{ /* null record */ }");
return;
}
/*
* TODO make a dedicated method in the visitor interface for QMLUnion
*/
if (r instanceof QMLUnion)
{
QMLUnion u = (QMLUnion) r;
visit(u);
return;
}
out.print("{");
out.endl();
out.print(" ");
out.block();
for (int i = 0; i < r.getNumberOfFields(); i++)
{
if (i > 0)
{
out.print(",");
out.endl();
}
QMLRecordField f = r.getField(i);
out.print(Utils.makeValidTTCN3Identifier(f.getName()));
out.print(" := ");
QMLValue v = f.getValue();
if (v != null)
{
mEsxpectFloat =
FloatTypeDetector.isFloatType(f.getFieldType().getType());
v.accept(this);
}
else
out.print("{ /* NULL */ }");
}
out.endl();
out.resume();
out.print("}");
}
public void visit(QMLUnion u)
{
if (u == null)
{
out.print("{ /* null union */ }");
return;
}
out.print("{");
out.endl();
out.print(" ");
out.block();
for (int i = 0; i < u.getNumberOfFields(); i++)
{
if (i > 0)
{
out.print(",");
out.endl();
}
QMLRecordField f = u.getField(i);
out.print(Utils.makeValidTTCN3Identifier(f.getName()));
out.print(" := ");
QMLValue v = f.getValue();
if (v != null)
{
mEsxpectFloat =
FloatTypeDetector.isFloatType(f.getFieldType().getType());
v.accept(this);
}
else
out.print("{ /* NULL */ }");
}
out.endl();
out.resume();
out.print("}");
}
@Override
public void visit(QMLString x)
{
assert (x != null);
String v = x.getValue();
out.print("\"");
for (int i = 0; i < v.length(); i++)
{
switch (v.charAt(i)) {
case '\n':
out.print("\\n");
break;
case '\r':
out.print("\\r");
break;
case '\t':
out.print("\\t");
break;
case '\"':
out.print("\"\"");
break;
case '\\':
if ( i + 1 < v.length() && v.charAt(i + 1) != '"')
{
out.print("\\");
}
// PASS THROUGH
default:
out.print(v.charAt(i));
break;
}
}
out.print("\"");
}
@Override
public void visit(QMLBoolean x)
{
assert (x != null);
out.print((x.getValue() ? "true" : "false"));
}
@Override
public void visit(QMLNumber x)
{
assert (x != null);
if (x.isBigInteger())
{
out.print(x.getBigInteger());
if (mEsxpectFloat)
{
out.print(".0");
}
}
else
{
if (!mUseFractions)
{
BigDecimal num = new BigDecimal(x.getNumerator()).setScale(20);
BigDecimal den = new BigDecimal(x.getDenominator());
out.print("" + num.divide(den, BigDecimal.ROUND_UP));
}
else
{
BigDecimal num = new BigDecimal(x.getNumerator());
BigDecimal den = new BigDecimal(x.getDenominator());
out.print("" + num + ".0 / " + den + ".0");
}
}
}
@Override
public void visit(QMLArray array)
{
if (array == null)
{
out.print("{ /* null */ }");
return;
}
out.print("{");
out.endl();
out.print(" ");
out.block();
QMLArrayType arrayType= (QMLArrayType)array.getType();
mEsxpectFloat = FloatTypeDetector.isFloatType(arrayType.getType());
for (int i = 0; i < array.getNumberOfElements(); i++)
{
if (i > 0)
{
out.print(",");
out.endl();
}
QMLValue v = array.getValue(i);
if (v != null)
v.accept(this);
else
out.print("{ /* null */ }");
}
out.endl();
out.resume();
out.print("}");
}
@Override
public void visit(QMLOptional o)
{
QMLValue v = o.getValue();
if (v == null)
{
out.print("omit");
}
else
{
v.accept(this);
}
}
private static class FloatTypeDetector implements QMLTypeVisitor
{
private boolean mREsult;
public static boolean isFloatType(QMLType type)
{
FloatTypeDetector dtector = new FloatTypeDetector();
type.accept(dtector);
return dtector.mREsult;
}
@Override
public void visit(QMLArrayType arg0) {
mREsult = false;
}
@Override
public void visit(QMLBooleanType arg0) {
mREsult = false;
}
@Override
public void visit(QMLNumberType arg0) {
if (arg0.isFloat())
{
mREsult = true;
}
else
{
mREsult = false;
}
}
@Override
public void visit(QMLRecordType arg0) {
mREsult = false;
}
@Override
public void visit(QMLStringType arg0) {
mREsult = false;
}
@Override
public void visit(QMLOptionalType arg0) {
mREsult = isFloatType(arg0.getType());
}
}
}