Logging objects in Titan/TTCN-3
Sziasztok,
Belefutottam egy problemaba (lasd cim), amely a mellekelt archivumot, illetve a Queue.tcQueueLog
-ot futtatva valik lathatova:
(bocs, h nem gyomlaltam ki a nem szigoruan idetartozo reszeket)
testcase tcQueueLog() runs on GeneralComp {
var UniversalCharstring uc0, uc1, uc2;
var object v_obj;
log("Create empty queue");
var TitanQueue q := TitanQueue.create();
log(q)
log(q.toString());
uc0 :=UniversalCharstring.create("FirstElement")
q.add(uc0);
uc1 :=UniversalCharstring.create("SecondElement")
q.add(uc1);
uc2 :=UniversalCharstring.create("ThirdElement")
q.add(uc2);
var QueueForwardIterator iterator := q.iterator() => QueueForwardIterator;
while(iterator.hasNext() ){
v_obj := iterator.next() => object;
log ("------>",v_obj)
//log(iterator); //!!!!!!
}
log(q.toString());
log(q); // !!!!!!!
}
A konstruktor meghivasa utan letrehozott queue
tipusu objektumot a Titan igy logolja ki /* log(q) */
08:43:36.504041 Queue.ttcn:229 TitanQueue: { Queue: { Collection: { Storable: { } } }, head := null, tail := null }
Nehany elem hozzaadasa utan viszont a log(q)
lefagyasztja a Titan-t.
Hasonlokeppen az iterator logolasa is fagyast eredmenyez.
Az objektumon beluli pointer tipusu mezok kozvetlenul nem erhetok el, mivel nem lehetnek publikusak (gondolok itt a head-re es tail-re:
type class TitanQueue extends Queue {
private var Node head;
private var Node tail;
create() {
head := null;
tail := null;
}
:
:
)
De barmikor lehet olyan publikus method-ot irni, amivel kiolvashatok,
Pl.
module TTCN3Queue {
import from TTCN3_standard_collections all;
import from StorableModule all;
import from OODataStructuresCommon all;
type class QueueForwardIterator extends Iterator {
//from head to tail
var Node nextNode;
create(in Node listHead) {
nextNode := listHead;
}
//public function @abstract hasNext() return boolean;
public function hasNext() return boolean {
return nextNode != null;
}
//public function @abstract next() return object;
public function next() return object {
var object toReturn := nextNode.getData();
nextNode := nextNode.getNext();
return toReturn;
}
public function nextN() return Node {
var Node toReturn := nextNode;
nextNode := nextNode.getNext();
return toReturn;
}
}
Es akkor a kiiratas szinten fagyassal vegzodik:
Queue.ttcn
while(iterator.hasNext() ){
v_obj := iterator.next() => object;
log ("------>",v_obj);
v_node := iterator.nextN() => Node;
log ("+++++++>",v_node);
}
Ket gondot latok alapvetoen:
- A Titannak semmilyen korulmenyek kozott nem szabad lefagynia
- Masreszt a szabvany semmilyen tampontot nem ad arra nezvest , h hogyan kell es lehet objektumokat logolni
Mint ahogy pl. Pythonban egy print ezt eredmenyezi:
_main_.Valami object at 0x7ff6a218d2210
Vagy Java-ban ezt:
Objektum@512ddf17
(bar az is hasznos lehetne, ha igyekeznenk az objektum valos tartalmat megjeleniteni).
Mindenesetre a masodik az egy szabvanyositasi kerdes; udvos lenne , ha a tool-ok egysegesen jelenitenek meg az objetumokat.
Gyuri, Kristof, mit gondoltok errol?
Udv