1 package org.opendaylight.controller.md.sal.dom.xsql.jdbc;
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;
15 import java.sql.CallableStatement;
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;
30 import java.util.Properties;
31 import java.util.concurrent.Executor;
33 import org.opendaylight.controller.md.sal.dom.xsql.XSQLAdapter;
34 import org.opendaylight.controller.md.sal.dom.xsql.XSQLBluePrint;
36 public class JDBCConnection implements Connection, Runnable {
37 private Socket socket = null;
38 private DataInputStream in = null;
39 private DataOutputStream out = null;
40 private LinkedList<byte[]> queue = new LinkedList<byte[]>();
41 private XSQLAdapter adapter = null;
42 private XSQLBluePrint metaData = null;
43 private String addr = null;
44 private boolean wasClosed = false;
46 public JDBCConnection(Socket s, XSQLAdapter _a) {
50 in = new DataInputStream(
51 new BufferedInputStream(s.getInputStream()));
52 out = new DataOutputStream(new BufferedOutputStream(
53 s.getOutputStream()));
54 new JDBCObjectReader();
55 new Thread(this).start();
56 } catch (Exception err) {
57 err.printStackTrace();
61 public Connection getProxy() {
64 return (Connection) Proxy.newProxyInstance(this.getClass()
65 .getClassLoader(), new Class[] { Connection.class },
70 public JDBCConnection(String _addr) throws Exception {
75 private void init() throws Exception {
76 if (addr.startsWith("http://"))
77 addr = addr.substring(7);
78 System.err.print("Address is:" + addr);
79 socket = new Socket(addr, 40004);
81 in = new DataInputStream(new BufferedInputStream(
82 socket.getInputStream()));
83 out = new DataOutputStream(new BufferedOutputStream(
84 socket.getOutputStream()));
85 new JDBCObjectReader();
86 new Thread(this).start();
87 } catch (Exception err) {
88 err.printStackTrace();
92 public JDBCConnection(boolean server) {
94 ServerSocket s = new ServerSocket(50003);
97 in = new DataInputStream(new BufferedInputStream(
98 socket.getInputStream()));
99 out = new DataOutputStream(new BufferedOutputStream(
100 socket.getOutputStream()));
101 new JDBCObjectReader();
102 new Thread(this).start();
103 } catch (Exception err) {
104 err.printStackTrace();
106 } catch (Exception err) {
107 err.printStackTrace();
111 private boolean isStopped() {
112 if (adapter != null && adapter.stopped) {
115 if (socket == null || socket.isClosed()) {
123 while (!isStopped()) {
125 int len = in.readInt();
126 data = new byte[len];
130 } catch (Exception err) {
131 System.out.println("Connection Lost or Closed.");
134 } catch (Exception er) {
139 } catch (Exception er) {
144 } catch (Exception err2) {
151 private void addObject(byte[] data) {
152 synchronized (queue) {
158 private class JDBCObjectReader extends Thread {
160 public JDBCObjectReader() {
161 super("JDBCObjectReader");
166 while (!isStopped()) {
168 synchronized (queue) {
169 if (queue.size() == 0) {
172 } catch (Exception err) {
175 if (queue.size() > 0) {
176 data = queue.removeFirst();
180 JDBCCommand command = (JDBCCommand) deSerialize(data);
181 processCommand(command);
186 private Object deSerialize(byte data[]) {
188 ByteArrayInputStream in = new ByteArrayInputStream(data);
189 ObjectInputStream oin = new ObjectInputStream(in);
190 return oin.readObject();
191 } catch (Exception err) {
192 err.printStackTrace();
198 public void processCommand(JDBCCommand cmd) {
199 switch (cmd.getType()) {
200 case JDBCCommand.TYPE_METADATA_REPLY:
201 this.metaData = cmd.getBluePrint();
202 synchronized (this) {
206 case JDBCCommand.TYPE_METADATA:
207 send(new JDBCCommand(this.adapter.getBluePrint()));
209 case JDBCCommand.TYPE_EXECUTE_QUERY:
211 JDBCServer.execute(cmd.getRS(), adapter);
212 send(new JDBCCommand(cmd.getRS(), JDBCCommand.TYPE_QUERY_REPLY));
213 QueryUpdater u = new QueryUpdater(cmd.getRS());
214 new Thread(u).start();
215 } catch (Exception err) {
216 send(new JDBCCommand(err, cmd.getRSID()));
219 case JDBCCommand.TYPE_QUERY_REPLY:
220 JDBCResultSet rs1 = JDBCStatement.getQuery(cmd.getRS().getID());
221 rs1.updateData(cmd.getRS());
223 case JDBCCommand.TYPE_QUERY_RECORD:
224 JDBCResultSet rs2 = JDBCStatement.getQuery(cmd.getRSID());
225 rs2.addRecord(cmd.getRecord());
227 case JDBCCommand.TYPE_QUERY_FINISH:
228 JDBCResultSet rs3 = JDBCStatement.removeQuery(cmd.getRSID());
229 rs3.setFinished(true);
231 case JDBCCommand.TYPE_QUERY_ERROR:
232 System.err.println("ERROR Executing Query\n");
233 cmd.getERROR().printStackTrace();
234 JDBCResultSet rs4 = JDBCStatement.removeQuery(cmd.getRSID());
235 rs4.setError(cmd.getERROR());
236 rs4.setFinished(true);
243 private class QueryUpdater implements Runnable {
245 private JDBCResultSet rs = null;
247 public QueryUpdater(JDBCResultSet _rs) {
253 JDBCCommand rec = new JDBCCommand(rs.getCurrent(), rs.getID());
256 JDBCCommand end = new JDBCCommand(rs.getID());
261 public void send(Object o) {
263 if (this.socket == null) {
266 } catch (Exception err) {
267 err.printStackTrace();
272 ByteArrayOutputStream bout = new ByteArrayOutputStream();
273 ObjectOutputStream oout = new ObjectOutputStream(bout);
275 byte data[] = bout.toByteArray();
276 synchronized (socket) {
277 out.writeInt(data.length);
281 } catch (Exception err) {
282 err.printStackTrace();
287 public boolean isWrapperFor(Class<?> arg0) throws SQLException {
288 // TODO Auto-generated method stub
293 public <T> T unwrap(Class<T> arg0) throws SQLException {
294 // TODO Auto-generated method stub
299 public void clearWarnings() throws SQLException {
300 // TODO Auto-generated method stub
305 public void close() throws SQLException {
309 } catch (Exception err) {
315 public void commit() throws SQLException {
316 // TODO Auto-generated method stub
321 public Array createArrayOf(String typeName, Object[] elements)
322 throws SQLException {
323 // TODO Auto-generated method stub
328 public Blob createBlob() throws SQLException {
329 // TODO Auto-generated method stub
334 public Clob createClob() throws SQLException {
335 // TODO Auto-generated method stub
340 public NClob createNClob() throws SQLException {
341 // TODO Auto-generated method stub
346 public SQLXML createSQLXML() throws SQLException {
347 // TODO Auto-generated method stub
352 public Statement createStatement() throws SQLException {
353 return new JDBCStatement(this).getProxy();
357 public Statement createStatement(int resultSetType,
358 int resultSetConcurrency, int resultSetHoldability)
359 throws SQLException {
360 return new JDBCStatement(this).getProxy();
364 public Statement createStatement(int resultSetType, int resultSetConcurrency)
365 throws SQLException {
366 return new JDBCStatement(this).getProxy();
370 public Struct createStruct(String typeName, Object[] attributes)
371 throws SQLException {
372 // TODO Auto-generated method stub
377 public boolean getAutoCommit() throws SQLException {
378 // TODO Auto-generated method stub
383 public String getCatalog() throws SQLException {
384 // TODO Auto-generated method stub
389 public Properties getClientInfo() throws SQLException {
390 // TODO Auto-generated method stub
395 public String getClientInfo(String name) throws SQLException {
396 // TODO Auto-generated method stub
401 public int getHoldability() throws SQLException {
402 // TODO Auto-generated method stub
407 public DatabaseMetaData getMetaData() throws SQLException {
408 if (this.metaData == null) {
409 JDBCCommand cmd = new JDBCCommand();
410 cmd.setType(JDBCCommand.TYPE_METADATA);
411 synchronized (this) {
415 } catch (Exception err) {
416 err.printStackTrace();
424 public int getTransactionIsolation() throws SQLException {
425 // TODO Auto-generated method stub
430 public Map<String, Class<?>> getTypeMap() throws SQLException {
431 // TODO Auto-generated method stub
436 public SQLWarning getWarnings() throws SQLException {
437 // TODO Auto-generated method stub
442 public boolean isClosed() throws SQLException {
447 public boolean isReadOnly() throws SQLException {
448 // TODO Auto-generated method stub
453 public boolean isValid(int timeout) throws SQLException {
454 // TODO Auto-generated method stub
459 public String nativeSQL(String sql) throws SQLException {
460 // TODO Auto-generated method stub
465 public CallableStatement prepareCall(String sql, int resultSetType,
466 int resultSetConcurrency, int resultSetHoldability)
467 throws SQLException {
468 // TODO Auto-generated method stub
473 public CallableStatement prepareCall(String sql, int resultSetType,
474 int resultSetConcurrency) throws SQLException {
475 // TODO Auto-generated method stub
480 public CallableStatement prepareCall(String sql) throws SQLException {
481 // TODO Auto-generated method stub
486 public PreparedStatement prepareStatement(String sql, int resultSetType,
487 int resultSetConcurrency, int resultSetHoldability)
488 throws SQLException {
489 System.err.println("SQL 1=" + sql);
490 return new JDBCStatement(this, sql).getProxy();
494 public PreparedStatement prepareStatement(String sql, int resultSetType,
495 int resultSetConcurrency) throws SQLException {
496 System.err.println("SQL 2=" + sql);
497 return new JDBCStatement(this, sql).getProxy();
501 public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
502 throws SQLException {
503 System.err.println("SQL 3=" + sql);
504 return new JDBCStatement(this, sql).getProxy();
508 public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
509 throws SQLException {
510 System.err.println("SQL 4=" + sql);
511 return new JDBCStatement(this, sql).getProxy();
515 public PreparedStatement prepareStatement(String sql, String[] columnNames)
516 throws SQLException {
517 System.err.println("SQL 5=" + sql);
518 return new JDBCStatement(this, sql).getProxy();
522 public PreparedStatement prepareStatement(String sql) throws SQLException {
523 System.err.println("SQL 6=" + sql);
524 return new JDBCStatement(this, sql).getProxy();
528 public void releaseSavepoint(Savepoint savepoint) throws SQLException {
529 // TODO Auto-generated method stub
534 public void rollback() throws SQLException {
535 // TODO Auto-generated method stub
540 public void rollback(Savepoint savepoint) throws SQLException {
541 // TODO Auto-generated method stub
546 public void setAutoCommit(boolean autoCommit) throws SQLException {
547 // TODO Auto-generated method stub
552 public void setCatalog(String catalog) throws SQLException {
553 // TODO Auto-generated method stub
558 public void setClientInfo(Properties properties)
559 throws SQLClientInfoException {
560 // TODO Auto-generated method stub
565 public void setClientInfo(String name, String value)
566 throws SQLClientInfoException {
567 // TODO Auto-generated method stub
572 public void setHoldability(int holdability) throws SQLException {
573 // TODO Auto-generated method stub
578 public void setReadOnly(boolean readOnly) throws SQLException {
579 // TODO Auto-generated method stub
584 public Savepoint setSavepoint() throws SQLException {
585 // TODO Auto-generated method stub
590 public Savepoint setSavepoint(String name) throws SQLException {
591 // TODO Auto-generated method stub
596 public void setTransactionIsolation(int level) throws SQLException {
597 // TODO Auto-generated method stub
602 public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
603 // TODO Auto-generated method stub
608 public void setSchema(String schema) throws SQLException {
609 // TODO Auto-generated method stub
614 public String getSchema() throws SQLException {
615 // TODO Auto-generated method stub
620 public void abort(Executor executor) throws SQLException {
621 // TODO Auto-generated method stub
626 public void setNetworkTimeout(Executor executor, int milliseconds)
627 throws SQLException {
628 // TODO Auto-generated method stub
633 public int getNetworkTimeout() throws SQLException {
634 // TODO Auto-generated method stub