From 012a5d6c7c92581777e484b7e2f9e4e56534d3ba Mon Sep 17 00:00:00 2001 From: stefano Date: Fri, 25 Jun 2010 00:53:31 +0200 Subject: [PATCH] Added Start Control for the presence of MySQL Database; Added Popup for the request of MySQL DataBase credentials; Added the Connection to the Databse on the OlsrdDataSource class; Added the possibility to start the application without store the data; Added the LatLonJsUtility for adding LatLon.js file data into MySQLDatabase; General improvements for Database output and ServiceDiscovery; --- nbproject/build-impl.xml | 59 +- nbproject/genfiles.properties | 4 +- nbproject/private/private.properties | 2 +- nbproject/project.properties | 2 +- nbproject/project.xml | 1 - src/freimapgsoc/CredentialRequired.java | 5 +- src/freimapgsoc/LatLonJsToMySQL.form | 2 +- src/freimapgsoc/LatLonJsToMySQL.java | 241 ++++--- src/freimapgsoc/Layer.java | 3 +- src/freimapgsoc/MainLayer.form | 2 +- src/freimapgsoc/MainLayer.java | 2 +- src/freimapgsoc/MySQLCredential.form | 391 ++++++++++ src/freimapgsoc/MySQLCredential.java | 680 ++++++++++++++++++ src/freimapgsoc/OlsrdDataSource.java | 620 +++++++++------- src/freimapgsoc/ServiceDiscovery.java | 3 +- src/freimapgsoc/ServiceDiscoveryUnicast.form | 66 +- src/freimapgsoc/ServiceDiscoveryUnicast.java | 54 +- src/freimapgsoc/Start.form | 44 +- src/freimapgsoc/Start.java | 50 +- .../ServiceDiscoveryUnicast.properties | 17 +- src/freimapgsoc/resources/Start.properties | 6 + src/freimapgsoc/resources/eth1Stefa | Bin 0 -> 33635 bytes src/freimapgsoc/resources/eth2Stefa.png | Bin 0 -> 29840 bytes src/freimapgsoc/resources/tap0Stefa.png | Bin 0 -> 44927 bytes {src => test}/freimapgsoc/SDListener.java | 0 {src => test}/freimapgsoc/SDMain.java | 1 + {src => test}/freimapgsoc/SDResponder.java | 0 27 files changed, 1701 insertions(+), 554 deletions(-) create mode 100644 src/freimapgsoc/MySQLCredential.form create mode 100644 src/freimapgsoc/MySQLCredential.java create mode 100644 src/freimapgsoc/resources/eth1Stefa create mode 100644 src/freimapgsoc/resources/eth2Stefa.png create mode 100644 src/freimapgsoc/resources/tap0Stefa.png rename {src => test}/freimapgsoc/SDListener.java (100%) rename {src => test}/freimapgsoc/SDMain.java (99%) rename {src => test}/freimapgsoc/SDResponder.java (100%) diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index 8d75fea..096f3b3 100755 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -79,43 +79,6 @@ is divided into following sections: - - - - - - - - - - - - - - - - - - - - - - - - - - Must set platform.home - Must set platform.bootcp - Must set platform.java - Must set platform.javac - - The J2SE Platform is not correctly set up. - Your active platform is: ${platform.active}, but the corresponding property "platforms.${platform.active}.home" is not found in the project's properties files. - Either open the project in the IDE and setup the Platform with the same name or add it manually. - For example like this: - ant -Duser.properties.file=<path_to_property_file> jar (where you put the property "platforms.${platform.active}.home" in a .properties file) - or ant -Dplatforms.${platform.active}.home=<path_to_JDK_home> jar (where no properties file is used) - @@ -217,6 +180,7 @@ is divided into following sections: + @@ -257,7 +221,7 @@ is divided into following sections: - + @@ -306,7 +270,7 @@ is divided into following sections: - + @@ -337,9 +301,6 @@ is divided into following sections: - - - @@ -355,9 +316,7 @@ is divided into following sections: - - - + @@ -382,7 +341,7 @@ is divided into following sections: - + @@ -407,7 +366,7 @@ is divided into following sections: - + @@ -532,7 +491,7 @@ is divided into following sections: - ${platform.java} -cp "${run.classpath.with.dist.jar}" ${main.class} + java -cp "${run.classpath.with.dist.jar}" ${main.class} @@ -557,7 +516,7 @@ is divided into following sections: To run this application from the command line without Ant, try: - ${platform.java} -jar "${dist.jar.resolved}" + java -jar "${dist.jar.resolved}" @@ -677,7 +636,7 @@ is divided into following sections: --> - + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index 5fca1bc..71e849f 100755 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -3,8 +3,8 @@ build.xml.script.CRC32=fecf65ff build.xml.stylesheet.CRC32=958a1d3e@1.26.1.45 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=56b42000 -nbproject/build-impl.xml.script.CRC32=727f9f53 +nbproject/build-impl.xml.data.CRC32=78461136 +nbproject/build-impl.xml.script.CRC32=c0c3402b nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45 nbproject/management-build-impl.xml.data.CRC32=add1b344 nbproject/management-build-impl.xml.script.CRC32=253f0558 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index a753feb..879b2a2 100644 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -5,4 +5,4 @@ file.reference.mysql-connector-java-5.0.5-bin.jar=/Users/Stefano/Desktop/Freimap javac.debug=true javadoc.preview=true jaxbwiz.endorsed.dirs=/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ide12/modules/ext/jaxb/api -user.properties.file=/Users/Stefano/.netbeans/6.8/build.properties +user.properties.file=/Users/stefano/.netbeans/6.8/build.properties diff --git a/nbproject/project.properties b/nbproject/project.properties index e693b08..ac29ec7 100755 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -82,7 +82,7 @@ jnlp.signed=false main.class=freimapgsoc.Start manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF -platform.active=JDK_1.6 +platform.active=default_platform run.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/nbproject/project.xml b/nbproject/project.xml index 492e957..d63d45e 100755 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -5,7 +5,6 @@ FreimapGSoC 1.6.5 - diff --git a/src/freimapgsoc/CredentialRequired.java b/src/freimapgsoc/CredentialRequired.java index e6959ea..11743fd 100644 --- a/src/freimapgsoc/CredentialRequired.java +++ b/src/freimapgsoc/CredentialRequired.java @@ -261,6 +261,8 @@ public void findDatabase(String host, String port, String username, String passw } catch (Exception ex) { logLabel.setForeground(Color.red); logLabel.setText(ex.getMessage()); + System.out.println(ex.getMessage()); + System.out.println(ex.getCause()); Logger.getLogger(CredentialRequired.class.getName()).log(Level.SEVERE, null, ex); } } @@ -319,6 +321,7 @@ private void loadDbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: } } } catch (Exception ex) { + System.out.println(ex.getMessage()); logLabel.setForeground(Color.red); logLabel.setText(ex.getMessage()); } @@ -343,7 +346,7 @@ public void run() { } }); } - Connection c = null; + Connection c = null; Statement stmt = null; ResultSet rss = null; String host; diff --git a/src/freimapgsoc/LatLonJsToMySQL.form b/src/freimapgsoc/LatLonJsToMySQL.form index e60b372..b99435c 100644 --- a/src/freimapgsoc/LatLonJsToMySQL.form +++ b/src/freimapgsoc/LatLonJsToMySQL.form @@ -78,7 +78,7 @@ - + diff --git a/src/freimapgsoc/LatLonJsToMySQL.java b/src/freimapgsoc/LatLonJsToMySQL.java index 0b4888f..ce8bbbd 100644 --- a/src/freimapgsoc/LatLonJsToMySQL.java +++ b/src/freimapgsoc/LatLonJsToMySQL.java @@ -91,7 +91,7 @@ private void initComponents() { newDbText = new javax.swing.JTextField(); confirmPane.setMessage("If you continue your current data in the Database will be destroyed. \n Are you sure that you want to continue?.\n"); - confirmPane.setFont(new java.awt.Font("Lucida Grande", 1, 10)); // NOI18N + confirmPane.setFont(new java.awt.Font("Lucida Grande", 1, 10)); confirmPane.setName("confirmPane"); // NOI18N confirmPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { @@ -104,7 +104,7 @@ public void propertyChange(java.beans.PropertyChangeEvent evt) { errorsLog.setColumns(20); errorsLog.setEditable(false); - errorsLog.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + errorsLog.setFont(new java.awt.Font("Lucida Grande", 0, 10)); errorsLog.setRows(8); errorsLog.setTabSize(10); errorsLog.setName("errorsLog"); // NOI18N @@ -119,7 +119,7 @@ public void propertyChange(java.beans.PropertyChangeEvent evt) { jLabel1.setText("Source File:"); jLabel1.setName("jLabel1"); // NOI18N - jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 10)); jLabel2.setText("Password:"); jLabel2.setName("jLabel2"); // NOI18N @@ -129,22 +129,22 @@ public void propertyChange(java.beans.PropertyChangeEvent evt) { userText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); userText.setName("userText"); // NOI18N - jLabel3.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + jLabel3.setFont(new java.awt.Font("Lucida Grande", 0, 10)); jLabel3.setText("UserName:"); jLabel3.setName("jLabel3"); // NOI18N - jLabel5.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + jLabel5.setFont(new java.awt.Font("Lucida Grande", 0, 10)); jLabel5.setText("Host:"); jLabel5.setName("jLabel5"); // NOI18N - hostText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + hostText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N hostText.setName("hostText"); // NOI18N - jLabel4.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + jLabel4.setFont(new java.awt.Font("Lucida Grande", 0, 10)); jLabel4.setText("Avaible Database:"); jLabel4.setName("jLabel4"); // NOI18N - cancelButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + cancelButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); cancelButton.setText("Cancel"); cancelButton.setName("cancelButton"); // NOI18N cancelButton.addActionListener(new java.awt.event.ActionListener() { @@ -162,7 +162,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { } }); - logLabel.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + logLabel.setFont(new java.awt.Font("Lucida Grande", 0, 10)); logLabel.setText(" "); logLabel.setName("logLabel"); // NOI18N @@ -180,7 +180,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { pathText.setToolTipText("Js File Path"); pathText.setName("pathText"); // NOI18N - chooseButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + chooseButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); chooseButton.setText("Choose File"); chooseButton.setName("chooseButton"); // NOI18N chooseButton.addActionListener(new java.awt.event.ActionListener() { @@ -192,7 +192,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jLabel7.setText("With this utility you can add your LatLon.js data into a mysql Database."); jLabel7.setName("jLabel7"); // NOI18N - showLog.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + showLog.setFont(new java.awt.Font("Lucida Grande", 0, 12)); showLog.setText("Show Log"); showLog.setName("showLog"); // NOI18N showLog.addActionListener(new java.awt.event.ActionListener() { @@ -208,7 +208,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { portText.setText("3306"); portText.setName("portText"); // NOI18N - jButton1.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + jButton1.setFont(new java.awt.Font("Lucida Grande", 0, 12)); jButton1.setText("Example"); jButton1.setName("jButton1"); // NOI18N jButton1.addActionListener(new java.awt.event.ActionListener() { @@ -220,7 +220,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { dbText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N dbText.setName("dbText"); // NOI18N - newDb.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + newDb.setFont(new java.awt.Font("Lucida Grande", 0, 10)); newDb.setText("I want to create a new Database:"); newDb.setName("newDb"); // NOI18N newDb.addItemListener(new java.awt.event.ItemListener() { @@ -229,7 +229,7 @@ public void itemStateChanged(java.awt.event.ItemEvent evt) { } }); - newDbText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + newDbText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); newDbText.setEnabled(false); newDbText.setName("newDbText"); // NOI18N @@ -242,7 +242,7 @@ public void itemStateChanged(java.awt.event.ItemEvent evt) { .add(jLabel7) .addContainerGap(54, Short.MAX_VALUE)) .add(layout.createSequentialGroup() - .add(99, 99, 99) + .add(106, 106, 106) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) @@ -348,7 +348,6 @@ private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN- }//GEN-LAST:event_cancelButtonActionPerformed private void copyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyButtonActionPerformed - path = "file://" + pathText.getText(); host = hostText.getText(); port = portText.getText(); username = userText.getText(); @@ -363,7 +362,6 @@ private void copyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI if (i == 0) { try { createTables(); - parseFile(path); } catch (ClassNotFoundException ex) { logLabel.setText(ex.getMessage()); Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); @@ -553,7 +551,111 @@ private void createTables() throws ClassNotFoundException, SQLException { } - public void parseFile(String path) throws SQLException, InterruptedException { + + private void showLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showLogActionPerformed + scrollPane.setSize(398, 298); + errorsLog.append(errors.values().toString()); + frame = new Frame("Activity Log"); + frame.add(scrollPane); + frame.setLayout(new FlowLayout()); + frame.setSize(400, 300); + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + frame.setVisible(false); + + + } + }); + }//GEN-LAST:event_showLogActionPerformed + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + pathText.setEditable(true); + pathText.setText("/Users/Stefano/Desktop/FreimapSte/Freimap/hg/src/data/latlon.js"); + userText.setText("root"); + passwordText.setText("CiscoSte5785"); + hostText.setText("127.0.0.1"); + }//GEN-LAST:event_jButton1ActionPerformed + + private void confirmPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_confirmPanePropertyChange + System.out.println("PopUp3"); + String prop = evt.getPropertyName(); + + + if (evt.getSource().equals(confirmPane) && prop.equals(JOptionPane.YES_OPTION)) { + try { + logLabel.setText("Getting connection..."); + Thread.sleep(1000); + Class.forName("com.mysql.jdbc.Driver"); + c = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password); + + + if (!c.isClosed()) { + logLabel.setForeground(Color.green); + logLabel.setText("Connected!"); + createTables(); + parseFile( + pathText.getText()); + Thread.sleep(3000); + + + } + } catch (Exception ex) { + logLabel.setText(ex.getMessage()); + Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); + } + + + } else { + optionPane.setEnabled(false); + + + } + +// TODO add your handling code here: + }//GEN-LAST:event_confirmPanePropertyChange + + private void newDbItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_newDbItemStateChanged + if (newDb.isSelected()) { + newDbText.setEnabled(true); + dbText.setEnabled(false); + + + } else if (!newDb.isSelected()) { + newDbText.setEnabled(false); + dbText.setEnabled(true); + + + } + }//GEN-LAST:event_newDbItemStateChanged + + private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed + JFileChooser fcjs = new JFileChooser(); + fcjs.addChoosableFileFilter(new jsFileFilter()); + fcjs.setAcceptAllFileFilterUsed(false); + fcjs.setFileFilter(new jsFileFilter()); + + + int returnVal = fcjs.showOpenDialog(fcjs); + + + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fcjs.getSelectedFile(); + System.out.println("FILE JS OPENED"); + System.out.println("Opening: " + file.getName() + ".\n"); + pathText.setText(file.getPath()); + path = "file://" + pathText.getText(); + + + } else if (returnVal == JFileChooser.CANCEL_OPTION) { + System.out.println("Open command cancelled by user." + "\n"); + + + } +}//GEN-LAST:event_chooseButtonActionPerformed + + public void parseFile(String path) throws SQLException, InterruptedException { System.out.println("Now Parse Node and Links"); errors.put("PARSE FILE:", "Now Parse Node and Links...\n"); parseNode(path); @@ -743,109 +845,6 @@ public String addSlashes(String str) { } - private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed - JFileChooser fcjs = new JFileChooser(); - fcjs.addChoosableFileFilter(new jsFileFilter()); - fcjs.setAcceptAllFileFilterUsed(false); - fcjs.setFileFilter(new jsFileFilter()); - - - int returnVal = fcjs.showOpenDialog(fcjs); - - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = fcjs.getSelectedFile(); - System.out.println("FILE JS OPENED"); - System.out.println("Opening: " + file.getName() + ".\n"); - pathText.setText(file.getPath()); - path = "file://" + pathText.getText(); - - - } else if (returnVal == JFileChooser.CANCEL_OPTION) { - System.out.println("Open command cancelled by user." + "\n"); - - - } - }//GEN-LAST:event_chooseButtonActionPerformed - - private void showLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showLogActionPerformed - scrollPane.setSize(398, 298); - errorsLog.append(errors.values().toString()); - frame = new Frame("Activity Log"); - frame.add(scrollPane); - frame.setLayout(new FlowLayout()); - frame.setSize(400, 300); - frame.setVisible(true); - frame.addWindowListener(new WindowAdapter() { - - public void windowClosing(WindowEvent e) { - frame.setVisible(false); - - - } - }); - }//GEN-LAST:event_showLogActionPerformed - - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed - pathText.setEditable(true); - pathText.setText("/Users/Stefano/Desktop/FreimapSte/Freimap/hg/src/data/latlon.js"); - userText.setText("root"); - passwordText.setText("CiscoSte5785"); - hostText.setText("127.0.0.1"); - }//GEN-LAST:event_jButton1ActionPerformed - - private void confirmPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_confirmPanePropertyChange - System.out.println("PopUp3"); - String prop = evt.getPropertyName(); - - - if (evt.getSource().equals(confirmPane) && prop.equals(JOptionPane.YES_OPTION)) { - try { - logLabel.setText("Getting connection..."); - Thread.sleep(1000); - Class.forName("com.mysql.jdbc.Driver"); - c = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password); - - - if (!c.isClosed()) { - logLabel.setForeground(Color.green); - logLabel.setText("Connected!"); - createTables(); - parseFile( - pathText.getText()); - Thread.sleep(3000); - - - } - } catch (Exception ex) { - logLabel.setText(ex.getMessage()); - Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); - } - - - } else { - optionPane.setEnabled(false); - - - } - -// TODO add your handling code here: - }//GEN-LAST:event_confirmPanePropertyChange - - private void newDbItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_newDbItemStateChanged - if (newDb.isSelected()) { - newDbText.setEnabled(true); - dbText.setEnabled(false); - - - } else if (!newDb.isSelected()) { - newDbText.setEnabled(false); - dbText.setEnabled(true); - - - } - }//GEN-LAST:event_newDbItemStateChanged - private String stripQuotes(String str) { if (str.length() <= 2) { return null; diff --git a/src/freimapgsoc/Layer.java b/src/freimapgsoc/Layer.java index b18f4c0..76aac43 100644 --- a/src/freimapgsoc/Layer.java +++ b/src/freimapgsoc/Layer.java @@ -45,7 +45,8 @@ public boolean setCurrentTime(long crtTime) { public void createLayer(HashMap, Vector> data, int id) { try { - //query al mysql per inserire i dati + //Query to the MySql Server to store the data + initLayout(); } catch (Exception ex) { diff --git a/src/freimapgsoc/MainLayer.form b/src/freimapgsoc/MainLayer.form index efe69ef..12fc7b3 100644 --- a/src/freimapgsoc/MainLayer.form +++ b/src/freimapgsoc/MainLayer.form @@ -1300,7 +1300,7 @@ - + diff --git a/src/freimapgsoc/MainLayer.java b/src/freimapgsoc/MainLayer.java index bb328ac..6a8a875 100644 --- a/src/freimapgsoc/MainLayer.java +++ b/src/freimapgsoc/MainLayer.java @@ -1632,7 +1632,7 @@ private void serviceDActionPerformed(java.awt.event.ActionEvent evt) { Logger.getLogger(MainLayer.class.getName()).log(Level.SEVERE, null, ex); } } catch (UnknownHostException ex) { - Logger.getLogger(SDMain.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(MainLayer.class.getName()).log(Level.SEVERE, null, ex); } // TODO add your handling code here: } diff --git a/src/freimapgsoc/MySQLCredential.form b/src/freimapgsoc/MySQLCredential.form new file mode 100644 index 0000000..e6e8aac --- /dev/null +++ b/src/freimapgsoc/MySQLCredential.form @@ -0,0 +1,391 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/freimapgsoc/MySQLCredential.java b/src/freimapgsoc/MySQLCredential.java new file mode 100644 index 0000000..6c093af --- /dev/null +++ b/src/freimapgsoc/MySQLCredential.java @@ -0,0 +1,680 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * LatLonJsToMySQL.java + * + * Created on 18-mar-2010, 0.49.47 + */ +package freimapgsoc; + +import com.mysql.jdbc.Connection; +import com.mysql.jdbc.Statement; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.URL; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.StringTokenizer; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + +/** + * + * @author Stefano + */ +public class MySQLCredential extends javax.swing.JFrame { + + /** Creates new form LatLonJsToMySQL */ + public MySQLCredential() { + initComponents(); + } + + /** + * This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + * @return + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + confirmPane = new JOptionPane("If you continue your current data in the Database will be destroyed. \n Are you sure that you want to continue?.\n", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION); + ; + scrollPane = new javax.swing.JScrollPane(); + errorsLog = new javax.swing.JTextArea(); + jLabel2 = new javax.swing.JLabel(); + passwordText = new javax.swing.JPasswordField(); + userText = new javax.swing.JTextField(); + jLabel3 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + hostText = new javax.swing.JTextField(); + jLabel4 = new javax.swing.JLabel(); + cancelButton = new javax.swing.JButton(); + startButton = new javax.swing.JButton(); + logLabel = new javax.swing.JLabel(); + checkconnButton = new javax.swing.JButton(); + jLabel7 = new javax.swing.JLabel(); + showLog = new javax.swing.JButton(); + jLabel6 = new javax.swing.JLabel(); + portText = new javax.swing.JTextField(); + exampleButton = new javax.swing.JButton(); + dbText = new javax.swing.JComboBox(); + newDb = new javax.swing.JCheckBox(); + newDbText = new javax.swing.JTextField(); + continueButton = new javax.swing.JButton(); + + confirmPane.setMessage("If you continue your current data in the Database will be destroyed. \n Are you sure that you want to continue?.\n"); + confirmPane.setFont(new java.awt.Font("Lucida Grande", 1, 10)); + confirmPane.setName("confirmPane"); // NOI18N + confirmPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() { + public void propertyChange(java.beans.PropertyChangeEvent evt) { + confirmPanePropertyChange(evt); + } + }); + + scrollPane.setName("scrollPane"); // NOI18N + scrollPane.setSize(new java.awt.Dimension(400, 300)); + + errorsLog.setColumns(20); + errorsLog.setEditable(false); + errorsLog.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + errorsLog.setRows(8); + errorsLog.setTabSize(10); + errorsLog.setName("errorsLog"); // NOI18N + errorsLog.setPreferredSize(new java.awt.Dimension(400, 300)); + errorsLog.setSize(new java.awt.Dimension(300, 400)); + scrollPane.setViewportView(errorsLog); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("MySQL Credentials"); + + jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + jLabel2.setText("Password:"); + jLabel2.setName("jLabel2"); // NOI18N + + passwordText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + passwordText.setName("passwordText"); // NOI18N + + userText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + userText.setName("userText"); // NOI18N + + jLabel3.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + jLabel3.setText("UserName:"); + jLabel3.setName("jLabel3"); // NOI18N + + jLabel5.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + jLabel5.setText("Host:"); + jLabel5.setName("jLabel5"); // NOI18N + + hostText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + hostText.setName("hostText"); // NOI18N + + jLabel4.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + jLabel4.setText("Avaible Database:"); + jLabel4.setName("jLabel4"); // NOI18N + + cancelButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + cancelButton.setText("Cancel"); + cancelButton.setName("cancelButton"); // NOI18N + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + startButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + startButton.setText("Copy All"); + startButton.setName("startButton"); // NOI18N + startButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + startButtonActionPerformed(evt); + } + }); + + logLabel.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + logLabel.setText(" "); + logLabel.setName("logLabel"); // NOI18N + + checkconnButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + checkconnButton.setText("Load Avaible Database"); + checkconnButton.setName("checkconnButton"); // NOI18N + checkconnButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkconnButtonActionPerformed(evt); + } + }); + + jLabel7.setText("Insert MySQL credential to store the data of the Mesh Network:"); + jLabel7.setName("jLabel7"); // NOI18N + + showLog.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + showLog.setText("Show Log"); + showLog.setName("showLog"); // NOI18N + showLog.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showLogActionPerformed(evt); + } + }); + + jLabel6.setText(":"); + jLabel6.setName("jLabel6"); // NOI18N + + portText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + portText.setText("3306"); + portText.setName("portText"); // NOI18N + + exampleButton.setFont(new java.awt.Font("Lucida Grande", 0, 12)); // NOI18N + exampleButton.setText("Example"); + exampleButton.setName("exampleButton"); // NOI18N + exampleButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + exampleButtonActionPerformed(evt); + } + }); + + dbText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + dbText.setName("dbText"); // NOI18N + + newDb.setFont(new java.awt.Font("Lucida Grande", 0, 10)); + newDb.setText("I want to create a new Database:"); + newDb.setName("newDb"); // NOI18N + newDb.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + newDbItemStateChanged(evt); + } + }); + + newDbText.setFont(new java.awt.Font("Lucida Grande", 0, 12)); + newDbText.setEnabled(false); + newDbText.setName("newDbText"); // NOI18N + + continueButton.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N + continueButton.setText("Continue without store data"); + continueButton.setName("continueButton"); // NOI18N + continueButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + continueButtonActionPerformed(evt); + } + }); + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() + .add(78, 78, 78) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .add(16, 16, 16) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) + .add(layout.createSequentialGroup() + .add(81, 81, 81) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) + .add(org.jdesktop.layout.GroupLayout.LEADING, exampleButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.LEADING, checkconnButton) + .add(continueButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 177, Short.MAX_VALUE))) + .add(logLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 315, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(layout.createSequentialGroup() + .add(newDb) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(newDbText))) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 53, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel5, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) + .add(dbText, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, userText, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, passwordText) + .add(hostText)) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .add(5, 5, 5) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) + .add(startButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(showLog, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE) + .add(cancelButton))) + .add(layout.createSequentialGroup() + .add(jLabel6) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(portText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 53, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) + .add(11, 11, 11)))) + .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel7)) + .add(71, 71, 71)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .add(24, 24, 24) + .add(jLabel7) + .add(26, 26, 26) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) + .add(layout.createSequentialGroup() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(hostText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel5) + .add(jLabel6) + .add(portText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(jLabel3) + .add(userText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(jLabel2) + .add(passwordText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(jLabel4) + .add(dbText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) + .add(layout.createSequentialGroup() + .add(startButton) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(showLog) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(cancelButton))) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(newDb) + .add(newDbText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(24, 24, 24) + .add(logLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(checkconnButton) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(exampleButton) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(continueButton) + .add(13, 13, 13)) + ); + + pack(); + }// //GEN-END:initComponents + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + new Start().setVisible(true); + this.dispose(); +}//GEN-LAST:event_cancelButtonActionPerformed + + private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startButtonActionPerformed + host = hostText.getText(); + port = portText.getText(); + username = userText.getText(); + password = passwordText.getText(); + if (newDb.isSelected()) { + database = newDbText.getText(); + } else { + database = dbText.getSelectedItem().toString(); + } + Component source = (Component) evt.getSource(); + int i = confirmPane.showConfirmDialog(source, "Are you sure?", "Database Replace", JOptionPane.YES_NO_OPTION); + if (i == 0) { + try { + createTables(); + Thread.sleep(3000); + new OlsrdDataSource(host,port,username,password).init(); + } catch (ClassNotFoundException ex) { + logLabel.setText(ex.getMessage()); + Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); + } catch (SQLException ex) { + logLabel.setText(ex.getMessage()); + Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); + } catch (Exception ex) { + ex.getMessage(); + } + } else { + confirmPane.setVisible(false); + } +}//GEN-LAST:event_startButtonActionPerformed + + private void checkconnButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkconnButtonActionPerformed + try { + host = hostText.getText(); + port = portText.getText(); + username = userText.getText(); + password = passwordText.getText(); + if (host.length() < 2) { + if (port.length() == 0) { + port = "3306"; + } + logLabel.setForeground(Color.red); + logLabel.setText("Add host address and port number!"); + } else { + logLabel.setText("Getting connection..."); + Thread.sleep(1000); + Class.forName("com.mysql.jdbc.Driver"); + c = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port, username, password); + if (!c.isClosed()) { + stmt = (Statement) c.createStatement(); + rss = stmt.executeQuery("SHOW DATABASES"); + int i = 0; + while (rss.next()) { + dbText.insertItemAt(rss.getString("Database"), i); + i++; + logLabel.setForeground(Color.green); + logLabel.setText("Connected!"); + dbText.setSelectedIndex(0); + } + } + } + } catch (Exception ex) { + logLabel.setForeground(Color.red); + logLabel.setText(ex.getMessage()); + } + + }//GEN-LAST:event_checkconnButtonActionPerformed + + private void createTables() throws ClassNotFoundException, SQLException { + try { + logLabel.setForeground(Color.black); + logLabel.setText("Creating Table in " + database + " database..."); + Class.forName("com.mysql.jdbc.Driver"); + errors.put("DATABASE:", "Getting Connection for CreateTables...\n"); + logLabel.setText("Getting Connection for CreateTables..."); + + String queryDel = "DROP SCHEMA IF EXISTS " + database + ";"; + + String queryCreate = "CREATE SCHEMA IF NOT EXISTS " + database + ";"; + + String queryUse = "use " + database + "; "; + + String query = "CREATE TABLE nodes (lon float DEFAULT '12.5535', " + + "lat float DEFAULT '41.8638', " + + "ip varchar(32) NOT NULL, " + + "name varchar(32) NOT NULL, " + + "isGateway binary(1) NOT NULL, " + + "gatewayIp varchar(32) NOT NULL, " + + "uptime varchar(10) DEFAULT NULL," + + "interfaces varchar(50) DEFAULT NULL, " + + "PRIMARY KEY (name),KEY ip (ip)" + + ") ENGINE=InnoDB DEFAULT CHARSET=latin1; "; + + String query2 = "CREATE TABLE flows (RECNUM bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT, " + + "PROBE varchar(16) NOT NULL DEFAULT '',TIME_RECEIVED datetime NOT NULL DEFAULT '0000-00-00 00:00:00'," + + "FLOW_VERSION tinyint(4) NOT NULL DEFAULT '0'," + + "SEQUENCE bigint(20) unsigned zerofill NOT NULL DEFAULT '00000000000000000000'," + + "SOURCE_IP varchar(16) NOT NULL DEFAULT ''," + + "SOURCE_PORT int(11) NOT NULL DEFAULT '0'," + + "DEST_IP varchar(16) NOT NULL DEFAULT ''," + + "DEST_PORT int(11) NOT NULL DEFAULT '0'," + + "NEXT_HOP varchar(16) NOT NULL DEFAULT ''," + + "PROTOCOL int(11) NOT NULL DEFAULT '0'," + + "TCP_FLAGS int(11) NOT NULL DEFAULT '0'," + + "TOS int(11) NOT NULL DEFAULT '0'," + + "BYTES bigint(20) unsigned NOT NULL DEFAULT '0'," + + "PACKETS bigint(20) unsigned NOT NULL DEFAULT '0'," + + "FLOW_BEGIN datetime NOT NULL DEFAULT '0000-00-00 00:00:00'," + + "FLOW_END datetime NOT NULL DEFAULT '0000-00-00 00:00:00'," + + "SOURCE_AS int(11) NOT NULL DEFAULT '0'," + + "DEST_AS int(11) NOT NULL DEFAULT '0'," + + "SOURCE_MASK smallint(6) NOT NULL DEFAULT '0'," + + "DEST_MASK smallint(6) NOT NULL DEFAULT '0'," + + "PRIMARY KEY (RECNUM),KEY k_begin (FLOW_BEGIN)," + + "KEY k_end (FLOW_END),KEY k_time (TIME_RECEIVED)," + + "KEY k_src (SOURCE_IP),KEY k_dst (DEST_IP)" + + ") ENGINE=MyISAM DEFAULT CHARSET=latin1;"; + + String query3 = "CREATE TABLE links (clock timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'," + + "src varchar(32) NOT NULL DEFAULT ''," + + "dest varchar(32) NOT NULL DEFAULT ''," + + "lq float DEFAULT NULL," + + "nlq float DEFAULT NULL," + + "etx float DEFAULT NULL," + + "PRIMARY KEY (clock,src,dest)," + + "KEY src (src)," + + "KEY dest (dest)," + + "CONSTRAINT links_ibfk_2 FOREIGN KEY (dest) REFERENCES nodes (ip)," + + "CONSTRAINT links_ibfk_1 FOREIGN KEY (src) REFERENCES nodes (ip)" + + ") ENGINE=InnoDB DEFAULT CHARSET=latin1; "; + + String query4 = "CREATE TABLE layer (" + + "id int(11) NOT NULL AUTO_INCREMENT," + + "srcnode varchar(32) DEFAULT NULL," + + "clock varchar(10) NULL DEFAULT NULL," + + "destnode varchar(32) DEFAULT NULL," + + "PRIMARY KEY (id)," + + "KEY srcnode (srcnode)," + + "KEY destnode (destnode)," + + "CONSTRAINT layer_ibfk_2 FOREIGN KEY (destnode) REFERENCES links (dest)," + + "CONSTRAINT layer_ibfk_1 FOREIGN KEY (srcnode) REFERENCES links (src)" + + ") ENGINE=InnoDB DEFAULT CHARSET=latin1;"; + + String query5 = "CREATE TABLE interfaces (mainIp varchar(32) NOT NULL DEFAULT ''," + + "IntIp varchar(32) DEFAULT NULL," + + "KEY mainIp (mainIp)" + + ") ENGINE=InnoDB DEFAULT CHARSET=latin1"; + + Connection c2 = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port, username, password); + Statement stmt2 = (Statement) c2.createStatement(); + errors.put("DATABASE:", "Connected to the database...\n"); + logLabel.setText("Execute Queries..."); + + Thread.sleep(3000); + System.out.println(queryDel); + + System.out.println(queryCreate); + System.out.println(queryUse); + System.out.println(query); + System.out.println(query2); + System.out.println(query3); + System.out.println(query4); + System.out.println(query5); + + + stmt2.executeUpdate(queryDel); + errors.put("DATABASE_QUERY:", queryDel + "\n"); + + stmt2.executeUpdate(queryCreate); + errors.put("DATABASE_QUERY:", queryCreate + "\n"); + + stmt2.executeQuery(queryUse); + errors.put("DATABASE_QUERY:", queryUse + "\n"); + + Thread.sleep(1000); + stmt2.executeUpdate(query); + errors.put("DATABASE_QUERY:", query + "\n"); + Thread.sleep(1000); + + stmt2.executeUpdate(query2); + errors.put("DATABASE_QUERY:", query2 + "\n"); + Thread.sleep(1000); + + stmt2.executeUpdate(query3); + errors.put("DATABASE_QUERY:", query3 + "\n"); + Thread.sleep(1000); + + stmt2.executeUpdate(query4); + errors.put("DATABASE:", query4 + "\n"); + Thread.sleep(1000); + + stmt2.executeUpdate(query5); + errors.put("DATABASE:", query5 + "\n"); + Thread.sleep(1000); + + errors.put("DATABASE:", "Now Adding nodes and Links....! This will take a while...\n"); + logLabel.setText("Now Adding nodes and Links....! This will take a while.."); + Thread.sleep(1500); + + } catch (Exception e) { + System.out.println(e.getMessage()); + } + + } + + + + private void showLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showLogActionPerformed + scrollPane.setSize(398, 298); + errorsLog.append(errors.values().toString()); + frame = new Frame("Activity Log"); + frame.add(scrollPane); + frame.setLayout(new FlowLayout()); + frame.setSize(400, 300); + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + frame.setVisible(false); + + + } + }); + }//GEN-LAST:event_showLogActionPerformed + + private void exampleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exampleButtonActionPerformed + userText.setText("root"); + passwordText.setText("CiscoSte5785"); + hostText.setText("127.0.0.1"); + }//GEN-LAST:event_exampleButtonActionPerformed + + private void confirmPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_confirmPanePropertyChange + System.out.println("PopUp3"); + String prop = evt.getPropertyName(); + + + if (evt.getSource().equals(confirmPane) && prop.equals(JOptionPane.YES_OPTION)) { + try { + logLabel.setText("Getting connection..."); + Thread.sleep(1000); + Class.forName("com.mysql.jdbc.Driver"); + c = (Connection) DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, username, password); + + + if (!c.isClosed()) { + logLabel.setForeground(Color.green); + logLabel.setText("Connected!"); + createTables(); + Thread.sleep(3000); + } + } catch (Exception ex) { + logLabel.setText(ex.getMessage()); + Logger.getLogger(LatLonJsToMySQL.class.getName()).log(Level.SEVERE, null, ex); + } + + + } else { + optionPane.setEnabled(false); + + + } + +// TODO add your handling code here: + }//GEN-LAST:event_confirmPanePropertyChange + + private void newDbItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_newDbItemStateChanged + if (newDb.isSelected()) { + newDbText.setEnabled(true); + dbText.setEnabled(false); + + + } else if (!newDb.isSelected()) { + newDbText.setEnabled(false); + dbText.setEnabled(true); + + + } + }//GEN-LAST:event_newDbItemStateChanged + + private void continueButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_continueButtonActionPerformed + OlsrdDataSource noStore=new OlsrdDataSource(); + noStore.init(); + }//GEN-LAST:event_continueButtonActionPerformed + + private String stripQuotes(String str) { + if (str.length() <= 2) { + return null; + + } + return str.substring(1, str.length() - 1); + + } + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + + public void run() { + new LatLonJsToMySQL().setVisible(true); + + + + } + }); + + + + + + } + Frame frame = null; + Connection c = null; + ResultSet rss = null; + Statement stmt = null; + String line = null; + HashMap errors = new HashMap(); + String host; + String username; + String password; + String database; + String port; + JOptionPane optionPane = null; + String path; + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JButton checkconnButton; + private javax.swing.JOptionPane confirmPane; + private javax.swing.JButton continueButton; + private javax.swing.JComboBox dbText; + private javax.swing.JTextArea errorsLog; + private javax.swing.JButton exampleButton; + private javax.swing.JTextField hostText; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel logLabel; + private javax.swing.JCheckBox newDb; + private javax.swing.JTextField newDbText; + private javax.swing.JPasswordField passwordText; + private javax.swing.JTextField portText; + private javax.swing.JScrollPane scrollPane; + private javax.swing.JButton showLog; + private javax.swing.JButton startButton; + private javax.swing.JTextField userText; + // End of variables declaration//GEN-END:variables +} diff --git a/src/freimapgsoc/OlsrdDataSource.java b/src/freimapgsoc/OlsrdDataSource.java index 48f5759..ce68239 100755 --- a/src/freimapgsoc/OlsrdDataSource.java +++ b/src/freimapgsoc/OlsrdDataSource.java @@ -1,218 +1,275 @@ /* net.relet.freimap.OlsrdDataSource.java - This file is part of the freimap software available at freimap.berlios.de +This file is part of the freimap software available at freimap.berlios.de - This software is copyright (c)2007 Thomas Hirsch +This software is copyright (c)2007 Thomas Hirsch - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License with - the Debian GNU/Linux distribution in file /doc/gpl.txt - if not, write to the Free Software Foundation, Inc., 59 Temple Place, - Suite 330, Boston, MA 02111-1307 USA -*/ +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License with +the Debian GNU/Linux distribution in file /doc/gpl.txt +if not, write to the Free Software Foundation, Inc., 59 Temple Place, +Suite 330, Boston, MA 02111-1307 USA + */ package freimapgsoc; +import com.mysql.jdbc.Connection; +import com.mysql.jdbc.Statement; import java.io.*; import java.net.*; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; public class OlsrdDataSource implements DataSource { - DotPluginListener dot; - DataSourceListener listener; - TreeMap> data = new TreeMap>(); - Hashtable knownNodes=new Hashtable(); - Hashtable generatedNodes=new Hashtable(); - - long lastUpdateTime = 1, - firstUpdateTime = 1; - String nodefile; - - MysqlDataSource mysqlSource; - xmlDataSource ffmdSource; - - DataSource nodeSource; - String sNodeSource; - - public OlsrdDataSource() { - } - - - public void init(HashMap conf) { - String host = "localhost"; - int port = 2004; - - // nodefile = Configurator.getS("nodefile", conf); - //System.out.println("nodefile = "+nodefile); - - //sNodeSource = Configurator.getS("nodesource", conf); - - if (port==-1) { - System.err.println("invalid port parameter "+port); - System.exit(1); + + DotPluginListener dot; + DataSourceListener listener; + TreeMap> data = new TreeMap>(); + Hashtable knownNodes = new Hashtable(); + Hashtable generatedNodes = new Hashtable(); + long lastUpdateTime = 1, + firstUpdateTime = 1; + String nodefile; + MysqlDataSource mysqlSource; + xmlDataSource ffmdSource; + DataSource nodeSource; + String sNodeSource; + String username, password, host, port; + Connection c = null; + ResultSet rss; + Statement stmt; + + public OlsrdDataSource() { } - dot = new DotPluginListener(host, port, this); - } - /** - * public void init(HashMap conf) { - * String host = Configurator.getS("host", conf); - * int port = Configurator.getI("port", conf); - * - * nodefile = Configurator.getS("nodefile", conf); - * //System.out.println("nodefile = "+nodefile); - * - * sNodeSource = Configurator.getS("nodesource", conf); - * - * if (port==-1) { - * System.err.println("invalid port parameter "+port); - * System.exit(1); - * } - * dot = new DotPluginListener(host, port, this); - * } - * @return - */ - - @SuppressWarnings("unchecked") - public Vector getNodeList() { - if ((nodeSource == null) && (sNodeSource != null)) { - System.out.println("nodeSource in OlsrdDataSource.java:"+ nodeSource); - //nodeSource=.get(sNodeSource); - sNodeSource = null; + + public OlsrdDataSource(String host, String port, String username, String password) { + this.host = host; + this.port = port; + this.username = username; + this.password = password; } - if (nodeSource!=null) { - Vector nodes = nodeSource.getNodeList(); - for (Enumeration enu = generatedNodes.keys(); enu.hasMoreElements();) { - nodes.add(generatedNodes.get(enu.nextElement())); - } - - for (int i=0;i nodes = (Vector)ois.readObject(); - ois.close(); - for (int i=0;i conf) { + String host = "localhost"; + int port = 2004; + + // nodefile = Configurator.getS("nodefile", conf); + //System.out.println("nodefile = "+nodefile); + + //sNodeSource = Configurator.getS("nodesource", conf); + + if (port == -1) { + System.err.println("invalid port parameter " + port); + System.exit(1); + } + dot = new DotPluginListener(host, port, this); } - MapNode node= knownNodes.get(id); - if (node!=null) return node; - else return generatedNodes.get(id); - } - - public HashMap getNodeAvailability(long time) { - if (nodeSource!=null) { - return nodeSource.getNodeAvailability(time); - } else { - return new HashMap(); //empty + + /** + * public void init(HashMap conf) { + * String host = Configurator.getS("host", conf); + * int port = Configurator.getI("port", conf); + * + * nodefile = Configurator.getS("nodefile", conf); + * //System.out.println("nodefile = "+nodefile); + * + * sNodeSource = Configurator.getS("nodesource", conf); + * + * if (port==-1) { + * System.err.println("invalid port parameter "+port); + * System.exit(1); + * } + * dot = new DotPluginListener(host, port, this); + * } + * @return + */ + @SuppressWarnings("unchecked") + public Vector getNodeList() { + if (setConnection()) { + if ((nodeSource == null) && (sNodeSource != null)) { + System.out.println("nodeSource in OlsrdDataSource.java:" + nodeSource); + //nodeSource=.get(sNodeSource); + sNodeSource = null; + } + + if (nodeSource != null) { + Vector nodes = nodeSource.getNodeList(); + for (Enumeration enu = generatedNodes.keys(); enu.hasMoreElements();) { + nodes.add(generatedNodes.get(enu.nextElement())); + } + + for (int i = 0; i < nodes.size(); i++) { + knownNodes.put(nodes.elementAt(i).ip, nodes.elementAt(i)); + } + return nodes; + } else { + try { + ObjectInputStream ois = new ObjectInputStream(ClassLoader.getSystemResourceAsStream(nodefile)); + Vector nodes = (Vector) ois.readObject(); + ois.close(); + for (int i = 0; i < nodes.size(); i++) { + knownNodes.put(nodes.elementAt(i).ip, nodes.elementAt(i)); + } + return nodes; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + return null; } - } - public long getLastUpdateTime() { - return lastUpdateTime; - } - public long getFirstUpdateTime() { - return firstUpdateTime; - } - public long getLastAvailableTime() { - return lastUpdateTime; - } - public long getFirstAvailableTime() { - return firstUpdateTime; - } - - - public long getClosestUpdateTime(long time) { - long cur=-1, closest = Long.MAX_VALUE; - Set keys = data.keySet(); - Iterator ki = keys.iterator(); - while (ki.hasNext()) { - cur = ki.next().longValue(); - long d=Math.abs(time-cur); - if (d getLinks(long time) { - Vector linkdata = data.get(new Long(time)); - return linkdata; - } - //threaded information fetching - public void addDataSourceListener(DataSourceListener dsl) { - listener = dsl; - if (!dot.isAlive()) dot.start(); - } - //some optional methods - public void getLinkCountProfile(MapNode node, NodeInfo info) { - LinkedList lcp=new LinkedList(); - //select HIGH_PRIORITY unix_timestamp(clock) as time, count(*) as num_links from "+TABLE_LINKS+" where dest='"+node.id+"' group by clock" - Iterator times=data.keySet().iterator(); - while(times.hasNext()) { - Long time=times.next(); - Vector links=data.get(time); - int lc=0; - for (int i=0; i getNodeAvailability(long time) { + if (nodeSource != null) { + return nodeSource.getNodeAvailability(time); + } else { + return new HashMap(); //empty } - } - lcp.add(new LinkCount(time.longValue(), lc)); } - info.setLinkCountProfile(lcp); - } - public void getLinkProfile(Link mylink, LinkInfo info) { - LinkedList lp=new LinkedList(); - //select HIGH_PRIORITY unix_timestamp(clock) as time, quality from "+TABLE_LINKS+" where src='"+link.from.id+"' and dest='"+link.to.id+"'"); - Iterator times=data.keySet().iterator(); - while (times.hasNext()) { - Long time=times.next(); - Vector links=data.get(time); - float quality=0; - for (int i=0; i keys = data.keySet(); + Iterator ki = keys.iterator(); + while (ki.hasNext()) { + cur = ki.next().longValue(); + long d = Math.abs(time - cur); + if (d < closest) { + closest = d; + } else { + break; + } + } + return cur; + } + + public Vector getLinks(long time) { + Vector linkdata = data.get(new Long(time)); + return linkdata; + } + //threaded information fetching + + public void addDataSourceListener(DataSourceListener dsl) { + listener = dsl; + if (!dot.isAlive()) { + dot.start(); + } + } + //some optional methods + + public void getLinkCountProfile(MapNode node, NodeInfo info) { + LinkedList lcp = new LinkedList(); + //select HIGH_PRIORITY unix_timestamp(clock) as time, count(*) as num_links from "+TABLE_LINKS+" where dest='"+node.id+"' group by clock" + Iterator times = data.keySet().iterator(); + while (times.hasNext()) { + Long time = times.next(); + Vector links = data.get(time); + int lc = 0; + for (int i = 0; i < links.size(); i++) { + Link link = links.elementAt(i); + if (link.dest.equals(node)) { + lc++; + } + } + lcp.add(new LinkCount(time.longValue(), lc)); } - } - lp.add(new LinkData(time.longValue(), quality)); + info.setLinkCountProfile(lcp); } - info.setLinkProfile(lp); - } - //private methods - private void addLinkData(long time, Vector linkData) { - data.put(new Long(time), linkData); - if (firstUpdateTime==1) firstUpdateTime=time; - lastUpdateTime=time; - if (listener != null) listener.timeRangeAvailable(firstUpdateTime, lastUpdateTime); - } + public void getLinkProfile(Link mylink, LinkInfo info) { + LinkedList lp = new LinkedList(); + //select HIGH_PRIORITY unix_timestamp(clock) as time, quality from "+TABLE_LINKS+" where src='"+link.from.id+"' and dest='"+link.to.id+"'"); + Iterator times = data.keySet().iterator(); + while (times.hasNext()) { + Long time = times.next(); + Vector links = data.get(time); + float quality = 0; + for (int i = 0; i < links.size(); i++) { + Link link = links.elementAt(i); + if (link.equals(mylink)) { + quality = link.etx; + } + } + lp.add(new LinkData(time.longValue(), quality)); + } + info.setLinkProfile(lp); + } + + //private methods + private void addLinkData(long time, Vector linkData) { + data.put(new Long(time), linkData); + if (firstUpdateTime == 1) { + firstUpdateTime = time; + } + lastUpdateTime = time; + if (listener != null) { + listener.timeRangeAvailable(firstUpdateTime, lastUpdateTime); + } + } public void init(String path) { throw new UnsupportedOperationException("Not supported yet."); @@ -239,120 +296,127 @@ public Vector getLinksFromDest(String id) { } /** - * - * @param ip - * @return - */ - @Override + * + * @param ip + * @return + */ + @Override public MapNode getNodeByIp(String ip) { throw new UnsupportedOperationException("Not supported yet."); } /** - * - * @return - */ - @Override + * + * @return + */ + @Override public void init() { throw new UnsupportedOperationException("Not supported yet."); } /** - * - * @param configuration - * @return - */ - @Override + * + * @param configuration + * @return + */ + @Override public HashMap read_conf(HashMap configuration) { throw new UnsupportedOperationException("Not supported yet."); } /** - * - * @return - */ - @Override + * + * @return + */ + @Override public Vector getLinks() { throw new UnsupportedOperationException("Not supported yet."); } + //Listener Of DotDraw Plugin + class DotPluginListener extends Thread { + BufferedReader in; + String host; + int port; + OlsrdDataSource parent; - //Listener Of DotDraw Plugin - class DotPluginListener extends Thread { - BufferedReader in; - String host; - int port; - OlsrdDataSource parent; - - //DotDraw Constructor - public DotPluginListener(String host, int port, OlsrdDataSource parent) { - this.parent=parent; - this.host=host; - this.port=port; - System.setProperty("java.net.IPv4Stack", "true"); //not necessary, but works around a bug in older java versions. - } + //DotDraw Constructor + public DotPluginListener(String host, int port, OlsrdDataSource parent) { + this.parent = parent; + this.host = host; + this.port = port; + System.setProperty("java.net.IPv4Stack", "true"); //not necessary, but works around a bug in older java versions. + } - //DotDraw Methods that open a Socket on the port 2004 and listen the traffic - public void run() { - Vector linkData = null; - try { - InetSocketAddress destination = new InetSocketAddress(host, port); - while (true) { //reconnect upon disconnection - Socket s = new Socket(); - //s.setSoTimeout(10000); - s.connect(destination, 25000); - in = new BufferedReader(new InputStreamReader(s.getInputStream())); - while (in!=null) { - String line=in.readLine(); - { //this used to be a try-catch statement - if (line==null) break; - if (line.equals("digraph topology")) { - if (linkData!=null) parent.addLinkData(System.currentTimeMillis()/1000, linkData); - linkData = new Vector(); - } else if ((linkData != null) && (line.length()>0) && (line.charAt(0)=='"')) { - StringTokenizer st=new StringTokenizer(line, "\"", false); - String from = st.nextToken(); - //if (from.indexOf("/")>-1) { from = from.substring(0, from.indexOf("/")); } - st.nextToken(); - if (st.hasMoreTokens()) { //otherwise it's a gateway node! - String to = st.nextToken(); - //if (to.indexOf("/")>-1) { to = to.substring(0, to.indexOf("/")); } - st.nextToken(); - String setx = st.nextToken(); - if(setx.equals("INFINITE")){ - setx = "0"; - } - boolean hna = setx.equals("HNA"); - float etx = hna?0:Float.parseFloat(setx); - MapNode nfrom = getNodeByName(from), - nto = getNodeByName(to); - if (nfrom == null) { - nfrom = new MapNode(from); - generatedNodes.put(from, nfrom); - if (listener!=null) listener.nodeListUpdate(nfrom); - } - if (nto == null) { - nto = new MapNode(to); - generatedNodes.put(to, nto); - if (listener!=null) listener.nodeListUpdate(nto); - } - linkData.add(new Link(nfrom, nto, etx, hna)); + //DotDraw Methods that open a Socket on the port 2004 and listen the traffic + public void run() { + Vector linkData = null; + try { + InetSocketAddress destination = new InetSocketAddress(host, port); + while (true) { //reconnect upon disconnection + Socket s = new Socket(); + //s.setSoTimeout(10000); + s.connect(destination, 25000); + in = new BufferedReader(new InputStreamReader(s.getInputStream())); + while (in != null) { + String line = in.readLine(); + { //this used to be a try-catch statement + if (line == null) { + break; + } + if (line.equals("digraph topology")) { + if (linkData != null) { + parent.addLinkData(System.currentTimeMillis() / 1000, linkData); + } + linkData = new Vector(); + } else if ((linkData != null) && (line.length() > 0) && (line.charAt(0) == '"')) { + StringTokenizer st = new StringTokenizer(line, "\"", false); + String from = st.nextToken(); + //if (from.indexOf("/")>-1) { from = from.substring(0, from.indexOf("/")); } + st.nextToken(); + if (st.hasMoreTokens()) { //otherwise it's a gateway node! + String to = st.nextToken(); + //if (to.indexOf("/")>-1) { to = to.substring(0, to.indexOf("/")); } + st.nextToken(); + String setx = st.nextToken(); + if (setx.equals("INFINITE")) { + setx = "0"; + } + boolean hna = setx.equals("HNA"); + float etx = hna ? 0 : Float.parseFloat(setx); + MapNode nfrom = getNodeByName(from), + nto = getNodeByName(to); + if (nfrom == null) { + nfrom = new MapNode(from); + generatedNodes.put(from, nfrom); + if (listener != null) { + listener.nodeListUpdate(nfrom); + } + } + if (nto == null) { + nto = new MapNode(to); + generatedNodes.put(to, nto); + if (listener != null) { + listener.nodeListUpdate(nto); + } + } + linkData.add(new Link(nfrom, nto, etx, hna)); + } + } + } + } + Thread.sleep(1000); } - } + } catch (SocketTimeoutException ex) { + System.err.println("[OlsrdDataSource] timeout while trying to connect. " + ex.getMessage()); + return; + } catch (ConnectException ex) { + System.err.println("connection to " + host + ":" + port + " failed. Detailed node data won't be available."); + return; + } catch (Exception ex) { + ex.printStackTrace(); } - } - Thread.sleep(1000); } - } catch (SocketTimeoutException ex) { - System.err.println("[OlsrdDataSource] timeout while trying to connect. "+ex.getMessage()); - return; - } catch (ConnectException ex) { - System.err.println("connection to " + host + ":" + port + " failed. Detailed node data won't be available."); - return; - } catch (Exception ex) { - ex.printStackTrace(); - } } - } } diff --git a/src/freimapgsoc/ServiceDiscovery.java b/src/freimapgsoc/ServiceDiscovery.java index 192aa7b..41495b0 100755 --- a/src/freimapgsoc/ServiceDiscovery.java +++ b/src/freimapgsoc/ServiceDiscovery.java @@ -103,8 +103,7 @@ public ServiceDiscovery(JmDNS jmdns) throws IOException { initComponents(); this.jmdns = jmdns; // jmdns.addServiceTypeListener(this); - for (int i = 0; i - < list.length; i++) { + for (int i = 0; i< list.length; i++) { jmdns.registerServiceType(list[i]); } } diff --git a/src/freimapgsoc/ServiceDiscoveryUnicast.form b/src/freimapgsoc/ServiceDiscoveryUnicast.form index 76a7b2d..9d08596 100644 --- a/src/freimapgsoc/ServiceDiscoveryUnicast.form +++ b/src/freimapgsoc/ServiceDiscoveryUnicast.form @@ -34,10 +34,10 @@ - - - - + + + + @@ -49,7 +49,7 @@ - + @@ -145,12 +145,9 @@ - - - - - - + + + @@ -175,14 +172,14 @@ - + - + @@ -191,11 +188,8 @@ - - - - - + + @@ -210,42 +204,37 @@ - + - + - + - - - - - - + - + - + @@ -309,9 +298,9 @@ - + - + @@ -402,7 +391,9 @@ + +
@@ -449,26 +440,27 @@ - - + + - + - + - + + - + diff --git a/src/freimapgsoc/ServiceDiscoveryUnicast.java b/src/freimapgsoc/ServiceDiscoveryUnicast.java index 16cb6df..e031c68 100644 --- a/src/freimapgsoc/ServiceDiscoveryUnicast.java +++ b/src/freimapgsoc/ServiceDiscoveryUnicast.java @@ -307,39 +307,38 @@ private void initComponents() { jPanel1.setName("jPanel1"); // NOI18N jPanel1.setPreferredSize(new java.awt.Dimension(500, 162)); - jLabel7.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + jLabel7.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N jLabel7.setName("jLabel7"); // NOI18N - jLabel8.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + jLabel8.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N jLabel8.setName("jLabel8"); // NOI18N nodeIPs.setFont(resourceMap.getFont("nodeIPs.font")); // NOI18N - nodeIPs.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + nodeIPs.setModel(new javax.swing.DefaultComboBoxModel(new String[] { " " })); nodeIPs.setName("nodeIPs"); // NOI18N nodeName.setFont(resourceMap.getFont("nodeName.font")); // NOI18N nodeName.setText(resourceMap.getString("nodeName.text")); // NOI18N nodeName.setName("nodeName"); // NOI18N - jLabel11.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + jLabel11.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N jLabel11.setName("jLabel11"); // NOI18N - nodeLatLon.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + nodeLatLon.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N nodeLatLon.setText(resourceMap.getString("nodeLatLon.text")); // NOI18N nodeLatLon.setName("nodeLatLon"); // NOI18N - jComboBox2.setFont(resourceMap.getFont("jComboBox1.font")); // NOI18N - jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + jComboBox2.setFont(resourceMap.getFont("jComboBox2.font")); // NOI18N jComboBox2.setName("jComboBox2"); // NOI18N - jLabel16.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + jLabel16.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N jLabel16.setText(resourceMap.getString("jLabel16.text")); // NOI18N jLabel16.setName("jLabel16"); // NOI18N - nodegw.setFont(resourceMap.getFont("jLabel12.font")); // NOI18N + nodegw.setFont(resourceMap.getFont("jLabel7.font")); // NOI18N nodegw.setText(resourceMap.getString("nodegw.text")); // NOI18N nodegw.setName("nodegw"); // NOI18N @@ -415,11 +414,9 @@ private void initComponents() { .addComponent(upTimeLab) .addComponent(nodegw))) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel8) - .addComponent(nodeIPs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(35, 35, 35)) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel8) + .addComponent(nodeIPs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(35, 35, 35) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -454,7 +451,9 @@ private void initComponents() { info.setColumns(20); info.setEditable(false); + info.setFont(resourceMap.getFont("info.font")); // NOI18N info.setRows(5); + info.setText(resourceMap.getString("info.text")); // NOI18N info.setName("info"); // NOI18N jScrollPane3.setViewportView(info); @@ -486,8 +485,8 @@ private void initComponents() { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 252, Short.MAX_VALUE)) + .addContainerGap()) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -519,23 +518,24 @@ private void initComponents() { jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addContainerGap(49, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(94, 94, 94) .addComponent(jLabel18, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(119, 119, 119) + .addGap(285, 285, 285) .addComponent(jLabel19, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(149, 149, 149)) + .addContainerGap()) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap(20, Short.MAX_VALUE) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel19, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel18, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(135, Short.MAX_VALUE)) + .addGap(194, 194, 194)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); @@ -544,10 +544,10 @@ private void initComponents() { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE) - .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE) - .addComponent(jPanel1, 0, 671, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, 0, 679, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 679, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 679, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( @@ -556,7 +556,7 @@ private void initComponents() { .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 174, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE) .addContainerGap()) diff --git a/src/freimapgsoc/Start.form b/src/freimapgsoc/Start.form index 8d9a6e5..f6e5388 100644 --- a/src/freimapgsoc/Start.form +++ b/src/freimapgsoc/Start.form @@ -23,27 +23,35 @@ - + + - - - - - + - + - + + + + + + + + + + + + @@ -62,7 +70,11 @@ - + + + + +
@@ -122,5 +134,19 @@ + + + + + + + + + + + + + + diff --git a/src/freimapgsoc/Start.java b/src/freimapgsoc/Start.java index fc93d60..b510fd9 100644 --- a/src/freimapgsoc/Start.java +++ b/src/freimapgsoc/Start.java @@ -41,6 +41,8 @@ private void initComponents() { secondLabel = new javax.swing.JLabel(); openExampleFile = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setName("Form"); // NOI18N @@ -90,26 +92,41 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N jLabel1.setName("jLabel1"); // NOI18N + jLabel2.setFont(resourceMap.getFont("jLabel2.font")); // NOI18N + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + jButton1.setFont(resourceMap.getFont("jButton1.font")); // NOI18N + jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N + jButton1.setName("jButton1"); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel1)) - .addGroup(layout.createSequentialGroup() - .addGap(48, 48, 48) + .addGap(34, 34, 34) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(olsrdButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(mySQLButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(openExampleFile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(openFileButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE))) + .addComponent(openFileButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 230, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() - .addGap(95, 95, 95) - .addComponent(secondLabel))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(81, 81, 81) + .addComponent(secondLabel)) + .addComponent(jLabel2)) + .addGap(8, 8, 8)) + .addGroup(layout.createSequentialGroup() + .addGap(116, 116, 116) + .addComponent(jButton1) + .addContainerGap(134, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel1) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -126,7 +143,11 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addComponent(openFileButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(openExampleFile) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel2) + .addGap(18, 18, 18) + .addComponent(jButton1) + .addContainerGap(10, Short.MAX_VALUE)) ); pack(); @@ -135,11 +156,8 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { private void olsrdButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_olsrdButtonActionPerformed //new Layer(new OlsrdDataSource().init()); CheckActiveDataSource check = new CheckActiveDataSource(); - if(check.mySql){ - MysqlDataSource ds=new MysqlDataSource(); - ds.init(); - } - + MySQLCredential mysqlcr=new MySQLCredential(); + mysqlcr.setVisible(true); }//GEN-LAST:event_olsrdButtonActionPerformed private void openFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openFileButtonActionPerformed @@ -189,7 +207,9 @@ public void run() { }); } // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; private javax.swing.JButton mySQLButton; private javax.swing.JButton olsrdButton; private javax.swing.JButton openExampleFile; diff --git a/src/freimapgsoc/resources/ServiceDiscoveryUnicast.properties b/src/freimapgsoc/resources/ServiceDiscoveryUnicast.properties index 6e36356..314e862 100644 --- a/src/freimapgsoc/resources/ServiceDiscoveryUnicast.properties +++ b/src/freimapgsoc/resources/ServiceDiscoveryUnicast.properties @@ -9,8 +9,8 @@ jLabel2.text=Services: jLabel3.text=Detail: #NOI18N jLabel2.font=Lucida Grande-Plain-10 -nodeLatLon.text=jLabel13 -nodeName.text=jLabel9 +nodeLatLon.text=41.8637595/12.5535823 +nodeName.text=StefanoP #NOI18N nodeName.font=Lucida Grande-Plain-10 #NOI18N @@ -18,11 +18,18 @@ nodeIPs.font=Lucida Grande-Plain-10 upTimeLab.text=UpTime: #NOI18N upTimeLab.font=Lucida Grande 10-Plain-10 -nodegw.text=jLabel13 -jLabel9.text=Attributes: +nodegw.text=\ +4 days 3h 2m #NOI18N jLabel9.font=Lucida Grande 10-Plain-10 -attributeArea.text=jLabel9 +attributeArea.text=Gateway - 192.168.1.1 #NOI18N attributeArea.font=Lucida Grande 10-Plain-10 jButton1.text=See Fresnel Zone +#NOI18N +jComboBox2.font=Lucida Grande-Plain-10 +#NOI18N +jLabel7.font=Lucida Grande-Plain-10 +info.text= +#NOI18N +info.font=Lucida Grande-Plain-10 diff --git a/src/freimapgsoc/resources/Start.properties b/src/freimapgsoc/resources/Start.properties index f1ed088..dd8bd89 100644 --- a/src/freimapgsoc/resources/Start.properties +++ b/src/freimapgsoc/resources/Start.properties @@ -12,3 +12,9 @@ jLabel1.text= jLabel1.icon=aboutfreimap.png #NOI18N nameServiceButton.font=Lucida Grande-Plain-10 +jLabel2.text=If you want to store Mesh Network Data set the mysql credential +#NOI18N +jLabel2.font=Lucida Grande-Plain-10 +jButton1.text=Set MySql +#NOI18N +jButton1.font=Lucida Grande-Plain-10 diff --git a/src/freimapgsoc/resources/eth1Stefa b/src/freimapgsoc/resources/eth1Stefa new file mode 100644 index 0000000000000000000000000000000000000000..18a08abf198c87a7e859d53b28a91b38397184aa GIT binary patch literal 33635 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 literal 0 HcmV?d00001 diff --git a/src/freimapgsoc/resources/tap0Stefa.png b/src/freimapgsoc/resources/tap0Stefa.png new file mode 100644 index 0000000000000000000000000000000000000000..925ec61deee92136cc7cf8bf9a800fd90c4a058a GIT binary patch literal 44927 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%0AVkKYyp6D&fN+R7TN7DrxEPt31qNuS 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 HJ