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.YangInstanceIdentifier;
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 private static String tmpDir = null;
34 private static File xqlLog = null;
35 public boolean stopped = false;
36 private List<String> elementHosts = new ArrayList<String>();
37 private String username;
38 private String password;
39 private String transport = "tcp";
40 private int reconnectTimeout;
43 private String applicationName = "NQL Adapter";
44 private Map<String, NEEntry> elements = new ConcurrentHashMap<String, XSQLAdapter.NEEntry>();
45 private StringBuffer lastInputString = new StringBuffer();
46 private XSQLBluePrint bluePrint = new XSQLBluePrint();
47 private boolean toCsv = false;
48 private String exportToFileName = null;
49 private XSQLThreadPool threadPool = new XSQLThreadPool(1, "Tasks", 2000);
50 private JDBCServer jdbcServer = new JDBCServer(this);
51 private String pinningFile;
52 private ServerSocket serverSocket = null;
53 private DOMDataBroker domDataBroker = null;
55 private XSQLAdapter() {
56 XSQLAdapter.log("Starting Adapter");
59 serverSocket = new ServerSocket(34343);
60 } catch (Exception err) {
64 XSQLAdapter.log("Adapter Started!");
68 public void loadBluePrint(){
70 InputStream in = this.getClass().getClassLoader().getResourceAsStream("BluePrintCache.dat");
72 this.bluePrint = XSQLBluePrint.load(in);
75 }catch(Exception err){
76 err.printStackTrace();
80 public static XSQLAdapter getInstance() {
84 public static File getXQLLogfile() {
85 tmpDir = System.getProperty("java.io.tmpdir");
86 xqlLog = new File(tmpDir + "/xql.log");
90 public static void main(String args[]) {
91 XSQLAdapter adapter = new XSQLAdapter();
95 public static void log(String str) {
98 synchronized (XSQLAdapter.class) {
101 new FileOutputStream(getXQLLogfile()));
105 l.print(Calendar.getInstance().getTime());
108 } catch (Exception err) {
109 err.printStackTrace();
113 public static void log(Exception e) {
116 synchronized (XSQLAdapter.class) {
119 new FileOutputStream(getXQLLogfile()));
123 l.print(Calendar.getInstance().getTime());
125 e.printStackTrace(l);
126 } catch (Exception err) {
127 err.printStackTrace();
132 public void onGlobalContextUpdated(SchemaContext context) {
133 Set<Module> modules = context.getModules();
134 for (Module m : modules) {
135 if (XSQLODLUtils.createOpenDaylightCache(this.bluePrint, m)) {
136 this.addRootElement(m);
141 public void setDataBroker(DOMDataBroker ddb) {
142 this.domDataBroker = ddb;
145 public XSQLBluePrint getBluePrint() {
146 return this.bluePrint;
149 public List<Object> collectModuleRoots(XSQLBluePrintNode table,LogicalDatastoreType type) {
150 if (table.getParent().isModule()) {
152 List<Object> result = new LinkedList<Object>();
153 YangInstanceIdentifier instanceIdentifier = YangInstanceIdentifier
155 .node(XSQLODLUtils.getPath(table.getODLNode()).get(0))
157 DOMDataReadTransaction t = this.domDataBroker
158 .newReadOnlyTransaction();
159 Object node = t.read(type,
160 instanceIdentifier).get();
162 node = XSQLODLUtils.get(node, "reference");
167 // XSQLAdapter.log(""+node);
168 Map<?, ?> children = XSQLODLUtils.getChildren(node);
169 for (Object c : children.values()) {
170 Map<?, ?> sons = XSQLODLUtils.getChildren(c);
171 for (Object child : sons.values()) {
177 } catch (Exception err) {
178 XSQLAdapter.log(err);
181 return collectModuleRoots(table.getParent(),type);
186 public void execute(JDBCResultSet rs) {
187 if(this.domDataBroker==null){
188 rs.setFinished(true);
191 List<XSQLBluePrintNode> tables = rs.getTables();
192 List<Object> roots = collectModuleRoots(tables.get(0),LogicalDatastoreType.OPERATIONAL);
193 roots.addAll(collectModuleRoots(tables.get(0),LogicalDatastoreType.CONFIGURATION));
195 rs.setFinished(true);
197 XSQLBluePrintNode main = rs.getMainTable();
198 List<NETask> tasks = new LinkedList<XSQLAdapter.NETask>();
200 for (Object entry : roots) {
201 NETask task = new NETask(rs, entry, main, bluePrint);
205 for (NETask task : tasks) {
206 threadPool.addTask(task);
213 Socket s = serverSocket.accept();
214 new TelnetConnection(s);
215 } catch (Exception err) {
216 err.printStackTrace();
219 } catch (Exception err2) {
226 public void addRootElement(Object o) {
227 NEEntry entry = new NEEntry(o);
228 elements.put(o.toString(), entry);
232 public void processCommand(StringBuffer inputString, PrintStream sout) {
233 if (inputString.toString().trim().equals("r")) {
234 sout.println(lastInputString);
235 inputString = lastInputString;
237 lastInputString = inputString;
238 String input = inputString.toString().trim();
239 if (input.startsWith("setExcel")) {
240 String substr = input.substring("setExcel".length()).trim();
241 if (!substr.equals("")) {
242 // excelPath01 = substr;
244 // sout.println("Excel Path="+excelPath01);
245 } else if (input.startsWith("list vrel")) {
246 String substr = input.substring("list vrel".length()).trim();
247 XSQLBluePrintNode node = bluePrint
248 .getBluePrintNodeByTableName(substr);
250 sout.println("Unknown Interface " + substr);
253 List<String> fld = new ArrayList<String>();
254 for (XSQLBluePrintRelation r : node.getRelations()) {
255 fld.add(r.toString());
257 String p[] = (String[]) fld.toArray(new String[fld.size()]);
259 for (int i = 0; i < p.length; i++) {
262 } else if (input.startsWith("list vfields")) {
263 String substr = input.substring("list vfields".length()).trim();
264 XSQLBluePrintNode node = bluePrint
265 .getBluePrintNodeByTableName(substr);
267 sout.println("Unknown Interface " + substr);
270 List<String> fld = new ArrayList<String>();
271 for (XSQLColumn c : node.getColumns()) {
272 fld.add(c.getName());
274 String p[] = (String[]) fld.toArray(new String[fld.size()]);
276 for (int i = 0; i < p.length; i++) {
279 } else if (input.startsWith("jdbc")) {
280 String addr = input.substring(5).trim();
281 jdbcServer.connectToClient(addr);
282 sout.println("Connected To " + addr);
283 } else if (input.startsWith("fetch")) {
284 // fetchSize = Integer.parseInt(input.substring(6).trim());
285 } else if (input.startsWith("list vtables")) {
287 String iNames[] = bluePrint.getAllTableNames().toArray(
291 for (int i = 0; i < iNames.length; i++) {
292 sout.println(iNames[i]);
294 } else if (input.equals("help") || input.equals("?")) {
295 // sout.println(getLongDescription());
296 } else if (input.equals("avmdata")) {
298 // myConnection.getManagedData();
299 } catch (Exception err) {
301 } else if (input.equals("innerjoin")) {
302 // innerJoin = !innerJoin;
303 // sout.println("Inner Join set to "+innerJoin);
304 } else if (input.equals("exit")) {
307 } catch (Exception err) {
309 } else if (input.equals("save")) {
310 XSQLBluePrint.save(this.bluePrint);
311 } else if (input.equals("tocsv")) {
313 sout.println("to csv file is " + toCsv);
314 } else if (input.indexOf("filename") != -1) {
315 exportToFileName = input.substring(input.indexOf(" ")).trim();
316 sout.println("Exporting to file:" + exportToFileName);
317 } else if (!input.equals("")) {
319 if (exportToFileName != null) {
321 PrintStream o = new PrintStream(new File(
323 executeSql(inputString.toString(), o);
325 } catch (Exception err) {
326 err.printStackTrace();
330 String fName = "export-" + System.currentTimeMillis()
332 PrintStream o = new PrintStream(new File(fName));
333 executeSql(inputString.toString(), o);
335 sout.println("Exported to file " + fName);
336 } catch (Exception err) {
337 err.printStackTrace();
342 executeSql(inputString.toString(), sout);
348 public void executeSql(String sql, PrintStream out) {
349 JDBCResultSet rs = new JDBCResultSet(sql);
352 JDBCServer.execute(rs, this);
353 boolean isFirst = true;
354 int loc = rs.getFields().size() - 1;
356 for (XSQLColumn c : rs.getFields()) {
368 out.print(c.getName());
371 int cw = c.getCharWidth();
372 int cnw = c.getName().length();
377 for (int i = 0; i < gap; i++) {
382 totalWidth += c.getCharWidth() + 1;
397 for (int i = 0; i < totalWidth; i++) {
405 loc = rs.getFields().size() - 1;
406 for (XSQLColumn c : rs.getFields()) {
418 Object sValue = rs.getObject(c.toString());
419 if (sValue == null) {
424 int cw = c.getCharWidth();
425 int vw = sValue.toString().length();
427 for (int i = 0; i < gap; i++) {
445 out.println("Total Number Of Records=" + count);
446 } catch (Exception err) {
447 err.printStackTrace(out);
451 public static class NETask implements Runnable {
453 private JDBCResultSet rs = null;
454 private Object modelRoot = null;
455 private XSQLBluePrintNode main = null;
456 private XSQLBluePrint bluePrint = null;
458 public NETask(JDBCResultSet _rs, Object _modelRoot,
459 XSQLBluePrintNode _main, XSQLBluePrint _bluePrint) {
461 this.modelRoot = _modelRoot;
463 this.bluePrint = _bluePrint;
467 rs.addRecords(modelRoot, main, true, main.getBluePrintNodeName(),
471 if (rs.numberOfTasks == 0) {
472 rs.setFinished(true);
479 private static class NEEntry {
480 private Object ne = null;
482 public NEEntry(Object _ne) {
486 public String toString() {
487 Module m = (Module) ne;
488 return m.getName() + " [" + m.getNamespace().toString() + "]";
492 private class TelnetConnection extends Thread {
494 private Socket socket = null;
495 private InputStream in = null;
496 private PrintStream out = null;
497 private Module currentModule = null;
499 public TelnetConnection(Socket s) {
502 this.in = s.getInputStream();
503 this.out = new PrintStream(s.getOutputStream());
505 } catch (Exception err) {
506 XSQLAdapter.log(err);
511 StringBuffer inputString = new StringBuffer();
512 String prompt = "XSQL>";
515 if (currentModule != null) {
516 prompt = "XQL/" + currentModule.getName() + ">";
520 byte data[] = new byte[1];
521 while (!socket.isClosed() && socket.isConnected() && !socket.isInputShutdown() && c != '\n') {
525 inputString.append(c);
526 } catch (Exception err) {
527 err.printStackTrace(out);
533 processCommand(inputString, out);
534 inputString = new StringBuffer();
536 } catch (Exception err) {
539 } catch (Exception err2) {