| /** Copyright (C) Conformiq Software Ltd. |
| * All rights reserved. |
| * |
| * Created Wed Aug 27 16:49:21 2008. |
| * |
| * @file Utils.java |
| * |
| * @author Conformiq Software Ltd. |
| * |
| * |
| */ |
| package com.conformiq.adaptation.ttcn; |
| |
| import java.io.File; |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import com.conformiq.qtronic2.Checkpoint; |
| import com.conformiq.qtronic2.QMLRecord; |
| import com.conformiq.qtronic2.TimeStamp; |
| |
| public class Utils |
| { |
| |
| static class TemplateDefinition |
| { |
| public TemplateDefinition(final String type, final String templatename, |
| QMLRecord record) |
| { |
| this.typeName = type; |
| this.templateName = templatename; |
| this.record = record; |
| } |
| |
| private String typeName; |
| private String templateName; |
| |
| public String getTypeName() |
| { |
| return typeName; |
| } |
| |
| public String getTemplateName() |
| { |
| return templateName; |
| } |
| |
| private QMLRecord record; |
| |
| public QMLRecord getRecord() |
| { |
| return record; |
| } |
| } |
| |
| static class CheckPointInfo |
| { |
| public CheckPointInfo(final Checkpoint checkpoint, final int status, |
| final TimeStamp ts) |
| { |
| this.checkpoint = checkpoint; |
| this.status = status; |
| this.ts = ts; |
| } |
| |
| public final Checkpoint checkpoint; |
| public final int status; |
| public final TimeStamp ts; |
| } |
| |
| public static String buildModuleNameFromFileName(File file) |
| { |
| if (file.isDirectory()) |
| { |
| return null; |
| } |
| String fileName = file.getName(); |
| int dot = fileName.lastIndexOf("."); |
| if (dot > -1) |
| { |
| fileName = fileName.substring(0, dot); |
| } |
| if (fileName.length() == 0) |
| { |
| return null; |
| } |
| return makeValidTTCN3Identifier(fileName); |
| } |
| |
| public static String makeValidTTCN3Identifier(String id) |
| { |
| /* "Identifier ::= <alpha> (<alnum> | <underscore>)*" */ |
| StringBuffer valid_ = new StringBuffer(); |
| final int size = id.length(); |
| if (size == 0) |
| { |
| System.err |
| .println("Warning: Empty string is not a valid TTCN3 identifier."); |
| return id; |
| } |
| if (isalpha(id.charAt(0))) |
| { |
| valid_.append(id.substring(0, 1)); |
| } |
| else |
| { |
| valid_.append("X" + id.substring(0, 1)); |
| } |
| for (int i = 1; i < size; i++) |
| { |
| if (!isalnum(id.charAt(i)) && id.charAt(i) != '_') |
| { |
| valid_.append("_"); |
| } |
| else |
| { |
| valid_.append(id.charAt(i)); |
| } |
| } |
| /* Postfix TTCN3 reserved words with '_' */ |
| String valid = valid_.toString(); |
| if (valid.equals("action") || valid.equals("fail") |
| || valid.equals("named") || valid.equals("self") |
| || valid.equals("activate") || valid.equals("false") |
| || valid.equals("none") || valid.equals("send") |
| || valid.equals("address") || valid.equals("float") |
| || valid.equals("nonrecursive") || valid.equals("sender") |
| || valid.equals("all") || valid.equals("for") |
| || valid.equals("not") || valid.equals("set") |
| || valid.equals("alt") || valid.equals("from") |
| || valid.equals("not4b") || valid.equals("signature") |
| || valid.equals("and") || valid.equals("function") |
| || valid.equals("nowait") || valid.equals("start") |
| || valid.equals("and4b") || valid.equals("null") |
| || valid.equals("stop") || valid.equals("any") |
| || valid.equals("get") || valid.equals("sut") |
| || valid.equals("getcall") || valid.equals("objid") |
| || valid.equals("system") || valid.equals("bitstring") |
| || valid.equals("getreply") || valid.equals("octetstring") |
| || valid.equals("boolean") || valid.equals("goto") |
| || valid.equals("of") || valid.equals("template") |
| || valid.equals("group") || valid.equals("omit") |
| || valid.equals("testcase") || valid.equals("call") |
| || valid.equals("on") || valid.equals("timeout") |
| || valid.equals("catch") || valid.equals("hexstring") |
| || valid.equals("optional") || valid.equals("timer") |
| || valid.equals("char") || valid.equals("or") || valid.equals("to") |
| || valid.equals("charstring") || valid.equals("if") |
| || valid.equals("or4b") || valid.equals("trigger") |
| || valid.equals("check") || valid.equals("ifpresent") |
| || valid.equals("out") || valid.equals("true") |
| || valid.equals("clear") || valid.equals("import") |
| || valid.equals("override") || valid.equals("type") |
| || valid.equals("complement") || valid.equals("in") |
| || valid.equals("component") || valid.equals("inconc") |
| || valid.equals("param") || valid.equals("union") |
| || valid.equals("connect") || valid.equals("infinity") |
| || valid.equals("pass") || valid.equals("universal") |
| || valid.equals("const") || valid.equals("inout") |
| || valid.equals("pattern") || valid.equals("unmap") |
| || valid.equals("control") || valid.equals("integer") |
| || valid.equals("port") || valid.equals("create") |
| || valid.equals("interleave") || valid.equals("procedure") |
| || valid.equals("value") || valid.equals("valueof") |
| || valid.equals("deactivate") || valid.equals("label") |
| || valid.equals("raise") || valid.equals("var") |
| || valid.equals("disconnect") || valid.equals("language") |
| || valid.equals("read") || valid.equals("verdict") |
| || valid.equals("display") || valid.equals("length") |
| || valid.equals("receive") || valid.equals("verdicttype") |
| || valid.equals("do") || valid.equals("log") |
| || valid.equals("record") || valid.equals("done") |
| || valid.equals("rem") || valid.equals("while") |
| || valid.equals("map") || valid.equals("repeat") |
| || valid.equals("with") || valid.equals("else") |
| || valid.equals("match") || valid.equals("reply") |
| || valid.equals("encode") || valid.equals("message") |
| || valid.equals("return") || valid.equals("xor") |
| || valid.equals("enumerated") || valid.equals("mixed") |
| || valid.equals("running") || valid.equals("xor4b") |
| || valid.equals("error") || valid.equals("mod") |
| || valid.equals("runs") || valid.equals("exception") |
| || valid.equals("modifies") || valid.equals("execute") |
| || valid.equals("module") || valid.equals("expand") |
| || valid.equals("mtc") || valid.equals("extension") |
| || valid.equals("external") || |
| |
| /* special identifiers reserved for the predefined functions */ |
| valid.equals("int2char") || valid.equals("char2int") |
| || valid.equals("int2unichar") || valid.equals("unichar2int") |
| || valid.equals("bit2int") || valid.equals("hex2int") |
| || valid.equals("int2bit") || valid.equals("int2hex") |
| || valid.equals("int2oct") || valid.equals("int2str") |
| || valid.equals("oct2int") || valid.equals("str2int") |
| || valid.equals("lengthof") || valid.equals("sizeof") |
| || valid.equals("ischosen") || valid.equals("ispresent")) |
| { |
| return valid + "_"; |
| } |
| return valid; |
| } |
| |
| private static boolean isalpha(char c) |
| { |
| return (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')); |
| } |
| |
| private static boolean isalnum(char c) |
| { |
| return (isalpha(c) || ('0' <= c && c <= '9')); |
| } |
| |
| static public String escapeString(String s) |
| { |
| // Checkpoint strings from the model must be escaped by "backslashing" |
| // double quotations and backslashes themselves. |
| StringBuffer escaped = new StringBuffer(); |
| final int size = s.length(); |
| if (size == 0) |
| return s; |
| for (int i = 0; i < size; i++) |
| { |
| if (s.charAt(i) == '\\') |
| { |
| escaped.append("\\\\"); |
| } |
| else if (s.charAt(i) == '"') |
| { |
| escaped.append("\\\""); |
| } |
| else |
| { |
| escaped.append(s.charAt(i)); |
| } |
| } |
| return escaped.toString(); |
| } |
| |
| public static boolean EqualTimeStamps(TimeStamp ts1, TimeStamp ts2) |
| { |
| return (ts1.seconds == ts2.seconds) |
| & (ts1.nanoseconds == ts2.nanoseconds); |
| } |
| |
| public static String TimeStampToString(TimeStamp ts) |
| { |
| return ts.seconds + "." + ts.nanoseconds; |
| } |
| |
| public static class Tag |
| { |
| public String getmTagName() |
| { |
| return mTagName; |
| } |
| |
| public String[] getmBody() |
| { |
| return mBody; |
| } |
| |
| private final String mTagName; |
| private final String[] mBody; |
| |
| Tag (String tagName, String[] body) |
| { |
| this.mTagName = tagName; |
| this.mBody = body; |
| } |
| } |
| |
| public static class Banner |
| { |
| private List<Tag> mLines; |
| Banner() |
| { |
| mLines = new LinkedList<Tag>(); |
| } |
| public void addTag(String tagName, String[] tagBody) |
| { |
| mLines.add(new Tag(tagName, tagBody)); |
| } |
| |
| public void addTag(String tagName, String tagBody) |
| { |
| this.addTag(tagName, new String[] {tagBody}); |
| } |
| |
| void print (PrettyPrinter out) |
| { |
| out.println("/**"); |
| out.print("*"); |
| out.block(); |
| for (Tag t : mLines) |
| { |
| out.println(" @" + t.getmTagName()); |
| out.print(" "); |
| out.block(); |
| for (String line : t.mBody) |
| { |
| out.println(line); |
| } |
| out.resume(); |
| } |
| out.resume(); |
| out.println("*/"); |
| } |
| |
| } |
| |
| |
| } |