Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dbd48ca

Browse files
committed
JavaReverseEngineering initial structure
1 parent 9e83351 commit dbd48ca

File tree

8 files changed

+860
-419
lines changed

8 files changed

+860
-419
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ Thumbs.db
88
.DS_Store
99

1010
#Java Test Sources
11-
/java-testset
11+
/test/src-jdk
1212
jisonOutput.txt

JavaReverseEngineer.js

Lines changed: 296 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,308 @@
2424
define(function (require, exports, module) {
2525
"use strict";
2626

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");
2934

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");
3536

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) {
3745
console.log(err);
3846
console.log(data);
3947
var r = java7.parse(data);
4048
console.log(JSON.stringify(r, null, "\t"));
4149
});
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;
42330

43331
});

0 commit comments

Comments
 (0)