Download this file
SpreadsheetMLSimplified2Trace.atl
112 lines (99 with data), 3.4 kB
--@atlcompiler atl2006
--@author Hugo Bruneliere (Hugo.Bruneliere <at> gmail.com)
module Sheet2Trace; -- Module Template
create OUT : Trace from IN : Sheet;
-------------------------------------------------------------------------------
-- HELPERS --------------------------------------------------------------------
-------------------------------------------------------------------------------
-- This helper indicates if a given row is the beginning of a trace level description
-- CONTEXT: Sheet!Row
-- RETURN: Boolean
helper context Sheet!Row def: isALevelDescriptionBeginning : Boolean =
let data : Sheet!Data = self.r_cells->at(1).c_data in
if not data.oclIsUndefined()then
if data.value.oclIsTypeOf(Sheet!StringValue) then
if data.value.value = 'Index' then
true
else
false
endif
else
false
endif
else
false
endif;
-- This helper returns the index of the last row before the next level
-- CONTEXT: Sheet!Row
-- RETURN: Integer
helper context Sheet!Row def: getIndexOfLastRowBeforeNextLevel : Integer =
let rows : Sequence(Sheet!Row) =
self.r_table.t_rows->select(row | row.isALevelDescriptionBeginning) in
if rows->indexOf(self) <> rows->size() then
self.r_table.t_rows->indexOf(rows->at(rows->indexOf(self)+1))-1
else
self.r_table.t_rows->indexOf(self.r_table.t_rows->at(self.r_table.t_rows->size()))
endif;
-- This global variable indicates the index of the current level
helper def: currentLevelIndex : Integer = 1;
-------------------------------------------------------------------------------
-- RULES ----------------------------------------------------------------------
-------------------------------------------------------------------------------
rule Worksheet2Trace {
from
ew : Sheet!Worksheet
to
t : Trace!Trace (
name <- ew.name,
levels <- if (not ew.ws_table.oclIsUndefined()) then
if (ew.ws_table.t_rows.oclIsUndefined()) then
ew.ws_table.t_rows->select(row | row.isALevelDescriptionBeginning)
->collect(row | thisModule.CreateLevel(row))
else Sequence{}
endif
else Sequence{}
endif
)
}
lazy rule CreateLevel {
from
er : Sheet!Row
to
l : Trace!Level (
calls <- er.r_table.t_rows
->subSequence(er.r_table.t_rows->indexOf(er)+1,er.getIndexOfLastRowBeforeNextLevel)
->collect(r | thisModule.CreateCall(r))
)
do {
thisModule.currentLevelIndex <- er.r_table.t_rows->select(row | row.isALevelDescriptionBeginning)
->indexOf(er)+1;
}
}
lazy rule CreateCall {
from
er : Sheet!Row
using {
nodeName : String = er.r_cells->at(thisModule.currentLevelIndex+1).c_data.value.value;
}
to
c : Trace!Call (
indexes <- er.r_cells->subSequence(1,thisModule.currentLevelIndex)
->collect(cell | thisModule.CreateIndex(cell)),
methodName <- nodeName,
DBAccessesNumber <- er.r_cells->at(thisModule.currentLevelIndex+2).c_data.value.value.round(),
DBRowsNumber <- er.r_cells->at(thisModule.currentLevelIndex+3).c_data.value.value.round(),
CPUTime <- if nodeName <> 'Total DB-Ops' then
er.r_cells->at(thisModule.currentLevelIndex+4).c_data.value.value.round()
else
OclUndefined
endif
)
}
lazy rule CreateIndex {
from
ec : Sheet!Cell
to
i : Trace!Index (
value <- ec.c_data.value.value.round()
)
}