Skip to content

Commit c039974

Browse files
authored
Merge pull request #42 from emfjson/41
Annotations details as JSON object
2 parents d9dfb8c + d799ef3 commit c039974

9 files changed

+219
-11
lines changed

bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ecore.js",
33
"main": "dist/ecore.js",
4-
"version": "0.11.0",
4+
"version": "0.12.0",
55
"homepage": "https://github.com/ghillairet/ecore.js",
66
"authors": [
77
"ghillairet <g.hillairet@gmail.com>"

dist/ecore.js

+44-2
Original file line numberDiff line numberDiff line change
@@ -1878,6 +1878,23 @@ Ecore.JSON = {
18781878
};
18791879
}
18801880

1881+
function processAnnotation(node, eObject) {
1882+
if (node.source) {
1883+
eObject.set('source', node.source);
1884+
}
1885+
1886+
if (node.details) {
1887+
if (_.isArray(node.details)) {
1888+
1889+
} else {
1890+
var details = eObject.get('details');
1891+
_.each(node.details, function(v, k) {
1892+
details.add(Ecore.EStringToStringMapEntry.create({ 'key': k, 'value': v }));
1893+
});
1894+
}
1895+
}
1896+
}
1897+
18811898
function resolveReferences() {
18821899
var index = buildIndex(model);
18831900

@@ -1932,7 +1949,11 @@ Ecore.JSON = {
19321949
child._id = object._id;
19331950
}
19341951

1935-
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
1952+
if (eClass === Ecore.EAnnotation) {
1953+
processAnnotation(object, child);
1954+
} else {
1955+
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
1956+
}
19361957
}
19371958
}
19381959

@@ -2013,14 +2034,35 @@ Ecore.JSON = {
20132034
};
20142035
}
20152036

2037+
function processAnnotation(object, data) {
2038+
if (object.values.source) {
2039+
data.source = object.values.source;
2040+
}
2041+
2042+
if (object.values.details && object.values.details.size() > 0) {
2043+
data.details = {};
2044+
object.values.details.each(function (e) {
2045+
var key = e.get("key");
2046+
var value = e.get("value");
2047+
if (key) {
2048+
data.details[key] = value;
2049+
}
2050+
});
2051+
}
2052+
}
2053+
20162054
function jsonObject(object) {
20172055
var eClass = object.eClass,
20182056
values = object.values,
20192057
data = { eClass: eClass.eURI() };
20202058

20212059
if (object._id) { data._id = object._id; }
20222060

2023-
_.each( values, processFeature(object, data) );
2061+
if (eClass === Ecore.EAnnotation) {
2062+
processAnnotation(object, data);
2063+
} else {
2064+
_.each(values, processFeature(object, data));
2065+
}
20242066

20252067
return data;
20262068
}

dist/ecore.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ecore.xmi.js

+44-2
Original file line numberDiff line numberDiff line change
@@ -1878,6 +1878,23 @@ Ecore.JSON = {
18781878
};
18791879
}
18801880

1881+
function processAnnotation(node, eObject) {
1882+
if (node.source) {
1883+
eObject.set('source', node.source);
1884+
}
1885+
1886+
if (node.details) {
1887+
if (_.isArray(node.details)) {
1888+
1889+
} else {
1890+
var details = eObject.get('details');
1891+
_.each(node.details, function(v, k) {
1892+
details.add(Ecore.EStringToStringMapEntry.create({ 'key': k, 'value': v }));
1893+
});
1894+
}
1895+
}
1896+
}
1897+
18811898
function resolveReferences() {
18821899
var index = buildIndex(model);
18831900

@@ -1932,7 +1949,11 @@ Ecore.JSON = {
19321949
child._id = object._id;
19331950
}
19341951

1935-
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
1952+
if (eClass === Ecore.EAnnotation) {
1953+
processAnnotation(object, child);
1954+
} else {
1955+
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
1956+
}
19361957
}
19371958
}
19381959

@@ -2013,14 +2034,35 @@ Ecore.JSON = {
20132034
};
20142035
}
20152036

2037+
function processAnnotation(object, data) {
2038+
if (object.values.source) {
2039+
data.source = object.values.source;
2040+
}
2041+
2042+
if (object.values.details && object.values.details.size() > 0) {
2043+
data.details = {};
2044+
object.values.details.each(function (e) {
2045+
var key = e.get("key");
2046+
var value = e.get("value");
2047+
if (key) {
2048+
data.details[key] = value;
2049+
}
2050+
});
2051+
}
2052+
}
2053+
20162054
function jsonObject(object) {
20172055
var eClass = object.eClass,
20182056
values = object.values,
20192057
data = { eClass: eClass.eURI() };
20202058

20212059
if (object._id) { data._id = object._id; }
20222060

2023-
_.each( values, processFeature(object, data) );
2061+
if (eClass === Ecore.EAnnotation) {
2062+
processAnnotation(object, data);
2063+
} else {
2064+
_.each(values, processFeature(object, data));
2065+
}
20242066

20252067
return data;
20262068
}

