blob: 349b3810d442918be3531f7555e1db577a135534 [file] [log] [blame]
Stuart McCullochbb014372012-06-07 21:57:32 +00001package aQute.lib.json;
2
3import java.io.*;
4import java.lang.reflect.*;
5import java.util.*;
Stuart McCullochec47fe72012-09-19 12:56:05 +00006import java.util.regex.*;
Stuart McCullochbb014372012-06-07 21:57:32 +00007
Stuart McCullochec47fe72012-09-19 12:56:05 +00008import aQute.lib.base64.*;
Stuart McCullocha21b9e82012-08-02 13:26:25 +00009import aQute.lib.hex.*;
Stuart McCullochbb014372012-06-07 21:57:32 +000010
Stuart McCullochb215bfd2012-09-06 18:28:06 +000011/**
Stuart McCullochb215bfd2012-09-06 18:28:06 +000012 * Will now use hex for encoding byte arrays
Stuart McCullochb215bfd2012-09-06 18:28:06 +000013 */
Stuart McCullochbb014372012-06-07 21:57:32 +000014public class ByteArrayHandler extends Handler {
Stuart McCullochec47fe72012-09-19 12:56:05 +000015 Pattern ENCODING = Pattern
16 .compile("((:?[\\dA-Za-z][\\dA-Za-z])*)|((:?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)+={1,3})");
17
Stuart McCulloch2286f232012-06-15 13:27:53 +000018 @Override
19 void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
Stuart McCullochb215bfd2012-09-06 18:28:06 +000020 StringHandler.string(app, Hex.toHexString((byte[]) object));
Stuart McCullochbb014372012-06-07 21:57:32 +000021 }
22
Stuart McCulloch2286f232012-06-15 13:27:53 +000023 @Override
24 Object decodeArray(Decoder r) throws Exception {
Stuart McCullochbb014372012-06-07 21:57:32 +000025 ByteArrayOutputStream out = new ByteArrayOutputStream();
26
27 ArrayList<Object> list = new ArrayList<Object>();
28 r.codec.parseArray(list, Byte.class, r);
29 for (Object b : list) {
30 out.write(((Byte) b).byteValue());
31 }
32 return out.toByteArray();
33 }
34
Stuart McCulloch2286f232012-06-15 13:27:53 +000035 @Override
Stuart McCullocha21b9e82012-08-02 13:26:25 +000036 Object decode(Decoder dec, String s) throws Exception {
Stuart McCullochec47fe72012-09-19 12:56:05 +000037 boolean hex = true;
38 StringBuilder sb = new StringBuilder(s);
39 for (int i = sb.length() - 1; i >= 0; i--) {
40 char c = sb.charAt(i);
41 if (Character.isWhitespace(c))
42 sb.delete(i, i + 1);
43 else {
44 switch (c) {
45 case '0' :
46 case '1' :
47 case '2' :
48 case '3' :
49 case '4' :
50 case '5' :
51 case '6' :
52 case '7' :
53 case '8' :
54 case '9' :
55 case 'A' :
56 case 'B' :
57 case 'C' :
58 case 'D' :
59 case 'E' :
60 case 'F' :
61 case 'a' :
62 case 'b' :
63 case 'c' :
64 case 'd' :
65 case 'e' :
66 case 'f' :
67 break;
68
69 default :
70 hex = false;
71 break;
72 }
73 }
74 }
75 if ( hex)
76 return Hex.toByteArray(sb.toString());
77 else
78 return Base64.decodeBase64(sb.toString());
Stuart McCullochbb014372012-06-07 21:57:32 +000079 }
80}