1 package org.opendaylight.controller.md.sal.dom.xsql;
4 import java.io.FileOutputStream;
5 import java.io.InputStream;
6 import java.io.PrintStream;
7 import java.net.ServerSocket;
8 import java.net.Socket;
9 import java.util.ArrayList;
10 import java.util.Arrays;
11 import java.util.Calendar;
12 import java.util.LinkedList;
13 import java.util.List;
16 import java.util.concurrent.ConcurrentHashMap;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
20 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction;
21 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCResultSet;
22 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCServer;
23 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
24 import org.opendaylight.yangtools.yang.model.api.Module;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
28 public class XSQLAdapter extends Thread implements SchemaContextListener {
30 private static final int SLEEP = 10000;
31 private static XSQLAdapter a = new XSQLAdapter();
32 private static PrintStream l = null;
33 public boolean stopped = false;
34 private List<String> elementHosts = new ArrayList<String>();
35 private String username;
36 private String password;
37 private String transport = "tcp";
38 private int reconnectTimeout;
41 private String applicationName = "NQL Adapter";
42 private Map<String, NEEntry> elements = new ConcurrentHashMap<String, XSQLAdapter.NEEntry>();
43 private StringBuffer lastInputString = new StringBuffer();
44 private XSQLBluePrint bluePrint = new XSQLBluePrint();
45 private boolean toCsv = false;
46 private String exportToFileName = null;
47 private XSQLThreadPool threadPool = new XSQLThreadPool(1, "Tasks", 2000);
48 private JDBCServer jdbcServer = new JDBCServer(this);
49 private String pinningFile;
50 private ServerSocket serverSocket = null;
51 private DOMDataBroker domDataBroker = null;
53 private XSQLAdapter() {
54 XSQLAdapter.log("Starting Adapter");
57 serverSocket = new ServerSocket(34343);
58 } catch (Exception err) {
62 XSQLAdapter.log("Adapter Started!");
66 public static XSQLAdapter getInstance() {
70 public static void main(String args[]) {
71 XSQLAdapter adapter = new XSQLAdapter();
75 public static void log(String str) {
78 synchronized (XSQLAdapter.class) {
81 new FileOutputStream("/tmp/xql.log"));
85 l.print(Calendar.getInstance().getTime());
88 } catch (Exception err) {
89 err.printStackTrace();
93 public static void log(Exception e) {
96 synchronized (XSQLAdapter.class) {
99 new FileOutputStream("/tmp/xql.log"));
103 l.print(Calendar.getInstance().getTime());
105 e.printStackTrace(l);
106 } catch (Exception err) {
107 err.printStackTrace();
112 public void onGlobalContextUpdated(SchemaContext context) {
113 Set<Module> modules = context.getModules();
114 for (Module m : modules) {
115 if (XSQLODLUtils.createOpenDaylightCache(this.bluePrint, m)) {
116 this.addRootElement(m);
121 public void setDataBroker(DOMDataBroker ddb) {
122 this.domDataBroker = ddb;
125 public XSQLBluePrint getBluePrint() {
126 return this.bluePrint;
129 public List<Object> collectModuleRoots(XSQLBluePrintNode table) {
130 if (table.getParent().isModule()) {
132 List<Object> result = new LinkedList<Object>();
133 InstanceIdentifier instanceIdentifier =
134 InstanceIdentifier.builder()
135 .node(XSQLODLUtils.getPath(table.getODLNode()).get(0))
137 DOMDataReadTransaction t = this.domDataBroker.newReadOnlyTransaction();
139 t.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier)
141 node = XSQLODLUtils.get(node, "reference");
146 //XSQLAdapter.log(""+node);
147 Map<?, ?> children = XSQLODLUtils.getChildren(node);
148 for (Object c : children.values()) {
149 Map<?, ?> sons = XSQLODLUtils.getChildren(c);
150 for (Object child : sons.values()) {
156 } catch (Exception err) {
157 XSQLAdapter.log(err);
160 return collectModuleRoots(table.getParent());
165 public void execute(JDBCResultSet rs) {
166 List<XSQLBluePrintNode> tables = rs.getTables();
167 List<Object> roots = collectModuleRoots(tables.get(0));
168 XSQLBluePrintNode main = rs.getMainTable();
169 List<NETask> tasks = new LinkedList<XSQLAdapter.NETask>();
171 for (Object entry : roots) {
172 NETask task = new NETask(rs, entry, main,bluePrint);
176 for (NETask task : tasks) {
177 threadPool.addTask(task);
184 Socket s = serverSocket.accept();
185 new TelnetConnection(s);
186 } catch (Exception err) {
187 err.printStackTrace();
190 } catch (Exception err2) {
197 public void addRootElement(Object o) {
198 NEEntry entry = new NEEntry(o);
199 elements.put(o.toString(), entry);
203 protected void processCommand(StringBuffer inputString, PrintStream sout,
204 TelnetConnection tc) {
205 if (inputString.toString().trim().equals("r")) {
206 sout.println(lastInputString);
207 inputString = lastInputString;
209 lastInputString = inputString;
210 String input = inputString.toString().trim();
211 if (input.startsWith("setExcel")) {
212 String substr = input.substring("setExcel".length()).trim();
213 if (!substr.equals("")) {
214 //excelPath01 = substr;
216 //sout.println("Excel Path="+excelPath01);
217 } else if (input.startsWith("list vrel")) {
218 String substr = input.substring("list vrel".length()).trim();
219 XSQLBluePrintNode node = bluePrint.getBluePrintNodeByTableName(substr);
221 sout.println("Unknown Interface " + substr);
224 List<String> fld = new ArrayList<String>();
225 for (XSQLBluePrintRelation r : node.getRelations()) {
226 fld.add(r.toString());
228 String p[] = (String[]) fld.toArray(new String[fld.size()]);
230 for (int i = 0; i < p.length; i++) {
233 } else if (input.startsWith("list vfields")) {
234 String substr = input.substring("list vfields".length()).trim();
235 XSQLBluePrintNode node = bluePrint.getBluePrintNodeByTableName(substr);
237 sout.println("Unknown Interface " + substr);
240 List<String> fld = new ArrayList<String>();
241 for (XSQLColumn c : node.getColumns()) {
242 fld.add(c.getName());
244 String p[] = (String[]) fld.toArray(new String[fld.size()]);
246 for (int i = 0; i < p.length; i++) {
249 } else if (input.startsWith("jdbc")) {
250 String addr = input.substring(5).trim();
251 jdbcServer.connectToClient(addr);
252 sout.println("Connected To " + addr);
253 } else if (input.startsWith("fetch")) {
254 //fetchSize = Integer.parseInt(input.substring(6).trim());
255 } else if (input.startsWith("list vtables")) {
258 bluePrint.getAllTableNames().toArray(new String[0]);
261 for (int i = 0; i < iNames.length; i++) {
262 sout.println(iNames[i]);
264 } else if (input.startsWith("cd sid")) {
265 String substr = input.substring("cd sid".length()).trim();
266 for (NEEntry e : elements.values()) {
267 if (((Module) e.ne).getName().equals(substr)) {
268 tc.currentModule = (Module) e.ne;
271 } else if (input.equals("list sid")) {
272 String arr[] = new String[elements.size()];
275 for (NEEntry entry : elements.values()) {
276 arr[i] = entry.toString();
280 for (String s : arr) {
283 } else if (input.equals("help") || input.equals("?")) {
284 //sout.println(getLongDescription());
285 } else if (input.equals("avmdata")) {
287 //myConnection.getManagedData();
288 } catch (Exception err) {
290 } else if (input.equals("innerjoin")) {
291 //innerJoin = !innerJoin;
292 //sout.println("Inner Join set to "+innerJoin);
293 } else if (input.equals("exit")) {
296 } catch (Exception err) {
298 } else if (input.equals("tocsv")) {
300 sout.println("to csv file is " + toCsv);
301 } else if (input.indexOf("filename") != -1) {
302 exportToFileName = input.substring(input.indexOf(" ")).trim();
303 sout.println("Exporting to file:" + exportToFileName);
304 } else if (!input.equals("")) {
306 if (exportToFileName != null) {
309 new PrintStream(new File(exportToFileName));
310 executeSql(inputString.toString(), o);
312 } catch (Exception err) {
313 err.printStackTrace();
318 "export-" + System.currentTimeMillis() + ".csv";
319 PrintStream o = new PrintStream(new File(fName));
320 executeSql(inputString.toString(), o);
322 sout.println("Exported to file " + fName);
323 } catch (Exception err) {
324 err.printStackTrace();
329 executeSql(inputString.toString(), sout);
335 public void executeSql(String sql, PrintStream out) {
336 JDBCResultSet rs = new JDBCResultSet(sql);
339 jdbcServer.execute(rs, this);
340 boolean isFirst = true;
341 int loc = rs.getFields().size() - 1;
343 for (XSQLColumn c : rs.getFields()) {
355 out.print(c.getName());
358 int cw = c.getCharWidth();
359 int cnw = c.getName().length();
364 for (int i = 0; i < gap; i++) {
369 totalWidth += c.getCharWidth() + 1;
384 for (int i = 0; i < totalWidth; i++) {
392 loc = rs.getFields().size() - 1;
393 for (XSQLColumn c : rs.getFields()) {
406 Object sValue = rs.getObject(c.toString());
407 if (sValue == null) {
412 int cw = c.getCharWidth();
413 int vw = sValue.toString().length();
415 for (int i = 0; i < gap; i++) {
434 out.println("Total Number Of Records=" + count);
435 } catch (Exception err) {
436 err.printStackTrace(out);
441 public static class NETask implements Runnable {
443 private JDBCResultSet rs = null;
444 private Object modelRoot = null;
445 private XSQLBluePrintNode main = null;
446 private XSQLBluePrint bluePrint = null;
448 public NETask(JDBCResultSet _rs, Object _modelRoot,XSQLBluePrintNode _main,XSQLBluePrint _bluePrint) {
450 this.modelRoot = _modelRoot;
452 this.bluePrint = _bluePrint;
456 rs.addRecords(modelRoot, main, true, main.getBluePrintNodeName(),bluePrint);
459 if (rs.numberOfTasks == 0) {
460 rs.setFinished(true);
468 private static class NEEntry {
469 private Object ne = null;
471 public NEEntry(Object _ne) {
475 public String toString() {
476 Module m = (Module) ne;
477 return m.getName() + " [" + m.getNamespace().toString() + "]";
482 private class TelnetConnection extends Thread {
484 private Socket socket = null;
485 private InputStream in = null;
486 private PrintStream out = null;
487 private Module currentModule = null;
489 public TelnetConnection(Socket s) {
492 this.in = s.getInputStream();
493 this.out = new PrintStream(s.getOutputStream());
495 } catch (Exception err) {
496 XSQLAdapter.log(err);
501 StringBuffer inputString = new StringBuffer();
502 String prompt = "XSQL>";
505 if (currentModule != null) {
506 prompt = "XQL/" + currentModule.getName() + ">";
510 byte data[] = new byte[1];
515 inputString.append(c);
516 } catch (Exception err) {
517 err.printStackTrace(out);
521 processCommand(inputString, out, this);
522 inputString = new StringBuffer();
524 } catch (Exception err) {
527 } catch (Exception err2) {