Merge "Fixed for bug 1197"
[controller.git] / opendaylight / md-sal / sal-dom-xsql / src / main / java / org / opendaylight / controller / md / sal / dom / xsql / jdbc / JDBCConnection.java
1 package org.opendaylight.controller.md.sal.dom.xsql.jdbc;
2
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.ByteArrayInputStream;
6 import java.io.ByteArrayOutputStream;
7 import java.io.DataInputStream;
8 import java.io.DataOutputStream;
9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 import java.net.ServerSocket;
12 import java.net.Socket;
13 import java.sql.Array;
14 import java.sql.Blob;
15 import java.sql.CallableStatement;
16 import java.sql.Clob;
17 import java.sql.Connection;
18 import java.sql.DatabaseMetaData;
19 import java.sql.NClob;
20 import java.sql.PreparedStatement;
21 import java.sql.SQLClientInfoException;
22 import java.sql.SQLException;
23 import java.sql.SQLWarning;
24 import java.sql.SQLXML;
25 import java.sql.Savepoint;
26 import java.sql.Statement;
27 import java.sql.Struct;
28 import java.util.LinkedList;
29 import java.util.Map;
30 import java.util.Properties;
31 import java.util.concurrent.Executor;
32
33 import org.opendaylight.controller.md.sal.dom.xsql.XSQLAdapter;
34
35 public class JDBCConnection extends Thread implements Connection {
36     private Socket socket = null;
37     private DataInputStream in = null;
38     private DataOutputStream out = null;
39     private LinkedList<byte[]> queue = new LinkedList<byte[]>();
40     private XSQLAdapter adapter = null;
41
42     public JDBCConnection(Socket s, XSQLAdapter _a) {
43         this.socket = s;
44         this.adapter = _a;
45         try {
46             in = new DataInputStream(
47                 new BufferedInputStream(s.getInputStream()));
48             out = new DataOutputStream(
49                 new BufferedOutputStream(s.getOutputStream()));
50             new JDBCObjectReader();
51             this.start();
52         } catch (Exception err) {
53             err.printStackTrace();
54         }
55     }
56
57     public JDBCConnection(String addr) throws Exception {
58         socket = new Socket(addr, 40004);
59         try {
60             in = new DataInputStream(
61                 new BufferedInputStream(socket.getInputStream()));
62             out = new DataOutputStream(
63                 new BufferedOutputStream(socket.getOutputStream()));
64             new JDBCObjectReader();
65             this.start();
66         } catch (Exception err) {
67             err.printStackTrace();
68         }
69     }
70
71     public JDBCConnection(boolean server) {
72         try {
73             ServerSocket s = new ServerSocket(50003);
74             socket = s.accept();
75             try {
76                 in = new DataInputStream(
77                     new BufferedInputStream(socket.getInputStream()));
78                 out = new DataOutputStream(
79                     new BufferedOutputStream(socket.getOutputStream()));
80                 new JDBCObjectReader();
81                 this.start();
82             } catch (Exception err) {
83                 err.printStackTrace();
84             }
85         } catch (Exception err) {
86             err.printStackTrace();
87         }
88     }
89
90
91     private boolean isStopped() {
92         if (adapter != null && adapter.stopped) {
93             return true;
94         }
95         if (socket == null || socket.isClosed()) {
96             return true;
97         }
98         return false;
99     }
100
101     public void run() {
102         byte data[] = null;
103         while (!isStopped()) {
104             try {
105                 int len = in.readInt();
106                 data = new byte[len];
107                 in.readFully(data);
108                 addObject(data);
109
110             } catch (Exception err) {
111                 System.out.println("Connection Lost or Closed.");
112                 try {
113                     socket.close();
114                 } catch (Exception err2) {
115                 }
116                 //err.printStackTrace();
117             }
118         }
119     }
120
121     private void addObject(byte[] data) {
122         synchronized (queue) {
123             queue.add(data);
124             queue.notifyAll();
125         }
126     }
127
128     private class JDBCObjectReader extends Thread {
129
130         public JDBCObjectReader() {
131             super("JDBCObjectReader");
132             start();
133         }
134
135         public void run() {
136             while (!isStopped()) {
137                 byte data[] = null;
138                 synchronized (queue) {
139                     if (queue.size() == 0) {
140                         try {
141                             queue.wait(1000);
142                         } catch (Exception err) {
143                         }
144                     }
145                     if (queue.size() > 0) {
146                         data = queue.removeFirst();
147                     }
148                 }
149                 if (data != null) {
150                     JDBCCommand command = (JDBCCommand) deSerialize(data);
151                     processCommand(command);
152                 }
153             }
154         }
155
156         private Object deSerialize(byte data[]) {
157             try {
158                 ByteArrayInputStream in = new ByteArrayInputStream(data);
159                 ObjectInputStream oin = new ObjectInputStream(in);
160                 return oin.readObject();
161             } catch (Exception err) {
162                 err.printStackTrace();
163             }
164             return null;
165         }
166     }
167
168     public void processCommand(JDBCCommand cmd) {
169         switch (cmd.getType()) {
170             case JDBCCommand.TYPE_EXECUTE_QUERY:
171                 try {
172                     JDBCServer.execute(cmd.getRS(), adapter);
173                     send(new JDBCCommand(cmd.getRS(),
174                         JDBCCommand.TYPE_QUERY_REPLY));
175                     QueryUpdater u = new QueryUpdater(cmd.getRS());
176                     new Thread(u).start();
177                 } catch (Exception err) {
178                     send(new JDBCCommand(err, cmd.getRSID()));
179                 }
180                 break;
181             case JDBCCommand.TYPE_QUERY_REPLY:
182                 JDBCResultSet rs1 = JDBCStatement.getQuery(cmd.getRS().getID());
183                 rs1.updateData(cmd.getRS());
184                 break;
185             case JDBCCommand.TYPE_QUERY_RECORD:
186                 JDBCResultSet rs2 = JDBCStatement.getQuery(cmd.getRSID());
187                 rs2.addRecord(cmd.getRecord());
188                 break;
189             case JDBCCommand.TYPE_QUERY_FINISH:
190                 JDBCResultSet rs3 = JDBCStatement.removeQuery(cmd.getRSID());
191                 rs3.setFinished(true);
192                 break;
193             case JDBCCommand.TYPE_QUERY_ERROR:
194                 System.err.println("ERROR Executing Query\n");
195                 cmd.getERROR().printStackTrace();
196                 JDBCResultSet rs4 = JDBCStatement.removeQuery(cmd.getRSID());
197                 rs4.setError(cmd.getERROR());
198                 rs4.setFinished(true);
199                 synchronized (rs4) {
200                     rs4.notifyAll();
201                 }
202         }
203     }
204
205     private class QueryUpdater implements Runnable {
206
207         private JDBCResultSet rs = null;
208
209         public QueryUpdater(JDBCResultSet _rs) {
210             this.rs = _rs;
211         }
212
213         public void run() {
214             while (rs.next()) {
215                 JDBCCommand rec = new JDBCCommand(rs.getCurrent(), rs.getID());
216                 send(rec);
217             }
218             JDBCCommand end = new JDBCCommand(rs.getID());
219             send(end);
220         }
221     }
222
223     public void send(Object o) {
224         try {
225             ByteArrayOutputStream bout = new ByteArrayOutputStream();
226             ObjectOutputStream oout = new ObjectOutputStream(bout);
227             oout.writeObject(o);
228             byte data[] = bout.toByteArray();
229             synchronized (socket) {
230                 out.writeInt(data.length);
231                 out.write(data);
232                 out.flush();
233             }
234         } catch (Exception err) {
235             err.printStackTrace();
236         }
237     }
238
239     @Override
240     public boolean isWrapperFor(Class<?> arg0) throws SQLException {
241         // TODO Auto-generated method stub
242         return false;
243     }
244
245     @Override
246     public <T> T unwrap(Class<T> arg0) throws SQLException {
247         // TODO Auto-generated method stub
248         return null;
249     }
250
251     @Override
252     public void clearWarnings() throws SQLException {
253         // TODO Auto-generated method stub
254
255     }
256
257     @Override
258     public void close() throws SQLException {
259         try {
260             socket.close();
261         } catch (Exception err) {
262         }
263         socket = null;
264     }
265
266     @Override
267     public void commit() throws SQLException {
268         // TODO Auto-generated method stub
269
270     }
271
272     @Override
273     public Array createArrayOf(String typeName, Object[] elements)
274         throws SQLException {
275         // TODO Auto-generated method stub
276         return null;
277     }
278
279     @Override
280     public Blob createBlob() throws SQLException {
281         // TODO Auto-generated method stub
282         return null;
283     }
284
285     @Override
286     public Clob createClob() throws SQLException {
287         // TODO Auto-generated method stub
288         return null;
289     }
290
291     @Override
292     public NClob createNClob() throws SQLException {
293         // TODO Auto-generated method stub
294         return null;
295     }
296
297     @Override
298     public SQLXML createSQLXML() throws SQLException {
299         // TODO Auto-generated method stub
300         return null;
301     }
302
303     @Override
304     public Statement createStatement() throws SQLException {
305         return new JDBCStatement(this);
306     }
307
308     @Override
309     public Statement createStatement(int resultSetType,
310         int resultSetConcurrency, int resultSetHoldability)
311         throws SQLException {
312         // TODO Auto-generated method stub
313         return null;
314     }
315
316     @Override
317     public Statement createStatement(int resultSetType,
318         int resultSetConcurrency)
319         throws SQLException {
320         // TODO Auto-generated method stub
321         return null;
322     }
323
324     @Override
325     public Struct createStruct(String typeName, Object[] attributes)
326         throws SQLException {
327         // TODO Auto-generated method stub
328         return null;
329     }
330
331     @Override
332     public boolean getAutoCommit() throws SQLException {
333         // TODO Auto-generated method stub
334         return false;
335     }
336
337     @Override
338     public String getCatalog() throws SQLException {
339         // TODO Auto-generated method stub
340         return null;
341     }
342
343     @Override
344     public Properties getClientInfo() throws SQLException {
345         // TODO Auto-generated method stub
346         return null;
347     }
348
349     @Override
350     public String getClientInfo(String name) throws SQLException {
351         // TODO Auto-generated method stub
352         return null;
353     }
354
355     @Override
356     public int getHoldability() throws SQLException {
357         // TODO Auto-generated method stub
358         return 0;
359     }
360
361     @Override
362     public DatabaseMetaData getMetaData() throws SQLException {
363         // TODO Auto-generated method stub
364         return null;
365     }
366
367     @Override
368     public int getTransactionIsolation() throws SQLException {
369         // TODO Auto-generated method stub
370         return 0;
371     }
372
373     @Override
374     public Map<String, Class<?>> getTypeMap() throws SQLException {
375         // TODO Auto-generated method stub
376         return null;
377     }
378
379     @Override
380     public SQLWarning getWarnings() throws SQLException {
381         // TODO Auto-generated method stub
382         return null;
383     }
384
385     @Override
386     public boolean isClosed() throws SQLException {
387         // TODO Auto-generated method stub
388         return false;
389     }
390
391     @Override
392     public boolean isReadOnly() throws SQLException {
393         // TODO Auto-generated method stub
394         return false;
395     }
396
397     @Override
398     public boolean isValid(int timeout) throws SQLException {
399         // TODO Auto-generated method stub
400         return false;
401     }
402
403     @Override
404     public String nativeSQL(String sql) throws SQLException {
405         // TODO Auto-generated method stub
406         return null;
407     }
408
409     @Override
410     public CallableStatement prepareCall(String sql, int resultSetType,
411         int resultSetConcurrency, int resultSetHoldability)
412         throws SQLException {
413         // TODO Auto-generated method stub
414         return null;
415     }
416
417     @Override
418     public CallableStatement prepareCall(String sql, int resultSetType,
419         int resultSetConcurrency) throws SQLException {
420         // TODO Auto-generated method stub
421         return null;
422     }
423
424     @Override
425     public CallableStatement prepareCall(String sql) throws SQLException {
426         // TODO Auto-generated method stub
427         return null;
428     }
429
430     @Override
431     public PreparedStatement prepareStatement(String sql, int resultSetType,
432         int resultSetConcurrency, int resultSetHoldability)
433         throws SQLException {
434         // TODO Auto-generated method stub
435         return null;
436     }
437
438     @Override
439     public PreparedStatement prepareStatement(String sql, int resultSetType,
440         int resultSetConcurrency) throws SQLException {
441         // TODO Auto-generated method stub
442         return null;
443     }
444
445     @Override
446     public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
447         throws SQLException {
448         // TODO Auto-generated method stub
449         return null;
450     }
451
452     @Override
453     public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
454         throws SQLException {
455         // TODO Auto-generated method stub
456         return null;
457     }
458
459     @Override
460     public PreparedStatement prepareStatement(String sql, String[] columnNames)
461         throws SQLException {
462         // TODO Auto-generated method stub
463         return null;
464     }
465
466     @Override
467     public PreparedStatement prepareStatement(String sql) throws SQLException {
468         // TODO Auto-generated method stub
469         return null;
470     }
471
472     @Override
473     public void releaseSavepoint(Savepoint savepoint) throws SQLException {
474         // TODO Auto-generated method stub
475
476     }
477
478     @Override
479     public void rollback() throws SQLException {
480         // TODO Auto-generated method stub
481
482     }
483
484     @Override
485     public void rollback(Savepoint savepoint) throws SQLException {
486         // TODO Auto-generated method stub
487
488     }
489
490     @Override
491     public void setAutoCommit(boolean autoCommit) throws SQLException {
492         // TODO Auto-generated method stub
493
494     }
495
496     @Override
497     public void setCatalog(String catalog) throws SQLException {
498         // TODO Auto-generated method stub
499
500     }
501
502     @Override
503     public void setClientInfo(Properties properties)
504         throws SQLClientInfoException {
505         // TODO Auto-generated method stub
506
507     }
508
509     @Override
510     public void setClientInfo(String name, String value)
511         throws SQLClientInfoException {
512         // TODO Auto-generated method stub
513
514     }
515
516     @Override
517     public void setHoldability(int holdability) throws SQLException {
518         // TODO Auto-generated method stub
519
520     }
521
522     @Override
523     public void setReadOnly(boolean readOnly) throws SQLException {
524         // TODO Auto-generated method stub
525
526     }
527
528     @Override
529     public Savepoint setSavepoint() throws SQLException {
530         // TODO Auto-generated method stub
531         return null;
532     }
533
534     @Override
535     public Savepoint setSavepoint(String name) throws SQLException {
536         // TODO Auto-generated method stub
537         return null;
538     }
539
540     @Override
541     public void setTransactionIsolation(int level) throws SQLException {
542         // TODO Auto-generated method stub
543
544     }
545
546     @Override
547     public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
548         // TODO Auto-generated method stub
549
550     }
551
552     @Override
553     public void setSchema(String schema) throws SQLException {
554         // TODO Auto-generated method stub
555
556     }
557
558     @Override
559     public String getSchema() throws SQLException {
560         // TODO Auto-generated method stub
561         return null;
562     }
563
564     @Override
565     public void abort(Executor executor) throws SQLException {
566         // TODO Auto-generated method stub
567
568     }
569
570     @Override
571     public void setNetworkTimeout(Executor executor, int milliseconds)
572         throws SQLException {
573         // TODO Auto-generated method stub
574
575     }
576
577     @Override
578     public int getNetworkTimeout() throws SQLException {
579         // TODO Auto-generated method stub
580         return 0;
581     }
582 }
583