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;
10 import com.google.common.base.Optional;
12 import java.io.FileOutputStream;
13 import java.io.InputStream;
14 import java.io.PrintStream;
15 import java.net.ServerSocket;
16 import java.net.Socket;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.Date;
20 import java.util.LinkedList;
21 import java.util.List;
22 import javax.annotation.concurrent.GuardedBy;
23 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
24 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
25 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
26 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCResultSet;
27 import org.opendaylight.controller.md.sal.dom.xsql.jdbc.JDBCServer;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
30 import org.opendaylight.yangtools.yang.model.api.Module;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
36 * @author Sharon Aicler(saichler@gmail.com)
39 * To be removed in Nitrogen
42 public class XSQLAdapter extends Thread implements SchemaContextListener {
43 private static final Logger LOG = LoggerFactory.getLogger(XSQLAdapter.class);
45 private static final int SLEEP = 10000;
46 private static XSQLAdapter a = new XSQLAdapter();
47 private static PrintStream l = null;
48 private static String tmpDir = null;
49 private static File xqlLog = null;
50 public boolean stopped = false;
51 private String username;
52 private String password;
53 private final String transport = "tcp";
54 private int reconnectTimeout;
57 private final String applicationName = "NQL Adapter";
58 private StringBuffer lastInputString = new StringBuffer();
59 private boolean toCsv = false;
60 private String exportToFileName = null;
61 private final XSQLThreadPool threadPool = new XSQLThreadPool(1, "Tasks", 2000);
62 private final JDBCServer jdbcServer = new JDBCServer(this);
63 private String pinningFile;
64 private ServerSocket serverSocket = null;
65 private DOMDataBroker domDataBroker = null;
68 private SchemaContext context;
70 private XSQLBluePrint bluePrint = new XSQLBluePrint();
72 private XSQLAdapter() {
73 XSQLAdapter.log("Starting Adapter");
76 serverSocket = new ServerSocket(34343);
77 } catch (Exception err) {
81 XSQLAdapter.log("Adapter Started!");
85 public synchronized void loadBluePrint(){
87 InputStream in = this.getClass().getClassLoader().getResourceAsStream("BluePrintCache.dat");
89 this.bluePrint = XSQLBluePrint.load(in);
92 }catch(Exception err){
93 err.printStackTrace();
97 public static XSQLAdapter getInstance() {
101 public static File getXQLLogfile() {
102 tmpDir = System.getProperty("java.io.tmpdir");
103 xqlLog = new File(tmpDir + "/xql.log");
107 public static void main(final String args[]) {
108 XSQLAdapter adapter = new XSQLAdapter();
112 public static void log(final String str) {
115 synchronized (XSQLAdapter.class) {
118 new FileOutputStream(getXQLLogfile()));
125 } catch (Exception err) {
126 err.printStackTrace();
130 public static void log(final Exception e) {
133 synchronized (XSQLAdapter.class) {
136 new FileOutputStream(getXQLLogfile()));
142 e.printStackTrace(l);
143 } catch (Exception err) {
144 err.printStackTrace();
149 public synchronized void onGlobalContextUpdated(final SchemaContext context) {
150 this.bluePrint = null;
151 this.context = context;
154 public void setDataBroker(final DOMDataBroker ddb) {
155 this.domDataBroker = ddb;
158 public synchronized XSQLBluePrint getBluePrint() {
159 if (bluePrint == null) {
160 LOG.warn("XSQL is not supported in production environments and will be removed in a future release");
161 bluePrint = XSQLBluePrint.create(context);
167 public List<NormalizedNode<?, ?>> collectModuleRoots(final XSQLBluePrintNode table,final LogicalDatastoreType type) {
168 if (table.getParent().isModule()) {
170 List<NormalizedNode<?, ?>> result = new LinkedList<>();
171 YangInstanceIdentifier instanceIdentifier = YangInstanceIdentifier
173 .node(XSQLODLUtils.getPath(table.getFirstFromSchemaNodes()).get(0))
175 DOMDataReadOnlyTransaction t = this.domDataBroker
176 .newReadOnlyTransaction();
177 Optional<NormalizedNode<?, ?>> node = t.read(type,
178 instanceIdentifier).get();
181 if (node.isPresent()) {
182 result.add(node.get());
186 } catch (Exception err) {
187 XSQLAdapter.log(err);
190 return collectModuleRoots(table.getParent(),type);
195 public void execute(final JDBCResultSet rs) {
196 if(this.domDataBroker==null){
197 rs.setFinished(true);
200 List<XSQLBluePrintNode> tables = rs.getTables();
201 List<NormalizedNode<?, ?>> roots = collectModuleRoots(tables.get(0),LogicalDatastoreType.OPERATIONAL);
202 roots.addAll(collectModuleRoots(tables.get(0),LogicalDatastoreType.CONFIGURATION));
204 rs.setFinished(true);
206 XSQLBluePrintNode main = rs.getMainTable();
207 List<NETask> tasks = new LinkedList<>();
209 for (NormalizedNode<?, ?> entry : roots) {
210 NETask task = new NETask(rs, entry, main, getBluePrint());
214 for (NETask task : tasks) {
215 threadPool.addTask(task);
223 Socket s = serverSocket.accept();
224 new TelnetConnection(s);
225 } catch (Exception err) {
226 err.printStackTrace();
229 } catch (Exception err2) {
236 public void processCommand(StringBuffer inputString, final PrintStream sout) {
237 if (inputString.toString().trim().equals("r")) {
238 sout.println(lastInputString);
239 inputString = lastInputString;
241 lastInputString = inputString;
242 String input = inputString.toString().trim();
243 if (input.startsWith("setExcel")) {
244 String substr = input.substring("setExcel".length()).trim();
245 if (!substr.equals("")) {
246 // excelPath01 = substr;
248 // sout.println("Excel Path="+excelPath01);
249 } else if (input.startsWith("list vrel")) {
250 String substr = input.substring("list vrel".length()).trim();
251 XSQLBluePrintNode node = getBluePrint().getBluePrintNodeByTableName(substr);
253 sout.println("Unknown Interface " + substr);
256 List<String> fld = new ArrayList<>();
257 for (XSQLBluePrintRelation r : node.getRelations()) {
258 fld.add(r.toString());
260 String p[] = fld.toArray(new String[fld.size()]);
262 for (String element : p) {
263 sout.println(element);
265 } else if (input.startsWith("list vfields")) {
266 String substr = input.substring("list vfields".length()).trim();
267 XSQLBluePrintNode node = getBluePrint().getBluePrintNodeByTableName(substr);
269 sout.println("Unknown Interface " + substr);
272 List<String> fld = new ArrayList<>();
273 for (XSQLColumn c : node.getColumns()) {
274 fld.add(c.getName());
276 String p[] = fld.toArray(new String[fld.size()]);
278 for (String element : p) {
279 sout.println(element);
281 } else if (input.startsWith("jdbc")) {
282 String addr = input.substring(5).trim();
283 jdbcServer.connectToClient(addr);
284 sout.println("Connected To " + addr);
285 } else if (input.startsWith("fetch")) {
286 // fetchSize = Integer.parseInt(input.substring(6).trim());
287 } else if (input.startsWith("list vtables")) {
289 String iNames[] = getBluePrint().getAllTableNames().toArray(
293 for (String iName : iNames) {
296 } else if (input.equals("help") || input.equals("?")) {
297 // sout.println(getLongDescription());
298 } else if (input.equals("avmdata")) {
300 // myConnection.getManagedData();
301 } catch (Exception err) {
303 } else if (input.equals("innerjoin")) {
304 // innerJoin = !innerJoin;
305 // sout.println("Inner Join set to "+innerJoin);
306 } else if (input.equals("exit")) {
309 } catch (Exception err) {
311 } else if (input.equals("save")) {
312 getBluePrint().save();
313 } else if (input.equals("tocsv")) {
315 sout.println("to csv file is " + toCsv);
316 } else if (input.indexOf("filename") != -1) {
317 exportToFileName = input.substring(input.indexOf(" ")).trim();
318 sout.println("Exporting to file:" + exportToFileName);
319 } else if (!input.equals("")) {
321 if (exportToFileName != null) {
323 PrintStream o = new PrintStream(new File(
325 executeSql(inputString.toString(), o);
327 } catch (Exception err) {
328 err.printStackTrace();
332 String fName = "export-" + System.currentTimeMillis()
334 PrintStream o = new PrintStream(new File(fName));
335 executeSql(inputString.toString(), o);
337 sout.println("Exported to file " + fName);
338 } catch (Exception err) {
339 err.printStackTrace();
344 executeSql(inputString.toString(), sout);
350 public void executeSql(final String sql, final PrintStream out) {
351 JDBCResultSet rs = new JDBCResultSet(sql);
354 JDBCServer.execute(rs, this);
355 boolean isFirst = true;
356 int loc = rs.getFields().size() - 1;
358 for (XSQLColumn c : rs.getFields()) {
370 out.print(c.getName());
373 int cw = c.getCharWidth();
374 int cnw = c.getName().length();
379 for (int i = 0; i < gap; i++) {
384 totalWidth += c.getCharWidth() + 1;
399 for (int i = 0; i < totalWidth; i++) {
407 loc = rs.getFields().size() - 1;
408 for (XSQLColumn c : rs.getFields()) {
420 Object sValue = rs.getObject(c.toString());
421 if (sValue == null) {
426 int cw = c.getCharWidth();
427 int vw = sValue.toString().length();
429 for (int i = 0; i < gap; i++) {
447 out.println("Total Number Of Records=" + count);
448 } catch (Exception err) {
449 err.printStackTrace(out);
453 public static class NETask implements Runnable {
455 private final JDBCResultSet rs;
456 private final NormalizedNode<?, ?> modelRoot;
457 private final XSQLBluePrintNode main;
458 private final XSQLBluePrint bluePrint;
460 public NETask(final JDBCResultSet _rs, final NormalizedNode<?, ?> _modelRoot,
461 final XSQLBluePrintNode _main, final XSQLBluePrint _bluePrint) {
463 this.modelRoot = _modelRoot;
465 this.bluePrint = _bluePrint;
470 rs.addRecords(modelRoot, main, true, main.getBluePrintNodeName(),
474 if (rs.numberOfTasks == 0) {
475 rs.setFinished(true);
482 private class TelnetConnection extends Thread {
484 private Socket socket = null;
485 private InputStream in = null;
486 private PrintStream out = null;
487 private final Module currentModule = null;
489 public TelnetConnection(final Socket s) {
492 this.in = s.getInputStream();
493 this.out = new PrintStream(s.getOutputStream());
495 } catch (Exception err) {
496 XSQLAdapter.log(err);
502 StringBuffer inputString = new StringBuffer();
503 String prompt = "XSQL>";
506 if (currentModule != null) {
507 prompt = "XQL/" + currentModule.getName() + ">";
511 byte data[] = new byte[1];
512 while (!socket.isClosed() && socket.isConnected() && !socket.isInputShutdown() && c != '\n') {
516 inputString.append(c);
517 } catch (Exception err) {
518 err.printStackTrace(out);
524 processCommand(inputString, out);
525 inputString = new StringBuffer();
527 } catch (Exception err) {
530 } catch (Exception err2) {