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

Skip to content

Commit 66f6f30

Browse files
committed
Additional test cases for Reverse Engineering
1 parent 0dbe7b2 commit 66f6f30

File tree

4 files changed

+244
-163
lines changed

4 files changed

+244
-163
lines changed

JavaCodeGenerator.js

Lines changed: 76 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,19 @@
2121
*
2222
*/
2323

24+
25+
// TODO: Make as class (e.g. JavaCodeGenerator)
26+
// TODO: Write Test Cases
27+
// TODO: Apply options
28+
2429
define(function (require, exports, module) {
2530
"use strict";
2631

2732
var Repository = staruml.getModule("engine/Repository"),
2833
Engine = staruml.getModule("engine/Engine"),
34+
FileSystem = staruml.getModule("filesystem/FileSystem"),
2935
UML = staruml.getModule("uml/UML");
3036

31-
function getBaseModel() {
32-
var project = Repository.getProject();
33-
return project.getTagValue("JavaCodeGen.BaseModel");
34-
}
35-
36-
function setBaseModel(baseModel) {
37-
var project = Repository.getProject();
38-
Engine.setTagValue(project, "JavaCodeGen.BaseModel", baseModel);
39-
}
40-
41-
function getTargetDirectory() {
42-
var project = Repository.getProject();
43-
return project.getTagValue("JavaCodeGen.TargetDirectory");
44-
}
45-
46-
function setTargetDirectory(baseModel) {
47-
var project = Repository.getProject();
48-
Engine.setTagValue(project, "JavaCodeGen.TargetDirectory", baseModel);
49-
}
50-
5137
/**
5238
* Return visibility
5339
* @param {Model} elem
@@ -139,7 +125,7 @@ define(function (require, exports, module) {
139125
_type = "ArrayList<" + _type + ">";
140126
} else if (elem.multiplicity.match(/^\d+$/)) { // number
141127
_type += "[" + elem.multiplicity + "]";
142-
}
128+
}
143129
}
144130
return _type;
145131
}
@@ -172,7 +158,7 @@ define(function (require, exports, module) {
172158
path = _.map(elem._parent.getPath(base), function (e) { return e.name; }).join(".");
173159
}
174160
if (path) {
175-
codeWriter.writeLine("package " + path + ";");
161+
codeWriter.writeLine("package " + path + ";");
176162
}
177163
}
178164

@@ -186,7 +172,7 @@ define(function (require, exports, module) {
186172
var terms = [];
187173
// Doc
188174
writeDoc(codeWriter, "Constructor");
189-
// Visibility
175+
// Visibility
190176
var visibility = getVisibility(elem);
191177
if (visibility) {
192178
terms.push(visibility);
@@ -215,7 +201,7 @@ define(function (require, exports, module) {
215201
// type
216202
terms.push(getType(elem));
217203
// name
218-
terms.push(elem.name);
204+
terms.push(elem.name);
219205
// initial value
220206
if (elem.defaultValue && elem.defaultValue.length > 0) {
221207
terms.push("= " + elem.defaultValue);
@@ -234,7 +220,7 @@ define(function (require, exports, module) {
234220
if (elem.name.length > 0) {
235221
var terms = [];
236222
var params = elem.getNonReturnParameters();
237-
var returnParam = elem.getReturnParameter();
223+
var returnParam = elem.getReturnParameter();
238224
// doc
239225
var doc = elem.documentation.trim();
240226
_.each(params, function (param) {
@@ -274,7 +260,7 @@ define(function (require, exports, module) {
274260
codeWriter.writeLine("// PUT CODE HERE");
275261
codeWriter.outdent();
276262
codeWriter.writeLine("}");
277-
}
263+
}
278264
}
279265
}
280266

@@ -466,14 +452,74 @@ define(function (require, exports, module) {
466452
codeWriter.writeLine("}");
467453
}
468454

455+
/*
456+
* options = {
457+
* base: (model)
458+
* path: "/User/niklaus/..."
459+
* javaDoc: true,
460+
* useTab: false,
461+
* indentSpaces: 4,
462+
* headerComment: true
463+
* }
464+
*/
465+
function generate(options) {
466+
var i, len;
467+
for (i = 0, len = options.base.ownedElements.length; i < len; i++) {
468+
var elem = options.base.ownedElements[i];
469+
if (elem instanceof type.UMLPackage) {
470+
var dir = options.path + "/" + elem.name;
471+
FileSystem.makeDir(dir, 0, function (err) {
472+
if (err === FileSystem.NO_ERROR) {
473+
generate(elem, dir);
474+
} else {
475+
console.log("[Java] Failed to make directory - " + dir);
476+
}
477+
});
478+
} else if (elem instanceof type.UMLClass) {
479+
var file = options.path + "/" + elem.name + ".java";
480+
var codeWriter = new CodeGenUtils.CodeWriter();
481+
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
482+
codeWriter.writeLine();
483+
codeWriter.writeLine("import java.util.ArrayList;");
484+
codeWriter.writeLine();
485+
JavaCodeGenerator.writeClass(codeWriter, elem);
486+
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
487+
if (err !== FileSystem.NO_ERROR) {
488+
console.log("[Java] Failed to generate - " + file);
489+
}
490+
});
491+
} else if (elem instanceof type.UMLInterface) {
492+
var file = options.path + "/" + elem.name + ".java";
493+
var codeWriter = new CodeGenUtils.CodeWriter();
494+
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
495+
codeWriter.writeLine();
496+
codeWriter.writeLine("import java.util.ArrayList;");
497+
codeWriter.writeLine();
498+
JavaCodeGenerator.writeInterface(codeWriter, elem);
499+
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
500+
if (err !== FileSystem.NO_ERROR) {
501+
console.log("[Java] Failed to generate - " + file);
502+
}
503+
});
504+
} else if (elem instanceof type.UMLEnumeration) {
505+
var file = options.path + "/" + elem.name + ".java";
506+
var codeWriter = new CodeGenUtils.CodeWriter();
507+
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
508+
codeWriter.writeLine();
509+
JavaCodeGenerator.writeEnum(codeWriter, elem);
510+
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
511+
if (err !== FileSystem.NO_ERROR) {
512+
console.log("[Java] Failed to generate - " + file);
513+
}
514+
});
515+
}
516+
}
517+
}
469518

