Skip to content

Commit 57eaa72

Browse files
committed
Merge pull request #45 from node-modules/support-generic-map
feat(generic) support generic map
2 parents 53cbc75 + 9633dd3 commit 57eaa72

6 files changed

Lines changed: 97 additions & 12 deletions

File tree

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,25 @@ var testObject = {
118118
encoder.write(testObject);
119119
```
120120

121+
### Java Generic Map
122+
123+
```js
124+
// java code:
125+
// Map<Long, Integer> map = new HashMap<Long, Integer>();
126+
// map.put(123L, 123456);
127+
// map.put(123456L, 123);
128+
129+
var hessian = require('hessian.js');
130+
var encoder = new hessian.Encoder();
131+
132+
// using es6 Map
133+
var map = new Map();
134+
map.set({ '$class': 'java.lang.Long', '$': 123 }, 123456);
135+
map.set({ '$class': 'java.lang.Long', '$': 123456 }, 123);
136+
137+
encoder.write(map); // or encoder.write({ '$class': 'java.util.HashMap', '$': map })
138+
```
139+
121140
## Decoder
122141

123142
```js

lib/v1/encoder.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ var utils = require('../utils');
1616
var javaObject = require('../object');
1717
var is = require('is-type-of');
1818

19+
var SUPPORT_ES6_MAP = typeof Map === 'function' && typeof Map.prototype.forEach === 'function';
20+
1921
function Encoder(options) {
2022
options = options || {};
2123
//array of buffer
@@ -263,12 +265,19 @@ proto._writeHashMap = function (obj) {
263265
// hashmap's type is null
264266
this.writeType('');
265267

266-
// hash map must sort keys
267-
var keys = Object.keys(obj).sort();
268-
for (var i = 0; i < keys.length; i++) {
269-
var k = keys[i];
270-
this.writeString(k);
271-
this.write(obj[k]);
268+
if (SUPPORT_ES6_MAP && obj instanceof Map) {
269+
obj.forEach(function (value, key) {
270+
this.write(key);
271+
this.write(value);
272+
}, this);
273+
} else {
274+
// hash map must sort keys
275+
var keys = Object.keys(obj).sort();
276+
for (var i = 0; i < keys.length; i++) {
277+
var k = keys[i];
278+
this.writeString(k);
279+
this.write(obj[k]);
280+
}
272281
}
273282
this.byteBuffer.put(0x7a);
274283
return this;

lib/v2/encoder.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ var util = require('util');
2020
var EncoderV1 = require('../v1/encoder');
2121
var javaObject = require('../object');
2222

23+
var SUPPORT_ES6_MAP = typeof Map === 'function' && typeof Map.prototype.forEach === 'function';
24+
2325
function Encoder(options) {
2426
EncoderV1.call(this, options);
2527

@@ -574,12 +576,19 @@ proto._writeHashMap = function (obj) {
574576

575577
this.byteBuffer.put(0x48); // H
576578

577-
// hash map must sort keys
578-
var keys = Object.keys(obj).sort();
579-
for (var i = 0; i < keys.length; i++) {
580-
var k = keys[i];
581-
this.writeString(k);
582-
this.write(obj[k]);
579+
if (SUPPORT_ES6_MAP && obj instanceof Map) {
580+
obj.forEach(function (value, key) {
581+
this.write(key);
582+
this.write(value);
583+
}, this);
584+
} else {
585+
// hash map must sort keys
586+
var keys = Object.keys(obj).sort();
587+
for (var i = 0; i < keys.length; i++) {
588+
var k = keys[i];
589+
this.writeString(k);
590+
this.write(obj[k]);
591+
}
583592
}
584593
this.byteBuffer.putChar('Z');
585594
return this;

test/fixtures/v1/map/generic.bin

33 Bytes
Binary file not shown.

test/fixtures/v2/map/generic.bin

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
H�{��@=�@�{Z

test/map.test.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,28 @@ describe('map.test.js', function () {
161161
});
162162
});
163163

164+
it('should write es6 Map to java.util.Map', function() {
165+
if (typeof Map !== 'function') {
166+
// pass if not support es6 Map
167+
return;
168+
}
169+
170+
var map = new Map();
171+
map.set({ '$class': 'java.lang.Long', '$': 123 }, 123456);
172+
map.set({ '$class': 'java.lang.Long', '$': 123456 }, 123);
173+
var buf = hessian.encode(map);
174+
buf.should.eql(utils.bytes('v1/map/generic'));
175+
176+
buf = hessian.encode({ '$class': 'java.util.HashMap', '$': map });
177+
buf.should.eql(utils.bytes('v1/map/generic'));
178+
179+
// decode auto transfer key to string
180+
hessian.decode(utils.bytes('v1/map/generic'), '1.0').should.eql({
181+
'123': 123456,
182+
'123456': 123
183+
});
184+
});
185+
164186
describe('v2.0', function () {
165187
// map = new HashMap();
166188
// map.put(new Integer(1), "fee");
@@ -330,4 +352,29 @@ describe('map.test.js', function () {
330352
var rv = hessian.decode(data);
331353
rv.should.eql({null: 'null'});
332354
});
355+
356+
it('should write es6 Map to java.util.Map', function() {
357+
if (typeof Map !== 'function') {
358+
// pass if not support es6 Map
359+
return;
360+
}
361+
362+
var map = new Map();
363+
map.set({ '$class': 'java.lang.Long', '$': 123 }, 123456);
364+
map.set({ '$class': 'java.lang.Long', '$': 123456 }, 123);
365+
var encoder = new hessian.EncoderV2();
366+
var buf = encoder.write(map).get();
367+
buf.should.eql(utils.bytes('v2/map/generic'));
368+
369+
encoder.reset();
370+
371+
buf = encoder.write({ '$class': 'java.util.HashMap', '$': map }).get();
372+
buf.should.eql(utils.bytes('v2/map/generic'));
373+
374+
// decode auto transfer key to string
375+
hessian.decode(utils.bytes('v2/map/generic'), '2.0').should.eql({
376+
'123': 123456,
377+
'123456': 123
378+
});
379+
});
333380
});

0 commit comments

Comments
 (0)