Switch to unified view

a b/eu.opensourceprojects.mondo.benchmarks.itmfactory/transformations/KDMtoUML.atl
1
-- @atlcompiler atl2006 
2
-- @nsURI uml=http://www.eclipse.org/uml2/2.1.0/UML
3
-- @nsURI kdm=http://www.eclipse.org/MoDisco/kdm
4
--authors: Gabriel Barbier, Mia-Software, gbarbier@mia-software.com 
5
--Transform KDM Models to UML 2.1 models
6
7
module KDMtoUML; 
8
create OUT : uml from IN : kdm;
9
10
-- specific case to attach all single elements to root model
11
entrypoint rule initExternalElementsContainer() {
12
--    to externalPackage :uml!Package(
13
--        name <- 'detached elements'
14
--        ,packagedElement <- externalClass
15
--    )
16
--    ,externalClass :uml!Class(
17
--        name <- 'detached elements'
18
--    )
19
--    do {
20
--        thisModule.externalPackage <- externalPackage;
21
--        thisModule.externalClass <- externalClass;
22
--    }
23
}
24
25
helper def : findExternalPackage() : kdm!CodeModel =
26
  kdm!Segment.allInstances()->select(e | e.refImmediateComposite().oclIsUndefined())
27
      ->collect(e | e.model)->flatten()
28
      ->select(e | e.name = 'externals')
29
      -->collect(e | e.codeElement)->flatten()
30
      -->select(e | e.name = 'detached elements')
31
      ->first();
32
33
endpoint rule manageDetachedElements() {
34
35
  do {
36
          if (not thisModule->findExternalPackage().oclIsUndefined()) {
37
              thisModule.externalPackage <- thisModule.resolveTemp(thisModule->findExternalPackage(), 'tgt');
38
          for (detachedClass in thisModule->findExternalPackage().codeElement) {
39
              if (detachedClass.name = 'detached elements') {
40
                  thisModule.externalClass <- thisModule.resolveTemp(detachedClass, 'tgt');
41
              }
42
          }
43
          for (alone in uml!Element.allInstances()) {
44
                  if (not (alone.oclIsTypeOf(uml!Model))) {
45
                      if (alone.refImmediateComposite().oclIsUndefined()) {
46
                          if (alone.oclIsKindOf(uml!PackageableElement)) {
47
                              thisModule.externalPackage.packagedElement <- alone;
48
                          } else {
49
                              if (not thisModule.externalClass.oclIsUndefined()) {
50
                                  if (alone.oclIsKindOf(uml!Generalization)) {
51
                                      thisModule.externalClass.generalization <- alone;
52
                                  }
53
                                  if (alone.oclIsKindOf(uml!Operation)) {
54
                                      thisModule.externalClass.ownedOperation <- alone;
55
                                  }
56
                                  if (alone.oclIsKindOf(uml!Property)) {
57
                                  thisModule.externalClass.ownedAttribute <- alone;
58
                                  }
59
                              }
60
                          }
61
                      }
62
                  }
63
              }
64
          }       
65
   }
66
}
67
68
helper def: externalPackage : uml!Package = OclUndefined;
69
helper def: externalClass : uml!Class = OclUndefined;
70
71
--------------------------Helpers--------------------------------------------------------------------------------------------------
72
73
helper context kdm!Element def : getVisibility() : uml!VisibilityKind = 
74
  if (self.oclIsTypeOf(kdm!MethodUnit)) then
75
      self->getMethodVisibility()
76
  else
77
      if (self.oclIsTypeOf(kdm!Datatype)) then
78
          self->getDatatypeVisibility()
79
      else
80
          #public
81
      endif
82
  endif;
