@@ -40,7 +40,6 @@ define(function (require, exports, module) {
40
40
41
41
require ( "grammar/java7" ) ;
42
42
43
-
44
43
var javaPrimitiveTypes = [
45
44
"void" ,
46
45
"byte" ,
@@ -122,9 +121,14 @@ define(function (require, exports, module) {
122
121
this . _implementPendings = [ ] ;
123
122
124
123
/**
125
- * @member {{classifier:type.UMLClassifier, node: Object}}
124
+ * @member {{classifier:type.UMLClassifier, association: type.UMLAssociation, node: Object}}
125
+ */
126
+ this . _associationPendings = [ ] ;
127
+
128
+ /**
129
+ * @member {{operation:type.UMLOperation, node: Object}}
126
130
*/
127
- this . _fieldPendings = [ ] ;
131
+ this . _throwPendings = [ ] ;
128
132
129
133
/**
130
134
* @member {{namespace:type.UMLModelElement, feature:type.UMLStructuralFeature, node: Object}}
@@ -187,7 +191,7 @@ define(function (require, exports, module) {
187
191
* - Resolve Type References
188
192
*/
189
193
JavaAnalyzer . prototype . perform2ndPhase = function ( options ) {
190
- var i , len , _typeName , _type , _pathName ;
194
+ var i , len , j , len2 , _typeName , _type , _pathName ;
191
195
192
196
// Create Generalizations
193
197
// if super type not found, create a Class correspond to the super type.
@@ -197,12 +201,13 @@ define(function (require, exports, module) {
197
201
_type = this . _findType ( _extend . classifier , _typeName ) ;
198
202
if ( ! _type ) {
199
203
_pathName = this . _toPathName ( _typeName ) ;
200
- if ( _extend . node . kind === "class" ) {
201
- _type = this . _ensureClass ( this . _root , _pathName ) ;
202
- } else if ( _extend . node . kind === "interface" ) {
204
+ if ( _extend . kind === "interface" ) {
203
205
_type = this . _ensureInterface ( this . _root , _pathName ) ;
206
+ } else {
207
+ _type = this . _ensureClass ( this . _root , _pathName ) ;
204
208
}
205
209
}
210
+
206
211
var generalization = new type . UMLGeneralization ( ) ;
207
212
generalization . _parent = _extend . classifier ;
208
213
generalization . source = _extend . classifier ;
@@ -228,6 +233,53 @@ define(function (require, exports, module) {
228
233
_implement . classifier . ownedElements . push ( realization ) ;
229
234
}
230
235
236
+ // Create Associations
237
+ for ( i = 0 , len = this . _associationPendings . length ; i < len ; i ++ ) {
238
+ var _asso = this . _associationPendings [ i ] ;
239
+ _typeName = _asso . node . type . qualifiedName . name ;
240
+ _type = this . _findType ( _asso . classifier , _typeName ) ;
241
+ // if type found, add as Association
242
+ if ( _type ) {
243
+ for ( j = 0 , len2 = _asso . node . variables . length ; j < len2 ; j ++ ) {
244
+ var variableNode = _asso . node . variables [ j ] ;
245
+ // Create Association
246
+ var association = new type . UMLAssociation ( ) ;
247
+ association . _parent = _asso . classifier ;
248
+ _asso . classifier . ownedElements . push ( association ) ;
249
+ // Set End1
250
+ association . end1 . reference = _asso . classifier ;
251
+ association . end1 . name = "" ;
252
+ association . end1 . visibility = UML . VK_PACKAGE ;
253
+ association . end1 . navigable = false ;
254
+ // TODO: Multiplicity
255
+ // TODO: Aggregation?
256
+ // Set End2
257
+ association . end2 . reference = _type ;
258
+ association . end2 . name = variableNode . name ;
259
+ association . end2 . visibility = this . _getVisibility ( _asso . node . modifiers ) ;
260
+ association . end2 . navigable = true ;
261
+ }
262
+ // if type not found, add as Attribute
263
+ } else {
264
+ this . translateFieldAsAttribute ( options , _asso . classifier , _asso . node ) ;
265
+ }
266
+ }
267
+
268
+ // Assign Throws to Operations
269
+ for ( i = 0 , len = this . _throwPendings . length ; i < len ; i ++ ) {
270
+ var _throw = this . _throwPendings [ i ] ;
271
+ _typeName = _throw . node . name ;
272
+ _type = this . _findType ( _throw . operation , _typeName ) ;
273
+ if ( ! _type ) {
274
+ _pathName = this . _toPathName ( _typeName ) ;
275
+ _type = this . _ensureClass ( this . _root , _pathName ) ;
276
+ }
277
+
278
+ console . log ( _type ) ;
279
+
280
+ _throw . operation . raisedExceptions . push ( _type ) ;
281
+ }
282
+
231
283
// Resolve Type References
232
284
for ( i = 0 , len = this . _typedFeaturePendings . length ; i < len ; i ++ ) {
233
285
var _typedFeature = this . _typedFeaturePendings [ i ] ;
@@ -246,14 +298,14 @@ define(function (require, exports, module) {
246
298
// otherwise
247
299
} else {
248
300
_pathName = this . _toPathName ( _typeName ) ;
249
- var _newClass = this . _ensureClass ( this . _builder . getBaseModel ( ) , _pathName ) ;
301
+ var _newClass = this . _ensureClass ( this . _root , _pathName ) ;
250
302
_typedFeature . feature . type = _newClass ;
251
303
}
252
304
}
253
305
254
306
// Translate type's arrayDimension to multiplicity
255
307
if ( _typedFeature . node . arrayDimension && _typedFeature . node . arrayDimension . length > 0 ) {
256
- var j , len2 , _dim = [ ] ;
308
+ var _dim = [ ] ;
257
309
for ( j = 0 , len2 = _typedFeature . node . arrayDimension . length ; j < len2 ; j ++ ) {
258
310
_dim . push ( "*" ) ;
259
311
}
@@ -514,7 +566,14 @@ define(function (require, exports, module) {
514
566
var memberNode = memberNodeArray [ i ] ;
515
567
switch ( memberNode . node ) {
516
568
case "Field" :
517
- this . translateField ( options , namespace , memberNode ) ;
569
+ if ( options . association ) {
570
+ this . translateFieldAsAssociation ( options , namespace , memberNode ) ;
571
+ } else {
572
+ this . translateFieldAsAttribute ( options , namespace , memberNode ) ;
573
+ }
574
+ break ;
575
+ case "Constructor" :
576
+ this . translateMethod ( options , namespace , memberNode ) ;
518
577
break ;
519
578
case "Method" :
520
579
this . translateMethod ( options , namespace , memberNode ) ;
@@ -527,6 +586,31 @@ define(function (require, exports, module) {
527
586
}
528
587
} ;
529
588
589
+
590
+ /**
591
+ * Translate Java Type Parameter Nodes.
592
+ * @param {Element } namespace
593
+ * @param {Object } typeParameterNodeArray
594
+ */
595
+ JavaAnalyzer . prototype . translateTypeParameters = function ( options , namespace , typeParameterNodeArray ) {
596
+ if ( typeParameterNodeArray ) {
597
+ var i , len , _typeParam ;
598
+ for ( i = 0 , len = typeParameterNodeArray . length ; i < len ; i ++ ) {
599
+ _typeParam = typeParameterNodeArray [ i ] ;
600
+ if ( _typeParam . node === "TypeParameter" ) {
601
+ var _templateParameter = new type . UMLTemplateParameter ( ) ;
602
+ _templateParameter . _parent = namespace ;
603
+ _templateParameter . name = _typeParam . name ;
604
+ if ( _typeParam . type ) {
605
+ _templateParameter . parameterType = _typeParam . type ;
606
+ }
607
+ namespace . templateParameters . push ( _templateParameter ) ;
608
+ }
609
+ }
610
+ }
611
+ } ;
612
+
613
+
530
614
/**
531
615
* Translate Java Class Node.
532
616
* @param {Element } namespace
@@ -565,7 +649,8 @@ define(function (require, exports, module) {
565
649
} ) ;
566
650
}
567
651
}
568
-
652
+ // Translate Type Parameters
653
+ this . translateTypeParameters ( options , _class , classNode . typeParameters ) ;
569
654
// Translate Types
570
655
this . translateTypes ( options , _class , classNode . body ) ;
571
656
// Translate Members
@@ -599,6 +684,8 @@ define(function (require, exports, module) {
599
684
}
600
685
}
601
686
687
+ // Translate Type Parameters
688
+ this . translateTypeParameters ( options , _interface , interfaceNode . typeParameters ) ;
602
689
// Translate Types
603
690
this . translateTypes ( options , _interface , interfaceNode . body ) ;
604
691
// Translate Members
@@ -620,6 +707,8 @@ define(function (require, exports, module) {
620
707
_enum . visibility = this . _getVisibility ( enumNode . modifiers ) ;
621
708
namespace . ownedElements . push ( _enum ) ;
622
709
710
+ // Translate Type Parameters
711
+ this . translateTypeParameters ( options , _enum , enumNode . typeParameters ) ;
623
712
// Translate Types
624
713
this . translateTypes ( options , _enum , enumNode . body ) ;
625
714
// Translate Members
@@ -642,29 +731,48 @@ define(function (require, exports, module) {
642
731
_annotationType . visibility = this . _getVisibility ( annotationTypeNode . modifiers ) ;
643
732
namespace . ownedElements . push ( _annotationType ) ;
644
733
734
+ // Translate Type Parameters
735
+ this . translateTypeParameters ( options , _annotationType , annotationTypeNode . typeParameters ) ;
645
736
// Translate Types
646
737
this . translateTypes ( options , _annotationType , annotationTypeNode . body ) ;
647
738
// Translate Members
648
739
this . translateMembers ( options , _annotationType , annotationTypeNode . body ) ;
649
740
} ;
650
741
651
742
/**
652
- * Translate Java Field Node.
743
+ * Translate Java Field Node as UMLAssociation .
653
744
* @param {Element } namespace
654
745
* @param {Object } fieldNode
655
746
*/
656
- JavaAnalyzer . prototype . translateField = function ( options , namespace , fieldNode ) {
747
+ JavaAnalyzer . prototype . translateFieldAsAssociation = function ( options , namespace , fieldNode ) {
748
+ var i , len ;
749
+ if ( fieldNode . variables && fieldNode . variables . length > 0 ) {
750
+ // Add to _associationPendings
751
+ this . _associationPendings . push ( {
752
+ classifier : namespace ,
753
+ node : fieldNode
754
+ } ) ;
755
+ }
756
+ } ;
757
+
758
+ /**
759
+ * Translate Java Field Node as UMLAttribute.
760
+ * @param {Element } namespace
761
+ * @param {Object } fieldNode
762
+ */
763
+ JavaAnalyzer . prototype . translateFieldAsAttribute = function ( options , namespace , fieldNode ) {
657
764
var i , len ;
658
765
if ( fieldNode . variables && fieldNode . variables . length > 0 ) {
659
766
for ( i = 0 , len = fieldNode . variables . length ; i < len ; i ++ ) {
660
767
var variableNode = fieldNode . variables [ i ] ;
768
+
769
+ // Create Attribute
661
770
var _attribute = new type . UMLAttribute ( ) ;
662
771
_attribute . _parent = namespace ;
663
772
_attribute . name = variableNode . name ;
664
773
665
774
// Modifiers
666
775
_attribute . visibility = this . _getVisibility ( fieldNode . modifiers ) ;
667
- _attribute . type = this . _findType ( namespace , fieldNode . type ) ;
668
776
if ( variableNode . initializer ) {
669
777
_attribute . defaultValue = variableNode . initializer ;
670
778
}
@@ -676,9 +784,6 @@ define(function (require, exports, module) {
676
784
_attribute . isReadOnly = true ;
677
785
}
678
786
// TODO: volatile, transient
679
-
680
- // TODO: Attribute? or Assocation?
681
-
682
787
namespace . attributes . push ( _attribute ) ;
683
788
684
789
// Add to _typedFeaturePendings
@@ -687,10 +792,12 @@ define(function (require, exports, module) {
687
792
feature : _attribute ,
688
793
node : fieldNode . type
689
794
} ) ;
795
+
690
796
}
691
797
}
692
798
} ;
693
799
800
+
694
801
/**
695
802
* Translate Method
696
803
*/
@@ -699,6 +806,7 @@ define(function (require, exports, module) {
699
806
_operation = new type . UMLOperation ( ) ;
700
807
_operation . _parent = namespace ;
701
808
_operation . name = methodNode . name ;
809
+ namespace . operations . push ( _operation ) ;
702
810
703
811
// Modifiers
704
812
_operation . visibility = this . _getVisibility ( methodNode . modifiers ) ;
@@ -739,9 +847,19 @@ define(function (require, exports, module) {
739
847
_operation . parameters . push ( _returnParam ) ;
740
848
}
741
849
742
- // TODO: throw exceptions
850
+ // Throws
851
+ if ( methodNode . throws ) {
852
+ for ( i = 0 , len = methodNode . throws . length ; i < len ; i ++ ) {
853
+ var _throwNode = methodNode . throws [ i ] ;
854
+ this . _throwPendings . push ( {
855
+ operation : _operation ,
856
+ node : _throwNode
857
+ } ) ;
858
+ }
859
+ }
743
860
744
- namespace . operations . push ( _operation ) ;
861
+ // Translate Type Parameters
862
+ this . translateTypeParameters ( options , _operation , methodNode . typeParameters ) ;
745
863
} ;
746
864
747
865
/**
0 commit comments