1-- @path Organisation=/Organisation/Organisation.ecore
2-- @path Report=/Report/Report.ecore
3
4module OrganisationTransform;
5create OUT: Report from IN: Organisation;
6
7-- Helper: format employee information
8helper context Organisation!Employee def: formattedInfo(): String =
9 self.name + ' (ID: ' + self.id.toString() + ')';
10
11-- Helper: get manager-specific information
12helper context Organisation!Employee def: getManagerInfo(): String =
13 if self.oclIsTypeOf(Organisation!Manager) then
14 let mgr : Organisation!Manager = self.oclAsType(Organisation!Manager) in
15 'Manager of ' + mgr.teamSize.toString() + ' people'
16 else
17 'Not a manager'
18 endif;
19
20-- Helper: get developer-specific information
21helper context Organisation!Employee def: getDeveloperInfo(): String =
22 if self.oclIsTypeOf(Organisation!Developer) then
23 let dev : Organisation!Developer = self.oclAsType(Organisation!Developer) in
24 'Develops in ' + dev.programmingLanguage
25 else
26 'Not a developer'
27 endif;
28
29-- Helper: calculate department statistics
30helper context Organisation!Department def: statistics(): String =
31 let total : Integer = self.employees->size() in
32 let managers : Integer = self.employees
33 ->select(e | e.oclIsTypeOf(Organisation!Manager))
34 ->size() in
35 let developers : Integer = self.employees
36 ->select(e | e.oclIsTypeOf(Organisation!Developer))
37 ->size() in
38 'Total: ' + total.toString() +
39 ', Managers: ' + managers.toString() +
40 ', Developers: ' + developers.toString();
41
42-- Rule: Transform department to report
43rule DepartmentToReport {
44 from
45 s: Organisation!Department
46 to
47 t: Report!DepartmentReport (
48 name <- s.name,
49 statistics <- s.statistics(),
50 employees <- s.employees
51 ->collect(e | e.formattedInfo() + ' - ' +
52 if e.oclIsTypeOf(Organisation!Manager) then
53 e.getManagerInfo()
54 else
55 if e.oclIsTypeOf(Organisation!Developer) then
56 e.getDeveloperInfo()
57 else
58 'Employee'
59 endif
60 endif)
61 )
62}