83
84
helper context kdm!MethodUnit def : getMethodVisibility() : uml!VisibilityKind =
85
  if (self.export = #private) then
86
      #private
87
  else
88
      if (self.export = #protected) then
89
          #protected
90
      else
91
          #public
92
      endif
93
  endif;
94
95
helper context kdm!Datatype def : getDatatypeVisibility() : uml!VisibilityKind = 
96
  let attribute : kdm!Attribute = self.attribute->select(e | e.tag = 'visibility')->first() in
97
      if (attribute.oclIsUndefined()) then
98
          #public
99
      else
100
          let value : String = attribute.value in
101
          if (value = 'private') then
102
              #private
103
          else
104
              if (value = 'protected') then
105
                  #protected
106
              else
107
                  #public
108
              endif
109
          endif
110
      endif;
111
112
helper context kdm!DataElement def : getLowerCardinality() : Integer =
113
  let attribute : kdm!Attribute = self.attribute->select(e | e.tag = 'inheritance')->first() in
114
      if (attribute.oclIsUndefined()) then
115
          0
116
      else
117
          if (attribute.value = 'final') then
118
              1
119
          else
120
              0
121
          endif
122
      endif;
123
124
-- depends on type of DataElement
125
helper context kdm!DataElement def : getUpperCardinality() : Integer =
126
  if (not self.size.oclIsUndefined()) then
127
      self.size
128
  else
129
      if (not self.type.oclIsUndefined()) then
130
          if (self.type.oclIsKindOf(kdm!ArrayType)) then
131
              -1
132
          else
133
              if (self.type.oclIsTypeOf(kdm!TemplateType)) then
134
                  if (self.type->isCollection() or self.type->isMap()) then
135
                      -1
136
                  else
137
                      1
138
                  endif
139
              else
140
                  1
141
              endif
142
          endif
143
      else
144
          1
145
      endif
146
  endif;
147
148
helper context kdm!Datatype def : isCollection() : Boolean =
149
  if (self.name.oclIsUndefined()) then
150
  false
151
  else
152
  if (self.name->startsWith('Collection')) then
153
      true
154
  else
155
      if (self.oclIsTypeOf(kdm!TemplateType)) then
156
          self->getTemplateUnit()->isCollection()
157
      else
158
          if (self.oclIsTypeOf(kdm!TemplateUnit)) then
159
              self->getRealType()->isCollection()
160
          else
161
              if (self->getInheritanceLinks()->isEmpty()) then
162
                  false
163
              else
164
                  let parents : Sequence(kdm!AbstractCodeRelationship) = self->getInheritanceLinks() in
165
                      parents->exists(parent | parent.to->isCollection())
166
              endif
167
          endif
168
      endif
169
  endif
170
  endif;
171
172
helper context kdm!Datatype def : isMap() : Boolean =
173
  if (self.name.oclIsUndefined()) then
174
  false
175
  else
176
  if (self.name->startsWith('Map')) then
177
      true
178
  else
179
      if (self.oclIsTypeOf(kdm!TemplateType)) then
180
          self->getTemplateUnit()->isMap()
181
      else
182
          if (self.oclIsTypeOf(kdm!TemplateUnit)) then
183
              self->getRealType()->isMap()
184
          else
185
              if (self->getInheritanceLinks()->isEmpty()) then
186
                  false
187
              else
188
                  let parents : Sequence(kdm!AbstractCodeRelationship) = self->getInheritanceLinks() in
189
                      parents->exists(parent | parent.to->isMap())
190
              endif
191
          endif
192
      endif
193
  endif
194
  endif;
195
196
197
helper context kdm!Datatype def : getInheritanceLinks() : Sequence(kdm!AbstractCodeRelationship) = 
198
  if ((self.oclIsTypeOf(kdm!EnumeratedType)) or (self.oclIsTypeOf(kdm!ClassUnit))
199
          or (self.oclIsTypeOf(kdm!InterfaceUnit)) or (self.oclIsTypeOf(kdm!TemplateUnit))) then
200
      self.codeRelation->select(e | e.oclIsTypeOf(kdm!Extends) or e.oclIsTypeOf(kdm!Implements))
201
  else
202
      Sequence{}
203
  endif;
204
  
205
  
206
helper context kdm!TemplateType def : getTemplateUnit() : kdm!Datatype =
207
  let link : kdm!InstanceOf = self.codeRelation->select(e | e.oclIsTypeOf(kdm!InstanceOf))->first() in
208
  if (link.oclIsUndefined()) then
209
      OclUndefined
210
  else
211
      if (link.to.oclIsUndefined()) then
212
          let otherLink : kdm!HasType = self.codeRelation->select(e | e.oclIsTypeOf(kdm!HasType))->first() in
213
          if (otherLink.oclIsUndefined()) then
214
              OclUndefined
215
          else
216
              otherLink.to
217
          endif
218
      else
219
          link.to
220
      endif
221
  endif;
222
223
helper context kdm!TemplateUnit def : getRealType() : kdm!CodeItem =
224
  self.codeElement->select(e | not e.oclIsTypeOf(kdm!TemplateParameter))->first();
225
226
helper context kdm!InterfaceUnit def : getRealType() : kdm!Datatype =
227
  self;
228
229
helper context kdm!ClassUnit def : getRealType() : kdm!Datatype =
230
  self;
231
232
helper context kdm!CodeItem def : getPackageContainer() : kdm!Package =
233
  if (self.refImmediateComposite().oclIsTypeOf(kdm!Package)) then
234
      self.refImmediateComposite()
235
  else
236
      if (self.refImmediateComposite().oclIsKindOf(kdm!CodeItem)) then
237
          self.refImmediateComposite()->getPackageContainer()
238
      else
239
          thisModule->findExternalPackage()
240
      endif
241
  endif;
242
243
helper context kdm!DataElement def : getDataElementType() : kdm!Datatype =
244
  if (self.type.oclIsTypeOf(kdm!TemplateType)) then
245
      if (self.type->isCollection() or self.type->isMap()) then
246
          self.type->getTemplateTypeBinding()
247
      else
248
          self.type
249
      endif
250
  else
251
      if (self.type.oclIsTypeOf(kdm!ArrayType)) then
252
          self.type.itemUnit.type
253
      else
254
          self.type
255
      endif
256
  endif;
257
helper context kdm!DataElement def : getDataElementQualifierType() : kdm!Datatype =
258
  if (self.type.oclIsTypeOf(kdm!TemplateType)) then
259
      if (self.type->isMap()) then
260
          self.type.codeRelation->select(e | e.oclIsTypeOf(kdm!ParameterTo))->first().to
261
      else
262
          OclUndefined
263
      endif
264
  else
265
      OclUndefined
266
  endif;
267
268
helper context kdm!TemplateType def : getTemplateTypeBinding() : kdm!Datatype =
269
  let parameter : kdm!ParameterTo = self.codeRelation->select(e | e.oclIsTypeOf(kdm!ParameterTo))->last() in
270
      if (parameter.to.oclIsTypeOf(kdm!TemplateType)) then
271
          if (parameter.to->isCollection() or parameter.to->isMap()) then
272
              parameter.to->getTemplateTypeBinding()
273
          else
274
              parameter.to
275
          endif
276
      else
277
          parameter.to
278
      endif;
279
280
helper context kdm!Datatype def : isPrimitiveType() : Boolean =
281
  if (self.oclIsUndefined() or (self.oclIsKindOf(kdm!PrimitiveType))) then
282
      true
283
  else
284
      -- specific case for primitive objects
285
      if ((self.name = 'String') or (self.name = 'Integer') 
286
              or (self.name = 'Long') or (self.name = 'Short')
287
              or (self.name = 'Float') or (self.name = 'Double')
288
              or (self.name = 'Boolean') or (self.name = 'Number')) then
289
          true
290
      else
291
          false
292
      endif
293
  endif;
294
  
295
--------------------------End-Helpers-----------------------------------------------------------------------------------------------------------------------------------------
296
297
298
299
--------------------------Rules-----------------------------------------------------------------------------------------------------------------------------------------------
300
301
rule SegmentToRootModel {
302
  from src :kdm!Segment
303
  to tgt :uml!Model(
304
      name<- if (src.name.oclIsUndefined()) then 'root model' else src.name endif
305
      ,packagedElement<-src.segment
306
      ,packagedElement<-src.model
307
      ,packagedElement<-src.extension
308
      -- contains external elements
309
--        ,packagedElement<- if (src.refImmediateComposite().oclIsUndefined()) then
310
--                                thisModule.externalPackage
311
--                            else Sequence{} endif
312
  )
313
}
314
315
rule ExtensionFamilyToProfile {
316
  from src :kdm!ExtensionFamily
317
  to tgt :uml!Profile (
318
      name <- src.name
319
      ,packagedElement <- src.annotation
320
      ,packagedElement <- src.attribute
321
      ,packagedElement <- src.stereotype
322
  )
323
}
324
325
rule KDMModelToModel {
326
  from src :kdm!KDMModel
327
  to tgt :uml!Model (
328
      name <- src.name
329
      ,packagedElement <- src.extension
330
      ,packagedElement <- src.ownedElement
331
  )
332
}
333
334
--------------------------------End-Rules------------------------------------
335
336
-- ##########################################################################
337
-- ##########################################################################
338
-- ##########################################################################
339
-- ##########################################################################
340
-- ##########################################################################
341
-- ##########################################################################
342
-- ##########################################################################
343
-- ##########################################################################
344
-- ##########################################################################
345
-- ##########################################################################
346
-- ##########################################################################
347
-- ##########################################################################
348
-- ##########################################################################
349
-- ##########################################################################
350
-- ##########################################################################
351
-- ##########################################################################
352
353
-- Specific rules for source package in KDM metamodel------------------------
354
355
rule InventoryModelToModel extends KDMModelToModel {
356
  from src :kdm!InventoryModel
357
  to tgt :uml!Model (
358
      packagedElement <- src.inventoryElement
359
  )
360
}
361
362
--rule SourceFileToArtifact extends KDMEntityToNamedElement {
363
--    from src :kdm!SourceFile
364
--    to tgt :uml!Artifact (
365
--        fileName <- src.path
366
--    )
367
--}
368
369
rule InventoryItemToArtifact extends KDMEntityToNamedElement {
370
  from src :kdm!InventoryItem
371
  to tgt :uml!Artifact (
372
      fileName <- src.path
373
  )
374
}
375
rule InventoryContainerToPackage extends KDMEntityToNamedElement {
376
  from src :kdm!InventoryContainer
377
  to tgt :uml!Package (
378
      packagedElement <- src.inventoryElement
379
  )
380
}
381
--------------------------------End-Rules------------------------------------
382
383
-- ##########################################################################
384
-- ##########################################################################
385
-- ##########################################################################
386
-- ##########################################################################
387
-- ##########################################################################
388
-- ##########################################################################
389
-- ##########################################################################
390
-- ##########################################################################
391
-- ##########################################################################
392
-- ##########################################################################
393
-- ##########################################################################
394
-- ##########################################################################
395
-- ##########################################################################
396
-- ##########################################################################
397
-- ##########################################################################
398
-- ##########################################################################
399
400
---Specific rules for code package in KDM metamodel--------------------------
401
402
rule CodeModelToModel extends KDMModelToModel {
403
  from src :kdm!CodeModel
404
  to tgt :uml!Model (
405
      packagedElement <- src.codeElement
406
  )
407
}
408
409
abstract rule KDMEntityToNamedElement {
410
  from src :kdm!KDMEntity
411
  to tgt :uml!NamedElement (
412
      name <- src.name
413
      ,visibility <- src->getVisibility()
414
  )
415
}
416
417
-- to manage LanguageUnit and Package
418
rule ModuleToPackage extends KDMEntityToNamedElement {
419
  from src :kdm!Module
420
  to tgt :uml!Package (
421
      packagedElement <- src.codeElement
422
  )
423
}
424
425
-- to manage all primitive types (Boolean, Integer, Void, ...)
426
rule PrimitiveTypeToPrimitiveType extends KDMEntityToNamedElement {
427
  from src :kdm!PrimitiveType
428
  to tgt :uml!PrimitiveType ()
429
}
430
431
-- we have to filter dummy class only needed in kdm to manage behaviour element in StorableUnit
432
rule ClassUnitToClass extends KDMEntityToNamedElement {
433
  from src :kdm!ClassUnit (
434
      not src.refImmediateComposite().oclIsTypeOf(kdm!TemplateUnit)
435
      and not (src.refImmediateComposite().oclIsTypeOf(kdm!StorableUnit))
436
      
437
  )
438
  to tgt :uml!Class (
439
      isAbstract <- src.isAbstract
440
      -- specific case to manage templated methods (encapsulated in a TemplateUnit)
441
      ,nestedClassifier <- src.codeElement->select(e | e.oclIsKindOf(kdm!Datatype))
442
              ->select(e | if (e.oclIsTypeOf(kdm!TemplateUnit)) then not (e->getRealType().oclIsTypeOf(kdm!MethodUnit)) else true endif)
443
      ,generalization <- src.codeRelation->select(e | e.oclIsTypeOf(kdm!Extends))
444
      ,interfaceRealization <- src.codeRelation->select(e | e.oclIsTypeOf(kdm!Implements))
445
      ,ownedOperation <- src.codeElement->select(e | e.oclIsTypeOf(kdm!MethodUnit))
446
      ,ownedAttribute <- src.codeElement->select(e | e.oclIsKindOf(kdm!DataElement))
447
  )
448
}
449
450
rule InterfaceUnitToInterface extends KDMEntityToNamedElement {
451
  from src :kdm!InterfaceUnit (not src.refImmediateComposite().oclIsTypeOf(kdm!TemplateUnit))
452
  to tgt :uml!Interface (
453
      -- specific case to manage templated methods (encapsulated in a TemplateUnit)
454
      nestedClassifier <- src.codeElement->select(e | e.oclIsKindOf(kdm!Datatype))
455
              ->select(e | if (e.oclIsTypeOf(kdm!TemplateUnit)) then not (e->getRealType().oclIsTypeOf(kdm!MethodUnit)) else true endif)
456
      ,generalization <- src.codeRelation->select(e | e.oclIsTypeOf(kdm!Extends))
457
      ,ownedOperation <- src.codeElement->select(e | e.oclIsTypeOf(kdm!MethodUnit))
458
      ,ownedAttribute <- src.codeElement->select(e | e.oclIsKindOf(kdm!DataElement))
459
  )
460
}
461
462
rule EnumeratedTypeToEnumeration extends KDMEntityToNamedElement {
463
  from src :kdm!EnumeratedType
464
  to tgt :uml!Enumeration (
465
      ownedLiteral <- src.value
466
  )
467
}
468
469
470
abstract rule TemplateUnitToTemplateableElement {
471
  from src :kdm!TemplateUnit
472
--    to tgt :uml!TemplateableElement (
473
--        ownedTemplateSignature <- signature
474
--    )
475
  to signature :uml!RedefinableTemplateSignature (
476
      name <- src.name
477
      ,ownedParameter <- src.codeElement->select(e | e.oclIsTypeOf(kdm!TemplateParameter))
478
                              ->collect(parameter | thisModule->TemplateParameterToClassifierTemplateParameter(parameter))
479
  )
480
}
481
482
lazy rule TemplateParameterToClassifierTemplateParameter {
483
  from src :kdm!TemplateParameter
484
  to tgt :uml!ClassifierTemplateParameter (
485
      -- name is not managed in UML
486
      ownedParameteredElement <- parameter
487
  )
488
  , parameter :uml!Class (
489
      name <- src.name
490
  )
491
}
492
493
rule TemplateUnitToClass extends TemplateUnitToTemplateableElement {
494
  from src :kdm!TemplateUnit (
495
      src->getRealType().oclIsTypeOf(kdm!ClassUnit)
496
      )
497
  using {
498
      realType :kdm!Datatype = src->getRealType();
499
  }
500
  to tgt :uml!Class (
501
      name <- realType.name
502
      ,isAbstract <- realType.isAbstract
503
      -- specific case to manage templated methods (encapsulated in a TemplateUnit)
504
      ,nestedClassifier <- realType.codeElement->select(e | e.oclIsKindOf(kdm!Datatype))
505
              ->select(e | if (e.oclIsTypeOf(kdm!TemplateUnit)) then not (e->getRealType().oclIsTypeOf(kdm!MethodUnit)) else true endif)
506
      ,generalization <- realType.codeRelation->select(e | e.oclIsTypeOf(kdm!Extends))
507
      ,interfaceRealization <- realType.codeRelation->select(e | e.oclIsTypeOf(kdm!Implements))
508
      ,ownedOperation <- realType.codeElement->select(e | e.oclIsTypeOf(kdm!MethodUnit))
509
      ,ownedAttribute <- realType.codeElement->select(e | e.oclIsKindOf(kdm!DataElement))
510
  )
511
}
512
513
rule TemplateUnitToInterface extends TemplateUnitToTemplateableElement {
514
  from src :kdm!TemplateUnit (
515
      src->getRealType().oclIsTypeOf(kdm!InterfaceUnit)
516
      )
517
  using {
518
      realType :kdm!Datatype = src->getRealType();
519
  }
520
  to tgt :uml!Interface (
521
      name <- realType.name
522
      -- specific case to manage templated methods (encapsulated in a TemplateUnit)
523
      ,nestedClassifier <- realType.codeElement->select(e | e.oclIsKindOf(kdm!Datatype))
524
              ->select(e | if (e.oclIsTypeOf(kdm!TemplateUnit)) then not (e->getRealType().oclIsTypeOf(kdm!MethodUnit)) else true endif)
525
      ,generalization <- realType.codeRelation->select(e | e.oclIsTypeOf(kdm!Extends))
526
      ,ownedOperation <- realType.codeElement->select(e | e.oclIsTypeOf(kdm!MethodUnit))
527
      ,ownedAttribute <- realType.codeElement->select(e | e.oclIsKindOf(kdm!DataElement))
528
  )
529
}
530
531
rule ExtendsToGeneralization {
532
  from src :kdm!Extends
533
  to tgt :uml!Generalization (
534
      general <- src.to
535
  )
536
}
537
538
rule ImplementsToInterfaceRealization {
539
  from src :kdm!Implements
540
  to tgt :uml!InterfaceRealization (
541
      contract <- if (src.to.oclIsTypeOf(kdm!ClassUnit)) then OclUndefined else src.to endif
542
  )
543
  do {
544
      if (src.to.oclIsTypeOf(kdm!ClassUnit)) {
545
          src.from->debug('Invalid implements, from ');
546
          src.to->debug('to ');
547
      }
548
  }
549
}
550
551
rule ImportsToDependency {
552
  from src :kdm!Imports
553
  to tgt :uml!Dependency (
554
      client <- src.from
555
      ,supplier <- src.to
556
  )
557
  do {
558
      -- store the created dependency in first parent package of client element
559
      thisModule.resolveTemp(src.from->getPackageContainer(), 'tgt').packagedElement <- tgt;
560
  }
561
}
562
563
rule TemplateTypeToInterface {
564
  from src : kdm ! TemplateType (
565
      if (src->getTemplateUnit() = OclUndefined) then
566
          false
567
      else
568
          src->getTemplateUnit()->getRealType().oclIsTypeOf(kdm!InterfaceUnit)
569
      endif
570
  )
571
  to tgt :uml!Interface(
572
      name<-src.name
573
      ,templateBinding <- src.codeRelation->select(e | e.oclIsTypeOf(kdm!ParameterTo))
574
  )
575
  do {
576
      thisModule.resolveTemp(src->getTemplateUnit()->getPackageContainer(), 'tgt').packagedElement <- tgt;
577
  }
578
}
579
580
rule TemplateTypeToClass {
581
  from src : kdm ! TemplateType (
582
      if (src->getTemplateUnit() = OclUndefined) then
583
          false
584
      else
585
          not src->getTemplateUnit()->getRealType().oclIsTypeOf(kdm!InterfaceUnit)
586
      endif       
587
  )
588
  to tgt :uml!Class(
589
      name<-src.name
590
      ,templateBinding <- src.codeRelation->select(e | e.oclIsTypeOf(kdm!ParameterTo))
591
  )
592
  do {
593
      thisModule.resolveTemp(src->getTemplateUnit()->getPackageContainer(), 'tgt').packagedElement <- tgt;
594
  }
595
}
596
597
rule ParameterToToTemplateBinding {
598
  from src :kdm!ParameterTo (src.from->getTemplateUnit().oclIsTypeOf(kdm!TemplateUnit))
599
  to tgt :uml!TemplateBinding (
600
      signature <- thisModule.resolveTemp(src.from->getTemplateUnit(), 'signature')
601
      ,parameterSubstitution <- substitution
602
  )
603
  , substitution :uml!TemplateParameterSubstitution (
604
--        actual <- src.to
605
      --,formal <- src.from->getTemplateUnit().codeElement->at(src.from.codeRelation->indexOf(src))
606
  )
607
  do {
608
      substitution.formal <- tgt.signature.ownedParameter->at(src.from.codeRelation->indexOf(src));
609
  }
610
}
611
--------------------------------End-Rules------------------------------------
612
613
-- ##########################################################################
614
-- ##########################################################################
615
-- ##########################################################################
616
-- ##########################################################################
617
-- ##########################################################################
618
-- ##########################################################################
619
-- ##########################################################################
620
-- ##########################################################################
621
-- ##########################################################################
622
-- ##########################################################################
623
-- ##########################################################################
624
-- ##########################################################################
625
-- ##########################################################################
626
-- ##########################################################################
627
-- ##########################################################################
628
-- ##########################################################################
629
630
---Specific rules for code package in KDM metamodel, dedicated to members----
631
632
rule ValueToEnumerationLiteral {
633
  from src :kdm!Value (src.refImmediateComposite().oclIsTypeOf(kdm!EnumeratedType))
634
  to tgt :uml!EnumerationLiteral (
635
      name <- src.name
636
  )
637
}
638
639
-- we have to filter dummy operations (needed in KDM to store behaviour)
640
rule MethodUnitToOperation extends KDMEntityToNamedElement {
641
  from src :kdm!MethodUnit (
642
      not src.refImmediateComposite().oclIsTypeOf(kdm!TemplateUnit)
643
      and not (src.type.oclIsUndefined())
644
      and not (src.refImmediateComposite().oclIsTypeOf(kdm!CodeModel)) -- Unresolved items
645
  )
646
  to tgt :uml!Operation (
647
      ownedParameter <- src.type.parameterUnit
648
  )
649
}
650
651
rule TemplateUnitToOperation extends TemplateUnitToTemplateableElement {
652
  from src :kdm!TemplateUnit (
653
      src->getRealType().oclIsTypeOf(kdm!MethodUnit)
654
  )
655
  using {
656
      realType :kdm!MethodUnit = src->getRealType();
657
  }
658
  to tgt :uml!Operation (
659
      name <- realType.name
660
      ,visibility <- src->getVisibility()
661
      ,ownedParameter <- realType.type.parameterUnit
662
  )
663
}
664
665
rule ParameterUnitToParameter extends KDMEntityToNamedElement {
666
  from src :kdm!ParameterUnit
667
  to tgt :uml!Parameter (
668
      direction <- if (src.kind = #return) then #return else OclUndefined endif
669
--        ,type <- src->getDataElementType()
670
      ,lowerValue <- lower
671
      ,upperValue <- upper
672
  )
673
  , lower : uml!LiteralInteger (
674
      value <- src.getLowerCardinality()
675
  )
676
  , upper : uml! LiteralUnlimitedNatural (
677
      value <- src.getUpperCardinality()
678
  )
679
}
680
681
rule MemberUnitToProperty extends KDMEntityToNamedElement {
682
  from src :kdm!MemberUnit
683
  to tgt :uml!Property (
684
      type <- src->getDataElementType()
685
      ,lowerValue <- lower
686
      ,upperValue <- upper
687
  )
688
  , lower : uml!LiteralInteger (
689
      value <- src.getLowerCardinality()
690
  )
691
  , upper : uml! LiteralUnlimitedNatural (
692
      value <- src.getUpperCardinality()
693
  )
694
  do {
695
      if (not (src->getDataElementType().oclIsUndefined())) {
696
          if (not (src->getDataElementType()->isPrimitiveType())) {
697
              thisModule->DataElementToAssociation(src);
698
          }
699
          if (not (src->getDataElementQualifierType().oclIsUndefined())) {
700
              tgt.qualifier <- thisModule.DatatypeToProperty(src->getDataElementQualifierType());
701
          }
702
      }
703
  }
704
}
705
706
rule StorableUnitToProperty extends KDMEntityToNamedElement {
707
  from src :kdm!StorableUnit (not (src.kind = #local)
708
      and not (src.refImmediateComposite().oclIsTypeOf(kdm!CodeModel))) -- Unresolved items
709
  to tgt :uml!Property (
710
--        type <- src->getDataElementType(),
711
      isStatic <- if (src.kind = #static) then true else false endif
712
      ,lowerValue <- lower
713
      ,upperValue <- upper
714
  )
715
  , lower : uml!LiteralInteger (
716
      value <- src.getLowerCardinality()
717
  )
718
  , upper : uml! LiteralUnlimitedNatural (
719
      value <- src.getUpperCardinality()
720
  )
721
  do {
722
      if (not (src->getDataElementType().oclIsUndefined())) {
723
          if (not (src->getDataElementType()->isPrimitiveType())) {
724
              thisModule->DataElementToAssociation(src);
725
          }
726
          if (not (src->getDataElementQualifierType().oclIsUndefined())) {
727
              tgt.qualifier <- thisModule.DatatypeToProperty(src->getDataElementQualifierType());
728
          }
729
      }
730
  }
731
}
732
733
lazy rule DataElementToAssociation {
734
  from src :kdm!DataElement
735
  to tgt :uml!Association (
736
      memberEnd<- src
737
      ,memberEnd <- targetProperty
738
      ,ownedEnd <- targetProperty
739
  )
740
  , targetProperty :uml!Property (
741
--        type <- src.refImmediateComposite()
742
  )
743
  do {
744
      thisModule.resolveTemp(src->getPackageContainer(), 'tgt').packagedElement <- tgt;
745
  }
746
}
747
748
-- to create qualifier for a parent property
749
lazy rule DatatypeToProperty {
750
  from src :kdm!Datatype
751
  to tgt :uml!Property (
752
      name <- 'qualifier'
753
      ,type <- src
754
  )
755
}
756
--------------------------------End-Rules------------------------------------