Browse Source

Added servlet for WatchDog services
Added service for providing last timestamps of observations per group
Added singleton for REST parameters names
Fixing names of variables

mkepka 4 năm trước cách đây
mục cha
commit
1028c0877a

+ 10 - 2
README.md

@@ -1,5 +1,13 @@
 # senslog1
 
-Public version of SensLog and System with telemetry are merged together.
+Public version of SensLog and System with telemetry module are merged together.
 
-This is the last version of SensLog system version 1.5
+This is the last version of SensLog system 1.5.
+
+System contains modules:
+* Feeder
+* Provider - DataService version, - Jersey REST version
+* VGI
+* Telemetry
+
+ 

+ 52 - 0
src/main/java/cz/hsrs/rest/ParamsList.java

@@ -0,0 +1,52 @@
+/**
+ * 
+ */
+package cz.hsrs.rest;
+
+/**
+ * Class providing single list of param names for all REST services 
+ * @author mkepka
+ *
+ */
+public class ParamsList {
+	
+	/*
+	 * Parameter names for REST services 
+	 */
+	
+	/*
+	 * Group
+	 */
+	public static final String GROUP_ID = "group_id";
+    public static final String GROUP_NAME = "group_name";
+    
+    /*
+     * Sensor 
+     */
+    public static final String SENSOR_ID = "sensor_id";
+    public static final String SENSOR_NAME = "sensor_name";
+    public static final String SENSOR_TYPE = "sensor_type";
+    
+	/*
+	 * Timestamps
+	 */
+    public static final String FROM_TIME = "from_time";
+    public static final String TO_TIME = "to_time";
+    
+    /*
+     * Unit
+     */    
+    public static final String UNIT_ID = "unit_id";
+    
+    /*
+     * User
+     */
+    public static final String USER_ID = "user_id";
+    public static final String USER_NAME = "user_name";
+    
+    
+    /*
+     * Values for parameters for REST services 
+     */
+    public static final String CROSS_TAB_STYLE = "crosstab";
+}

+ 50 - 0
src/main/java/cz/hsrs/rest/beans/LastObsTimestampBean.java

@@ -0,0 +1,50 @@
+/**
+ * 
+ */
+package cz.hsrs.rest.beans;
+
+/**
+ * @author mkepka
+ *
+ */
+public class LastObsTimestampBean {
+	
+	public int groupId;
+	public String groupName;
+	public long unitId;
+	public String description;
+	public long sensorId;
+	public String sensorName;
+	public String lastTimest;
+
+	public LastObsTimestampBean() {
+		super();
+	}
+
+	/**
+	 * @param groupId
+	 * @param groupName
+	 * @param unitId
+	 * @param description
+	 * @param sensorId
+	 * @param sensorName
+	 * @param lastTimest
+	 */
+	public LastObsTimestampBean(int groupId, String groupName, long unitId, String description, long sensorId,
+			String sensorName, String lastTimest) {
+		this.groupId = groupId;
+		this.groupName = groupName;
+		this.unitId = unitId;
+		this.description = description;
+		this.sensorId = sensorId;
+		this.sensorName = sensorName;
+		this.lastTimest = lastTimest;
+	}
+
+	@Override
+	public String toString() {
+		return "[groupId=" + groupId + ", groupName=" + groupName + ", unitId=" + unitId + ", description="
+				+ description + ", sensorId=" + sensorId + ", sensorName=" + sensorName + ", lastTimest=" + lastTimest
+				+ "]";
+	}	
+}

+ 7 - 12
src/main/java/cz/hsrs/rest/provider/ObservationRest.java

@@ -21,6 +21,7 @@ import org.mortbay.jetty.HttpStatus;
 
 import cz.hsrs.db.util.ExportUtil;
 import cz.hsrs.db.util.UserUtil;
+import cz.hsrs.rest.ParamsList;
 import cz.hsrs.rest.beans.ExceptionBean;
 import cz.hsrs.rest.util.AuthUtil;
 import cz.hsrs.servlet.security.LoginUser;
