Skip to content

Commit d4dfb3d

Browse files
author
zhourenjian@gmail.com
committed
Support compact mode of byte[] array serialization
Support ignored fields for return data
1 parent c53ee51 commit d4dfb3d

File tree

7 files changed

+189
-111
lines changed

7 files changed

+189
-111
lines changed

sources/net.sf.j2s.ajax/ajaxcore/net/sf/j2s/ajax/HttpRequest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,11 @@ private void request() {
561561
}
562562
}
563563
if (responseText == null) {
564-
responseText = baos.toString();
564+
try {
565+
responseText = baos.toString("iso-8859-1");
566+
} catch (UnsupportedEncodingException e) {
567+
responseText = baos.toString();
568+
}
565569
}
566570
readyState = 4;
567571
if (onreadystatechange != null) {
@@ -576,7 +580,7 @@ private void request() {
576580
*/
577581
} catch (IOException e) {
578582
if (checkAbort()) return; // exception caused by abort action
579-
//e.printStackTrace();
583+
e.printStackTrace();
580584
readyState = 4;
581585
if (onreadystatechange != null) {
582586
onreadystatechange.onLoaded();

sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ private static void monitoringAllPipes() {
416416
e.printStackTrace();
417417
}
418418
}
419-
if (pipes == null || pipes.isEmpty()) {
419+
if (pipes == null/* || pipes.isEmpty()*/) {
420420
monitored = false;
421421
break;
422422
}

sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import java.io.ByteArrayOutputStream;
1414
import java.io.IOException;
15+
import java.io.UnsupportedEncodingException;
1516

1617
import net.sf.j2s.ajax.HttpRequest;
1718
import net.sf.j2s.ajax.SimpleRPCRequest;
@@ -805,12 +806,17 @@ public boolean receiving(ByteArrayOutputStream baos, byte b[], int off, int len)
805806
* It is OK to convert to string, because SimpleSerialize's
806807
* serialized string contains only ASCII chars.
807808
*/
808-
String string = baos.toString();
809+
String string = null;
810+
try {
811+
string = baos.toString("iso-8859-1");
812+
} catch (UnsupportedEncodingException e1) {
813+
string = baos.toString();
814+
}
809815
String resetString = parseReceived(string);
810816
if (resetString != null) {
811817
baos.reset();
812818
try {
813-
baos.write(resetString.getBytes());
819+
baos.write(resetString.getBytes("iso-8859-1"));
814820
} catch (IOException e) {
815821
e.printStackTrace();
816822
}
@@ -959,7 +965,7 @@ public static String parseReceived(final String string) {
959965
/**
960966
* @j2sNative
961967
* net.sf.j2s.ajax.SimplePipeRequest.pipeContinuum(runnable, subdomain, true);
962-
*/ { subdomain.isEmpty(); }
968+
*/ { subdomain.toString(); }
963969
}
964970
return string.substring(end + continueKey.length());
965971
}

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

Lines changed: 3 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
import java.io.IOException;
1616
import java.io.InputStream;
1717
import java.io.PrintWriter;
18-
import java.lang.reflect.Field;
19-
import java.lang.reflect.Modifier;
2018
import java.net.URLDecoder;
21-
import java.util.Arrays;
2219
import java.util.Enumeration;
2320
import java.util.HashSet;
2421
import java.util.Set;
@@ -264,7 +261,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
264261
//e.printStackTrace();
265262
}
266263
runnable.ajaxRun();
267-
final String[] diffs = compareDiffs(runnable, clonedRunnable);
264+
final String[] diffs = SimpleRPCUtils.compareDiffs(runnable, clonedRunnable);
268265
String serialize = runnable.serialize(new SimpleFilter() {
269266

270267
public boolean accept(String field) {
@@ -333,7 +330,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
333330
//e.printStackTrace();
334331
}
335332
runnable.ajaxRun();
336-
final String[] diffs = compareDiffs(runnable, clonedRunnable);
333+
final String[] diffs = SimpleRPCUtils.compareDiffs(runnable, clonedRunnable);
337334
String serialize = runnable.serialize(new SimpleFilter() {
338335

339336
public boolean accept(String field) {
@@ -503,94 +500,5 @@ private void cleanSession(HttpSession ses) {
503500
}
504501
}
505502
}
506-
507-
protected String[] compareDiffs(SimpleRPCRunnable runnable1, SimpleRPCRunnable runnable2) {
508-
Set<String> diffSet = new HashSet<String>();
509-
Set<Field> fieldSet = new HashSet<Field>();
510-
Class<?> clazz = runnable1.getClass();
511-
while(clazz != null && !"net.sf.j2s.ajax.SimpleSerializable".equals(clazz.getName())) {
512-
Field[] fields = clazz.getDeclaredFields();
513-
for (int i = 0; i < fields.length; i++) {
514-
fieldSet.add(fields[i]);
515-
}
516-
clazz = clazz.getSuperclass();
517-
}
518-
Field[] fields = fieldSet.toArray(new Field[0]);
519-
for (int i = 0; i < fields.length; i++) {
520-
Field field = fields[i];
521-
int modifiers = field.getModifiers();
522-
if ((modifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0
523-
&& (modifiers & Modifier.TRANSIENT) == 0
524-
&& (modifiers & Modifier.STATIC) == 0) {
525-
String name = field.getName();
526-
Object field1 = null;
527-
try {
528-
field1 = field.get(runnable1);
529-
} catch (IllegalArgumentException e1) {
530-
//e1.printStackTrace();
531-
} catch (IllegalAccessException e1) {
532-
//e1.printStackTrace();
533-
}
534-
Object field2 = null;
535-
try {
536-
field2 = field.get(runnable2);
537-
} catch (IllegalArgumentException e) {
538-
//e.printStackTrace();
539-
} catch (IllegalAccessException e) {
540-
//e.printStackTrace();
541-
}
542-
if (field1 == null) {
543-
if (field2 != null) {
544-
diffSet.add(name);
545-
}
546-
} else if (field1.getClass().getName().startsWith("[")) {
547-
Class<?> type = field.getType();
548-
if (type == float[].class) {
549-
if (!Arrays.equals((float[]) field1, (float[]) field2)) {
550-
diffSet.add(name);
551-
}
552-
} else if (type == double[].class) {
553-
if (!Arrays.equals((double[]) field1, (double[]) field2)) {
554-
diffSet.add(name);
555-
}
556-
} else if (type == int[].class) {
557-
if (!Arrays.equals((int[]) field1, (int[]) field2)) {
558-
diffSet.add(name);
559-
}
560-
} else if (type == long[].class) {
561-
if (!Arrays.equals((long[]) field1, (long[]) field2)) {
562-
diffSet.add(name);
563-
}
564-
} else if (type == short[].class) {
565-
if (!Arrays.equals((short[]) field1, (short[]) field2)) {
566-
diffSet.add(name);
567-
}
568-
} else if (type == byte[].class) {
569-
if (!Arrays.equals((byte[]) field1, (byte[]) field2)) {
570-
diffSet.add(name);
571-
}
572-
} else if (type == char[].class) {
573-
if (!Arrays.equals((char[]) field1, (char[]) field2)) {
574-
diffSet.add(name);
575-
}
576-
} else if (type == boolean[].class) {
577-
if (!Arrays.equals((boolean[]) field1, (boolean[]) field2)) {
578-
diffSet.add(name);
579-
}
580-
} else if (type == String[].class) {
581-
if (!Arrays.equals((String[]) field1, (String[]) field2)) {
582-
diffSet.add(name);
583-
}
584-
} else if (type == Object[].class) {
585-
if (!Arrays.equals((Object[]) field1, (Object[]) field2)) {
586-
diffSet.add(name);
587-
}
588-
}
589-
} else if (!field1.equals(field2)) {
590-
diffSet.add(name);
591-
}
592-
}
593-
}
594-
return diffSet.toArray(new String[diffSet.size()]);
595-
}
503+
596504
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ protected static boolean checkXSS(String url, String serialize, SimpleRPCRunnabl
448448
* @param response
449449
* @param session
450450
*/
451+
@SuppressWarnings("unused")
451452
static void xssNotify(String nameID, String response, String session) {
452453
/**
453454
* @j2sNative
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package net.sf.j2s.ajax;
2+
3+
import java.lang.reflect.Field;
4+
import java.lang.reflect.Modifier;
5+
import java.util.Arrays;
6+
import java.util.HashSet;
7+
import java.util.Set;
8+
9+
public class SimpleRPCUtils {
10+
11+
/**
12+
* Calculate the differences of two existed SimpleRPCRunnable objects.
13+
* In Simple RPC, we only need to result differences of SimpleRPCRunnable
14+
* objects. In such a way, we reduce the server traffic.
15+
*
16+
* @param runnable1 original object
17+
* @param runnable2 modified object
18+
* @return Names of the modified fields.
19+
*
20+
* @j2sIgnore
21+
*/
22+
public static String[] compareDiffs(SimpleRPCRunnable runnable1, SimpleRPCRunnable runnable2) {
23+
Set<String> diffSet = new HashSet<String>();
24+
Set<Field> fieldSet = new HashSet<Field>();
25+
Class<?> clazz = runnable1.getClass();
26+
while(clazz != null && !"net.sf.j2s.ajax.SimpleSerializable".equals(clazz.getName())) {
27+
Field[] fields = clazz.getDeclaredFields();
28+
for (int i = 0; i < fields.length; i++) {
29+
fieldSet.add(fields[i]);
30+
}
31+
clazz = clazz.getSuperclass();
32+
}
33+
String[] ignoredFields = runnable1.fieldDiffIgnored();
34+
Field[] fields = fieldSet.toArray(new Field[fieldSet.size()]);
35+
for (int i = 0; i < fields.length; i++) {
36+
Field field = fields[i];
37+
int modifiers = field.getModifiers();
38+
if ((modifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0
39+
&& (modifiers & Modifier.TRANSIENT) == 0
40+
&& (modifiers & Modifier.STATIC) == 0) {
41+
String name = field.getName();
42+
if (ignoredFields != null) {
43+
boolean ignored = false;
44+
for (int j = 0; j < ignoredFields.length; j++) {
45+
if (name.equals(ignoredFields[j])) {
46+
ignored = true;
47+
break;
48+
}
49+
}
50+
if (ignored) {
51+
continue;
52+
}
53+
}
54+
Object field1 = null;
55+
try {
56+
field1 = field.get(runnable1);
57+
} catch (IllegalArgumentException e1) {
58+
//e1.printStackTrace();
59+
} catch (IllegalAccessException e1) {
60+
//e1.printStackTrace();
61+
}
62+
Object field2 = null;
63+
try {
64+
field2 = field.get(runnable2);
65+
} catch (IllegalArgumentException e) {
66+
//e.printStackTrace();
67+
} catch (IllegalAccessException e) {
68+
//e.printStackTrace();
69+
}
70+
if (field1 == null) {
71+
if (field2 != null) {
72+
diffSet.add(name);
73+
}
74+
} else if (field2 == null) { // field1 != null
75+
diffSet.add(name);
76+
} else if (field1.getClass().getName().startsWith("[")) {
77+
Class<?> type = field.getType();
78+
if (type == float[].class) {
79+
if (!Arrays.equals((float[]) field1, (float[]) field2)) {
80+
diffSet.add(name);
81+
}
82+
} else if (type == double[].class) {
83+
if (!Arrays.equals((double[]) field1, (double[]) field2)) {
84+
diffSet.add(name);
85+
}
86+
} else if (type == int[].class) {
87+
if (!Arrays.equals((int[]) field1, (int[]) field2)) {
88+
diffSet.add(name);
89+
}
90+
} else if (type == long[].class) {
91+
if (!Arrays.equals((long[]) field1, (long[]) field2)) {
92+
diffSet.add(name);
93+
}
94+
} else if (type == short[].class) {
95+
if (!Arrays.equals((short[]) field1, (short[]) field2)) {
96+
diffSet.add(name);
97+
}
98+
} else if (type == byte[].class) {
99+
if (!Arrays.equals((byte[]) field1, (byte[]) field2)) {
100+
diffSet.add(name);
101+
}
102+
} else if (type == char[].class) {
103+
if (!Arrays.equals((char[]) field1, (char[]) field2)) {
104+
diffSet.add(name);
105+
}
106+
} else if (type == boolean[].class) {
107+
if (!Arrays.equals((boolean[]) field1, (boolean[]) field2)) {
108+
diffSet.add(name);
109+
}
110+
} else if (type == String[].class) {
111+
if (!Arrays.equals((String[]) field1, (String[]) field2)) {
112+
diffSet.add(name);
113+
}
114+
} else if (type == Object[].class) {
115+
if (!Arrays.equals((Object[]) field1, (Object[]) field2)) {
116+
diffSet.add(name);
117+
}
118+
}
119+
} else if (!field1.equals(field2)) {
120+
diffSet.add(name);
121+
}
122+
}
123+
}
124+
return diffSet.toArray(new String[diffSet.size()]);
125+
}
126+
127+
}

0 commit comments

Comments
 (0)