blob: fc3dc7f729963baadeb363ab65541c1882c6a062 [file] [log] [blame]
/** 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("*/");
}
}
}