@@ -42,7 +43,7 @@ public class ObservationRest {
     }
     
     /**
-     * 
+     * Method provides 
      * @return
      * /rest/observation/export?group_id=25&sensor_id=340340092&from_time=2021-05-30&to_time=2021-05-31&style=crosstab
      * /rest/observation/export?group_id=25&sensor_id=340340092&from_time=2021-05-30&to_time=2021-05-30+04:00:00&style=crosstab&nullable=false
@@ -50,16 +51,16 @@ public class ObservationRest {
     @Path("/export")
     @GET
     public Response getObservationsCrossTab(
-            @QueryParam("sensor_id") Long sensorId,
-            @QueryParam("group_id") Integer groupId,
-            @QueryParam(Params.FROM_TIME) String fromTime,
-            @QueryParam(Params.TO_TIME) String toTime,
+            @QueryParam(ParamsList.SENSOR_ID) Long sensorId,
+            @QueryParam(ParamsList.GROUP_ID) Integer groupId,
+            @QueryParam(ParamsList.FROM_TIME) String fromTime,
+            @QueryParam(ParamsList.TO_TIME) String toTime,
             @QueryParam("style") String exportStyle,
             @DefaultValue("true") @QueryParam("nullable") Boolean nullable,
             @Context HttpServletRequest req){
         try {
             LoginUser loggedUser = AuthUtil.getAuthenticatedLoginUser(req);
-            if(exportStyle.equalsIgnoreCase(Params.CROSS_TAB_STYLE)) {
+            if(exportStyle.equalsIgnoreCase(ParamsList.CROSS_TAB_STYLE)) {
                 if(groupId == null) {
                 	groupId = UserUtil.getUserGroupId(loggedUser.getUserName());
                 }
@@ -85,10 +86,4 @@ public class ObservationRest {
                     .build();
 		}
     }
-    
-    private class Params{
-        static final String CROSS_TAB_STYLE = "crosstab";
-        static final String FROM_TIME = "from_time";
-        static final String TO_TIME = "to_time";
-    }
 }

+ 1 - 1
src/main/java/cz/hsrs/rest/provider/UserRest.java

@@ -78,7 +78,7 @@ public class UserRest {
     public Response insertUser(JSONObject userJSON, @Context HttpServletRequest req) {
         try {
             LoginUser loggedUser = AuthUtil.getAuthenticatedLoginUser(req);
-            if(loggedUser.getRightsID() == 0) {
+            if(loggedUser.getRightsId() == 0) {
             	if(!checkDuplicity(userJSON.getString("userName"))) {
             		UserUtil.insertUser(userJSON.getString("userName"),
                             userJSON.getString("userPass"),

+ 103 - 0
src/main/java/cz/hsrs/rest/provider/WatchDogRest.java

@@ -0,0 +1,103 @@
+package cz.hsrs.rest.provider;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import javax.naming.AuthenticationException;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.mortbay.jetty.HttpStatus;
+
+import cz.hsrs.rest.ParamsList;
+import cz.hsrs.rest.beans.ExceptionBean;
+import cz.hsrs.rest.beans.LastObsTimestampBean;
+import cz.hsrs.rest.beans.UserBean;
+import cz.hsrs.rest.util.AuthUtil;
+import cz.hsrs.rest.util.ObservationRestUtil;
+import cz.hsrs.rest.util.UserRestUtil;
+import cz.hsrs.servlet.security.LoginUser;
+
+/**
+ * Special servlet for services used by monitoring applications
+ * 
+ * @author mkepka
+ *
+ */
+@Path("/watchdog")
+public class WatchDogRest {
+
+	/**
+	 * Empty constructor
+	 */
+	public WatchDogRest() {
+	}
+
+	/**
+	 * Test service for validating DB connection. It returns user details for logged user.
+	 * @param req
+	 * @return
+	 */
+	@Path("/test")
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response testDB(@Context HttpServletRequest req) {
+		try {
+            LoginUser loggedUser = AuthUtil.getAuthenticatedLoginUser(req);
+            UserBean userDetails = UserRestUtil.getUser(loggedUser.getUserName());
+            return Response.ok().entity(userDetails)
+                    .build();
+        } catch (AuthenticationException e1) {
+            return Response.status(HttpStatus.ORDINAL_401_Unauthorized)
+                    .entity(new ExceptionBean(e1.getClass().getName(), "Authentication failure for request!"))
+                    .build();
+        } catch (SQLException e) {
+            return Response.status(HttpStatus.ORDINAL_500_Internal_Server_Error)
+                    .entity(new ExceptionBean(e.getClass().getName(), e.getLocalizedMessage()))
+                    .build();
+        }
+	}
+	/**
+	 * Service provides list of observation last time stamps for given group
+	 * e.g. /rest/watchdog/group?group_name=kynsperk 
+	 * e.g. /rest/watchdog/group?group_id=8
+	 * @param groupId - ID of group
+	 * @param groupName - name of group
+	 * @param req HTTPRequest contains logged user session
+	 * @return List of observations timestamps
+	 */
+	@Path("/group/")
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getLastTimestampsPerGroup(@QueryParam(ParamsList.GROUP_ID) Integer groupId,
+											  @QueryParam(ParamsList.GROUP_NAME) String groupName,
+											  @Context HttpServletRequest req) {
+		try {
+			LoginUser loggedUser = AuthUtil.getAuthenticatedLoginUser(req);
+			
+			/* to check last values needs to have superuser rights */
+			if(loggedUser.getRightsId() < 0) {
+				List<LastObsTimestampBean> obsList = ObservationRestUtil.getLastTimestampPerGroup(groupName, groupId);
+				return Response.ok().entity(obsList)
+	                    .build();
+			}
+			else {
+				throw new AuthenticationException();
+			}
+		} catch (AuthenticationException e1) {
+            return Response.status(HttpStatus.ORDINAL_401_Unauthorized)
+                    .entity(new ExceptionBean(e1.getClass().getName(), "Authentication failure for request!"))
+                    .build();
+		} catch (SQLException e) {
+            return Response.status(HttpStatus.ORDINAL_500_Internal_Server_Error)
+                    .entity(new ExceptionBean(e.getClass().getName(), e.getLocalizedMessage()))
+                    .build();
+        }
+	}
+}

