Mercurial Hosting > luan
annotate core/src/luan/modules/RpcLuan.java @ 759:ae612dfc57cb 0.21
better handling of longs in rpc and json
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 19 Jul 2016 09:09:41 -0600 |
parents | c29d11d675fd |
children |
rev | line source |
---|---|
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 package luan.modules; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 import java.io.InputStream; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 import java.io.OutputStream; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 import java.io.BufferedInputStream; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 import java.io.BufferedOutputStream; |
744 | 7 import java.io.InputStreamReader; |
754 | 8 import java.io.FilterInputStream; |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 import java.io.IOException; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 import java.io.EOFException; |
744 | 11 import java.net.Socket; |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 import java.nio.charset.StandardCharsets; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 import java.util.Set; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 import java.util.IdentityHashMap; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 import java.util.Collections; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 import java.util.Map; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 import luan.Luan; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 import luan.LuanState; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 import luan.LuanTable; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 import luan.LuanFunction; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 import luan.LuanException; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 import luan.LuanMethod; |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
23 import luan.modules.parsers.Json; |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
24 import luan.modules.parsers.ParseException; |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 public final class RpcLuan { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 private static final int NIL = 0; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
29 private static final int STRING = 1; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 private static final int BOOLEAN = 2; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 private static final int NUMBER = 3; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
32 private static final int BINARY = 4; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 private static final int TABLE = 5; |
744 | 34 private static final int IO = 6; |
759
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
35 private static final int LONG = 7; |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 @LuanMethod public static Object[] call(LuanState luan,LuanTable socketTbl,String fnName,Object... args) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 throws LuanException, IOException |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 { |
744 | 40 IoLuan.LuanSocket luanSocket = (IoLuan.LuanSocket)socketTbl.rawGet("java"); |
41 Socket socket = luanSocket.socket; | |
42 InputStream in = new BufferedInputStream(socket.getInputStream()); | |
43 OutputStream out = new BufferedOutputStream(socket.getOutputStream()); | |
44 Close close = new Close(); | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 try { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
46 writeString(out,fnName); |
744 | 47 writeObjs(out,luan,args); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
48 out.flush(); |
744 | 49 socket.shutdownOutput(); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
50 boolean ok = readBoolean(in); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
51 if( ok ) { |
744 | 52 return readObjs(in,luan,close); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
53 } else { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
54 String msg = readString(in); |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
55 throw new LuanException(msg); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
56 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
57 } finally { |
744 | 58 if( close.b) { |
59 socket.close(); | |
60 } | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
61 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
62 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
63 |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
64 public static void respond(LuanState luan,LuanTable socketTbl,LuanTable fns) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
65 throws IOException, LuanException |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
66 { |
744 | 67 IoLuan.LuanSocket luanSocket = (IoLuan.LuanSocket)socketTbl.rawGet("java"); |
68 Socket socket = luanSocket.socket; | |
69 InputStream in = new BufferedInputStream(socket.getInputStream()); | |
70 OutputStream out = new BufferedOutputStream(socket.getOutputStream()); | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
71 try { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 Object[] rtn; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
73 try { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 String fnName = readString(in); |
744 | 75 Object[] args = readObjs(in,luan,null); |
742 | 76 LuanFunction fn = (LuanFunction)fns.get(luan,fnName); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
77 if( fn == null ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
78 throw new LuanException( "function not found: " + fnName ); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
79 rtn = Luan.array(fn.call(luan,args)); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
80 } catch(LuanException e) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
81 writeBoolean(out,false); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
82 writeString(out,e.getFullMessage()); |
754 | 83 out.flush(); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
84 return; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
85 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
86 writeBoolean(out,true); |
744 | 87 writeObjs(out,luan,rtn); |
754 | 88 out.flush(); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
89 } finally { |
744 | 90 socket.close(); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
91 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
92 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
93 |
744 | 94 private static void writeObjs(OutputStream out,LuanState luan,Object[] a) throws IOException, LuanException { |
95 IoLuan.LuanIn luanIn = null; | |
96 writeInt(out,a.length); | |
97 for( Object obj : a ) { | |
98 if( obj instanceof LuanTable ) { | |
99 LuanTable tbl = (LuanTable)obj; | |
100 Object java = tbl.rawGet("java"); | |
101 if( java instanceof IoLuan.LuanIn ) { | |
102 if( luanIn != null ) | |
103 throw new LuanException("can't have multiple IO params"); | |
104 luanIn = (IoLuan.LuanIn)java; | |
105 out.write(IO); | |
106 continue; | |
107 } | |
108 } | |
109 writeObj(out,luan,obj); | |
110 } | |
111 if( luanIn != null ) { | |
112 InputStream in = luanIn.inputStream(); | |
113 Utils.copyAll(in,out); | |
114 } | |
115 } | |
116 | |
117 private static Object[] readObjs(InputStream in,LuanState luan,Close close) throws IOException, LuanException { | |
118 int n = readInt(in); | |
119 Object[] rtn = new Object[n]; | |
120 for( int i=0; i<n; i++ ) { | |
121 rtn[i] = readObj(in,luan,close); | |
122 } | |
123 return rtn; | |
124 } | |
125 | |
126 private static void writeObj(OutputStream out,LuanState luan,Object obj) throws IOException, LuanException { | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
127 if( obj == null ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
128 out.write(NIL); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
129 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
130 else if( obj instanceof String ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
131 out.write(STRING); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
132 writeString(out,(String)obj); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
133 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
134 else if( obj instanceof Boolean ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
135 out.write(BOOLEAN); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
136 writeBoolean(out,(Boolean)obj); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
137 } |
759
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
138 else if( obj instanceof Long ) { |
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
139 out.write(LONG); |
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
140 writeString(out,obj.toString()); |
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
141 } |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
142 else if( obj instanceof Number ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
143 out.write(NUMBER); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
144 writeString(out,obj.toString()); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
145 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
146 else if( obj instanceof byte[] ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
147 byte[] a = (byte[])obj; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
148 out.write(BINARY); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
149 writeInt(out,a.length); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
150 out.write(a); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
151 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
152 else if( obj instanceof LuanTable ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
153 out.write(TABLE); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
154 // String s = pickle( luan, obj, Collections.newSetFromMap(new IdentityHashMap<LuanTable,Boolean>()) ); |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
155 String s = Json.toString(obj); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
156 writeString(out,s); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
157 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
158 else |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
159 throw new LuanException( "invalid type: " + obj.getClass() ); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
160 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
161 |
744 | 162 private static Object readObj(InputStream in,LuanState luan,Close close) throws IOException, LuanException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
163 int type = in.read(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
164 switch(type) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
165 case NIL: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
166 return null; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
167 case STRING: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
168 return readString(in); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
169 case BOOLEAN: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
170 return readBoolean(in); |
759
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
171 case LONG: |
ae612dfc57cb
better handling of longs in rpc and json
Franklin Schmidt <fschmidt@gmail.com>
parents:
758
diff
changeset
|
172 return Long.valueOf(readString(in)); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
173 case NUMBER: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
174 return Double.valueOf(readString(in)); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
175 case BINARY: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
176 return readBinary(in,readInt(in)); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
177 case TABLE: |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
178 String s = readString(in); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
179 /* |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
180 LuanFunction fn = Luan.load("return "+s,"rpc-reader"); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
181 return fn.call(luan); |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
182 */ |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
183 try { |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
184 return Json.parse(s); |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
185 } catch(ParseException e) { |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
186 throw new LuanException(e); |
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
187 } |
744 | 188 case IO: |
189 return new LuanInputStream(in,close).table(); | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
190 default: |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
191 throw new LuanException( "invalid type: " + type ); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
192 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
193 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
194 |
744 | 195 private static Boolean readBoolean(InputStream in) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
196 return Boolean.valueOf(readString(in)); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
197 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
198 |
744 | 199 private static String readString(InputStream in) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
200 int len = readInt(in); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
201 byte[] a = readBinary(in,len); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
202 return new String(a,StandardCharsets.UTF_8); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
203 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
204 |
744 | 205 private static int readInt(InputStream in) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
206 int ch1 = in.read(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
207 int ch2 = in.read(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
208 int ch3 = in.read(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
209 int ch4 = in.read(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
210 if ((ch1 | ch2 | ch3 | ch4) < 0) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
211 throw new EOFException(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
212 return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
213 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
214 |
744 | 215 private static byte[] readBinary(InputStream in,int size) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
216 byte[] a = new byte[size]; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
217 int i = 0; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
218 while( i < size ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
219 int n = in.read(a,i,size-i); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
220 if( n == -1 ) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
221 throw new EOFException(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
222 i += n; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
223 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
224 return a; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
225 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
226 |
744 | 227 private static void writeBoolean(OutputStream out,Boolean b) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
228 writeString(out,b.toString()); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
229 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
230 |
744 | 231 private static void writeString(OutputStream out,String s) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
232 byte[] a = s.getBytes(StandardCharsets.UTF_8); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
233 writeInt(out,a.length); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
234 out.write(a); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
235 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
236 |
744 | 237 private static void writeInt(OutputStream out,int v) throws IOException { |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
238 out.write((v >>> 24) & 0xFF); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
239 out.write((v >>> 16) & 0xFF); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
240 out.write((v >>> 8) & 0xFF); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
241 out.write((v >>> 0) & 0xFF); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
242 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
243 |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
244 /* |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
245 private static String pickle(LuanState luan,Object obj,Set<LuanTable> set) throws LuanException { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
246 if( obj == null ) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
247 return "nil"; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
248 if( obj instanceof Boolean ) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
249 return obj.toString(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
250 if( obj instanceof Number ) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
251 return Luan.toString((Number)obj); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
252 if( obj instanceof String ) |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
253 return "\"" + Luan.stringEncode((String)obj) + "\""; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
254 if( obj instanceof LuanTable ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
255 LuanTable tbl = (LuanTable)obj; |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
256 if( !set.add(tbl) ) { |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
257 throw new LuanException( "circular reference in table" ); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
258 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
259 StringBuilder sb = new StringBuilder(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
260 sb.append( "{" ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
261 for( Map.Entry<Object,Object> entry : tbl.iterable(luan) ) { |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
262 sb.append( "[" ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
263 sb.append( pickle(luan,entry.getKey(),set) ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
264 sb.append( "]=" ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
265 sb.append( pickle(luan,entry.getValue(),set) ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
266 sb.append( ", " ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
267 } |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
268 sb.append( "}" ); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
269 return sb.toString(); |
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
270 } |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
610
diff
changeset
|
271 throw new LuanException( "invalid type: " + obj.getClass() ); |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
272 } |
758
c29d11d675fd
added Json.toString() and rpc now sends tables as json
Franklin Schmidt <fschmidt@gmail.com>
parents:
754
diff
changeset
|
273 */ |
744 | 274 |
275 private static class Close { | |
276 boolean b = true; | |
277 } | |
278 | |
279 private static class LuanInputStream extends IoLuan.LuanIn { | |
280 private final InputStream in; | |
281 private final boolean close; | |
282 | |
283 public LuanInputStream(InputStream in,Close close) { | |
284 this.in = in; | |
285 this.close = close!=null && close.b; | |
286 if(this.close) close.b = false; | |
287 } | |
288 | |
289 @Override public InputStream inputStream() { | |
754 | 290 return new FilterInputStream(in) { |
291 @Override public void close() throws IOException { | |
292 if(close) super.close(); | |
293 } | |
294 }; | |
744 | 295 } |
296 | |
297 @Override public String to_string() { | |
298 return "<input_stream>"; | |
299 } | |
300 | |
301 @Override public String to_uri_string() { | |
302 throw new UnsupportedOperationException(); | |
303 } | |
304 | |
305 @Override public boolean exists() { | |
306 return true; | |
307 } | |
308 }; | |
309 | |
610
b4f3dbe1c6e3
add Rpc and change Hosting to use Rpc
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
310 } |