2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.sal.dom.xsql;
11 import java.io.FileOutputStream;
12 import java.io.InputStream;
13 import java.io.PrintStream;
14 import java.net.ServerSocket;
15 import java.net.Socket;
16 import java.util.ArrayList;
17 import java.util.Arrays;
18 import java.util.Date;
19 import java.util.LinkedList;
20 import java.util.List;
23 import java.util.concurrent.ConcurrentHashMap;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
27 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction;
28 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCResultSet;
29 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCServer;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
31 import org.opendaylight.yangtools.yang.model.api.Module;
32 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
33 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
35 * @author Sharon Aicler(saichler@gmail.com)
38 * To be removed in Nitrogen
41 public class XSQLAdapter extends Thread implements SchemaContextListener {
43 private static final int SLEEP = 10000;
44 private static XSQLAdapter a = new XSQLAdapter();
45 private static PrintStream l = null;
46 private static String tmpDir = null;
47 private static File xqlLog = null;
48 public boolean stopped = false;
49 private List<String> elementHosts = new ArrayList<>();
50 private String username;
51 private String password;
52 private String transport = "tcp";
53 private int reconnectTimeout;
56 private String applicationName = "NQL Adapter";
57 private Map<String, NEEntry> elements = new ConcurrentHashMap<>();
58 private StringBuffer lastInputString = new StringBuffer();
59 private XSQLBluePrint bluePrint = new XSQLBluePrint();
60 private boolean toCsv = false;
61 private String exportToFileName = null;
62 private XSQLThreadPool threadPool = new XSQLThreadPool(1, "Tasks", 2000);
63 private JDBCServer jdbcServer = new JDBCServer(this);
64 private String pinningFile;
65 private ServerSocket serverSocket = null;
66 private DOMDataBroker domDataBroker = null;
67 private static final String REFERENCE_FIELD_NAME = "reference";
69 private XSQLAdapter() {
70 XSQLAdapter.log("Starting Adapter");
73 serverSocket = new ServerSocket(34343);
74 } catch (Exception err) {
78 XSQLAdapter.log("Adapter Started!");
82 public void loadBluePrint(){
84 InputStream in = this.getClass().getClassLoader().getResourceAsStream("BluePrintCache.dat");
86 this.bluePrint = XSQLBluePrint.load(in);
89 }catch(Exception err){
90 err.printStackTrace();
94 public static XSQLAdapter getInstance() {
98 public static File getXQLLogfile() {
99 tmpDir = System.getProperty("java.io.tmpdir");
100 xqlLog = new File(tmpDir + "/xql.log");
104 public static void main(String args[]) {
105 XSQLAdapter adapter = new XSQLAdapter();
109 public static void log(String str) {
112 synchronized (XSQLAdapter.class) {
115 new FileOutputStream(getXQLLogfile()));
122 } catch (Exception err) {
123 err.printStackTrace();
127 public static void log(Exception e) {
130 synchronized (XSQLAdapter.class) {
133 new FileOutputStream(getXQLLogfile()));
139 e.printStackTrace(l);
140 } catch (Exception err) {
141 err.printStackTrace();
146 public void onGlobalContextUpdated(SchemaContext context) {
147 Set<Module> modules = context.getModules();
148 for (Module m : modules) {
149 if (XSQLODLUtils.createOpenDaylightCache(this.bluePrint, m)) {
150 this.addRootElement(m);
155 public void setDataBroker(DOMDataBroker ddb) {
156 this.domDataBroker = ddb;
159 public XSQLBluePrint getBluePrint() {
160 return this.bluePrint;
163 public List<Object> collectModuleRoots(XSQLBluePrintNode table,LogicalDatastoreType type) {
164 if (table.getParent().isModule()) {
166 List<Object> result = new LinkedList<>();
167 YangInstanceIdentifier instanceIdentifier = YangInstanceIdentifier
169 .node(XSQLODLUtils.getPath(table.getFirstFromSchemaNodes()).get(0))
171 DOMDataReadTransaction t = this.domDataBroker
172 .newReadOnlyTransaction();
173 Object node = t.read(type,
174 instanceIdentifier).get();
176 node = XSQLODLUtils.get(node, REFERENCE_FIELD_NAME);
182 } catch (Exception err) {
183 XSQLAdapter.log(err);
186 return collectModuleRoots(table.getParent(),type);
191 public void execute(JDBCResultSet rs) {
192 if(this.domDataBroker==null){
193 rs.setFinished(true);
196 List<XSQLBluePrintNode> tables = rs.getTables();
197 List<Object> roots = collectModuleRoots(tables.get(0),LogicalDatastoreType.OPERATIONAL);
198 roots.addAll(collectModuleRoots(tables.get(0),LogicalDatastoreType.CONFIGURATION));
200 rs.setFinished(true);
202 XSQLBluePrintNode main = rs.getMainTable();
203 List<NETask> tasks = new LinkedList<>();
205 for (Object entry : roots) {
206 NETask task = new NETask(rs, entry, main, bluePrint);
210 for (NETask task : tasks) {
211 threadPool.addTask(task);
218 Socket s = serverSocket.accept();
219 new TelnetConnection(s);
220 } catch (Exception err) {
221 err.printStackTrace();
224 } catch (Exception err2) {
231 public void addRootElement(Object o) {
232 NEEntry entry = new NEEntry(o);
233 elements.put(o.toString(), entry);
237 public void processCommand(StringBuffer inputString, PrintStream sout) {
238 if (inputString.toString().trim().equals("r")) {
239 sout.println(lastInputString);
240 inputString = lastInputString;
242 lastInputString = inputString;
243 String input = inputString.toString().trim();
244 if (input.startsWith("setExcel")) {
245 String substr = input.substring("setExcel".length()).trim();
246 if (!substr.equals("")) {
247 // excelPath01 = substr;
249 // sout.println("Excel Path="+excelPath01);
250 } else if (input.startsWith("list vrel")) {
251 String substr = input.substring("list vrel".length()).trim();
252 XSQLBluePrintNode node = bluePrint
253 .getBluePrintNodeByTableName(substr);
255 sout.println("Unknown Interface " + substr);
258 List<String> fld = new ArrayList<>();
259 for (XSQLBluePrintRelation r : node.getRelations()) {
260 fld.add(r.toString());
262 String p[] = (String[]) fld.toArray(new String[fld.size()]);
264 for (int i = 0; i < p.length; i++) {
267 } else if (input.startsWith("list vfields")) {
268 String substr = input.substring("list vfields".length()).trim();
269 XSQLBluePrintNode node = bluePrint
270 .getBluePrintNodeByTableName(substr);
272 sout.println("Unknown Interface " + substr);
275 List<String> fld = new ArrayList<>();
276 for (XSQLColumn c : node.getColumns()) {
277 fld.add(c.getName());
279 String p[] = (String[]) fld.toArray(new String[fld.size()]);
281 for (int i = 0; i < p.length; i++) {
284 } else if (input.startsWith("jdbc")) {
285 String addr = input.substring(5).trim();
286 jdbcServer.connectToClient(addr);
287 sout.println("Connected To " + addr);
288 } else if (input.startsWith("fetch")) {
289 // fetchSize = Integer.parseInt(input.substring(6).trim());
290 } else if (input.startsWith("list vtables")) {
292 String iNames[] = bluePrint.getAllTableNames().toArray(
296 for (int i = 0; i < iNames.length; i++) {
297 sout.println(iNames[i]);
299 } else if (input.equals("help") || input.equals("?")) {
300 // sout.println(getLongDescription());
301 } else if (input.equals("avmdata")) {
303 // myConnection.getManagedData();
304 } catch (Exception err) {
306 } else if (input.equals("innerjoin")) {
307 // innerJoin = !innerJoin;
308 // sout.println("Inner Join set to "+innerJoin);
309 } else if (input.equals("exit")) {
312 } catch (Exception err) {
314 } else if (input.equals("save")) {
315 XSQLBluePrint.save(this.bluePrint);
316 } else if (input.equals("tocsv")) {
318 sout.println("to csv file is " + toCsv);
319 } else if (input.indexOf("filename") != -1) {
320 exportToFileName = input.substring(input.indexOf(" ")).trim();
321 sout.println("Exporting to file:" + exportToFileName);
322 } else if (!input.equals("")) {
324 if (exportToFileName != null) {
326 PrintStream o = new PrintStream(new File(
328 executeSql(inputString.toString(), o);
330 } catch (Exception err) {
331 err.printStackTrace();
335 String fName = "export-" + System.currentTimeMillis()
337 PrintStream o = new PrintStream(new File(fName));
338 executeSql(inputString.toString(), o);
340 sout.println("Exported to file " + fName);
341 } catch (Exception err) {
342 err.printStackTrace();
347 executeSql(inputString.toString(), sout);
353 public void executeSql(String sql, PrintStream out) {
354 JDBCResultSet rs = new JDBCResultSet(sql);
357 JDBCServer.execute(rs, this);
358 boolean isFirst = true;
359 int loc = rs.getFields().size() - 1;
361 for (XSQLColumn c : rs.getFields()) {
373 out.print(c.getName());
376 int cw = c.getCharWidth();
377 int cnw = c.getName().length();
382 for (int i = 0; i < gap; i++) {
387 totalWidth += c.getCharWidth() + 1;
402 for (int i = 0; i < totalWidth; i++) {
410 loc = rs.getFields().size() - 1;
411 for (XSQLColumn c : rs.getFields()) {
423 Object sValue = rs.getObject(c.toString());
424 if (sValue == null) {
429 int cw = c.getCharWidth();
430 int vw = sValue.toString().length();
432 for (int i = 0; i < gap; i++) {
450 out.println("Total Number Of Records=" + count);
451 } catch (Exception err) {
452 err.printStackTrace(out);
456 public static class NETask implements Runnable {
458 private JDBCResultSet rs = null;
459 private Object modelRoot = null;
460 private XSQLBluePrintNode main = null;
461 private XSQLBluePrint bluePrint = null;
463 public NETask(JDBCResultSet _rs, Object _modelRoot,
464 XSQLBluePrintNode _main, XSQLBluePrint _bluePrint) {
466 this.modelRoot = _modelRoot;
468 this.bluePrint = _bluePrint;
472 rs.addRecords(modelRoot, main, true, main.getBluePrintNodeName(),
476 if (rs.numberOfTasks == 0) {
477 rs.setFinished(true);
484 private static class NEEntry {
485 private Object ne = null;
487 public NEEntry(Object _ne) {
491 public String toString() {
492 Module m = (Module) ne;
493 return m.getName() + " [" + m.getNamespace().toString() + "]";
497 private class TelnetConnection extends Thread {
499 private Socket socket = null;
500 private InputStream in = null;
501 private PrintStream out = null;
502 private Module currentModule = null;
504 public TelnetConnection(Socket s) {
507 this.in = s.getInputStream();
508 this.out = new PrintStream(s.getOutputStream());
510 } catch (Exception err) {
511 XSQLAdapter.log(err);
516 StringBuffer inputString = new StringBuffer();
517 String prompt = "XSQL>";
520 if (currentModule != null) {
521 prompt = "XQL/" + currentModule.getName() + ">";
525 byte data[] = new byte[1];
526 while (!socket.isClosed() && socket.isConnected() && !socket.isInputShutdown() && c != '\n') {
530 inputString.append(c);
531 } catch (Exception err) {
532 err.printStackTrace(out);
538 processCommand(inputString, out);
539 inputString = new StringBuffer();
541 } catch (Exception err) {
544 } catch (Exception err2) {