+ 57 - 0
src/main/java/cz/hsrs/rest/util/ObservationRestUtil.java

@@ -0,0 +1,57 @@
+/**
+ * 
+ */
+package cz.hsrs.rest.util;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+
+import cz.hsrs.db.pool.SQLExecutor;
+import cz.hsrs.rest.beans.LastObsTimestampBean;
+
+/**
+ * @author mkepka
+ *
+ */
+public class ObservationRestUtil {
+
+	/**
+	 * 
+	 * @param groupName
+	 * @param groupId
+	 * @return
+	 * @throws SQLException
+	 */
+	public static List<LastObsTimestampBean> getLastTimestampPerGroup(String groupName, Integer groupId) throws SQLException {
+		String query;
+		if(groupName.isEmpty() && groupId != null) {
+			query = "SELECT * FROM public.units_sensors_lastobs WHERE id = "+groupId+";";
+		}
+		else if(!groupName.isEmpty() && groupId == null) {
+			query = "SELECT * FROM public.units_sensors_lastobs WHERE group_name = '"+groupName+"';";
+		}
+		else {
+			query = "SELECT * FROM public.units_sensors_lastobs WHERE id = "+groupId+" AND group_name = '"+groupName+"';";
+		}
+		List<LastObsTimestampBean> obsList = new LinkedList<LastObsTimestampBean>();
+		
+		ResultSet res = SQLExecutor.getInstance().executeQuery(query);
+		if(res != null) {
+			while (res.next()) {
+				LastObsTimestampBean obs = new LastObsTimestampBean(
+						res.getInt("id"),
+						res.getString("group_name"),
+						res.getLong("unit_id"),
+						res.getString("description"),
+						res.getLong("sensor_id"),
+						res.getString("sensor_name"),
+						res.getString("last_timestamp")
+						);
+				obsList.add(obs);
+			}
+		}
+		return obsList;
+	}
+}

+ 1 - 1
src/main/java/cz/hsrs/servlet/security/ControllerServlet.java

@@ -72,7 +72,7 @@ public class ControllerServlet extends DBServlet {
                 resp.setStatus(200);
                 resp.setHeader("Access-Control-Allow-Origin", "*");
                 resp.setHeader("Content-Type", "application/json; charset=utf-8");
-                resp.getWriter().println("{\"sessionid\":\""+req.getSession().getId()+"\", \"language\":\""+user.getUserLanguage()+"\", \"audio\":\"" + user.isAudio() + "\", \"rightsID\":"+user.getRightsID()+"}");
+                resp.getWriter().println("{\"sessionid\":\""+req.getSession().getId()+"\", \"language\":\""+user.getUserLanguage()+"\", \"audio\":\"" + user.isAudio() + "\", \"rightsID\":"+user.getRightsId()+"}");
             }
         } else {
         	/** Login prichazi z webove stranky, vrat webovou stranku 

+ 34 - 6
src/main/java/cz/hsrs/servlet/security/LoginUser.java

@@ -9,6 +9,11 @@ import cz.hsrs.db.model.NoItemFoundException;
 import cz.hsrs.db.pool.SQLExecutor;
 import cz.hsrs.db.util.UserUtil;
 
+/**
+ * Class representing user of the system
+ * @author mkepka
+ *
+ */
 public class LoginUser {
     final HttpServletRequest req;
     private String userName;
@@ -68,19 +73,35 @@ public class LoginUser {
         } 
     }
 
+    /**
+     * Method checks if the user is correctly authenticated
+     * @return
+     */
     public boolean isAuthenticated() {
         return (userName != null);
     }
 
+    /**
+     * Method provides name of the user 
+     * @return
+     */
     public String getUserName() {
         return userName;
     }
 
+    /** 
+     * Method provides system language set for the user
+     * @return
+     */
     public String getUserLanguage() {
         return userLang;
     }
     
-    public int getRightsID() {
+    /**
+     * Method provides ID of rights level of the user
+     * @return
+     */
+    public int getRightsId() {
         return this.rightsId;
     }
     
@@ -101,10 +122,14 @@ public class LoginUser {
         }
     }
 
+    /**
+     * Method provides ID of rights level of the user
+     * @return
+     */
     private int getRights() throws SQLException {
         try {
             return util.getRightsId(userName);
-        }catch (NoItemFoundException e) {
+        } catch (NoItemFoundException e) {
             throw new SQLException(e);
         } 
     }
@@ -115,8 +140,7 @@ public class LoginUser {
             return util.getUserLanguage(userName);
         } catch (NoItemFoundException e) {
             throw new SQLException(e);
-        } 
-        
+        }
     }
     
     private boolean hasAudio() throws SQLException{
@@ -126,9 +150,13 @@ public class LoginUser {
         } catch (NoItemFoundException e) {
             throw new SQLException(e);
         } 
-        
     }
-    
+   
+    /**
+     * Method gets user password for logging in
+     * @param un
+     * @return
+     */
     protected String getPassword(String un) {
         try {
             return util.getUserPassword(un);