470-
exports.getBaseModel = getBaseModel;
471-
exports.setBaseModel = setBaseModel;
472-
exports.getTargetDirectory = getTargetDirectory;
473-
exports.setTargetDirectory = setTargetDirectory;
474519
exports.writePackageDeclaration = writePackageDeclaration;
475520
exports.writeClass = writeClass;
476521
exports.writeInterface = writeInterface;
477522
exports.writeEnum = writeEnum;
523+
exports.generate = generate;
478524

479525
});

JavaReverseEngineer.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424

2525
// TODO: Field를 Association으로 변환하는 경우, Directional은 쉽지만 Bidirectional은 어떻게 할건지?
2626
// 무조건 directional로 하든지, 아니면 options의 bidirectional = true 이면 임의로 Bidirectional로 생성하는 방법.
27+
// TODO: JavaDoc을 Documentation으로.
28+
// TODO: options.publicOnly 처리
29+
// TODO: options.typeHierarchy 처리
30+
// TODO: options.packageOverview 처리
31+
// TODO: options.packageStructure 처리
2732

2833
/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, maxerr: 50, regexp: true */
2934
/*global define, $, _, window, staruml, type, document, java7 */
@@ -274,9 +279,6 @@ define(function (require, exports, module) {
274279
_pathName = this._toPathName(_typeName);
275280
_type = this._ensureClass(this._root, _pathName);
276281
}
277-
278-
console.log(_type);
279-
280282
_throw.operation.raisedExceptions.push(_type);
281283
}
282284

main.js

