| /** 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()); | |
| } | |
| } | |
| } |