Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 1 | package aQute.lib.json; |
| 2 | |
| 3 | import java.io.*; |
| 4 | import java.lang.reflect.*; |
| 5 | import java.util.*; |
Stuart McCulloch | ec47fe7 | 2012-09-19 12:56:05 +0000 | [diff] [blame^] | 6 | import java.util.regex.*; |
Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 7 | |
Stuart McCulloch | ec47fe7 | 2012-09-19 12:56:05 +0000 | [diff] [blame^] | 8 | import aQute.lib.base64.*; |
Stuart McCulloch | a21b9e8 | 2012-08-02 13:26:25 +0000 | [diff] [blame] | 9 | import aQute.lib.hex.*; |
Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 10 | |
Stuart McCulloch | b215bfd | 2012-09-06 18:28:06 +0000 | [diff] [blame] | 11 | /** |
Stuart McCulloch | b215bfd | 2012-09-06 18:28:06 +0000 | [diff] [blame] | 12 | * Will now use hex for encoding byte arrays |
Stuart McCulloch | b215bfd | 2012-09-06 18:28:06 +0000 | [diff] [blame] | 13 | */ |
Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 14 | public class ByteArrayHandler extends Handler { |
Stuart McCulloch | ec47fe7 | 2012-09-19 12:56:05 +0000 | [diff] [blame^] | 15 | Pattern ENCODING = Pattern |
| 16 | .compile("((:?[\\dA-Za-z][\\dA-Za-z])*)|((:?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)+={1,3})"); |
| 17 | |
Stuart McCulloch | 2286f23 | 2012-06-15 13:27:53 +0000 | [diff] [blame] | 18 | @Override |
| 19 | void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception { |
Stuart McCulloch | b215bfd | 2012-09-06 18:28:06 +0000 | [diff] [blame] | 20 | StringHandler.string(app, Hex.toHexString((byte[]) object)); |
Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 21 | } |
| 22 | |
Stuart McCulloch | 2286f23 | 2012-06-15 13:27:53 +0000 | [diff] [blame] | 23 | @Override |
| 24 | Object decodeArray(Decoder r) throws Exception { |
Stuart McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 25 | 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 McCulloch | 2286f23 | 2012-06-15 13:27:53 +0000 | [diff] [blame] | 35 | @Override |
Stuart McCulloch | a21b9e8 | 2012-08-02 13:26:25 +0000 | [diff] [blame] | 36 | Object decode(Decoder dec, String s) throws Exception { |
Stuart McCulloch | ec47fe7 | 2012-09-19 12:56:05 +0000 | [diff] [blame^] | 37 | 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 McCulloch | bb01437 | 2012-06-07 21:57:32 +0000 | [diff] [blame] | 79 | } |
| 80 | } |