implement full DatabaseConnector and do some tests
This commit is contained in:
		| @@ -1,5 +1,8 @@ | |||||||
| package ch.hevs.isi; | package ch.hevs.isi; | ||||||
|  |  | ||||||
|  | import ch.hevs.isi.core.BooleanDataPoint; | ||||||
|  | import ch.hevs.isi.core.FloatDataPoint; | ||||||
|  | import ch.hevs.isi.db.DatabaseConnector; | ||||||
| import ch.hevs.isi.utils.Utility; | import ch.hevs.isi.utils.Utility; | ||||||
|  |  | ||||||
| public class MinecraftController { | public class MinecraftController { | ||||||
| @@ -74,5 +77,20 @@ public class MinecraftController { | |||||||
|  |  | ||||||
|         // Start coding here ... |         // Start coding here ... | ||||||
|  |  | ||||||
|  |         // Initialize the database connector | ||||||
|  |         if((dbProtocol != null) && (dbHostName != null)){ | ||||||
|  |             DatabaseConnector.url = dbProtocol+ "://" + dbHostName; | ||||||
|  |             DatabaseConnector.getMySelf().initialize(dbProtocol+ "://" + dbHostName); | ||||||
|  |         } | ||||||
|  |         if(dbName != null){ | ||||||
|  |             DatabaseConnector.org = dbName; | ||||||
|  |         } | ||||||
|  |         if(dbUserName != null){ | ||||||
|  |             DatabaseConnector.bucket = dbUserName; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Initialize the Modbus TCP connector | ||||||
|  |  | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,86 +1,190 @@ | |||||||
| package ch.hevs.isi.db; | package ch.hevs.isi.db; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import ch.hevs.isi.MinecraftController; | ||||||
| import ch.hevs.isi.core.DataPoint; | import ch.hevs.isi.core.DataPoint; | ||||||
| import ch.hevs.isi.core.DataPointListener; | import ch.hevs.isi.core.DataPointListener; | ||||||
|  | import ch.hevs.isi.core.FloatDataPoint; | ||||||
|  | import ch.hevs.isi.utils.Utility; | ||||||
|  |  | ||||||
| import java.io.FileInputStream; | import java.io.FileInputStream; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
| import java.io.OutputStreamWriter; | import java.io.OutputStreamWriter; | ||||||
| import java.net.HttpURLConnection; | import java.net.HttpURLConnection; | ||||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||||
|  | import java.net.ProtocolException; | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.util.Properties; | import java.util.Properties; | ||||||
|  |  | ||||||
|  |  | ||||||
| public class DatabaseConnector implements DataPointListener { | public class DatabaseConnector implements DataPointListener { | ||||||
|     Properties properties = new Properties(); |     private Properties properties = new Properties();           // Properties of the config.properties file | ||||||
|     String default_token = System.getenv("SECRET_TOKEN"); |     private String fullURL = null;                              // Full URL of the InfluxDB server | ||||||
|     String default_url; |     private URL urlForWrite = null;                             // URL of the InfluxDB server | ||||||
|     String default_org; |     private HttpURLConnection con = null;                       // Connection to the InfluxDB server | ||||||
|     String default_bucket; |     private boolean initialized = false;                        // Boolean to know if the database connector is initialized | ||||||
|     String fullURL; |     private TimeManager _timeManager = new TimeManager(3); // Time manager to manage the time of the data points | ||||||
|     URL myURL; |     private long _timestamp = 0;                                // Timestamp of the data points | ||||||
|     HttpURLConnection con; |     String default_token = System.getenv("SECRET_TOKEN"); // Token to access the InfluxDB server | ||||||
|  |     public static String url = null;                            // URL of the InfluxDB server | ||||||
|  |     public static String org = null;                            // Organization of the InfluxDB server | ||||||
|  |     public static String bucket = null;                         // Bucket of the InfluxDB server | ||||||
|  |  | ||||||
|  |  | ||||||
|     private static DatabaseConnector  mySelf = null; |     private static DatabaseConnector  mySelf = null; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Private constructor of the database connector | ||||||
|  |      * Read the config.properties file and initialize the database connector | ||||||
|  |      */ | ||||||
|     private DatabaseConnector (){ |     private DatabaseConnector (){ | ||||||
|  |         // Read the config.properties file | ||||||
|         try (InputStream input = new FileInputStream("src/config.properties")) { |         try (InputStream input = new FileInputStream("src/config.properties")) { | ||||||
|             properties.load(input); |             properties.load(input); | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|         default_url = properties.getProperty("URL"); |  | ||||||
|         default_org = properties.getProperty("ORG"); |         // Get the URL, the organization and the bucket from the config.properties file if their are null | ||||||
|         default_bucket = properties.getProperty("BUCKET"); |         if (url == null){ | ||||||
|  |             url = properties.getProperty("URL"); | ||||||
|  |         } | ||||||
|  |         if (org == null){ | ||||||
|  |             org = properties.getProperty("ORG"); | ||||||
|  |         } | ||||||
|  |         if (bucket == null){ | ||||||
|  |             bucket = properties.getProperty("BUCKET"); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get the instance of the database connector | ||||||
|  |      * @return The instance of the database connector | ||||||
|  |      */ | ||||||
|     public static DatabaseConnector  getMySelf(){ |     public static DatabaseConnector  getMySelf(){ | ||||||
|         if (mySelf == null){ |         if (mySelf == null){ | ||||||
|             mySelf = new DatabaseConnector(); |             mySelf = new DatabaseConnector(); | ||||||
|         } |         } | ||||||
|         return mySelf; |         return mySelf; | ||||||
|     } |     } | ||||||
|     public void initialize(String url){ |  | ||||||
|         String org = default_org; |  | ||||||
|         String bucket = default_bucket; |  | ||||||
|  |  | ||||||
|         fullURL = url + "/api/v2/write?org=" + org + "&bucket=" + bucket; |     /** | ||||||
|         System.out.println(fullURL); |      * Initialize the database connector | ||||||
|  |      * @param url URL of the database. If null take the URL from the config.properties file | ||||||
|  |      */ | ||||||
|  |     public void initialize(String url){ | ||||||
|         try{ |         try{ | ||||||
|             myURL = new URL(fullURL); |             if(urlForWrite == null){ | ||||||
|  |                 if(url == null){ | ||||||
|  |                     url = properties.getProperty("URL"); | ||||||
|  |                 } | ||||||
|  |                 fullURL = url + "/api/v2/write?org=" + org + "&bucket=" + bucket; | ||||||
|  |                 Utility.pDebug("URL: " + fullURL); | ||||||
|  |                 urlForWrite = new URL(fullURL); | ||||||
|  |             } | ||||||
|  |             initialized = true; | ||||||
|         } catch (MalformedURLException e) { |         } catch (MalformedURLException e) { | ||||||
|             throw new RuntimeException(e); |             throw new RuntimeException(e); | ||||||
|         } catch (IOException e) { |  | ||||||
|             throw new RuntimeException(e); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // If the user want to erase the previous data in the database | ||||||
|  |         // Delete the previous data | ||||||
|  |         if(MinecraftController.ERASE_PREVIOUS_DATA_INB_DB){ | ||||||
|  |             try { | ||||||
|  |                 // Create the URL to delete the data | ||||||
|  |                 fullURL = url + "/api/v2/delete?org=" + org + "&bucket=" + bucket; | ||||||
|  |                 Utility.pDebug("URL: " + fullURL); | ||||||
|  |                 URL urlForDelete = new URL(fullURL); | ||||||
|  |                 // Create the connection to the database | ||||||
|  |                 con = (HttpURLConnection) urlForDelete.openConnection(); | ||||||
|  |                 con.setRequestMethod("POST"); | ||||||
|  |                 con.setRequestProperty("Authorization", "Token " + default_token); | ||||||
|  |                 con.setRequestProperty("Content-Type", "text/plain"); | ||||||
|  |                 con.setRequestProperty("Accept", "application/json"); | ||||||
|  |                 con.setDoOutput(true); | ||||||
|  |             } catch (MalformedURLException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } catch (ProtocolException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } catch (IOException e) { | ||||||
|  |                 throw new RuntimeException(e); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Create the data to send to delete the data in the database and send it | ||||||
|  |             String data = "{\n"; | ||||||
|  |             data += "\"start\": \"2000-01-01T00:00:00Z\",\n"; | ||||||
|  |             data += "\"stop\": \"2024-04-25T10:45:00Z\",\n"; | ||||||
|  |             data += "\"predicate\": \"_measurement=\\\"Minecraft\\\"\"\n"; | ||||||
|  |             data += "}"; | ||||||
|  |             Utility.pDebug(data); | ||||||
|  |             sendDataToDatabase(data); | ||||||
|  |             fullURL=null;   // Reset the full URL | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void pushToDatabase(DataPoint dp){ |     /** | ||||||
|         String data = "measurement " + dp.toString(); |      * Push the data point to the database | ||||||
|  |      * @param dp Data point to push | ||||||
|  |      */ | ||||||
|  |     private void pushToDatabase(DataPoint dp) { | ||||||
|  |         // Initialize the database connector if not already done | ||||||
|  |         if(initialized == false){ | ||||||
|  |             initialize(null); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Create the data to send | ||||||
|  |         String data = "Minecraft "; | ||||||
|  |         data += dp.toString(); | ||||||
|  |         data += " " + _timestamp; | ||||||
|  |  | ||||||
|  |         // Send the data to the database | ||||||
|  |         sendDataToDatabase(data); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void sendDataToDatabase(String data){ | ||||||
|         try { |         try { | ||||||
|             HttpURLConnection con = (HttpURLConnection) myURL.openConnection(); |             // Create connection and set headers | ||||||
|             con.setRequestMethod("POST"); |             if(con == null){ | ||||||
|             con.setRequestProperty("Authorization", "Token " + default_token); |                 con = (HttpURLConnection) urlForWrite.openConnection(); | ||||||
|             con.setRequestProperty("Content-Type", "application/json"); |                 con.setRequestMethod("POST"); | ||||||
|             con.setDoOutput(true); |                 con.setRequestProperty("Authorization", "Token " + default_token); | ||||||
|  |                 con.setRequestProperty("Content-Type", "application/json"); | ||||||
|  |                 con.setDoOutput(true); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Send data | ||||||
|             OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); |             OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); | ||||||
|             writer.write(data); |             writer.write(data); | ||||||
|             writer.flush(); |             writer.flush(); | ||||||
|  |  | ||||||
|  |             // Get response code | ||||||
|             int respondCode = con.getResponseCode(); |             int respondCode = con.getResponseCode(); | ||||||
|             System.out.println(dp.toString() + " -> Database. Code: " + respondCode); |             if(respondCode != 204){ | ||||||
|  |                 System.out.println("Error: " + respondCode + ", Data: " + data); | ||||||
|  |             } else { | ||||||
|  |                 System.out.println(data + " -> Database"); | ||||||
|  |             } | ||||||
|             con.disconnect(); |             con.disconnect(); | ||||||
|  |             con = null; | ||||||
|         } catch (IOException e) { |         } catch (IOException e) { | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Push the data point to the database | ||||||
|  |      * @param dp Data point to push | ||||||
|  |      */ | ||||||
|     @Override |     @Override | ||||||
|     public void onNewValue(DataPoint dp) { |     public void onNewValue(DataPoint dp) { | ||||||
|         pushToDatabase(dp); |         if(dp.getLabel().equals("CLOAK_FLOAT")) { | ||||||
|  |             FloatDataPoint fdp = (FloatDataPoint) dp; | ||||||
|  |             _timeManager.setTimestamp(fdp.getValue()); | ||||||
|  |             _timestamp = _timeManager.getNanosForDB(); | ||||||
|  |         } | ||||||
|  |         if(_timestamp != 0){ | ||||||
|  |             pushToDatabase(dp); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import ch.hevs.isi.MinecraftController; | ||||||
|  | import ch.hevs.isi.core.BooleanDataPoint; | ||||||
| import ch.hevs.isi.core.DataPoint; | import ch.hevs.isi.core.DataPoint; | ||||||
| import ch.hevs.isi.core.FloatDataPoint; | import ch.hevs.isi.core.FloatDataPoint; | ||||||
| import ch.hevs.isi.db.DatabaseConnector; | import ch.hevs.isi.db.DatabaseConnector; | ||||||
| @@ -8,19 +10,20 @@ import java.util.Properties; | |||||||
|  |  | ||||||
| public class Database { | public class Database { | ||||||
|     public static void main(String[] args) { |     public static void main(String[] args) { | ||||||
|         Properties properties = new Properties(); |         MinecraftController.ERASE_PREVIOUS_DATA_INB_DB = true; | ||||||
|         try (InputStream input = new FileInputStream("src/config.properties")) { |         FloatDataPoint clock = new FloatDataPoint("CLOAK_FLOAT", false); | ||||||
|             properties.load(input); |  | ||||||
|         } catch (Exception e) { |  | ||||||
|             e.printStackTrace(); |  | ||||||
|         } |  | ||||||
|         String url = properties.getProperty("URL"); |  | ||||||
|  |  | ||||||
|         DatabaseConnector db = DatabaseConnector.getMySelf(); |  | ||||||
|         db.initialize(url); |  | ||||||
|  |  | ||||||
|         FloatDataPoint gridVoltage = new FloatDataPoint("GRID_U_FLOAT", true); |         FloatDataPoint gridVoltage = new FloatDataPoint("GRID_U_FLOAT", true); | ||||||
|         gridVoltage.setValue(500); |         BooleanDataPoint solarPanel = new BooleanDataPoint("REMOTE_SOLAR_SW", true); | ||||||
|  |  | ||||||
|  |         DatabaseConnector.getMySelf().initialize(null); | ||||||
|  |  | ||||||
|  |         clock.setValue(0f); | ||||||
|  |  | ||||||
|  |         for (float i = 0; i < 3; i += 0.1f) { | ||||||
|  |             System.out.println(""); | ||||||
|  |             clock.setValue(i); | ||||||
|  |             gridVoltage.setValue(750 + (100*i)%100); | ||||||
|  |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user