diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index c8d40b5..0b13b74 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -1,19 +1,3 @@ Manifest-Version: 1.0 -Class-Path: jackson-annotations-2.9.0.jar jetty-server-9.4.8.v20171121 - .jar google-oauth-client-jetty-1.23.0.jar httpcore-4.4.10.jar google- - http-client-1.23.0.jar jetty-xml-9.4.8.v20171121.jar jetty-client-9.4 - .8.v20171121.jar commons-logging-1.2.jar jetty-util-9.4.8.v20171121.j - ar google-http-client-jackson2-1.23.0.jar google-oauth-client-java6-1 - .23.0.jar jackson-databind-2.9.5.jar zway-lib-0.2.9-SNAPSHOT.jar jett - y-security-9.4.8.v20171121.jar guava-jdk5-17.0.jar gson-2.8.1.jar slf - 4j-simple-1.7.25.jar javax.servlet-api-3.1.0.jar jetty-webapp-9.4.8.v - 20171121.jar jsr305-1.3.9.jar jetty-io-9.4.8.v20171121.jar websocket- - client-9.4.8.v20171121.jar sqlite-jdbc-3.21.0.1.jar websocket-api-9.4 - .8.v20171121.jar spark-core-2.7.2.jar httpclient-4.5.6.jar libai-1.6. - 12.jar google-oauth-client-1.23.0.jar websocket-server-9.4.8.v2017112 - 1.jar jetty-servlet-9.4.8.v20171121.jar google-api-client-1.23.0.jar - jetty-http-9.4.8.v20171121.jar websocket-common-9.4.8.v20171121.jar w - ebsocket-servlet-9.4.8.v20171121.jar commons-codec-1.10.jar jackson-c - ore-2.9.5.jar slf4j-api-1.7.25.jar -Main-Class: main.Main +Main-Class: main.SeniorAssistant diff --git a/build.gradle b/build.gradle index bebe7bd..cd33528 100644 --- a/build.gradle +++ b/build.gradle @@ -53,8 +53,8 @@ dependencies { //compile 'org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:4.3' //Winzozz 64 //compile 'org.eclipse.swt:org.eclipse.swt.gtk.linux.x86:4.3' //Linuzuzz 32 //compile files('lib/SWT_linux32.jar') - compile files('lib/SWT_linux64.jar') - //compile files('lib/SWT_win64.jar') + //compile files('lib/SWT_linux64.jar') + compile files('lib/SWT_win64.jar') compile group: 'com.hynnet', name: 'DJNativeSwing', version: '1.0.0' compile group: 'com.hynnet', name: 'DJNativeSwing-SWT', version: '1.0.0' } diff --git a/src/main/java/main/SeniorAssistant.java b/src/main/java/main/SeniorAssistant.java new file mode 100644 index 0000000..54f13c7 --- /dev/null +++ b/src/main/java/main/SeniorAssistant.java @@ -0,0 +1,136 @@ +package main; + +import device.*; +import support.database.Database; +import support.database.LocalDB; +import support.database.RemoteDB; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by 20015159 on 28/08/2018. + * Ci si puo' interfacciare con l'assistente tramite Telegram o dal sito di ngrok. + */ +public class SeniorAssistant { + + /** + * Funzione principale, qui si creano tutte le classi che verranno utilizzate.
+ * Si possono passare dei parametri usando -(nome parametro)::(valore parametro)
+ * Ogni parametro deve esser separato da uno o piu spazi
+ * Parametri possibili:
+ * + * @param args i possibili argomenti da passare al programma + */ + public static void main(String[] args) { + VariousThreads threads = new VariousThreads(); // this should be the first action of the main + Map arguments = getArgsMap(args); + + // list of arguments to use in the classes + String hueAddress = arguments.get("hueAddress"); + String hueUser = arguments.get("hueUser"); + //TODO String sensorAddress = arguments.get("sensorAddress"); + Integer sensorNode = getInt(arguments.get("sensorNode")); + String remoteDbUser = arguments.get("remoteDbUser"); + + try { + VariousThreads.LOG.info("Connessione alle Philips Hue..."); + Hue lights = new Hue(hueAddress, hueUser); + + try { + VariousThreads.LOG.info("Connessione ai sensori..."); + Sensor sensor = new Sensor(sensorNode); + + threads.startHueAutoBrightness(lights, sensor); + } catch (Exception e) { + VariousThreads.LOG.warn(e.getMessage()); + } + + try { + VariousThreads.LOG.info("Connessione al Fitbit, ignorare eventuale errore per setPermissionsToOwnerOnly..."); + Fitbit fitbit = new Fitbit(); + + VariousThreads.LOG.info("Connessione al database..."); + Database database = remoteDbUser == null ? new LocalDB() : new RemoteDB(remoteDbUser); + + threads.startInsertData(database, fitbit); + threads.startHueControlledByHeartBeat(lights, fitbit, database); + threads.startCheckSteps(fitbit); + } catch (Exception e) { + VariousThreads.LOG.warn("Non e' stato possibile collegarsi al fitbit"); + e.printStackTrace(); + } + + threads.startWebhook(lights); + } catch (Exception e) { + VariousThreads.LOG.error(e.getMessage()); + } + VariousThreads.LOG.info("FINE MAIN"); + } + + /* + TODO AUTOMATIC: {B}, {D} + + XXX Gestione DB in modo che si aggiorni ogni ora + /B/ Gestione luci in modo che la luminosità sia sempre la stessa + XXX Gestione luci a seconda del battito cardiaco + /D/ Ad una certa ora guarda i passi e se sono pochi dillo + XXX Se i battiti sono troppo bassi/alti avvisare il tizio + + TODO USER-INTERACTION {A}, {C} + + /A/ Dati del sonno/battito/passi che l'utente puo' richiedere + XXX Gestione luci secondo le esigenze dell'utente ( settare Dialogflow e server + risolvere bug ) + XXX Gestione musica tramite comando vocale + TODO la musica non funzia su linux, ma forse + provando ad installare tramite comando: sudo apt-get install ia32-libs-gtk + oppure con: sudo apt-get install libgtk-3-dev + oppure con: sudo apt-get install libgnomeui-dev libxtst-dev freeglut3-dev libgtk-3-dev libgtk2.0-dev + + guardare qui: http://www.eclipse.org/swt/faq.php#gtkstartup + + + // Randomly at night heavy metal start + */ + + /* ------------------------------------------------------------------------------------ + Le funzioni qui sotto servono solamente per gli argomenti passati al main + ------------------------------------------------------------------------------------ */ + + /** + * Prende gli argomenti nel formato "-(.+)::(.+)" e li inserisce in una mappa. + * Se l'argomento non e' nel formato giusto lo ignora. + * @param args un'array di stringhe contente i vari argomenti + * @return una mappa con key il nome dell'argomento (la parte prima del :: e dopo il meno) e come valore il valore di esso (la parte dopo ::) + */ + private static Map getArgsMap(String[] args) { + Map map = new HashMap<>(); + Pattern pattern = Pattern.compile("-(.+)::(.+)"); + + for (String arg: args) { + Matcher matcher = pattern.matcher(arg); + if (matcher.find()) + map.put(matcher.group(1), matcher.group(2)); + } + return map; + } + + /** + * Funzione creata per gli argomenti che vengono passati in modo da evitare millemila try and catch + * @param num la stringa da trasformare in numero + * @return il numero trasformato, null se fallisce + */ + private static Integer getInt(String num) { + Integer returnNum = null; + try { returnNum = Integer.parseInt(num); } catch (Exception e) {} + return returnNum; + } +} diff --git a/src/main/java/main/Main.java b/src/main/java/main/VariousThreads.java similarity index 50% rename from src/main/java/main/Main.java rename to src/main/java/main/VariousThreads.java index 7890797..2e8ab58 100644 --- a/src/main/java/main/Main.java +++ b/src/main/java/main/VariousThreads.java @@ -1,104 +1,50 @@ package main; -import device.*; +import device.DialogFlowWebHook; +import device.Fitbit; +import device.Hue; +import device.Sensor; import device.fitbitdata.HeartRate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import support.Musich; import support.database.Database; -import support.database.LocalDB; -import support.database.RemoteDB; +import java.sql.Timestamp; import java.util.Calendar; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -/** - * Created by 20015159 on 28/08/2018. - * Ci si puo' interfacciare con l'assistente tramite Telegram o dal sito di ngrok. - */ -public class Main { +public class VariousThreads { /** * Un Logger per capire meglio quali pezzi vengono eseguiti e quali no. */ - private static final Logger LOG = LoggerFactory.getLogger("SeniorAssistant"); - - private static Hue lights = null; - private static Fitbit fitbit = null; - private static Sensor sensor = null; - private static Database database = null; - private static Musich musich = new Musich(); + public static final Logger LOG = LoggerFactory.getLogger("SeniorAssistant"); /** - * Funzione principale, qui si creano tutte le classi che verranno utilizzate.
- * Si possono passare dei parametri usando -(nome parametro)::(valore parametro)
- * Ogni parametro deve esser separato da uno o piu spazi
- * Parametri possibili:
- *
    - *
  • hueAddress
  • - *
  • hueUser
  • - *
  • sensorNode
  • - *
  • sensorLog
  • - *
  • remoteDbUser
  • - *
- * @param args + * Una costante che indica quanti millisecondi ci sono in un minuto (utile per le conversioni) */ - public static void main(String[] args) { - System.getProperty("sun.arch.data.model"); - Map arguments = getArgsMap(args); + public static final int MILLISEC_IN_MINUTE = 60000; - // list of arguments to use in the classes - String hueAddress = arguments.get("hueAddress"); - String hueUser = arguments.get("hueUser"); - Integer sensorLog = getInt(arguments.get("sensorLog")); - Integer sensorNode = getInt(arguments.get("sensorNode")); - String remoteDbUser = arguments.get("remoteDbUser"); - try { - LOG.info("Connessione alle Philips Hue..."); - lights = new Hue(hueAddress, hueUser); + /** + * La variabile per far partire della musica da Youtube + */ + private final Musich musich; - try { - LOG.info("Connessione ai sensori..."); - sensor = new Sensor(sensorNode); - - if(sensorLog>0) - startSensorLog(sensorLog); - startHueAutoBrightness(); - } catch (Exception e) { - LOG.warn(e.getMessage()); - } - - try { - LOG.info("Connessione al Fitbit, ignorare eventuale errore per setPermissionsToOwnerOnly..."); - fitbit = new Fitbit(); - - LOG.info("Connessione al database..."); - database = remoteDbUser==null? new LocalDB():new RemoteDB(remoteDbUser); - - startInsertData(); - startCheckSteps(); - startHueControlledByHeartBeat(); - } catch (Exception e) { - LOG.warn("Non e' stato possibile collegarsi al fitbit"); - e.printStackTrace(); - } - - startWebhook(); - } catch (Exception e) { - LOG.error(e.getMessage()); - } - LOG.info("FINE MAIN"); + /** + * Costruttore + */ + public VariousThreads() { + musich = new Musich(); } + // TODO aggingere il fitbit per la richiesta dei dati /** * Fa partire il server Webhook per DialogFlow e continua l'esecuzione + * @param lights le luci che deve controllare */ - private static void startWebhook() { + public void startWebhook(final Hue lights) { DialogFlowWebHook df = new DialogFlowWebHook(); df.addOnAction("LightsON", (params) -> { lights.turnOn(); return null; }); @@ -135,46 +81,38 @@ public class Main { //TODO aggiungere una azione che faccia in modo di richiedere dei dati in particolare //TODO aggiungere una azione su DialogFlow che riconosca di impostare una playlist (Rilassante, Antica...) - LOG.info("Starting Webhook"); df.startServer(); + LOG.info("Webhook partito"); } /** - * Gestione DB in modo che si aggiorni ogni ora + * Gestione DB in modo che si aggiorni ogni ora e ogni giorno.
+ * Da quando viene fatto partire aspetta un giorno e poi aggiorna i dati sul DB; ripete.
+ * Da quando viene fatto partire aspetta un'ora e poi aggiorna i dati sul DB; ripete. + * @param database il database a cui inviare i dati + * @param fitbit la sorgente di dati */ - private static void startInsertData() { + public void startInsertData(final Database database, final Fitbit fitbit) { try { Thread hourlyData = Database.insertHourlyDataIn(database, fitbit, 5); Thread dailyData = Database.insertDailyData(database, fitbit, 5); - LOG.info("Starting threads for automatic update"); hourlyData.start(); dailyData.start(); - + LOG.info("Thread per gli aggiornamenti automatici partiti"); } catch (Exception e) { e.printStackTrace(); } } + // TODO fare auto-brightness /** - * funzione che logga periodicalmente i valori ricevuti dal sensore + * Gestione delle luci in modo che cambiano la luminosita' in base ai dati ricevuti dal sensore
+ * Se l'utente pero' cambia il valore delle luci di sua volonta', il processo non modifichera' le luci per almeno un'ora. + * @param lights le luci da controllare + * @param sensor i sensori da cui porendere i dati */ - private static void startSensorLog(int minutes) { - LOG.info("Starting thread for logging sensor data"); - - Runnable runnable = new Runnable() { - @Override - public synchronized void run() { - sensor.update(0); - LOG.info("Luminosita' rilevata: " + sensor.getBrightnessLevel()); - } - }; - - Database.getThreadStartingEach(runnable, "sensor", minutes).start(); - } - - // TODO AUTO:{B} Gestione luci in modo che la luminosità sia sempre la stessa - private static void startHueAutoBrightness() { + public void startHueAutoBrightness(final Hue lights, final Sensor sensor) { // controllare la luminosita' arrivata dal sensore // trovare un valore di default per ogni ora // se troppo bassa alzare la luci di poco @@ -226,8 +164,14 @@ public class Main { */ } - private static void startHueControlledByHeartBeat() { - LOG.info("Starting thread lights for heartbeat"); + /** + * Permette di far partire un thread che controlla le Hue in base al battito cardiaco.
+ * Il battito e' preso sia in tempo reale dal fitbit, che dal databse, che permette di fare una analisi statistica. + * @param lights le luci da controllare + * @param fitbit da dove ricevo i dati in tempo reale + * @param database da dove posso analizzare i vecchi dati + */ + public void startHueControlledByHeartBeat(final Hue lights, final Fitbit fitbit, final Database database) { final int minutes = 30; final int delta = 15; Runnable runnable = new Runnable() { @@ -263,65 +207,54 @@ public class Main { } }; - Database.getThreadStartingEach(runnable, "lights-with-heartbeat", minutes).start(); + getThreadStartingEach(runnable, minutes, "lights-with-heartbeat").start(); + LOG.info("Thread per il controllo delle luci tramite il battito cardiaco partito"); } - // TODO AUTO:{D} Ad una certa ora guarda i passi e se sono pochi dillo - private static void startCheckSteps() { + // TODO Ad una certa ora guarda i passi e se sono pochi dillo + /** + * Controlla che ad una certa ora si siano fatti abbastanza passi, ed in caso contrario avvisa tramite un messaggio vocale.
+ * E' possibile trasformarlo in controlla ogni X se si sono fatti dei movimenti o meno. + * @param fitbit da dove vediamo se si sono fatti abbastanza passi + */ + public void startCheckSteps(final Fitbit fitbit) { // trovare un orario (magari inserirlo tramite arg) // a quell'ora controllare i passi fatti durante la giornata // se pochi mandare un avviso tramite dialogFlow(?) // (secondo me si puo' evitare) } - /* - TODO AUTOMATIC: {B}, {D} - XXX Gestione DB in modo che si aggiorni ogni ora - /B/ Gestione luci in modo che la luminosità sia sempre la stessa - XXX Gestione luci a seconda del battito cardiaco - /D/ Ad una certa ora guarda i passi e se sono pochi dillo - XXX Se i battiti sono troppo bassi/alti avvisare il tizio - TODO USER-INTERACTION {A}, {C} - /A/ Dati del sonno/battito/passi che l'utente puo' richiedere - XXX Gestione luci secondo le esigenze dell'utente ( settare Dialogflow e server + risolvere bug ) - /C/ Gestione musica tramite comando vocale - - // Randomly at night heavy metal start - */ - - /* ------------------------------------------------------------------------------------ - Le funzioni qui sotto servono solamente per gli argomenti passati al main - ------------------------------------------------------------------------------------ */ /** - * Prende gli argomenti nel formato "-(.+)::(.+)" e li inserisce in una mappa. - * Se l'argomento non e' nel formato giusto lo ignora. - * @param args un'array di stringhe contente i vari argomenti - * @return una mappa con key il nome dell'argomento (la parte prima del :: e dopo il meno) e come valore il valore di esso (la parte dopo ::) + * Restuisce un thread che se fatto partire, esegue il runnable in un sub-thread ogni X minuti
+ * Il sotto thread lanciato avra' lo stesso nome, ma con un trattino e la data di lancio a seguito
+ * Se il thread viene interrotto non fa piu' partire il runnable e si ferma + * @param runnable il runnable da lanciare + * @param minutes i minuti da aspettare, se negativi o 0 ritorna null + * @param threadName il nome da dare al thread */ - private static Map getArgsMap(String[] args) { - Map map = new HashMap<>(); - Pattern pattern = Pattern.compile("-(.+)::(.+)"); + public static Thread getThreadStartingEach(final Runnable runnable, int minutes, String threadName) { + if(minutes<1) + return null; - for (String arg: args) { - Matcher matcher = pattern.matcher(arg); - if (matcher.find()) - map.put(matcher.group(1), matcher.group(2)); - } - return map; - } - - /** - * Funzione creata per gli argomenti che vengono passati in modo da evitare millemila try and catch - * @param num la stringa da trasformare in numero - * @return il numero trasformato, null se fallisce - */ - private static Integer getInt(String num) { - Integer returnNum = null; - try { returnNum = Integer.parseInt(num); } catch (Exception e) {} - return returnNum; + return new Thread(new Runnable() { + @Override + public synchronized void run() { + boolean notInterrupted = true; + do { + try { + wait(minutes * MILLISEC_IN_MINUTE); + Thread thread = new Thread(runnable, threadName + "-" + new Timestamp(System.currentTimeMillis())); + thread.start(); + } catch (Exception e) { + e.printStackTrace(); + notInterrupted = false; + } + } while (notInterrupted); + } + }, threadName); } } diff --git a/src/main/java/support/Musich.java b/src/main/java/support/Musich.java index 04268a9..937f525 100644 --- a/src/main/java/support/Musich.java +++ b/src/main/java/support/Musich.java @@ -94,7 +94,8 @@ public class Musich { } /** - * Dato l'id di un video viene fatta partire un frame contenente il video richiesto + * Dato l'id di un video viene fatta partire un frame contenente il video richiesto
+ * Come al solito, youtube potrebbe far partire una pubblicita'... eh beh. * @param videoId l'id del video da far vedere * @param seconds da quanti secondi bisogna far partire il video */ @@ -123,7 +124,8 @@ public class Musich { } /** - * Dato l'id di un video viene fatta partire un frame contenente il video richiesto + * Dato l'id di un video viene fatta partire un frame contenente il video richiesto
+ * Come al solito, youtube potrebbe far partire una pubblicita'... eh beh. * @param videoId l'id del video da far vedere */ public void play(final String videoId) { @@ -131,7 +133,8 @@ public class Musich { } /** - * Serve a far partire un video a caso tra quelli che corrispondono alle keyword indicate nella ricerca + * Serve a far partire un video a caso tra quelli che corrispondono alle keyword indicate nella ricerca
+ * Come al solito, youtube potrebbe far partire una pubblicita'... eh beh. * @param search la ricerca da fare su youtube * @param maxResult fra quanti risultati deve scegliere */ diff --git a/src/main/java/support/Rest.java b/src/main/java/support/Rest.java index 15ca4ca..787a5b2 100644 --- a/src/main/java/support/Rest.java +++ b/src/main/java/support/Rest.java @@ -41,23 +41,22 @@ public class Rest { public static Map get(String URL) { Map response = new HashMap<>(); - CloseableHttpClient httpclient = HttpClients.createDefault(); - HttpGet request = new HttpGet(URL); - - CloseableHttpResponse result; try { - result = httpclient.execute(request); + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpGet request = new HttpGet(URL); + CloseableHttpResponse result = httpclient.execute(request); String json = EntityUtils.toString(result.getEntity()); - // do something useful with the response body + response = gson.fromJson(json, Map.class); - // should be inside a finally... result.close(); + httpclient.close(); LOG.debug("GET response: " + json); - } catch (IOException e) { + } catch (Exception e) { LOG.error("GET: " + e.getMessage()); } + return response; } @@ -69,17 +68,16 @@ public class Rest { * @param contentType the content type of the request */ public static void put(String URL, String contentBody, String contentType) { - CloseableHttpClient httpclient = HttpClients.createDefault(); - HttpPut request = new HttpPut(URL); - - StringEntity params; try { - params = new StringEntity(contentBody); + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpPut request = new HttpPut(URL); + StringEntity params = new StringEntity(contentBody); + request.addHeader("content-type", contentType); request.setEntity(params); - // I don't really care about the response + HttpResponse result = httpclient.execute(request); - // should be in finally... + httpclient.close(); } catch (Exception e) { LOG.error("PUT: " + e.getMessage()); diff --git a/src/main/java/support/database/Database.java b/src/main/java/support/database/Database.java index 3184c56..beeff57 100644 --- a/src/main/java/support/database/Database.java +++ b/src/main/java/support/database/Database.java @@ -6,9 +6,11 @@ import device.fitbitdata.Sleep; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.Timestamp; import java.util.List; +import static main.VariousThreads.MILLISEC_IN_MINUTE; +import static main.VariousThreads.getThreadStartingEach; + public interface Database { /** @@ -16,11 +18,6 @@ public interface Database { */ Logger LOG = LoggerFactory.getLogger("DB"); - /** - * Una costante che indica quanti millisecondi ci sono in un minuto (utile per le conversioni) - */ - int MILLISEC_IN_MINUTE = 60000; - /** * Dice solamente se e' possibile collegarsi al database e se si possono fare delle query * @return vero se si pu' falso in altri casi. @@ -85,7 +82,7 @@ public interface Database { } }; - return getThreadStartingEach(runnable, "update-hourly-data", 60); + return getThreadStartingEach(runnable, 60, "update-hourly-data"); } /** @@ -121,36 +118,6 @@ public interface Database { } }; - return getThreadStartingEach(runnable, "update-daily-data", 24*60); - } - - /** - * Restuisce un thread che se fatto partire, esegue il runnable in un sub-thread ogni X minuti
- * Il sotto thread lanciato avra' lo stesso nome, ma con un trattino e la data di lancio a seguito
- * Se il thread viene interrotto non fa piu' partire il runnable e si ferma - * @param runnable il runnable da lanciare - * @param threadName il nome da dare al thread - * @param minutes i minuti da aspettare, se negativi o 0 ritorna null - */ - static Thread getThreadStartingEach(final Runnable runnable, String threadName, int minutes) { - if(minutes<1) - return null; - - return new Thread(new Runnable() { - @Override - public synchronized void run() { - boolean notInterrupted = true; - do { - try { - wait(minutes * MILLISEC_IN_MINUTE); - Thread thread = new Thread(runnable, threadName + "-" + new Timestamp(System.currentTimeMillis())); - thread.start(); - } catch (Exception e) { - e.printStackTrace(); - notInterrupted = false; - } - } while (notInterrupted); - } - }, threadName); + return getThreadStartingEach(runnable, 24*60, "update-daily-data"); } } diff --git a/src/main/java/support/database/RemoteDB.java b/src/main/java/support/database/RemoteDB.java index 78884e4..3477832 100644 --- a/src/main/java/support/database/RemoteDB.java +++ b/src/main/java/support/database/RemoteDB.java @@ -1,23 +1,31 @@ package support.database; import device.fitbitdata.HeartRate; +import support.Rest; import java.util.List; +import java.util.Map; // TODO implement public class RemoteDB implements Database { - public static final String BASE_URL = "https://localhost:"; //TODO inserire il percorso giusto con la porta - + private final String base_url; private final String username; public RemoteDB(String username) { + this(username, "http://127.0.0.1:5001/api/"); + } + + public RemoteDB(String username, String base_url) { this.username = username; + this.base_url = base_url; } @Override public boolean isReachable() { - return false; + Map map = Rest.get(base_url+"user/"); + LOG.info(map.toString()); + return !map.isEmpty(); } @Override diff --git a/src/test/java/test/TestRemoteDB.java b/src/test/java/test/TestRemoteDB.java new file mode 100644 index 0000000..4457bea --- /dev/null +++ b/src/test/java/test/TestRemoteDB.java @@ -0,0 +1,19 @@ +package test; + +import org.junit.Test; +import support.database.Database; +import support.database.RemoteDB; + +import static org.junit.Assert.assertTrue; + +public class TestRemoteDB { + + private static final String REMOTE_URL = "http://127.0.0.1:5001/api/"; + private static final String USERNAME = "vecchio"; + + @Test + public void test() { + Database database = new RemoteDB(USERNAME, REMOTE_URL); + assertTrue(database.isReachable()); + } +}