Lines changed: 68 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -51,110 +51,66 @@ define(function (require, exports, module) {
5151
CMD_JAVA_GENERATE = 'java.generate',
5252
CMD_JAVA_REVERSE = 'java.reverse';
5353

54-
// TODO: Return $.Promise
55-
function checkConfig(callback) {
56-
var baseModel = JavaCodeGenerator.getBaseModel(),
57-
targetDir = JavaCodeGenerator.getTargetDirectory();
58-
var dir = FileSystem.getDirectoryForPath(targetDir);
59-
if (dir && dir._isDirectory === true) {
60-
if (baseModel instanceof type.UMLPackage) {
61-
callback(true, baseModel, targetDir);
62-
} else {
63-
callback(false);
64-
}
65-
} else {
66-
callback(false);
67-
}
68-
}
54+
/**
55+
* CommandManager.execute로부터 파라미터를 받아서 코드 생성 가능하게 한다.
56+
* 파라미터가 없으면 baseModel, targetDir을 사용한다.
57+
* @param {Object} options
58+
* @return {$.Promise}
59+
*/
60+
function _handleGenerate(options) {
61+
var result = new $.Deferred();
6962

70-
function generate(baseModel, targetDir) {
71-
var i, len;
72-
for (i = 0, len = baseModel.ownedElements.length; i < len; i++) {
73-
var elem = baseModel.ownedElements[i];
74-
if (elem instanceof type.UMLPackage) {
75-
var dir = targetDir + "/" + elem.name;
76-
FileSystem.makeDir(dir, 0, function (err) {
77-
if (err === FileSystem.NO_ERROR) {
78-
generate(elem, dir);
63+
// If options is not passed, get from preference
64+
options = JavaPreferences.getGenOptions();
65+
66+
// If options.base is not assigned, popup ElementPicker
67+
if (!options.base) {
68+
ElementPicker.showDialog("Select a base model to generate codes", null, type.UMLPackage)
69+
.done(function (buttonId, selected) {
70+
if (buttonId === Dialogs.DIALOG_BTN_OK && selected) {
71+
options.base = selected;
72+
73+
// If options.path is not assigned, popup Open Dialog to select a folder
74+
if (!options.path) {
75+
FileSystem.showOpenDialog(false, true, "Select a folder where generated codes to be located", null, null, function (err, files) {
76+
if (!err) {
77+
if (files.length > 0) {
78+
options.path = files[0];
79+
JavaCodeGenerator.generate(options).then(result.resolve, result.reject);
80+
} else {
81+
result.reject(FileSystem.USER_CANCELED);
82+
}
83+
} else {
84+
result.reject(err);
85+
}
86+
});
87+
} else {
88+
JavaCodeGenerator.generate(options).then(result.resolve, result.reject);
89+
}
7990
} else {
80-
console.log("[Java] Failed to make directory - " + dir);
81-
}
82-
});
83-
} else if (elem instanceof type.UMLClass) {
84-
var file = targetDir + "/" + elem.name + ".java";
85-
var codeWriter = new CodeGenUtils.CodeWriter();
86-
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
87-
codeWriter.writeLine();
88-
codeWriter.writeLine("import java.util.ArrayList;");
89-
codeWriter.writeLine();
90-
JavaCodeGenerator.writeClass(codeWriter, elem);
91-
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
92-
if (err !== FileSystem.NO_ERROR) {
93-
console.log("[Java] Failed to generate - " + file);
94-
}
95-
});
96-
} else if (elem instanceof type.UMLInterface) {
97-
var file = targetDir + "/" + elem.name + ".java";
98-
var codeWriter = new CodeGenUtils.CodeWriter();
99-
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
100-
codeWriter.writeLine();
101-
codeWriter.writeLine("import java.util.ArrayList;");
102-
codeWriter.writeLine();
103-
JavaCodeGenerator.writeInterface(codeWriter, elem);
104-
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
105-
if (err !== FileSystem.NO_ERROR) {
106-
console.log("[Java] Failed to generate - " + file);
91+
result.reject();
10792
}
10893
});
109-
} else if (elem instanceof type.UMLEnumeration) {
110-
var file = targetDir + "/" + elem.name + ".java";
111-
var codeWriter = new CodeGenUtils.CodeWriter();
112-
JavaCodeGenerator.writePackageDeclaration(codeWriter, elem);
113-
codeWriter.writeLine();
114-
JavaCodeGenerator.writeEnum(codeWriter, elem);
115-
FileSystem.writeFile(file, codeWriter.getData(), "utf8", function (err) {
116-
if (err !== FileSystem.NO_ERROR) {
117-
console.log("[Java] Failed to generate - " + file);
94+
} else {
95+
// If options.path is not assigned, popup Open Dialog to select a folder
96+
if (!options.path) {
97+
FileSystem.showOpenDialog(false, true, "Select a folder where generated codes to be located", null, null, function (err, files) {
98+
if (!err) {
99+
if (files.length > 0) {
100+
options.path = files[0];
101+
JavaCodeGenerator.generate(options).then(result.resolve, result.reject);
102+
} else {
103+
result.reject(FileSystem.USER_CANCELED);
104+
}
105+
} else {
106+
result.reject(err);
118107
}
119108
});
120-
}
121-
}
122-
}
123-
124-
function traverse(dir, analyzer) {
125-
dir.getContents(function (err, entries, stats) {
126-
if (entries && entries.length > 0) {
127-
for (var i = 0, len = entries.length; i < len; i++) {
128-
var entry = entries[i];
129-
analyzer(entry);
130-
if (entry._isDirectory === true) {
131-
traverse(entry, analyzer);
132-
}
133-
}
134-
}
135-
});
136-
}
137-
138-
/**
139-
* CommandManager.execute로부터 파라미터를 받아서 코드 생성 가능하게 한다.
140-
* 파라미터가 없으면 baseModel, targetDir을 사용한다.
141-
* options = {
142-
* base: (model)
143-
* path: "/User/niklaus/..."
144-
* javaDoc: true,
145-
* useTab: false,
146-
* indentSpaces: 4,
147-
* headerComment: true
148-
* }
149-
*/
150-
function _handleGenerate(options) {
151-
checkConfig(function (configured, baseModel, targetDir) {
152-
if (configured) {
153-
generate(baseModel, targetDir);
154109
} else {
155-
Dialogs.showAlertDialog("Java Code Generation is not configured.");
110+
JavaCodeGenerator.generate(options).then(result.resolve, result.reject);
156111
}
157-
});
112+
}
113+
return result.promise();
158114
}
159115

160116
/**
@@ -169,24 +125,26 @@ define(function (require, exports, module) {
169125
* 파라미터가 없으면 baseModel, targetDir을 사용한다.
170126
* Must return $.Promise
171127
*/
172-
// TODO: options.path 가 주어져 있으면 showOpenDialog를 하지 않는다.
173128
function _handleReverse(options) {
174129
var result = new $.Deferred();
175-
FileSystem.showOpenDialog(false, true, "Select Folder", null, null, function (err, files) {
176-
if (!err) {
177-
if (files && files.length > 0) {
178-
var options = {
179-
association: true,
180-
path: files[0]
181-
};
182-
JavaReverseEngineer.analyze(options).then(result.resolve, result.reject);
130+
// If options is not passed, get from preference
131+
options = JavaPreferences.getRevOptions();
132+
133+
// If options.path is not assigned, popup Open Dialog to select a folder
134+
if (!options.path) {
135+
FileSystem.showOpenDialog(false, true, "Select Folder", null, null, function (err, files) {
136+
if (!err) {
137+
if (files.length > 0) {
138+
options.path = files[0];
139+
JavaReverseEngineer.analyze(options).then(result.resolve, result.reject);
140+
} else {
141+
result.reject(FileSystem.USER_CANCELED);
142+
}
183143
} else {
184-
result.reject();
144+
result.reject(err);
185145
}
186-
} else {
187-
result.reject(err);
188-
}
189-
});
146+
});
147+
}
190148
return result.promise();
191149
}
192150

0 commit comments

Comments
 (0)