Skip to content

Commit 7b47e96

Browse files
author
zhourenjian
committed
1. Fixing bug that SimplePipe/CompoundPipe is not stable and may generate lots of IFRAME elements.
2. Support SimpleSerializable to generate a much smaller serialized string by ignoring fields with default values.
1 parent 49da8a1 commit 7b47e96

File tree

5 files changed

+124
-33
lines changed

5 files changed

+124
-33
lines changed

sources/net.sf.j2s.ajax/ajaxrpc/net/sf/j2s/ajax/SimpleFilter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,10 @@ public interface SimpleFilter {
3636
*/
3737
public boolean accept(String field);
3838

39+
/**
40+
* Ignore fields with default value or not.
41+
* @return true for to enable ignoring and false to keep serializing
42+
*/
43+
public boolean ignoreDefaultFields();
44+
3945
}

sources/net.sf.j2s.ajax/ajaxrpc/net/sf/j2s/ajax/SimpleRPCHttpServlet.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,15 @@ protected long maxXSSRequestLatency() {
101101
*/
102102
protected SimpleRPCRunnable getRunnableByRequest(String request) {
103103
SimpleSerializable instance = SimpleSerializable.parseInstance(request, new SimpleFilter() {
104+
104105
public boolean accept(String clazzName) {
105106
return validateRunnable(clazzName);
106107
}
108+
109+
public boolean ignoreDefaultFields() {
110+
return false;
111+
}
112+
107113
});
108114
if (instance instanceof SimpleRPCRunnable) {
109115
instance.deserialize(request);
@@ -249,14 +255,17 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
249255
String serialize = runnable.serialize(new SimpleFilter() {
250256

251257
public boolean accept(String field) {
252-
if (diffs == null || diffs.length == 0) return true;
253258
for (int i = 0; i < diffs.length; i++) {
254259
if (diffs[i].equals(field)) {
255260
return true;
256261
}
257262
}
258263
return false;
259264
}
265+
266+
public boolean ignoreDefaultFields() {
267+
return false;
268+
}
260269

261270
});
262271

@@ -315,14 +324,17 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
315324
String serialize = runnable.serialize(new SimpleFilter() {
316325

317326
public boolean accept(String field) {
318-
if (diffs == null || diffs.length == 0) return true;
319327
for (int i = 0; i < diffs.length; i++) {
320328
if (diffs[i].equals(field)) {
321329
return true;
322330
}
323331
}
324332
return false;
325333
}
334+
335+
public boolean ignoreDefaultFields() {
336+
return false;
337+
}
326338

327339
});
328340

sources/net.sf.j2s.ajax/ajaxrpc/net/sf/j2s/ajax/SimpleRPCRequest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,8 @@ static void xssNotify(String nameID, String response, String session) {
388388
if (session != null){
389389
g.idSet["s" + nameID] = session;
390390
}
391-
var xcontent = g.idSet["x" + nameID];
391+
var k = "x" + nameID;
392+
var xcontent = g.idSet[k];
392393
if (xcontent != null) {
393394
//The following codes may be modified to send out requests one by one.
394395
if (xcontent != null) {
@@ -398,7 +399,8 @@ static void xssNotify(String nameID, String response, String session) {
398399
xcontent[i] = null;
399400
}
400401
}
401-
g.idSet["x" + nameID] = null;
402+
g.idSet[k] = null;
403+
delete g.idSet[k];
402404
}
403405
}
404406
*/ {}
@@ -408,10 +410,14 @@ static void xssNotify(String nameID, String response, String session) {
408410
/**
409411
* @j2sNative
410412
var g = net.sf.j2s.ajax.SimpleRPCRequest;
411-
runnable = g.idSet["o" + nameID];
412-
g.idSet["o" + nameID] = null;
413-
if (g.idSet["s" + nameID] != null) {
414-
g.idSet["s" + nameID] = null;
413+
var oK = "o" + nameID;
414+
runnable = g.idSet[oK];
415+
g.idSet[oK] = null;
416+
delete g.idSet[oK];
417+
var sK = "s" + nameID;
418+
if (g.idSet[sK] != null) {
419+
g.idSet[sK] = null;
420+
delete g.idSet[sK];
415421
}
416422
if (response == null && runnable != null) { // error!
417423
runnable.ajaxFail();

sources/net.sf.j2s.ajax/ajaxrpc/net/sf/j2s/ajax/SimpleSerializable.java

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,34 @@ public class SimpleSerializable implements Cloneable {
6363
if (fields == null) {
6464
fields = [];
6565
}
66+
var filter = arguments[0];
67+
var ignoring = (filter == null || filter.ignoreDefaultFields ());
6668
for (var i = 0; i < fields.length; i++) {
6769
var field = fields[i];
6870
var name = field.name;
69-
buffer[buffer.length] = String.fromCharCode (baseChar + name.length);
70-
buffer[buffer.length] = name;
71+
if (filter != null && !filter.accept (name)) continue;
72+
var nameStr = String.fromCharCode (baseChar + name.length) + name;
7173
var type = field.type;
7274
if (type == 'F' || type == 'D' || type == 'I' || type == 'L'
7375
|| type == 'S' || type == 'B' || type == 'b') {
76+
if (ignoring && this[name] == 0
77+
&& (type == 'F' || type == 'D' || type == 'I'
78+
|| type == 'L' || type == 'S' || type == 'B')) {
79+
continue;
80+
}
81+
if (ignoring && this[name] == false && type == 'b') {
82+
continue;
83+
}
84+
buffer[buffer.length] = nameStr;
7485
buffer[buffer.length] = type;
7586
var value = "" + this[name];
7687
buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
7788
buffer[buffer.length] = value;
7889
} else if (type == 'C') {
90+
if (ignoring && this[name] == 0 || this[name] == '\0') {
91+
continue;
92+
}
93+
buffer[buffer.length] = nameStr;
7994
buffer[buffer.length] = type;
8095
var value = "";
8196
if (typeof this[name] == 'number') {
@@ -86,12 +101,21 @@ public class SimpleSerializable implements Cloneable {
86101
buffer[buffer.length] = String.fromCharCode (baseChar + value.length);
87102
buffer[buffer.length] = value;
88103
} else if (type == 's') {
104+
if (ignoring && this[name] == null) {
105+
continue;
106+
}
107+
buffer[buffer.length] = nameStr;
89108
this.serializeString(buffer, this[name]);
90109
} else if (type.charAt (0) == 'A') {
91-
buffer[buffer.length] = type;
92110
if (this[name] == null) {
111+
if (ignoring) {
112+
continue;
113+
}
114+
buffer[buffer.length] = nameStr;
93115
buffer[buffer.length] = String.fromCharCode (baseChar - 1);
94116
} else {
117+
buffer[buffer.length] = nameStr;
118+
buffer[buffer.length] = type;
95119
var l4 = this[name].length;
96120
if (l4 > 52) {
97121
if (l4 > 0x4000) { // 16 * 1024
@@ -180,6 +204,7 @@ public String serialize(SimpleFilter filter) {
180204
}
181205
clazz = clazz.getSuperclass();
182206
}
207+
boolean ignoring = (filter == null || filter.ignoreDefaultFields());
183208
try {
184209
Field[] fields = (Field []) fieldSet.toArray(new Field[0]);
185210
for (int i = 0; i < fields.length; i++) {
@@ -190,64 +215,83 @@ public String serialize(SimpleFilter filter) {
190215
&& (modifiers & Modifier.STATIC) == 0) {
191216
String name = field.getName();
192217
if (filter != null && !filter.accept(name)) continue;
193-
buffer.append((char)(baseChar + name.length()));
194-
buffer.append(name);
218+
String nameStr = (char)(baseChar + name.length()) + name;
195219
Class type = field.getType();
196220
if (type == float.class) {
197-
buffer.append('F');
198221
float f = field.getFloat(this);
222+
if (f == 0.0 && ignoring) continue;
223+
buffer.append(nameStr);
224+
buffer.append('F');
199225
String value = "" + f;
200226
buffer.append((char) (baseChar + value.length()));
201227
buffer.append(f);
202228
} else if (type == double.class) {
203-
buffer.append('D');
204229
double d = field.getDouble(this);
230+
if (d == 0.0d && ignoring) continue;
231+
buffer.append(nameStr);
232+
buffer.append('D');
205233
String value = "" + d;
206234
buffer.append((char) (baseChar + value.length()));
207235
buffer.append(d);
208236
} else if (type == int.class) {
209-
buffer.append('I');
210237
int n = field.getInt(this);
238+
if (n == 0 && ignoring) continue;
239+
buffer.append(nameStr);
240+
buffer.append('I');
211241
String value = "" + n;
212242
buffer.append((char) (baseChar + value.length()));
213243
buffer.append(n);
214244
} else if (type == long.class) {
215-
buffer.append('L');
216245
long l = field.getLong(this);
246+
if (l == 0L && ignoring) continue;
247+
buffer.append(nameStr);
248+
buffer.append('L');
217249
String value = "" + l;
218250
buffer.append((char) (baseChar + value.length()));
219251
buffer.append(l);
220252
} else if (type == short.class) {
221-
buffer.append('S');
222253
short s = field.getShort(this);
254+
if (s == 0 && ignoring) continue;
255+
buffer.append(nameStr);
256+
buffer.append('S');
223257
String value = "" + s;
224258
buffer.append((char) (baseChar + value.length()));
225259
buffer.append(s);
226260
} else if (type == byte.class) {
227-
buffer.append('B');
228261
byte b = field.getByte(this);
262+
if (b == 0 && ignoring) continue;
263+
buffer.append(nameStr);
264+
buffer.append('B');
229265
String value = "" + b;
230266
buffer.append((char) (baseChar + value.length()));
231267
buffer.append(b);
232268
} else if (type == char.class) {
233-
buffer.append('C');
234269
int c = 0 + field.getChar(this);
270+
if (c == 0 && ignoring) continue;
271+
buffer.append(nameStr);
272+
buffer.append('C');
235273
String value = "" + c;
236274
buffer.append((char) (baseChar + value.length()));
237275
buffer.append(c);
238276
} else if (type == boolean.class) {
239-
buffer.append('b');
240277
boolean b = field.getBoolean(this);
278+
if (b == false && ignoring) continue;
279+
buffer.append(nameStr);
280+
buffer.append('b');
241281
String value = "" + b;
242282
buffer.append((char) (baseChar + value.length()));
243283
buffer.append(b);
244284
} else if (type == String.class) {
245285
String s = (String) field.get(this);
286+
if (s == null && ignoring) continue;
287+
buffer.append(nameStr);
246288
serializeString(buffer, s);
247289
} else { // Array ...
248290
if (type == float[].class) {
249-
buffer.append("AF");
250291
float[] fs = (float[]) field.get(this);
292+
if (fs == null && ignoring) continue;
293+
buffer.append(nameStr);
294+
buffer.append("AF");
251295
if (fs == null) {
252296
buffer.append((char) (baseChar - 1));
253297
} else {
@@ -260,8 +304,10 @@ public String serialize(SimpleFilter filter) {
260304
}
261305
}
262306
} else if (type == double[].class) {
263-
buffer.append("AD");
264307
double [] ds = (double []) field.get(this);
308+
if (ds == null && ignoring) continue;
309+
buffer.append(nameStr);
310+
buffer.append("AD");
265311
if (ds == null) {
266312
buffer.append((char) (baseChar - 1));
267313
} else {
@@ -274,8 +320,10 @@ public String serialize(SimpleFilter filter) {
274320
}
275321
}
276322
} else if (type == int[].class) {
277-
buffer.append("AI");
278323
int [] ns = (int []) field.get(this);
324+
if (ns == null && ignoring) continue;
325+
buffer.append(nameStr);
326+
buffer.append("AI");
279327
if (ns == null) {
280328
buffer.append((char) (baseChar - 1));
281329
} else {
@@ -288,8 +336,10 @@ public String serialize(SimpleFilter filter) {
288336
}
289337
}
290338
} else if (type == long[].class) {
291-
buffer.append("AL");
292339
long [] ls = (long []) field.get(this);
340+
if (ls == null && ignoring) continue;
341+
buffer.append(nameStr);
342+
buffer.append("AL");
293343
if (ls == null) {
294344
buffer.append((char) (baseChar - 1));
295345
} else {
@@ -302,8 +352,10 @@ public String serialize(SimpleFilter filter) {
302352
}
303353
}
304354
} else if (type == short[].class) {
305-
buffer.append("AS");
306355
short [] ss = (short []) field.get(this);
356+
if (ss == null && ignoring) continue;
357+
buffer.append(nameStr);
358+
buffer.append("AS");
307359
if (ss == null) {
308360
buffer.append((char) (baseChar - 1));
309361
} else {
@@ -316,8 +368,10 @@ public String serialize(SimpleFilter filter) {
316368
}
317369
}
318370
} else if (type == byte[].class) {
319-
buffer.append("AB");
320371
byte [] bs = (byte []) field.get(this);
372+
if (bs == null && ignoring) continue;
373+
buffer.append(nameStr);
374+
buffer.append("AB");
321375
if (bs == null) {
322376
buffer.append((char) (baseChar - 1));
323377
} else {
@@ -330,8 +384,10 @@ public String serialize(SimpleFilter filter) {
330384
}
331385
}
332386
} else if (type == char[].class) {
333-
buffer.append("AC");
334387
char [] cs = (char []) field.get(this);
388+
if (cs == null && ignoring) continue;
389+
buffer.append(nameStr);
390+
buffer.append("AC");
335391
if (cs == null) {
336392
buffer.append((char) (baseChar - 1));
337393
} else {
@@ -344,8 +400,10 @@ public String serialize(SimpleFilter filter) {
344400
}
345401
}
346402
} else if (type == boolean[].class) {
347-
buffer.append("Ab");
348403
boolean [] bs = (boolean []) field.get(this);
404+
if (bs == null && ignoring) continue;
405+
buffer.append(nameStr);
406+
buffer.append("Ab");
349407
if (bs == null) {
350408
buffer.append((char) (baseChar - 1));
351409
} else {
@@ -358,8 +416,10 @@ public String serialize(SimpleFilter filter) {
358416
}
359417
}
360418
} else if (type == String[].class) {
361-
buffer.append("AX"); // special
362419
String[] ss = (String []) field.get(this);
420+
if (ss == null && ignoring) continue;
421+
buffer.append(nameStr);
422+
buffer.append("AX"); // special
363423
if (ss == null) {
364424
buffer.append((char) (baseChar - 1));
365425
} else {
@@ -493,8 +553,10 @@ private void serializeString(StringBuffer buffer, String s) throws UnsupportedEn
493553
size = parseInt(sizeStr);
494554
} catch (e) { }
495555
}
556+
// all fields are in their default values or no fields
557+
if (size == 0) return true;
496558
index++;
497-
if (size == 0 || size > length + start - index) return false;
559+
if (size > length + start - index) return false;
498560
}
499561
500562
var fieldMap = [];
@@ -654,12 +716,14 @@ public boolean deserialize(final String str, int start) {
654716
try {
655717
size = Integer.parseInt(sizeStr);
656718
} catch (NumberFormatException e) {
657-
//
719+
return false;
658720
}
659721
}
722+
// all fields are in their default values or no fields
723+
if (size == 0) return true;
660724
index++;
661725
// may be empty string or not enough string!
662-
if (size == 0 || size > length + start - index) return false;
726+
if (size > length + start - index) return false;
663727
}
664728

665729
Map fieldMap = new HashMap();

0 commit comments

Comments
 (0)