dist/ecore.xmi.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "ecore",
33
"description": "Ecore (EMOF) JavaScript Implementation",
4-
"version": "0.11.0",
4+
"version": "0.12.0",
55
"author": "Guillaume Hillairet <g.hillairet@gmail.com>",
66
"repository": {
77
"type": "git",

src/resource.js

+44-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,23 @@ Ecore.JSON = {
4848
};
4949
}
5050

51+
function processAnnotation(node, eObject) {
52+
if (node.source) {
53+
eObject.set('source', node.source);
54+
}
55+
56+
if (node.details) {
57+
if (_.isArray(node.details)) {
58+
59+
} else {
60+
var details = eObject.get('details');
61+
_.each(node.details, function(v, k) {
62+
details.add(Ecore.EStringToStringMapEntry.create({ 'key': k, 'value': v }));
63+
});
64+
}
65+
}
66+
}
67+
5168
function resolveReferences() {
5269
var index = buildIndex(model);
5370

@@ -102,7 +119,11 @@ Ecore.JSON = {
102119
child._id = object._id;
103120
}
104121

105-
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
122+
if (eClass === Ecore.EAnnotation) {
123+
processAnnotation(object, child);
124+
} else {
125+
_.each(eClass.get('eAllStructuralFeatures'), processFeature(object, child));
126+
}
106127
}
107128
}
108129

@@ -183,14 +204,35 @@ Ecore.JSON = {
183204
};
184205
}
185206

207+
function processAnnotation(object, data) {
208+
if (object.values.source) {
209+
data.source = object.values.source;
210+
}
211+
212+
if (object.values.details && object.values.details.size() > 0) {
213+
data.details = {};
214+
object.values.details.each(function (e) {
215+
var key = e.get("key");
216+
var value = e.get("value");
217+
if (key) {
218+
data.details[key] = value;
219+
}
220+
});
221+
}
222+
}
223+
186224
function jsonObject(object) {
187225
var eClass = object.eClass,
188226
values = object.values,
189227
data = { eClass: eClass.eURI() };
190228

191229
if (object._id) { data._id = object._id; }
192230

193-
_.each( values, processFeature(object, data) );
231+
if (eClass === Ecore.EAnnotation) {
232+
processAnnotation(object, data);
233+
} else {
234+
_.each(values, processFeature(object, data));
235+
}
194236

195237
return data;
196238
}

test/annotations.test.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
var assert = require('assert');
2+
var Ecore = require('../dist/ecore');
3+
var _ = require('underscore');
4+
var fs = require('fs');
5+
6+
describe('Annotations', function () {
7+
8+
it('should read an ecore file containing annotations', function (done) {
9+
var resourceSet = Ecore.ResourceSet.create();
10+
var model = resourceSet.create({uri: 'http://www.example.org/example'});
11+
12+
fs.readFile('./test/models/annotations.json', 'utf8', function (err, data) {
13+
if (err) {
14+
console.log(err);
15+
done();
16+
return;
17+
}
18+
19+
model.load(data, function (model, err) {
20+
if (err) {
21+
console.log(err);
22+
done();
23+
return;
24+
}
25+
26+
var pp = model.get('contents').at(0);
27+
var fooClass = pp.get('eClassifiers').at(0);
28+
29+
assert.ok(fooClass);
30+
assert.equal(1, fooClass.get('eAnnotations').size());
31+
32+
var details = fooClass.get('eAnnotations').at(0).get('details');
33+
34+
assert.equal("displayName", details.at(0).get('key'));
35+
assert.equal("value", details.at(0).get('value'));
36+
37+
assert.equal("otherName", details.at(1).get('key'));
38+
assert.equal("otherValue", details.at(1).get('value'));
39+
40+
done();
41+
}, {format: Ecore.JSON});
42+
});
43+
});
44+
45+
it('should write annotations as object', function (done) {
46+
var resourceSet = Ecore.ResourceSet.create();
47+
var model = resourceSet.create({uri: 'http://www.example.org/example'});
48+
49+
fs.readFile('./test/models/annotations.json', 'utf8', function (err, data) {
50+
51+
model.load(data, function (model, err) {
52+
var result = Ecore.JSON.to(model);
53+
54+
assert.equal("value", result.eClassifiers[0].eAnnotations[0].details.displayName);
55+
assert.equal("otherValue", result.eClassifiers[0].eAnnotations[0].details.otherName);
56+
done();
57+
}, {format: Ecore.JSON});
58+
});
59+
});
60+
61+
});

test/models/annotations.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"eClass": "http://www.eclipse.org/emf/2002/Ecore#//EPackage",
3+
"name": "example",
4+
"nsURI": "http://www.example.org/example",
5+
"nsPrefix": "example",
6+
"eClassifiers": [
7+
{
8+
"eClass": "http://www.eclipse.org/emf/2002/Ecore#//EClass",
9+
"name": "Foo",
10+
"eAnnotations": [
11+
{
12+
"source": "source",
13+
"details": {
14+
"displayName": "value",
15+
"otherName": "otherValue"
16+
}
17+
}
18+
]
19+
}
20+
]
21+
}

0 commit comments

Comments
 (0)