Author: obruce Date: 2014-05-21 18:52:22 +0200 (Wed, 21 May 2014) New Revision: 2985 Url: http://forge.chorem.org/projects/jtimer/repository/revisions/2985 Log: controller: changement synchro serveur -> ui (pas fini) entities: getNode Rest getalltimes, ajout timesresource Added: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimesResource.java Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/entities/TimerTime.java branches/ng-jtimer/src/main/java/org/chorem/jtimer/storage/Storage.java branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/ApplicationServletFilter.java branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/RestApplication.java branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TasksResource.java branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimeResource.java branches/ng-jtimer/src/main/webapp/js/controllers.js branches/ng-jtimer/src/main/webapp/js/entities.js branches/ng-jtimer/src/main/webapp/js/service.js Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/entities/TimerTime.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/entities/TimerTime.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/entities/TimerTime.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -93,7 +93,8 @@ return "TimerTime{" + ", taskId='" + taskId + '\'' + ", timeId='" + timeId + '\'' + - ", modificationDate=" + creationDate + + ", creationDate=" + creationDate + + ", modificationDate=" + modificationDate + ", time=" + time + '}'; } Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/storage/Storage.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/storage/Storage.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/storage/Storage.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -5,7 +5,12 @@ import org.chorem.jtimer.entities.TimerTask; import org.chorem.jtimer.entities.TimerTime; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -63,6 +68,7 @@ //TODO obruce 15-05-14 path a definir String url = "/tmp/jtimer/jtimer"; //String url = "/home/olivia/Bureau/jtimer/jtimer"; + if (log.isInfoEnabled()) { log.info("Opening connection to database : " + url); } @@ -371,13 +377,16 @@ try { statement = connection.prepareStatement("INSERT INTO " + TABLE_TIME + "(taskid, date, uuid, duration, modificationDate)" + - " VALUES(?, ?, ?, ?)"); + " VALUES(?, ?, ?, ?, ?)"); statement.setLong(1, number); statement.setLong(2, time.getCreationDate().getTime()); statement.setString(3, time.getTimeId()); statement.setLong(4, time.getTime()); - statement.setLong(4, time.getModificationDate().getTime()); + if(log.isDebugEnabled()){ + log.info(time.getModificationDate().getTime()); + } + statement.setLong(5, time.getModificationDate().getTime()); statement.executeUpdate(); } catch (SQLException ex) { throw new StorageException("Can't add task time", ex); @@ -394,20 +403,59 @@ } + /** + * Query that returns every task's times + * @return times hashMap(key: taskId, value: times) + */ + public ArrayList<TimerTime> getTimes(Long date) { + ArrayList<TimerTime> times = new ArrayList<>(); + PreparedStatement statement = null; + try { + statement = connection.prepareStatement("SELECT TA.taskId AS mytask, TI.* FROM " + + TABLE_TASK + " TA, "+ TABLE_TIME + " TI" + + " WHERE TA.id = TI.taskid" + + " AND TI.modificationDate >" +date); + + ResultSet rs = statement.executeQuery(); + + while (rs.next()) { + + + TimerTime time = new TimerTime(); + time.setTaskId(rs.getString("mytask")); + time.setTimeId(rs.getString("uuid")); + time.setTime(rs.getLong("duration")); + time.setCreationDate(new java.util.Date(rs.getLong("date"))); + time.setModificationDate(new java.util.Date(rs.getLong("modificationDate"))); + + times.add(time); + + } + + } catch (SQLException ex) { + throw new StorageException("Can't get time", ex); + } finally { + closeStatement(statement); + } + return times; + } + + /** - * Query that returns every tasks + * Query that returns every tasks for a specified task * @return tasks arraylist of tasks */ - public List<TimerTime> getTimes(String taskid) { + public List<TimerTime> getTimes(String taskid, Long date) { List<TimerTime> times = new ArrayList<>(); PreparedStatement statement = null; try { statement = connection.prepareStatement("SELECT TI.* FROM " + TABLE_TASK + " TA, "+ TABLE_TIME + " TI" + - " WHERE TA.id = TI.taskid AND TA.taskId = '" +taskid +"' "); + " WHERE TA.id = TI.taskid AND TA.taskId = '" +taskid +"' " + + " AND TI.modificationDate >" +date); ResultSet rs = statement.executeQuery(); while (rs.next()) { TimerTime time = new TimerTime(); Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/ApplicationServletFilter.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/ApplicationServletFilter.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/ApplicationServletFilter.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -1,14 +1,18 @@ package org.chorem.jtimer.web; -import javax.servlet.*; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Enumeration; -import java.util.logging.Level; -import java.util.logging.Logger; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,10 +38,6 @@ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - //Avant l'execution de la requete - if (log.isDebugEnabled()) { - log.debug("Passage dans le filter"); - } if(servletRequest instanceof HttpServletRequest ) { @@ -50,7 +50,7 @@ while (lesElem.hasMoreElements()) { names += ", " + lesElem.nextElement(); } - log.warn(names); + log.warn("request Headers :" + names); httpServletResponse.addHeader(HEADER_ACCESS_CONTROL_ALLOW_ORIGIN, "*"); httpServletResponse.addHeader(HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); @@ -67,10 +67,6 @@ } - - if (log.isWarnEnabled()) { - log.warn("Fin filter"); - } } @Override Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/RestApplication.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/RestApplication.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/RestApplication.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -25,9 +25,11 @@ Router router = new Router(context); // Defines only one route - router.attach("/tasks", TasksResource.class); - router.attach("/tasks/{taskId}", TaskResource.class); - router.attach("/tasks/{taskId}/time", TimeResource.class); + router.attach("/tasks/task", TasksResource.class); + router.attach("/tasks/task/{taskId}", TaskResource.class); + //router.attach("/tasks/{taskId}/time", TimeResource.class); + router.attach("/tasks/time/{taskId}", TimeResource.class); + router.attach("/tasks/time", TimesResource.class); return router; } Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TasksResource.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TasksResource.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TasksResource.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -79,12 +79,12 @@ */ @Get("json") public Representation getTasks() { - Long date = Long.valueOf(0); + Long date = (long) 0; try { date = Long.valueOf(getQuery().getValues("date")); } catch (Exception e) { - date = Long.valueOf(0); + date = (long) 0; } Gson gson = builder.create(); Modified: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimeResource.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimeResource.java 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimeResource.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -1,7 +1,14 @@ package org.chorem.jtimer.web; -import com.google.gson.*; - +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.jtimer.entities.TimerTime; @@ -9,7 +16,13 @@ import org.restlet.data.MediaType; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; -import org.restlet.resource.*; +import org.restlet.resource.Delete; +import org.restlet.resource.Get; +import org.restlet.resource.Options; +import org.restlet.resource.Post; +import org.restlet.resource.Put; +import org.restlet.resource.ResourceException; +import org.restlet.resource.ServerResource; import java.io.IOException; import java.lang.reflect.Type; @@ -61,8 +74,17 @@ */ @Get("json") public Representation getTask() { + + Long date = (long) 0; + try{ + date = Long.valueOf(getQuery().getValues("date")); + } + catch(Exception e){ + date = (long) 0; + } + String taskId = (String)getRequest().getAttributes().get("taskId"); - List<TimerTime> timerTimes = storage.getTimes(taskId); + List<TimerTime> timerTimes = storage.getTimes(taskId, date); Gson gson = builder.create(); String json = gson.toJson(timerTimes); @@ -87,6 +109,7 @@ */ @Post("json") public void createTask(Representation representation) throws IOException { + String timeId = (String)getRequest().getAttributes().get("taskId"); long number = storage.getTaskNumber(timeId); @@ -95,7 +118,14 @@ TimerTime t = gson.fromJson(repr1, TimerTime.class); - storage.addTaskTime(t,number); + if (log.isInfoEnabled()) { + log.info(repr1); + log.info(t); + log.info(t.getModificationDate().getTime()); + log.info(number); + } + + storage.addTaskTime(t, number); } /** @@ -114,9 +144,7 @@ @Options public void timeOptions() { - if (log.isInfoEnabled()) { - log.info("org.chorem.jtimer.web.TimeResource.timeOptions"); - } + } } Added: branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimesResource.java =================================================================== --- branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimesResource.java (rev 0) +++ branches/ng-jtimer/src/main/java/org/chorem/jtimer/web/TimesResource.java 2014-05-21 16:52:22 UTC (rev 2985) @@ -0,0 +1,91 @@ +package org.chorem.jtimer.web; + +import com.google.gson.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.jtimer.entities.TimerTask; +import org.chorem.jtimer.entities.TimerTime; +import org.chorem.jtimer.storage.Storage; +import org.restlet.data.MediaType; +import org.restlet.representation.Representation; +import org.restlet.representation.StringRepresentation; +import org.restlet.resource.Get; +import org.restlet.resource.ResourceException; +import org.restlet.resource.ServerResource; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +/** + * Created by olivia on 21/05/14. + */ +public class TimesResource extends ServerResource { + + private static final Log log = LogFactory.getLog(TaskResource.class); + protected Storage storage; + protected GsonBuilder builder; + + /** + * Methode qui initialis la resource + * @throws org.restlet.resource.ResourceException + */ + @Override + protected void doInit() throws ResourceException { + storage = (Storage)getContext().getAttributes().get(Storage.class.getName()); + + builder = new GsonBuilder(); + // Register an adapter to manage the date types as long values + //GSON builder to format dates + + builder = new GsonBuilder(); + builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { + + public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + return new Date(json.getAsJsonPrimitive().getAsLong()); + + } + + }); + builder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() { + @Override + public JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) { + return new JsonPrimitive(date.getTime()); + } + }); + + } + + /** + * Methode qui retourne la representation de la liste de toutes les temps + * Suite a une requete de type GET + * + * @return + */ + @Get("json") + public Representation getTimes() { + + Long date = (long) 0; + + try { + date = Long.valueOf(getQuery().getValues("date")); + } catch (Exception e) { + date = (long) 0; + } + + Gson gson = builder.create(); + ArrayList<TimerTime> timerTasks = storage.getTimes(date); + + String json = gson.toJson(timerTasks); + + if (log.isInfoEnabled()) { + log.info(json); + } + + return new StringRepresentation(json, MediaType.APPLICATION_JSON); + } + + +} Modified: branches/ng-jtimer/src/main/webapp/js/controllers.js =================================================================== --- branches/ng-jtimer/src/main/webapp/js/controllers.js 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/webapp/js/controllers.js 2014-05-21 16:52:22 UTC (rev 2985) @@ -9,7 +9,8 @@ $scope.todo = $localStorage.getTodo("todo"); // {Date} last update to server - $scope.access = $scope.todo.lastAccess; + $scope.taskAccess = $scope.todo.lastTaskAccess; + $scope.timeAccess = $scope.todo.lastTimeAccess; // {TreeNode} l'arbre regenere automatiquement lorsque les donnees changent $scope.tree; @@ -64,7 +65,7 @@ * @returns moment */ $scope.getLastMajDate = function(){ - return moment($scope.access).format("YYYY-MM-DD H:mm:ss"); + return moment($scope.taskAccess).format("YYYY-MM-DD H:mm:ss"); }; /** @@ -116,13 +117,9 @@ /** * Récupère les nouveaux elements du serveur et les ajoute a l'arbre pour l'affichage */ - var getTasksFromServ = function(){ + var initTasksFromServ = function(){ - serverTaskAccess.query({date : $scope.access},function (response) { - //On change la date de dernier acces - $scope.access = new Date().getTime(); - $scope.todo.lastAccess= $scope.access; - save(); + serverTaskAccess.query({}, function (response) { angular.forEach(response, function (item) { @@ -147,30 +144,81 @@ $scope.data.tasks[newTask.taskId] = newTask; save(); //Les temps sont recuperes du serveur - getTimesFromServer(newTask); + getTimesFromServerWithTask(newTask); save(); } - }else{ - console.log( "Un element deja present " + item.name + item.modificationDate); - var newTask = new Task( item.name, item.taskId, item.parent); - $scope.data.tasks[newTask.taskId] = newTask; - save(); - } }); console.log("Je suis dans le get tasks"); - + //On change la date de dernier acces + $scope.taskAccess = new Date().getTime(); + $scope.todo.lastTaskAccess= $scope.taskAccess; + save(); }); }; - var getTimesFromServer = function(task){ + /** + * Methode qui va chercher les mise à jour sur les taches + * + */ + var updateTaskFromServ = function(){ + serverTaskAccess.query({date : $scope.taskAccess}, function (response) { + + console.log("Chercher modif du serveur des taches"); + + angular.forEach(response, function (item) { + console.log(item); + //On cherche le node et on le met à jour + $scope.tree.getNode(item.taskId).task.name = item.name; + + save(); + + //On change la date de dernier acces + $scope.taskAccess = new Date().getTime(); + $scope.todo.lastTaskAccess= $scope.taskAccess; + save(); + }); + + }); + } + + var updateTimesFromServer = function(){ + console.log("Chercher modif temps du serveur"); + + serverTimeAccess.query({date : $scope.timeAccess}, function (response) { + + angular.forEach(response, function (item) { + console.log(item); + if(!$scope.data.times[item.taskId]){$scope.data.times[item.taskId] = []} + + taskTime = new TaskTime($scope.data.tasks[item.taskId], item.timeId, item.creationDate, item.time); + $scope.data.times[item.taskId].push(taskTime); + + save(); + + //On change la date de dernier acces + $scope.timeAccess = new Date().getTime(); + $scope.todo.lastTimeAccess= $scope.timeAccess; + save(); + }); + }); + + } + + + /** + * Methode qui recupere les temps pour une tache + */ + var getTimesFromServerWithTask = function(task){ + if(!$scope.data.times[task.taskId]){$scope.data.times[task.taskId] = []} - serverTimeAccess.query({taskId : task.taskId}, function (response) { + serverTimeAccess.query({taskId : task.taskId, date : $scope.timeAccess}, function (response) { + angular.forEach(response, function (item) { if(!(existInObject($scope.data.times,item.timeId,task.taskId)) && !(existInObject($scope.todo.stockedDeletedTimes, item.timeId, task.taskId))){ @@ -179,9 +227,20 @@ $scope.data.times[task.taskId].push(taskTime); save(); } + + }); + + //On change la date de dernier acces + $scope.timeAccess = new Date().getTime(); + $scope.todo.lastTimeAccess= $scope.timeAccess; + save(); + + }); + + } var existInObject = function(object, item, pos){ @@ -298,7 +357,12 @@ */ var timer = function() { $interval(function() { - actionToServ(); + //A changer + //initControllerWithServ(); + pushChangesToServ(); + updateTaskFromServ(); + + //updateTimesFromServer(); }, 30000); //TODO: obruce 05-05-14 for now 30s but for real put at least 2h: 200000000 }; timer(); @@ -306,12 +370,12 @@ /** *Méthode qui lance les actions à faires sur le serveur */ - var actionToServ = function(){ + var initControllerWithServ = function(){ //Si en ligne on envoie les donnees if ( $scope.online) { pushChangesToServ(); - getTasksFromServ(); + initTasksFromServ(); } } @@ -325,14 +389,14 @@ //On synchronise la tache creer serverTaskAccess.create(angular.toJson(newTask), - function(){ - console.log("persist task success" + newTask); - $scope.todo.stockedNewTasks.shift(); + function(){ + console.log("persist task success" + newTask); + $scope.todo.stockedNewTasks.shift(); }, - function(){ - console.log("fail"); - //On ajoute à la file de synchro - $scope.todo.stockedNewTasks.push(newTask); + function(){ + console.log("fail"); + //On ajoute à la file de synchro + $scope.todo.stockedNewTasks.push(newTask); }); $scope.name = ""; @@ -542,7 +606,7 @@ $scope.saveTask = function(node) { node.edit = null; - node.task.setModificationDate(); + node.task.modificationDate = $scope.taskAccess; $scope.todo.stockedEditedTasks.push(node.task); save(); }; @@ -707,11 +771,10 @@ } //force the first server connection - actionToServ(); + initControllerWithServ(); // force the first tree creation $scope.createTree(); - // connect to webscocket server (go client) wtWebsocket.connect(); Modified: branches/ng-jtimer/src/main/webapp/js/entities.js =================================================================== --- branches/ng-jtimer/src/main/webapp/js/entities.js 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/webapp/js/entities.js 2014-05-21 16:52:22 UTC (rev 2985) @@ -60,7 +60,9 @@ * @returns {tdListData} */ var tdListData = function(){ - this.lastAccess = 0; + //Les timestamp de dernier acces + this.lastTimeAccess = 0; + this.lastTaskAccess = 0; // {Array of TaskID} la file de tache attendant la synchronisation avec le serveur this.stockedDeletedTasks = []; // {Array of Task} file de tache attendant la synchronisation avec le serveur @@ -95,7 +97,8 @@ } if (json) { - this.lastAccess = json.lastAccess; + this.lastTaskAccess = json.lastTaskAccess; + this.lastTimeAccess = json.lastTimeAccess; angular.forEach(json.stockedDeletedTasks, function (t) { this.stockedDeletedTasks.push(t); @@ -241,6 +244,24 @@ }; /** + * Methode qui fait un parcours reccursif de l'arbre et recupere l'element voulu + */ +TreeNode.prototype.getNode = function(taskid,task){ + + angular.forEach(this.children, function(elem){ + + if(taskid == elem.task.taskId){ + task = elem; + }else{ + task = elem.getNode(taskid, task); + } + }); + + return task; +} + + +/** * Ce retire de l'arbre * @returns {undefined} */ @@ -385,16 +406,7 @@ this.syncOptions = {}; }; - /** - * Change la date de derniere modification - * @returns {undefined} - */ -Task.prototype.setModificationDate = function() { - this.modificationDate = Date.now(); -}; - -/** * Marque la tache comme supprimee * @returns {undefined} */ @@ -447,9 +459,10 @@ this.creationDate = Date.now(); }else{ this.creationDate = date; - } + this.modificationDate = this.creationDate; + if(time == undefined){ this.time = 0; }else{ Modified: branches/ng-jtimer/src/main/webapp/js/service.js =================================================================== --- branches/ng-jtimer/src/main/webapp/js/service.js 2014-05-21 14:42:45 UTC (rev 2984) +++ branches/ng-jtimer/src/main/webapp/js/service.js 2014-05-21 16:52:22 UTC (rev 2985) @@ -1,7 +1,7 @@ angular.module("serverAccessService", ["ngResource"]) .factory("serverTaskAccess", function ( $resource) { // Encapsule l'acces au server - return $resource("http://localhost:8080/rest/tasks/:taskId",{}, + return $resource("/rest/tasks/task/:taskId",{}, { query : {method:'GET', isArray:true}, get : {method: 'GET',isArray: false}, @@ -18,7 +18,7 @@ angular.module("serverTimeService", ["ngResource"]) .factory("serverTimeAccess", function ( $resource) { // Encapsule l'acces au server - return $resource("http://localhost:8080/rest/tasks/:taskId/time",{}, + return $resource("/rest/tasks/time/:taskId",{}, { query : {method:'GET', isArray:true}, get : {method: 'GET', isArray: false},