Skip to content
This repository has been archived by the owner on Oct 28, 2019. It is now read-only.

Commit

Permalink
Merge pull request #229 from Dufgui/enh221_package
Browse files Browse the repository at this point in the history
#221 Support Package
  • Loading branch information
MathieuAA authored Nov 18, 2016
2 parents a8f6196 + fe33c71 commit 500a574
Show file tree
Hide file tree
Showing 11 changed files with 326 additions and 58 deletions.
31 changes: 20 additions & 11 deletions lib/editors/genmymodel_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,31 @@ function initParser(args) {
parsedData = new ParsedData();
}


function findElements() {
for (let i = 0; i < root.packagedElement.length; i++) {
let element = root.packagedElement[i];
findElementsInNode(root, []);
}

function findElementsInNode(node, path) {
for (let i = 0; i < node.packagedElement.length; i++) {
let element = node.packagedElement[i];
var indexInfo = {index: i, path: path};
switch (element.$['xsi:type']) {
case 'uml:PrimitiveType':
case 'uml:DataType':
rawObjects.rawTypesIndexes.push(i);
rawObjects.rawTypesIndexes.push(indexInfo);
break;
case 'uml:Enumeration':
rawObjects.rawEnumsIndexes.push(i);
rawObjects.rawEnumsIndexes.push(indexInfo);
break;
case 'uml:Class':
rawObjects.rawClassesIndexes.push(i);
rawObjects.rawClassesIndexes.push(indexInfo);
break;
case 'uml:Association':
rawObjects.rawAssociationsIndexes.push(i);
rawObjects.rawAssociationsIndexes.push(indexInfo);
break;
case 'uml:Package':
findElementsInNode(element, _.concat(path,i));
break;
default:
}
Expand All @@ -73,7 +82,7 @@ function findElements() {

function fillTypes() {
for (let i = 0; i < rawObjects.rawTypesIndexes.length; i++) {
addType(root.packagedElement[rawObjects.rawTypesIndexes[i]]);
addType(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawTypesIndexes, i));
}
}

Expand All @@ -96,7 +105,7 @@ function addType(typeElement) {

function fillEnums() {
for (let i = 0; i < rawObjects.rawEnumsIndexes.length; i++) {
addEnum(root.packagedElement[rawObjects.rawEnumsIndexes[i]]);
addEnum(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawEnumsIndexes, i));
}
}

Expand Down Expand Up @@ -130,7 +139,7 @@ function getEnumValues(enumElement) {

function fillAssociations() {
for (let i = 0; i < rawObjects.rawAssociationsIndexes.length; i++) {
addAssociation(root.packagedElement[rawObjects.rawAssociationsIndexes[i]]);
addAssociation(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawAssociationsIndexes, i));
}
}

Expand Down Expand Up @@ -181,7 +190,7 @@ function getAssociationComments(association) {
commentInTo: ''
};
for (let i = 0; i < association.ownedEnd.length; i++) {
comments[(i === 0) ? 'commentInTo' : 'commentInFrom'] =
comments[(i === 0) ? 'commentInTo' : 'commentInFrom'] =
getComment(association.ownedEnd[i]);
}
return comments;
Expand All @@ -201,7 +210,7 @@ function getComment(ownedEnd) {

function fillClassesAndFields() {
for (let i = 0; i < rawObjects.rawClassesIndexes.length; i++) {
addClassAndFields(root.packagedElement[rawObjects.rawClassesIndexes[i]]);
addClassAndFields(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawClassesIndexes, i));
}
}

Expand Down
33 changes: 19 additions & 14 deletions lib/editors/modelio_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,35 @@ function initParser(args) {
rawClassesIndexes: [],
rawAssociationsIndexes: [],
rawValidationRulesIndexes: [],
rawPackagesIndexes: []
};
parsedData = new ParsedData();
}


function findElements() {
for (let i = 0; i < root.packagedElement.length; i++) {
let element = root.packagedElement[i];
findElementsInNode(root, []);
}

function findElementsInNode(node, path) {
for (let i = 0; i < node.packagedElement.length; i++) {
let element = node.packagedElement[i];
var indexInfo = {index: i, path: path};
switch (element.$['xmi:type']) {
case 'uml:PrimitiveType':
rawObjects.rawTypesIndexes.push(i);
rawObjects.rawTypesIndexes.push(indexInfo);
break;
case 'uml:Enumeration':
rawObjects.rawEnumsIndexes.push(i);
rawObjects.rawEnumsIndexes.push(indexInfo);
break;
case 'uml:Class':
rawObjects.rawClassesIndexes.push(i);
rawObjects.rawClassesIndexes.push(indexInfo);
break;
case 'uml:Association':
rawObjects.rawAssociationsIndexes.push(i);
break;
case 'uml:Package':
rawObjects.rawPackagesIndexes.push(i);
rawObjects.rawAssociationsIndexes.push(indexInfo);
break;
case 'uml:Package':
findElementsInNode(element, _.concat(path,i));
break;
default:
}
}
Expand All @@ -90,7 +95,7 @@ function findConstraints() {

function fillTypes() {
for (let i = 0; i < rawObjects.rawTypesIndexes.length; i++) {
addType(root.packagedElement[rawObjects.rawTypesIndexes[i]]);
addType(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawTypesIndexes, i));
}
}

Expand All @@ -113,7 +118,7 @@ function addType(typeElement) {

function fillEnums() {
for (let i = 0; i < rawObjects.rawEnumsIndexes.length; i++) {
addEnum(root.packagedElement[rawObjects.rawEnumsIndexes[i]]);
addEnum(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawEnumsIndexes, i));
}
}

Expand Down Expand Up @@ -147,7 +152,7 @@ function getEnumValues(enumElement) {

function fillAssociations() {
for (let i = 0; i < rawObjects.rawAssociationsIndexes.length; i++) {
addAssociation(root.packagedElement[rawObjects.rawAssociationsIndexes[i]]);
addAssociation(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawAssociationsIndexes, i));
}
}

Expand Down Expand Up @@ -176,7 +181,7 @@ function addAssociation(associationElement) {

function fillClassesAndFields() {
for (let i = 0; i < rawObjects.rawClassesIndexes.length; i++) {
addClassAndFields(root.packagedElement[rawObjects.rawClassesIndexes[i]]);
addClassAndFields(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawClassesIndexes, i));
}
}

Expand Down
18 changes: 17 additions & 1 deletion lib/editors/parser_helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ const _ = require('lodash');
module.exports = {
isAnId: isAnId,
getTypeNameFromURL: getTypeNameFromURL,
extractClassName: extractClassName
extractClassName: extractClassName,
getXmlElementFromRawIndexes : getXmlElementFromRawIndexes
};


Expand Down Expand Up @@ -47,3 +48,18 @@ function extractClassName(name) {
).toLowerCase()
};
}

/**
* Extract indexInfo in rawIndexes array and use it to get the referenced element
* @param rawIndexes array of index info with path and the index in the leaf parent element to access to the element
* @param i index of element in rawIndexes
* @returns {Object} the xml element
*/
function getXmlElementFromRawIndexes(root, rawIndexes, i) {
var indexInfo = rawIndexes[i];
var parentPackage = root;
for (let j = 0; j < indexInfo.path.length; j++) {
parentPackage = parentPackage.packagedElement[indexInfo.path[j]];
}
return parentPackage.packagedElement[indexInfo.index];
}
48 changes: 28 additions & 20 deletions lib/editors/umldesigner_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,30 +49,38 @@ function initParser(args) {
}

function findElements() {
for (let i = 0; i < root.packagedElement.length; i++) {
let element = root.packagedElement[i];
findElementsInNode(root, []);
}

function findElementsInNode(node, path) {
for (let i = 0; i < node.packagedElement.length; i++) {
let element = node.packagedElement[i];
var indexInfo = {index: i, path: path};
switch (element.$['xmi:type']) {
case 'uml:PrimitiveType':
case 'uml:DataType':
rawObjects.rawTypesIndexes.push(i);
break;
case 'uml:Enumeration':
rawObjects.rawEnumsIndexes.push(i);
break;
case 'uml:Class':
rawObjects.rawClassesIndexes.push(i);
break;
case 'uml:Association':
rawObjects.rawAssociationsIndexes.push(i);
break;
default:
case 'uml:PrimitiveType':
case 'uml:DataType':
rawObjects.rawTypesIndexes.push(indexInfo);
break;
case 'uml:Enumeration':
rawObjects.rawEnumsIndexes.push(indexInfo);
break;
case 'uml:Class':
rawObjects.rawClassesIndexes.push(indexInfo);
break;
case 'uml:Association':
rawObjects.rawAssociationsIndexes.push(indexInfo);
break;
case 'uml:Package':
findElementsInNode(element, _.concat(path,i));
break;
default:
}
}
}

function fillTypes() {
for (let i = 0; i < rawObjects.rawTypesIndexes.length; i++) {
addType(root.packagedElement[rawObjects.rawTypesIndexes[i]]);
addType(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawTypesIndexes, i));
}
}

Expand All @@ -95,7 +103,7 @@ function addType(typeElement) {

function fillEnums() {
for (let i = 0; i < rawObjects.rawEnumsIndexes.length; i++) {
addEnum(root.packagedElement[rawObjects.rawEnumsIndexes[i]]);
addEnum(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawEnumsIndexes, i));
}
}

Expand Down Expand Up @@ -129,7 +137,7 @@ function getEnumValues(enumElement) {

function fillClassesAndFields() {
for (let i = 0; i < rawObjects.rawClassesIndexes.length; i++) {
addClassAndFields(root.packagedElement[rawObjects.rawClassesIndexes[i]]);
addClassAndFields(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawClassesIndexes, i));
}
}

Expand Down Expand Up @@ -223,7 +231,7 @@ function addRegularField(element, classId) {

function fillAssociations() {
for (let i = 0; i < rawObjects.rawAssociationsIndexes.length; i++) {
addAssociation(root.packagedElement[rawObjects.rawAssociationsIndexes[i]]);
addAssociation(parser_helper.getXmlElementFromRawIndexes(root, rawObjects.rawAssociationsIndexes, i));
}
}

Expand Down
19 changes: 19 additions & 0 deletions test/editors/genmymodel_parser_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,25 @@ describe('GenMyModelParser', () => {
});
});
});
describe('with package', () => {
var parserData = ParserFactory.createParser({
file: './test/xmi/genmymodel_package.xmi',
databaseType: 'sql'
});
var parser = parserData.parser;
var parsedData = parser.parse(parserData.data);

it('parses it', () => {
expect(parsedData).not.to.be.null;
});
it('includes classes in package', () => {
expect(parsedData.classes['_z3DqLaFTEeawbN_F_HFDxg']).not.to.be.null;
expect(parsedData.classes['_z3DqQ6FTEeawbN_F_HFDxg']).not.to.be.null;
expect(parsedData.classNames).to.deep.eq(['A','B']);
expect(parsedData.enums['_z3DqRqFTEeawbN_F_HFDxg']).not.to.be.null;
expect(parsedData.associations['_z3DqM6FTEeawbN_F_HFDxg']).not.to.be.null;
});
});
});
describe('when passing an invalid diagram', () => {
describe('as a class has no name', () => {
Expand Down
51 changes: 41 additions & 10 deletions test/editors/modelio_parser_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -279,18 +279,49 @@ describe('ModelioParser', () => {
});
});
describe('with packages', () => {
var parserData = ParserFactory.createParser({
file: './test/xmi/modelio_packages.xmi',
databaseType: 'sql'
});
var parser = parserData.parser;
var parsedData = parser.parse(parserData.data);
describe('simple model', () => {
var parserData = ParserFactory.createParser({
file: './test/xmi/modelio_packages.xmi',
databaseType: 'sql'
});
var parser = parserData.parser;
var parsedData = parser.parse(parserData.data);

it('parses it', () => {
expect(parsedData).not.to.be.null;
it('parses it', () => {
expect(parsedData).not.to.be.null;
});
it('works by adding all the classes', () => {
expect(parsedData.classNames).to.deep.eq(['Class1', 'Class3', 'Class2']);
expect(parsedData.classes['_vC4sxHdfEeaWkfx80xqrTw']).not.to.be.null;
expect(parsedData.classes['_vC4syndfEeaWkfx80xqrTw']).not.to.be.null;
expect(parsedData.classes['_vC4sz3dfEeaWkfx80xqrTw']).not.to.be.null;
expect(parsedData.associations['_vC4sx3dfEeaWkfx80xqrTw']).not.to.be.null;
expect(parsedData.associations['_vC4szXdfEeaWkfx80xqrTw']).not.to.be.null;

});
});
it('works by adding all the classes', () => {
expect(parsedData.classNames).to.deep.eq(['Class2']);
describe('more complex model', () => {
var parserData = ParserFactory.createParser({
file: './test/xmi/modelio_packages2.xmi',
databaseType: 'sql'
});
var parser = parserData.parser;
var parsedData = parser.parse(parserData.data);

it('parses it', () => {
expect(parsedData).not.to.be.null;
});
it('works by adding all the classes', () => {
expect(parsedData.classNames).to.deep.eq(['Class1', 'Class3', 'Class2']);
expect(parsedData.classes['_bYuIdaFSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.classes['_bYuviqFSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.classes['_bYuvj6FSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.enums['_bYuvi6FSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.associations['_bYuvhaFSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.associations['_bYuvg6FSEeaVvapPODu8lg']).not.to.be.null;
expect(parsedData.associations['_bYuvh6FSEeaVvapPODu8lg']).not.to.be.null;

});
});
});
});
Expand Down
14 changes: 13 additions & 1 deletion test/editors/parser_helper_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

var expect = require('chai').expect,
isAnId = require('../../lib/editors/parser_helper').isAnId,
extractClassName = require('../../lib/editors/parser_helper').extractClassName;
extractClassName = require('../../lib/editors/parser_helper').extractClassName,
getXmlElementFromRawIndexes = require('../../lib/editors/parser_helper').getXmlElementFromRawIndexes;

describe('ParserHelper', () => {
describe('#isAnId', () => {
Expand Down Expand Up @@ -37,4 +38,15 @@ describe('ParserHelper', () => {
});
});
});
describe('#getXmlElementFromRawIndexes', () => {
var root = { packagedElement : [{dumb: 'dumb'}, { packagedElement: [{dumb: 'dumb'},{dumb: 'dumb'},{dumb: 'good'}]}]};
var rawIndexes = [{index: 2, path: [1]}];
var i = 0;
var xmlElt = getXmlElementFromRawIndexes(root, rawIndexes, i);

it('returns the right element', () => {
expect(xmlElt.dumb).to.eq('good');
});
});

});
Loading

0 comments on commit 500a574

Please sign in to comment.