Browse Source

refactor init

Lukas Cerny 4 years ago
parent
commit
8d9cc0a721

+ 22 - 1
pom.xml

@@ -160,7 +160,28 @@
     </build>
 
     <dependencies>
-<!-- Tests -->
+      <!-- NEW DATABASE DEPENDENCIES -->
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>4.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jdbi</groupId>
+            <artifactId>jdbi3-postgres</artifactId>
+            <version>3.20.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jdbi</groupId>
+            <artifactId>jdbi3-jodatime2</artifactId>
+            <version>3.20.0</version>
+        </dependency>
+
+
+
+
+
+        <!-- Tests -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

+ 36 - 63
src/main/java/cz/hsrs/db/ConnectionManager.java

@@ -1,11 +1,9 @@
 package cz.hsrs.db;
 
-import java.beans.PropertyVetoException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Properties;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import cz.hsrs.db.pool.SQLExecutor;
@@ -24,19 +22,13 @@ class ConnectionManager {
 	public static Logger logger = Logger.getLogger(SQLExecutor.LOGGER_ID);
 	
 	@Deprecated
-	private ConnectionManager() {
-		
-	}
+	private ConnectionManager() { }
 
 	public static void setProperties(Properties proper) throws SQLException {
-
-			prop = proper;		
-			
+			prop = proper;
 			UnitsPositions_table = prop.getProperty("UnitsPositions_table");
 			UnitsTracks_table = prop.getProperty("UnitsTracks_table");
 			UnitsLastPositions_table = prop.getProperty("UnitsLastPositions_table");
-		
-
 	}
 
 	public static String getUnitsPositions_table() {
@@ -53,68 +45,49 @@ class ConnectionManager {
 	
   
 	public static synchronized Connection getConnectionnn() throws SQLException  {
-		if (conn == null || conn.isClosed()) {
-
+		if (conn != null && !conn.isClosed()) {
+			return conn;
+		}
 
-			// String propFile =
-			// "/home/jezekjan/code/workspace-web2/DBFeederService/WebContent/WEB-INF/database.properties";
-			// = new Properties();
-			// prop.load(new FileInputStream(propFile));
-			try {			
-				try {
-					Class.forName("org.postgresql.Driver").newInstance();
-				} catch (InstantiationException e) {
-					throw new SQLException(e);
-				} catch (IllegalAccessException e) {
-					// TODO Auto-generated catch block
-					throw new SQLException(e);
-				} catch (ClassNotFoundException e) {
-					// TODO Auto-generated catch block
-					throw new SQLException(e);
-				}
-				
-				conn = DriverManager
-						.getConnection((String) prop.get("Address"),
-								(String) prop.get("Username"), (String) prop
-										.get("Password"));					
-				return conn;
-			} catch (NullPointerException e) {
-				throw new NullPointerException(
-						"You have to setProperties before getting Connection");
-			}
+		try {
+			Class.forName("org.postgresql.Driver").newInstance();
+		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+			throw new SQLException(e);
+		}
 
-		} else
+		try {
+			String address = (String) prop.get("Address");
+			String username = (String) prop.get("Username");
+			String password = (String) prop.get("Password");
+			conn = DriverManager.getConnection(address, username, password);
 			return conn;
+		} catch (NullPointerException e) {
+			throw new NullPointerException(
+					"You have to setProperties before getting Connection");
+		}
 	}
   
 	
 	public static synchronized Connection getConnectionFeeder() throws SQLException  {
-		if (connFeeder == null || connFeeder.isClosed()) {
-			try {			
-				try {
-					Class.forName("org.postgresql.Driver").newInstance();
-				} catch (InstantiationException e) {
-					throw new SQLException(e);
-				} catch (IllegalAccessException e) {
-					// TODO Auto-generated catch block
-					throw new SQLException(e);
-				} catch (ClassNotFoundException e) {
-					// TODO Auto-generated catch block
-					throw new SQLException(e);
-				}
-				
-				connFeeder = DriverManager
-						.getConnection((String) prop.get("Address"),
-								(String) prop.get("Username"), (String) prop
-										.get("Password"));					
-				return connFeeder;
-			} catch (NullPointerException e) {
-				throw new NullPointerException(
-						"You have to setProperties before getting Connection");
-			}
+		if (connFeeder != null && !connFeeder.isClosed()) {
+			return connFeeder;
+		}
+
+		try {
+			Class.forName("org.postgresql.Driver").newInstance();
+		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+			throw new SQLException(e);
+		}
 
-		} else
+		try {
+			String address = (String) prop.get("Address");
+			String username = (String) prop.get("Username");
+			String password = (String) prop.get("Password");
+			connFeeder = DriverManager.getConnection(address, username, password);
 			return connFeeder;
+		} catch (NullPointerException e) {
+			throw new NullPointerException("You have to setProperties before getting Connection");
+		}
 	}
 	
 	public static void closeConnection() throws SQLException {

+ 12 - 39
src/main/java/cz/hsrs/db/model/Observation.java

@@ -23,7 +23,8 @@ public class Observation implements DBObject {
     private int gid;
     private long unit_id;
     private Double observedValue;
-    private final SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
+
+    private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
     
     @Override
     public DBObject getDBObject(ResultSet set) throws SQLException {
@@ -37,7 +38,6 @@ public class Observation implements DBObject {
      * @param unit_id - id of unit
      */
     public Observation(Date timeStamp, Double observedValue, long sensor_id, long unit_id) {
-        super();
         this.sensor_id = sensor_id;
         this.timeStamp = timeStamp;
         this.unit_id = unit_id;
@@ -50,11 +50,10 @@ public class Observation implements DBObject {
      * @throws SQLException
      */
     public Observation(ResultSet set) throws SQLException {
-        super();
         this.sensor_id = set.getLong("sensor_id");
         String time_string =  set.getString("time_stamp");
         try {
-            timeStamp =  formater.parse(time_string+"00");
+            timeStamp =  FORMATTER.parse(time_string+"00");
         } catch (ParseException e) {
             // Should never happpend
             SQLExecutor.logger.log(Level.SEVERE, e.getMessage());
@@ -63,11 +62,8 @@ public class Observation implements DBObject {
         this.observedValue = set.getDouble("observed_value");
         this.gid = set.getInt("gid");
     }
-    /**
-     * Empty constructor
-     */
-    public Observation() {
-    }    
+
+    public Observation() { }
 
     public long getUnitId(){
         return unit_id;
@@ -93,36 +89,13 @@ public class Observation implements DBObject {
     public void setObservedValue(Double observedValue) {
         this.observedValue = observedValue;
     }
-    
-    /**
-     * Method inserts Observation to database
-     * @return true if observations was successfully inserted, 
-     * false if it wasn't
-     * @throws SQLException
-     */
+
+
     public boolean insertToDb() throws SQLException{
-        String ins = null;
-        if(this.observedValue.isNaN()){
-            ins = "INSERT INTO observations(time_stamp, observed_value, sensor_id, unit_id) VALUES ("
-                    + "'"+formater.format(this.timeStamp)+ "',"
-                    + " 'NaN',"
-                    + " "+this.sensor_id+","
-                    + " "+this.unit_id+");";
-        }
-        else{
-            ins = "INSERT INTO observations(time_stamp, observed_value, sensor_id, unit_id) VALUES ("
-                    + "'"+formater.format(this.timeStamp)+ "',"
-                    + " "+this.observedValue+","
-                    + " "+this.sensor_id+","
-                    + " "+this.unit_id+");";
-        }
-        int i = SQLExecutor.executeUpdate(ins);
-        /* Promyslet!! */
-        if (i == 1 || i == 0){
-            return true;
-        }
-        else{
-            return false;
-        }
+        int i = SQLExecutor.executeUpdate(String.format(
+                "INSERT INTO observations(time_stamp, observed_value, sensor_id, unit_id) VALUES ('%s', %s, %s, %s);",
+                FORMATTER.format(timeStamp), observedValue.isNaN() ? "'NaN'" : observedValue, sensor_id, unit_id
+        ));
+        return i == 1 || i == 0;
     }
 }

+ 1 - 2
src/main/java/cz/hsrs/db/util/ServerUtil.java

@@ -29,8 +29,7 @@ public class ServerUtil extends DBUtil {
 		return urls;
 	}
 
-	public void callServers(List<URL> urls, final String query)
-			throws MalformedURLException {
+	public void callServers(List<URL> urls, final String query) throws MalformedURLException {
 		for (final URL url : urls) {
 			final URL urlreq = new URL(url.toString() + "?" + query);
 			(new CallServer(urlreq, System.out)).start();

+ 2 - 3
src/main/java/cz/hsrs/rest/SCListener.java

@@ -1,7 +1,6 @@
 package cz.hsrs.rest;
 
 import cz.hsrs.db.pool.SQLExecutor;
-import cz.hsrs.rest.provider.InfoRest;
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -9,8 +8,8 @@ import java.io.FileInputStream;
 import java.util.Properties;
 import java.util.logging.Logger;
 
-import static cz.hsrs.core.ApplicationInfo.appVersion;
-import static cz.hsrs.core.ApplicationInfo.buildVersion;
+import static io.senslog.core.ApplicationInfo.appVersion;
+import static io.senslog.core.ApplicationInfo.buildVersion;
 
 /**
  * 

+ 3 - 3
src/main/java/cz/hsrs/rest/provider/InfoRest.java

@@ -1,6 +1,6 @@
 package cz.hsrs.rest.provider;
 
-import cz.hsrs.core.ApplicationInfo;
+import io.senslog.core.ApplicationInfo;
 import net.sf.json.JSONObject;
 
 import javax.ws.rs.GET;
@@ -9,8 +9,8 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
 import java.util.concurrent.TimeUnit;
 
-import static cz.hsrs.core.ApplicationInfo.appVersion;
-import static cz.hsrs.core.ApplicationInfo.buildVersion;
+import static io.senslog.core.ApplicationInfo.appVersion;
+import static io.senslog.core.ApplicationInfo.buildVersion;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 @Path("/info")

+ 82 - 107
src/main/java/cz/hsrs/servlet/feeder/FeederServlet.java

@@ -18,6 +18,7 @@ import java.util.logging.LogManager;
 import java.util.logging.Logger;
 
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -27,22 +28,42 @@ import cz.hsrs.db.pool.SQLExecutor;
 import cz.hsrs.db.util.AlertUtil;
 import cz.hsrs.db.util.ServerUtil;
 
+import static cz.hsrs.servlet.feeder.ServiceParameters.*;
 
-public class FeederServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
+
+public class FeederServlet extends HttpServlet {
     static final long serialVersionUID = 1L;
 
-    public static Logger logger = Logger.getLogger(SQLExecutor.LOGGER_ID);
+    private static final Logger logger = Logger.getLogger(FeederServlet.class.getSimpleName());
+
     private static final List<URL> BACKUP_URLS = new LinkedList<>();
-    
 
-    private static String getTimeZone(){
-        Calendar cal = Calendar.getInstance();
-        int z = ((cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000)/60);
-        return "+0"+String.valueOf(z).subSequence(0, 1)+"00";
+    @Override
+    public void init() throws ServletException {
+        String propFile = getServletContext().getRealPath("WEB-INF/database.properties");
+        Properties prop = new Properties();
+        try {
+            prop.load(new FileInputStream(propFile));
+            SQLExecutor.setProperties(prop);
+        } catch (Exception e) {
+            logger.log(Level.SEVERE, e.getMessage(), e);
+        }
+
+        /* Initialize logging properties */
+        try {
+            FileInputStream fstrem = new FileInputStream(new File(getServletContext().getRealPath("WEB-INF/logging.properties")));
+            LogManager.getLogManager().readConfiguration(fstrem);
+            logger.log(Level.INFO, "Logging inialized Succesefully!");
+        } catch (SecurityException | IOException e1) {
+            logger.log(Level.SEVERE, e1.getMessage());
+        }
+
+        SQLExecutor.setProperties(prop);
+        super.init();
     }
 
-    protected void doGet(HttpServletRequest request,
-            HttpServletResponse response) throws ServletException, IOException {
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
         /* Forward request to other servers */
         try {
@@ -51,69 +72,53 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         } catch (Exception e) {
             logger.log(Level.WARNING, e.getMessage() + " query: " + request.getQueryString(), e);
         }
-        
-        /* Insert observation request */
-        if (request.getParameter(ServiceParameters.OPERATION).equals(ServiceParameters.INSERT_OBSERVATION)) {
-            PrintWriter out = response.getWriter();
-            try {
-                out.print(insObservation(request));
-            } catch (Exception e) {
-                logger.log(Level.WARNING, e.getMessage() + " query: "+ request.getQueryString(), e);
-                out.print(false);
-            }
-        }
-        
-        /* Insert position request */
-        else if (request.getParameter(ServiceParameters.OPERATION).equals(ServiceParameters.INSERT_POSITION)) {
-            PrintWriter out = response.getWriter();
-            try {
-                out.print(insPosition(request));
-            } catch (Exception e) {
-                logger.log(Level.WARNING, e.getMessage()+" query: "+request.getQueryString(), e);
-                out.print(false);
-            }
-        }
 
-        /* Insert new alert event request */
-        else if (request.getParameter(ServiceParameters.OPERATION).equals(ServiceParameters.INSERT_ALERT_EVENT)) {
-            PrintWriter out = response.getWriter();
-            try {
-                out.print(insAlertEvent(request)); // depends on existing older event!!!
-            } catch (Exception e) {
-                logger.log(Level.WARNING, e.getMessage() + " query: " + request.getQueryString(), e);
-                out.print(false);
-            }
-        } 
-        /* Set solving parameter of alert event request */
-        else if (request.getParameter(ServiceParameters.OPERATION).equals(ServiceParameters.SOLVING_ALERT_EVENT)) {
-            PrintWriter out = response.getWriter();
-            try {
-                insSolvingAlertEvent(request);
-                out.print(true);
-            } catch (Exception e) {
-                logger.log(Level.WARNING, e.getMessage() + " query: " + request.getQueryString(), e);
-                out.print(false);
-            }
-        } else if (request.getParameter(ServiceParameters.OPERATION).equals("RESET")) {
-            SQLExecutor.close();
-            init();
-            response.sendRedirect("./monitor.jsp");
+        String requestOperation = request.getParameter(ServiceParameters.OPERATION);
 
-        } else if (request.getParameter(ServiceParameters.OPERATION).equals("SLEEP")) {
-            try {
-                Thread.sleep(20000);
-                PrintWriter out = response.getWriter();
-                out.print("uzzzz....");
-            } catch (InterruptedException e) {
-                e.printStackTrace();
+        PrintWriter out = response.getWriter();
+        try {
+            switch (requestOperation) {
+                case INSERT_OBSERVATION: { // Insert observation request
+                    out.print(insObservation(request));
+                }
+                break;
+                case INSERT_POSITION: { // Insert position request
+                    out.print(insPosition(request));
+                }
+                break;
+                case INSERT_ALERT_EVENT: { // Insert new alert event request
+                    out.print(insAlertEvent(request)); // depends on existing older event!!!
+                }
+                break;
+                case SOLVING_ALERT_EVENT: { // Set solving parameter of alert event request
+                    out.print(insSolvingAlertEvent(request));
+                }
+                break;
+                case "RESET": { // Set solving parameter of alert event request
+                    SQLExecutor.close();
+                    init();
+                    response.sendRedirect("./monitor.jsp");
+                }
+                case "SLEEP": {
+                    try {
+                        Thread.sleep(20000);
+                        out.print("uzzzz....");
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
             }
+        } catch (Exception e) {
+            logger.log(Level.WARNING, e.getMessage() + " query: " + request.getQueryString(), e);
+            out.print(false);
         }
     }
 
+    @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
         /* Insert position via insert.jsp page form */
-        if (request.getParameter(ServiceParameters.OPERATION).equals(ServiceParameters.INSERT_POSITION)) {
+        if (request.getParameter(ServiceParameters.OPERATION).equals(INSERT_POSITION)) {
             PrintWriter out = response.getWriter();
             try {
                 insPosition(request);
@@ -127,7 +132,8 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         }
     }
 
-    public static Date parse(String dateString) throws ParseException {
+
+    private static Date parse(String dateString) throws ParseException {
         final SimpleDateFormat formaterT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
         final SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
 
@@ -155,7 +161,13 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         }
     }
 
-    protected boolean insObservation(HttpServletRequest request) throws SQLException, ParseException {
+    private static String getTimeZone(){
+        Calendar cal = Calendar.getInstance();
+        int z = ((cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000)/60);
+        return "+0"+String.valueOf(z).subSequence(0, 1)+"00";
+    }
+
+    private static boolean insObservation(HttpServletRequest request) throws SQLException, ParseException {
         Double value = Double.parseDouble(request.getParameter(ServiceParameters.VALUE));
         String time = request.getParameter(ServiceParameters.DATE);
         long unit_id = Long.parseLong(request.getParameter(ServiceParameters.UNIT_ID));
@@ -164,13 +176,8 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         Date date = parse(time);// "2008-01-02 12:00:00");    
         return DatabaseFeedOperation.insertObservation(date, unit_id, sensor_id, value);
     }
-    
-    /**
-     * Method insert new position in database
-     * @param request HTTP request with parameters
-     * @throws SQLException while parsing request
-     */
-    protected boolean insPosition(HttpServletRequest request) throws SQLException {
+
+    private static boolean insPosition(HttpServletRequest request) throws SQLException {
         boolean inserted;
         /* Mandatory lat and lon */
         double lat = Double.parseDouble(request.getParameter(ServiceParameters.LAT));
@@ -213,35 +220,7 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         return inserted;
     }
 
-    public void init() throws ServletException {
-        String propFile = getServletContext().getRealPath("WEB-INF/database.properties");
-        Properties prop = new Properties();
-        try {
-            prop.load(new FileInputStream(propFile));
-            SQLExecutor.setProperties(prop);
-        } catch (Exception e) {
-            logger.log(Level.SEVERE, e.getMessage(), e);
-        }
-
-        /* Initialize logging properties */
-        try {
-            FileInputStream fstrem = new FileInputStream(new File(getServletContext().getRealPath("WEB-INF/logging.properties")));
-            LogManager.getLogManager().readConfiguration(fstrem);
-            logger.log(Level.INFO, "Logging inialized Succesefully!");
-        } catch (SecurityException | IOException e1) {
-            logger.log(Level.SEVERE, e1.getMessage());
-        }
-
-        SQLExecutor.setProperties(prop);
-        super.init();
-    }
-
-    /**
-     * Method processes insertAlertEvent request
-     * @param request - HTTP GET request
-     * @throws Exception throws exception while parsing time stamp 
-     */
-    protected boolean insAlertEvent(HttpServletRequest request) throws Exception {
+    private static boolean insAlertEvent(HttpServletRequest request) throws Exception {
         String time = request.getParameter(ServiceParameters.DATE);
         long unit_id = Long.parseLong(request.getParameter(ServiceParameters.UNIT_ID));
         int alert_id = Integer.parseInt(request.getParameter(ServiceParameters.ALERT_ID));
@@ -257,13 +236,9 @@ public class FeederServlet extends javax.servlet.http.HttpServlet implements jav
         return notOlderEvent;
     }
 
-    /**
-     * Method processes insert solving parameter request
-     * @param request HTTP get request
-     * @throws Exception while parsing alert_event_id
-     */
-    protected void insSolvingAlertEvent(HttpServletRequest request)    throws Exception {
+    private static boolean insSolvingAlertEvent(HttpServletRequest request) throws Exception {
         int event_id = Integer.parseInt(request.getParameter(ServiceParameters.ALERT_EVENT_ID));
         DatabaseFeedOperation.solvingAlertEvent(event_id);
+        return true;
     }
 }

+ 22 - 22
src/main/java/cz/hsrs/servlet/feeder/ServiceParameters.java

@@ -2,33 +2,33 @@ package cz.hsrs.servlet.feeder;
 
 public class ServiceParameters {
 
-	public static String OPERATION = "Operation";
+	public static final String OPERATION = "Operation";
 
 	// --- FeederServlet ---
-	public static String INSERT_OBSERVATION = "InsertObservation";
-	public static String INSERT_POSITION = "InsertPosition";
-	public static String INSERT_POI = "InsertPOI";
-	public static String INSERT_ALERT_EVENT = "InsertAlertEvent";
-	public static String SOLVING_ALERT_EVENT = "SolvingAlertEvent";
-
-
-	public static String UNIT_ID = "unit_id";
-	public static String SENSOR_ID = "sensor_id";
-	public static String PHENOMEN_ID = "phenomenon_id";
-	public static String LAT = "lat";
-	public static String LON = "lon";
-	public static String ALT = "alt";
-	public static String SPEED = "speed";
-	public static String DOP = "dop";
-	public static String VALUE = "value";
-	public static String DATE = "date";
-	public static String FROM = "from";
-	public static String TO = "to";
+	public static final String INSERT_OBSERVATION = "InsertObservation";
+	public static final String INSERT_POSITION = "InsertPosition";
+	public static final String INSERT_POI = "InsertPOI";
+	public static final String INSERT_ALERT_EVENT = "InsertAlertEvent";
+	public static final String SOLVING_ALERT_EVENT = "SolvingAlertEvent";
+
+
+	public static final String UNIT_ID = "unit_id";
+	public static final String SENSOR_ID = "sensor_id";
+	public static final String PHENOMEN_ID = "phenomenon_id";
+	public static final String LAT = "lat";
+	public static final String LON = "lon";
+	public static final String ALT = "alt";
+	public static final String SPEED = "speed";
+	public static final String DOP = "dop";
+	public static final String VALUE = "value";
+	public static final String DATE = "date";
+	public static final String FROM = "from";
+	public static final String TO = "to";
 	public static final String TRUNC = "trunc";
 
 
-	public static String ALERT_ID = "alert_id";
-	public static String ALERT_EVENT_ID = "alert_event_id";
+	public static final String ALERT_ID = "alert_id";
+	public static final String ALERT_EVENT_ID = "alert_event_id";
 	public static final String USER = "user";
 	public static final String GROUP = "group";
 

+ 30 - 68
src/main/java/cz/hsrs/track/TrackIgnitionSolver.java

@@ -3,15 +3,18 @@ package cz.hsrs.track;
 import java.sql.SQLException;
 import java.util.Date;
 import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import cz.hsrs.db.model.NoItemFoundException;
 import cz.hsrs.db.model.Observation;
 import cz.hsrs.db.model.TrackData;
 import cz.hsrs.db.model.UnitPosition;
 import cz.hsrs.db.util.Util;
-import cz.hsrs.servlet.feeder.FeederServlet;
 
 public class TrackIgnitionSolver {
+
+    private static final Logger logger = Logger.getLogger(TrackIgnitionSolver.class.getSimpleName());
+
     private final Util util;
     private final int timeConst;
     public static final int IGNITION_SENSOR_ID = 330040000;
@@ -21,12 +24,7 @@ public class TrackIgnitionSolver {
     private UnitPosition positionBefore;
     private Observation observationBefore;
 
-    /**
-     * Constructs solver
-     * 
-     * @param obs
-     * @throws SQLException
-     */
+
     public TrackIgnitionSolver(Observation obs) throws SQLException {
         observation = obs;
         util = new Util();
@@ -37,12 +35,10 @@ public class TrackIgnitionSolver {
         }
 
         try {
-            this.position = util.getExactObservationPosition(observation
-                    .getTimeStamp(), observation.getUnitId());
-            } catch (NoItemFoundException e1) {
-                throw new SQLException(e1);
-            }
-        //}
+            this.position = util.getExactObservationPosition(observation.getTimeStamp(), observation.getUnitId());
+        } catch (NoItemFoundException e1) {
+            throw new SQLException(e1);
+        }
     }
 
     private boolean initPositionBefore(Date timestamp, long unit_id) throws SQLException {
@@ -53,12 +49,7 @@ public class TrackIgnitionSolver {
             return false;
         }
     }
-    /**
-     * Initialize observation and position before this observation
-     * 
-     * @return
-     * @throws SQLException
-     */
+
     private boolean initObservationBefore() throws SQLException {
         try {
             observationBefore = util.getObservationBefore(position, IGNITION_SENSOR_ID);
@@ -68,16 +59,13 @@ public class TrackIgnitionSolver {
         }
     }
 
-    
-    /**
-     * 
-     */
     public void solve() throws SQLException {
         if (!initObservationBefore()) {
-            /**neexistuje predesla observace -> pokud je nastartovano zaloz track*/
-            if (observation.getObservedValue() == 1)
+            /* neexistuje predesla observace -> pokud je nastartovano zaloz track */
+            if (observation.getObservedValue() == 1) {
                 util.startTrack(position);
-            FeederServlet.logger.log(Level.INFO, "Zakladam track - neni predchozi observace,"+ position.getUnit_id());
+            }
+            logger.log(Level.INFO, "Zakladam track - neni predchozi observace,"+ position.getUnit_id());
             return;
         }
         
@@ -87,34 +75,22 @@ public class TrackIgnitionSolver {
         } 
         
         switch (observation.getObservedValue().intValue()) {
-        case 1:
-            solveEngineOn();
-            break;
-        case 0:
-            solveEngineOff();
-            break;
+            case 1: solveEngineOn();  break;
+            case 0: solveEngineOff(); break;
         }
     }
 
-    /**
-     * Pripad kdy neexistuje predesla observace s pozici
-     * @throws SQLException
-     */
+    /** Pripad kdy neexistuje predesla observace s pozici */
     private void solveMissingPreviousPosition() throws SQLException {
         if (observation.getObservedValue()==1){
             switch (observationBefore.getObservedValue().intValue()) {
-            case 1:
-                solveEngineWasOn();
-                break;
-            case 0:
-                solveEngineWasOff();
-                break;
+                case 1: solveEngineWasOn();  break;
+                case 0: solveEngineWasOff(); break;
             }
         }
     }
     
     private void solveEngineWasOn() throws SQLException {
-        
         try {
             TrackData td = getOlderTrack(position.getUnit_id(), position.internalGetTimestamp());
             if (!util.wasEngineOn(position.getUnit_id(), td.getEnd(), observationBefore.getTimeStamp())){
@@ -123,7 +99,6 @@ public class TrackIgnitionSolver {
                 solveInsertToTrack();
             }
         } catch (NoItemFoundException e) {
-            // TODO Auto-generated catch block
             util.startTrack(position);
         }
     }
@@ -136,16 +111,11 @@ public class TrackIgnitionSolver {
         switch (observationBefore.getObservedValue().intValue()) {
         case 1:
             solveInsertToTrack();
-        /*    } else {
-                System.out.println("k posledni observaci je stara pozice");
-                /**pokud bylo v mezicase chcipnuto zaloz novej*/
+                // System.out.println("k posledni observaci je stara pozice");
+                // pokud bylo v mezicase chcipnuto zaloz novej
                 
-                /** pokud nebylo v mezicase chcipnuto zaloz pokracuj ve starym*/
-                /**
-                 * 
-                 * tady se musi dodelat jestli mezi pozicema nebylo chipnuto!!!
-                 */
-            //}*/
+                // pokud nebylo v mezicase chcipnuto zaloz pokracuj ve starym
+                // tady se musi dodelat jestli mezi pozicema nebylo chipnuto!!!
             break;
         case 0:
             solveStartTrack();
@@ -155,11 +125,8 @@ public class TrackIgnitionSolver {
 
     private void solveEngineOff() throws SQLException {
         switch (observationBefore.getObservedValue().intValue()) {
-        case 1:
-            solveFinishTrack();
-            break;
-        case 0:
-            solveOff();
+            case 1: solveFinishTrack(); break;
+            case 0: solveOff(); break;
         }
     }
 
@@ -172,9 +139,7 @@ public class TrackIgnitionSolver {
         }
     }
 
-    /**
-     * Insert to old or running track
-     */
+    /** Insert to old or running track */
     private void solveInsertToTrack() throws SQLException {
         TrackData track;
         try {
@@ -182,8 +147,7 @@ public class TrackIgnitionSolver {
             util.addToTrack(track, position);
         } catch (NoItemFoundException e) {
             util.startTrack(position);
-            FeederServlet.logger.log(Level.INFO,
-                    "Zakladam track - starej track nenalezen "+ position.getUnit_id());
+            logger.log(Level.INFO, "Zakladam track - starej track nenalezen "+ position.getUnit_id());
         }
     }
 
@@ -203,22 +167,20 @@ public class TrackIgnitionSolver {
                 throw new SQLException(e1);
             }
         }
-
     }
 
     private TrackData getOlderTrack(long unit_id, Date time) throws SQLException, NoItemFoundException {
         return util.getOlderTrack(unit_id, time);
     }
 
-    private TrackData getProperTrack(long unit_id, Date time)
-            throws SQLException, NoItemFoundException {
+    private TrackData getProperTrack(long unit_id, Date time) throws SQLException, NoItemFoundException {
         TrackData track;
         try {
             try {
-                /** try to insert in middle */
+                /* try to insert in middle */
                 track = util.getTrack(unit_id, time);
             } catch (NoItemFoundException e) {
-                /** insert to end */
+                /* insert to end */
                 track = util.getOlderTrack(unit_id, time);
             }
         } catch (NoItemFoundException e) {

+ 1 - 1
src/main/java/cz/hsrs/core/ApplicationInfo.java → src/main/java/io/senslog/core/ApplicationInfo.java

@@ -1,4 +1,4 @@
-package cz.hsrs.core;
+package io.senslog.core;
 
 import java.io.IOException;
 import java.io.InputStream;

+ 32 - 0
src/main/java/io/senslog/database/DBConfig.java

@@ -0,0 +1,32 @@
+package io.senslog.database;
+
+public class DBConfig {
+
+    private final String url;
+    private final String username;
+    private final String password;
+    private final int poolSize;
+
+    public DBConfig(String url, String username, String password, int poolSize) {
+        this.url = url;
+        this.username = username;
+        this.password = password;
+        this.poolSize = poolSize;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public int getPoolSize() {
+        return poolSize;
+    }
+}

+ 39 - 0
src/main/java/io/senslog/database/DBConnection.java

@@ -0,0 +1,39 @@
+package io.senslog.database;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.jdbi.v3.core.Jdbi;
+import org.jdbi.v3.jodatime2.JodaTimePlugin;
+import org.jdbi.v3.postgres.PostgresPlugin;
+import org.postgresql.ds.PGSimpleDataSource;
+
+public class DBConnection {
+
+    private Jdbi jdbi;
+
+    public void connect(DBConfig config) {
+        PGSimpleDataSource ds = new PGSimpleDataSource();
+        ds.setUrl(config.getUrl());
+        ds.setPassword(config.getPassword());
+        ds.setUser(config.getUsername());
+        ds.setLoadBalanceHosts(true);
+        HikariConfig hc = new HikariConfig();
+        hc.setDataSource(ds);
+        hc.setMaximumPoolSize(config.getPoolSize());
+
+        jdbi = Jdbi.create(new HikariDataSource(hc))
+                .installPlugin(new PostgresPlugin())
+                .installPlugin(new JodaTimePlugin());
+    }
+
+    public boolean isConnected() {
+        return jdbi != null;
+    }
+
+    public Jdbi get() throws DBException {
+        if (!isConnected()) {
+            throw new DBException("The connection to the database has been closed.");
+        }
+        return jdbi;
+    }
+}

+ 12 - 0
src/main/java/io/senslog/database/DBException.java

@@ -0,0 +1,12 @@
+package io.senslog.database;
+
+public class DBException extends Exception {
+
+    public DBException(String message) {
+        super(message);
+    }
+
+    public DBException(String pattern, Object... params) {
+        this(String.format(pattern, params));
+    }
+}

+ 40 - 0
src/main/java/io/senslog/database/DBRepositoryPool.java

@@ -0,0 +1,40 @@
+package io.senslog.database;
+
+import io.senslog.database.repository.AbstractRepository;
+import io.senslog.database.repository.ObservationRepository;
+import io.senslog.database.repository.SensorRepository;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DBRepositoryPool {
+
+    private static final Map<Class<? extends AbstractRepository>, AbstractRepository> REPOSITORIES;
+
+    static {
+        REPOSITORIES = new HashMap<>();
+    }
+
+    public static void create(DBConfig config) throws IOException {
+        DBConnection connection = new DBConnection();
+        connection.connect(config);
+
+        if (!connection.isConnected()) {
+            throw new IOException("Can not connect to the database.");
+        }
+
+
+        REPOSITORIES.put(ObservationRepository.class, new ObservationRepository(connection));
+        REPOSITORIES.put(SensorRepository.class, new SensorRepository(connection));
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T getRepository(Class<T> tClass) throws IOException {
+        if (REPOSITORIES.containsKey(tClass)) {
+            return (T) REPOSITORIES.get(tClass);
+        } else {
+            throw new IOException("Repository class "+tClass+" is not registered.");
+        }
+    }
+}

+ 5 - 0
src/main/java/io/senslog/database/repository/AbstractRepository.java

@@ -0,0 +1,5 @@
+package io.senslog.database.repository;
+
+public interface AbstractRepository {
+
+}

+ 27 - 0
src/main/java/io/senslog/database/repository/ObservationRepository.java

@@ -0,0 +1,27 @@
+package io.senslog.database.repository;
+
+import io.senslog.database.DBConnection;
+import io.senslog.database.DBException;
+import cz.hsrs.db.model.Observation;
+
+public class ObservationRepository implements AbstractRepository {
+
+    private final DBConnection connection;
+
+    public ObservationRepository(DBConnection connection) {
+        this.connection = connection;
+    }
+
+    public long insert(Observation observation) throws DBException {
+        try {
+            connection.get().<Exception>useHandle(h -> h.inTransaction(t -> t.execute(
+                    "INSERT INTO observations(time_stamp, observed_value, sensor_id, unit_id) VALUES (?, ?, ?, ?)",
+                    observation.getTimeStamp(), observation.getObservedValue(), observation.getSensorId(), observation.getUnitId()
+                    )
+            ));
+        } catch (Exception e) {
+            throw new DBException(e.getMessage());
+        }
+        return 0L; // observation_id
+    }
+}

+ 21 - 0
src/main/java/io/senslog/database/repository/SensorRepository.java

@@ -0,0 +1,21 @@
+package io.senslog.database.repository;
+
+import io.senslog.database.DBConnection;
+import cz.hsrs.db.model.UnitPosition;
+
+import java.time.OffsetDateTime;
+
+public class SensorRepository implements AbstractRepository {
+
+    private final DBConnection connection;
+
+    public SensorRepository(DBConnection connection) {
+        this.connection = connection;
+    }
+
+    public UnitPosition selectLastLocationFrom(long unitId, OffsetDateTime from) {
+        return null;
+    }
+
+
+}

+ 49 - 0
src/main/java/io/senslog/manager/ObservationManager.java

@@ -0,0 +1,49 @@
+package io.senslog.manager;
+
+import io.senslog.database.DBException;
+import io.senslog.database.DBRepositoryPool;
+import io.senslog.database.repository.ObservationRepository;
+import io.senslog.database.repository.SensorRepository;
+import cz.hsrs.db.model.Observation;
+
+import java.io.IOException;
+
+import static cz.hsrs.track.TrackIgnitionSolver.IGNITION_SENSOR_ID;
+
+public class ObservationManager {
+
+    private final ObservationRepository observationRep;
+    private final SensorRepository unitRep;
+
+    public static ObservationManager newInstance() {
+        try {
+            ObservationRepository obsRep = DBRepositoryPool.getRepository(ObservationRepository.class);
+            SensorRepository seRep = DBRepositoryPool.getRepository(SensorRepository.class);
+            return new ObservationManager(obsRep, seRep);
+        } catch (IOException e) {
+            throw new IllegalStateException(e.getMessage());
+        }
+    }
+
+    public ObservationManager(ObservationRepository observationRep, SensorRepository unitRep) {
+        this.observationRep = observationRep;
+        this.unitRep = unitRep;
+    }
+
+    public void save(Observation observation) {
+
+        if (observation.getSensorId() == IGNITION_SENSOR_ID) {
+            // TODO solve
+        }
+
+        try {
+            long obsId = observationRep.insert(observation);
+            if (obsId <= 0) {
+                throw new RuntimeException("Observation was not inserted successfully.");
+            }
+        } catch (DBException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+}

+ 44 - 0
src/main/java/io/senslog/ws/handler/FeederHandler.java

@@ -0,0 +1,44 @@
+package io.senslog.ws.handler;
+
+import io.senslog.manager.ObservationManager;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.Response;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+@Path("/v1/FeederServlet")
+public class FeederHandler {
+
+    private final ObservationManager observationManager;
+
+    public FeederHandler() {
+        this.observationManager = ObservationManager.newInstance();
+    }
+
+    @POST @Produces(APPLICATION_JSON)
+    public Response handlePostOperation(
+            @QueryParam("Operation") String operationType,
+            @QueryParam("value")     String value,
+            @QueryParam("date")      String timestamp,
+            @QueryParam("unit_id")   String unitId,
+            @QueryParam("sensor_id") String sensorId
+    ) {
+        return Response.ok().build();
+    }
+
+    @GET @Produces(APPLICATION_JSON)
+    public Response handleGetOperation(
+            @QueryParam("Operation") String operationType,
+            @QueryParam("value")     String value,
+            @QueryParam("date")      String timestamp,
+            @QueryParam("unit_id")   String unitId,
+            @QueryParam("sensor_id") String sensorId
+    ) {
+        return Response.ok().build();
+    }
+
+    private Response insertObservation() {
+        return null;
+    }
+}

+ 1 - 1
src/main/webapp/signin.jsp

@@ -2,7 +2,7 @@
     pageEncoding="UTF-8" %>
     <%@ page import = "cz.hsrs.servlet.security.*"%>
     <%@ page import = "cz.hsrs.db.pool.*"%>
-<%@ page import="cz.hsrs.core.ApplicationInfo" %>
+<%@ page import="io.senslog.core.ApplicationInfo" %>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html>
     <head>