24
24
define ( function ( require , exports , module ) {
25
25
"use strict" ;
26
26
27
- var JavaParser = require ( "java7" ) ;
28
- var FileSystem = staruml . getModule ( "utils/FileSystem" ) ;
27
+ var Core = staruml . getModule ( "core/Core" ) ,
28
+ Repository = staruml . getModule ( "engine/Repository" ) ,
29
+ UML = staruml . getModule ( "uml/UML" ) ,
30
+ FileSystem = staruml . getModule ( "filesystem/FileSystem" ) ,
31
+ FileSystemError = staruml . getModule ( "filesystem/FileSystemError" ) ,
32
+ FileUtils = staruml . getModule ( "file/FileUtils" ) ,
33
+ Async = staruml . getModule ( "utils/Async" ) ;
29
34
30
- var p1 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/java-testset/src-jdk/java/applet/Applet.java" ,
31
- p2 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/java-testset/src-jdk/java/awt/Canvas.java" ,
32
- p3 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/java-testset/src-jdk/java/util/Collection.java" ,
33
- p4 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/java-testset/src-jdk/com/sun/corba/se/spi/protocol/RetryType.java" ,
34
- p5 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/java-testset/src-jdk/com/sun/org/glassfish/external/arc/Taxonomy.java" ;
35
+ require ( "java7" ) ;
35
36
36
- var x = FileSystem . readFile ( p5 , "utf8" , function ( err , data ) {
37
+ /*
38
+ var p1 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/test/src-jdk/java/applet/Applet.java",
39
+ p2 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/test/src-jdk/java/awt/Canvas.java",
40
+ p3 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/test/src-jdk/java/util/Collection.java",
41
+ p4 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/test/src-jdk/com/sun/corba/se/spi/protocol/RetryType.java",
42
+ p5 = "/Users/niklaus/Library/Application Support/StarUML/extensions/user/JavaCodeEng/test/src-jdk/com/sun/org/glassfish/external/arc/Taxonomy.java";
43
+
44
+ var x = FileSystem.readFile(p1, "utf8", function (err, data) {
37
45
console.log(err);
38
46
console.log(data);
39
47
var r = java7.parse(data);
40
48
console.log(JSON.stringify(r, null, "\t"));
41
49
});
50
+ */
51
+
52
+ /**
53
+ * CodeWriter
54
+ * @constructor
55
+ */
56
+ function ModelBuilder ( ) {
57
+
58
+ this . _baseModel = new type . UMLModel ( ) ;
59
+
60
+ }
61
+
62
+ ModelBuilder . prototype . getBaseModel = function ( ) {
63
+ return this . _baseModel ;
64
+ }
65
+
66
+
67
+
68
+ ModelBuilder . prototype . toJson = function ( ) {
69
+ var writer = new Core . Writer ( ) ;
70
+ writer . writeObj ( "data" , this . _baseModel ) ;
71
+ return writer . current [ "data" ] ;
72
+ }
73
+
74
+
75
+ // --------------------
76
+
77
+ /**
78
+ * Java Code Analyzer
79
+ * @constructor
80
+ */
81
+ function JavaAnalyzer ( ) {
82
+
83
+ /** @member {Array.<File>} */
84
+ this . _files = [ ] ;
85
+
86
+ this . _builder = new ModelBuilder ( ) ;
87
+
88
+ }
89
+
90
+ /**
91
+ * @param {Array.<string> } modifiers
92
+ */
93
+ JavaAnalyzer . prototype . _getVisibility = function ( modifiers ) {
94
+ if ( _ . contains ( modifiers , "public" ) ) {
95
+ return UML . VK_PUBLIC ;
96
+ } else if ( _ . contains ( modifiers , "protected" ) ) {
97
+ return UML . VK_PROTECTED ;
98
+ } else if ( _ . contains ( modifiers , "private" ) ) {
99
+ return UML . VK_PRIVATE ;
100
+ }
101
+ return UML . VK_PACKAGE ;
102
+ }
103
+
104
+ JavaAnalyzer . prototype . _getType = function ( typeNode ) {
105
+ if ( _ . isString ( typeNode . name ) ) {
106
+ return typeNode . name ;
107
+ } else if ( typeNode . name . name ) {
108
+ return typeNode . name . name ;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Add File to Reverse Engineer
114
+ * @param {File } file
115
+ */
116
+ JavaAnalyzer . prototype . addFile = function ( file ) {
117
+ this . _files . push ( file ) ;
118
+ }
119
+
120
+
121
+ /**
122
+ * Analyze all files.
123
+ */
124
+ JavaAnalyzer . prototype . analyze = function ( ) {
125
+ var self = this ;
126
+ // First Phase
127
+ var promise = Async . doSequentially ( this . _files , function ( file ) {
128
+ var result = new $ . Deferred ( ) ;
129
+ file . read ( { } , function ( err , data , stat ) {
130
+ try {
131
+ var parent = self . _builder . getBaseModel ( ) ,
132
+ ast = java7 . parse ( data ) ;
133
+ self . translateCompilationUnit ( parent , ast ) ;
134
+ result . resolve ( ) ;
135
+ } catch ( e ) {
136
+ console . log ( e ) ;
137
+ console . log ( "[Java] Failed to parse : " + file . _path ) ;
138
+ result . reject ( ) ;
139
+ }
140
+ } ) ;
141
+ return result . promise ( ) ;
142
+ } , false ) ;
143
+
144
+ promise . always ( function ( ) {
145
+ var json = self . _builder . toJson ( ) ;
146
+ Repository . importFromJson ( Repository . getProject ( ) , json , function ( elem ) {
147
+ console . log ( "done." ) ;
148
+ } ) ;
149
+ } ) ;
150
+
151
+ }
152
+
153
+ /**
154
+ * Return the package of a given pathNames. If not exists, create the package.
155
+ * @param {Element } parent
156
+ * @param {Array.<string> } pathNames
157
+ * @return {Element } Package element corresponding to the pathNames
158
+ */
159
+ JavaAnalyzer . prototype . ensurePackage = function ( parent , pathNames ) {
160
+ if ( pathNames . length > 0 ) {
161
+ var name = pathNames . shift ( ) ;
162
+ if ( name && name . length > 0 ) {
163
+ var elem = parent . findByName ( name ) ;
164
+ if ( elem !== null ) {
165
+ // Package exists
166
+ if ( pathNames . length > 0 ) {
167
+ return this . ensurePackage ( elem , pathNames ) ;
168
+ } else {
169
+ return elem ;
170
+ }
171
+ } else {
172
+ // Package not exists, then create one.
173
+ var _package = new type . UMLPackage ( ) ;
174
+ parent . ownedElements . push ( _package ) ;
175
+ _package . _parent = parent ;
176
+ _package . name = name ;
177
+ if ( pathNames . length > 0 ) {
178
+ return this . ensurePackage ( _package , pathNames ) ;
179
+ } else {
180
+ return _package ;
181
+ }
182
+ }
183
+ }
184
+ } else {
185
+ return null ;
186
+ }
187
+ }
188
+
189
+ JavaAnalyzer . prototype . translateCompilationUnit = function ( parent , compilationUnitNode ) {
190
+ var _namespace = parent ;
191
+ if ( compilationUnitNode [ "package" ] ) {
192
+ var _package = this . translatePackage ( parent , compilationUnitNode [ "package" ] ) ;
193
+ if ( _package !== null ) {
194
+ _namespace = _package ;
195
+ }
196
+ }
197
+ if ( compilationUnitNode . types && compilationUnitNode . types . length > 0 ) {
198
+ for ( var i = 0 , len = compilationUnitNode . types . length ; i < len ; i ++ ) {
199
+ var type = compilationUnitNode . types [ i ] ;
200
+ switch ( type . node ) {
201
+ case "Class" :
202
+ this . translateClass ( _namespace , type ) ;
203
+ break ;
204
+ case "Interface" :
205
+ this . translateInterface ( _namespace , type ) ;
206
+ break ;
207
+ case "Enum" :
208
+ this . translateEnum ( _namespace , type ) ;
209
+ break ;
210
+ case "AnnotationType" :
211
+ this . translateAnnotationType ( _namespace , type ) ;
212
+ break ;
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ JavaAnalyzer . prototype . translatePackage = function ( parent , packageNode ) {
219
+ if ( packageNode && packageNode . name && packageNode . name . name ) {
220
+ var pathNames = packageNode . name . name . split ( "." ) ;
221
+ return this . ensurePackage ( parent , pathNames ) ;
222
+ }
223
+ return null ;
224
+ }
225
+
226
+ JavaAnalyzer . prototype . translateClass = function ( parent , classNode ) {
227
+ var _class = new type . UMLClass ( ) ;
228
+ _class . _parent = parent ;
229
+ _class . name = classNode . name ;
230
+ _class . visibility = this . _getVisibility ( classNode . modifiers ) ;
231
+ parent . ownedElements . push ( _class ) ;
232
+ // Translate Body
233
+ if ( classNode . body && classNode . body . length > 0 ) {
234
+ for ( var i = 0 , len = classNode . body . length ; i < len ; i ++ ) {
235
+ var memberNode = classNode . body [ i ] ;
236
+ switch ( memberNode . node ) {
237
+ case "Field" :
238
+ this . translateField ( _class , memberNode ) ;
239
+ break ;
240
+ case "Method" :
241
+ this . translateMethod ( _class , memberNode ) ;
242
+ break ;
243
+ }
244
+ }
245
+ }
246
+ console . log ( classNode ) ;
247
+ // if (classNode[""])
248
+ }
249
+
250
+ JavaAnalyzer . prototype . translateInterface = function ( parent , interfaceNode ) {
251
+ var _interface = new type . UMLInterface ( ) ;
252
+ _interface . _parent = parent ;
253
+ _interface . name = interfaceNode . name ;
254
+ _interface . visibility = this . _getVisibility ( interfaceNode . modifiers ) ;
255
+ parent . ownedElements . push ( _interface ) ;
256
+ }
257
+
258
+ JavaAnalyzer . prototype . translateEnum = function ( parent , enumNode ) {
259
+ }
260
+
261
+ JavaAnalyzer . prototype . translateAnnotationType = function ( parent , annotationTypeNode ) {
262
+ }
263
+
264
+ JavaAnalyzer . prototype . translateField = function ( parent , fieldNode ) {
265
+ if ( fieldNode . variables && fieldNode . variables . length > 0 ) {
266
+ for ( var i = 0 , len = fieldNode . variables . length ; i < len ; i ++ ) {
267
+ var variableNode = fieldNode . variables [ i ] ;
268
+ var _attribute = new type . UMLAttribute ( ) ;
269
+ _attribute . _parent = parent ;
270
+ _attribute . name = variableNode . name ;
271
+ _attribute . visibility = this . _getVisibility ( fieldNode . modifiers ) ;
272
+ // TODO: type, type.arrayDimension
273
+ _attribute . type = this . _getType ( fieldNode . type ) ;
274
+ // TODO: arrayDimension
275
+ // TODO: initializer
276
+ // TODO: static, ..., other modifiers...
277
+ parent . attributes . push ( _attribute ) ;
278
+ }
279
+ }
280
+ }
281
+
282
+ JavaAnalyzer . prototype . translateMethod = function ( parent , methodNode ) {
283
+ var _operation = new type . UMLOperation ( ) ;
284
+ _operation . _parent = parent ;
285
+ _operation . name = methodNode . name ;
286
+ _operation . visibility = this . _getVisibility ( methodNode . modifiers ) ;
287
+
288
+ if ( methodNode . parameters && methodNode . parameters . length > 0 ) {
289
+ for ( var i = 0 , len = methodNode . parameters . length ; i < len ; i ++ ) {
290
+ var parameterNode = methodNode . parameters [ i ] ;
291
+ this . translateParameter ( _operation , parameterNode ) ;
292
+ }
293
+ }
294
+ // TODO: ReturnType
295
+
296
+ parent . operations . push ( _operation ) ;
297
+ }
298
+
299
+ JavaAnalyzer . prototype . translateParameter = function ( parent , parameterNode ) {
300
+ var _parameter = new type . UMLParameter ( ) ;
301
+ _parameter . _parent = parent ;
302
+ _parameter . name = parameterNode . variable . name ;
303
+ _parameter . type = this . _getType ( parameterNode . type ) ;
304
+
305
+ parent . parameters . push ( _parameter ) ;
306
+ }
307
+
308
+ // --------------------
309
+
310
+ function analyze ( dir ) {
311
+ var javaAnalyzer = new JavaAnalyzer ( ) ;
312
+ function visitEntry ( entry ) {
313
+ if ( entry . _isFile === true ) {
314
+ var ext = FileUtils . getFileExtension ( entry . _path ) ;
315
+ if ( ext && ext . toLowerCase ( ) === "java" ) {
316
+ javaAnalyzer . addFile ( entry ) ;
317
+ }
318
+ }
319
+ return true ;
320
+ }
321
+ // Traverse all file entries
322
+ dir . visit ( visitEntry , { } , function ( err ) {
323
+ if ( err === null ) {
324
+ javaAnalyzer . analyze ( ) ;
325
+ }
326
+ } ) ;
327
+ }
328
+
329
+ exports . analyze = analyze ;
42
330
43
331
} ) ;
0 commit comments