[Notice] Announcing the End of Demo Server [Read me]
BlueMir 2012-10-22
taskBoard Server model & test
@45d1be2829b9ac926f02fb81fbf1b1aa940dead3
app/Global.java
--- app/Global.java
+++ app/Global.java
@@ -1,15 +1,12 @@
 import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-import javax.servlet.ServletException;
-
-import org.tigris.subversion.javahl.ClientException;
+import java.util.List;
+import java.util.Map;
 
 import models.Project;
 import models.User;
-import play.*;
 import play.Application;
+import play.GlobalSettings;
+import play.Logger;
 import play.api.mvc.Handler;
 import play.libs.Yaml;
 import play.mvc.Http.RequestHeader;
@@ -17,14 +14,14 @@
 
 import com.avaje.ebean.Ebean;
 
-import controllers.*;
+import controllers.routes;
 
 public class Global extends GlobalSettings {
     public void onStart(Application app) {
         InitialData.insert(app);
         InitialData.makeUploadFolder();
-//        InitialData.makeTestRepository();
-//        UserApp.anonymous = User.findByLoginId("anonymous");
+        InitialData.makeTestRepository();
+        // UserApp.anonymous = User.findByLoginId("anonymous");
     }
 
     @Override
@@ -62,14 +59,11 @@
                     Ebean.saveManyToManyAssociations(role, "permissions");
                 }
                 Ebean.save(all.get("projectUsers"));
-                Ebean.save(all.get("cards"));
-                Ebean.save(all.get("taskBoards"));
-                Ebean.save(all.get("labels"));
-                Ebean.save(all.get("lines"));
-                /*for (Object line : all.get("lines")){
-                   Ebean.saveAssociation(line, "taskBoard");
-                }*/
                 
+                Ebean.save(all.get("taskBoards"));
+                Ebean.save(all.get("lines"));
+                Ebean.save(all.get("cards"));
+                Ebean.save(all.get("labels"));
                 Ebean.save(all.get("checkLists"));
             }
         }
@@ -92,6 +86,6 @@
     }
 
     public void onStop(Application app) {
-        
+
     }
 }
app/controllers/TaskApp.java
--- app/controllers/TaskApp.java
+++ app/controllers/TaskApp.java
@@ -3,7 +3,12 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 
+import models.Project;
+import models.task.TaskBoard;
+
 import org.codehaus.jackson.JsonNode;
+
+import com.avaje.ebean.Ebean;
 
 import play.Logger;
 import play.libs.F.Callback;
@@ -55,7 +60,6 @@
 
         public void sendNotify(WebSocketConnector that, String msg) {
             for (int i = 0; i < sockets.size(); i++) {
-
                 WebSocketConnector socket = sockets.get(i);
                 if (socket != that) {
                     socket.sendMessage(msg);
@@ -71,6 +75,7 @@
         private String projectName;
         private play.mvc.WebSocket.Out<String> out;
         private WebSocketServer server;
+        private TaskBoard taskBoard;
 
         public WebSocketConnector(String userName, String projectName,
                 WebSocketServer webSocketServer) {
@@ -83,13 +88,12 @@
         public void onReady(play.mvc.WebSocket.In<String> in, play.mvc.WebSocket.Out<String> out) {
             // For each event received on the socket,
             in.onMessage(this);
-
-            // When the socket is closed.
             in.onClose(this);
 
             this.out = out;
-            // Send a single 'Hello!' message
-            //out.write("Hello!");
+
+            taskBoard = TaskBoard.findByProject(ProjectApp.getProject(userName, projectName));
+            out.write(Json.stringify(taskBoard.toJSON()));
         }
 
         public void sendMessage(String msg) {
@@ -98,16 +102,9 @@
 
         @Override
         public void invoke(String event) throws Throwable {
-            // out.write()로 응답
-
-            //JsonNode data = Json.parse(event);
-            /*for (int i = 0; i < data.size(); i++) {
-                Logger.info(data.get(i).findValue("_id").asText());
-            }*/
-
-            // model에 뭔가 저장한다.
-            // 같은 것에 접속해 있는 모든사람에게 노티를 보낸다.
+            //클라이언트에서 모델을 보내올때
             this.server.sendNotify(this, event);
+            this.taskBoard.accecptJSON(Json.parse(event));
         }
 
         @Override
 
app/models/Task.java (deleted)
--- app/models/Task.java
@@ -1,17 +0,0 @@
-package models;
-
-import java.util.List;
-
-import play.db.ebean.Model;
-
-public class Task extends Model{
-    public Project project;
-    public String title;
-    public String body;
-    
-    private static Finder<Long, Task> find = new Finder<Long, Task>(Long.class, Task.class);
-    
-    public static List<Task> list(String userName, String projectName){
-        return find.where().eq("project.owner", userName).eq("project.name", projectName).findList();
-    }
-}
app/models/task/Card.java
--- app/models/task/Card.java
+++ app/models/task/Card.java
@@ -8,10 +8,16 @@
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.node.ObjectNode;
 
 import models.ProjectUser;
 
+import play.Logger;
 import play.db.ebean.Model;
+import play.libs.Json;
 
 @Entity
 public class Card extends Model{
@@ -20,16 +26,19 @@
     public String title;
     public List<TaskComment> comments = new ArrayList<TaskComment>();
     public Set<ProjectUser> assignee = new HashSet<ProjectUser>() ;
-    int StoryPoint; //!주의 10배로 표현
+    public int storyPoint; //!주의 10배로 표현
     public Set<Label> labels = new HashSet<Label>();
     public String body;
     public Date dueDate;
     public CheckList checklist;
     
+    @ManyToOne
+    public Line line;
+    
     private static Finder<Long, Card> find = new Finder<Long, Card>(Long.class, Card.class);
     
-    public static Card findById(Long cardid){
-        return find.byId(cardid);
+    public static Card findById(Long id){
+        return find.byId(id);
     }
     
     public void assignMember(ProjectUser member){
@@ -59,4 +68,20 @@
         this.checklist = checklist;
         checklist.save();
     }
+
+    public JsonNode toJSON() {
+        ObjectNode json = Json.newObject();
+        json.put("_id", id);
+        json.put("title", title);
+        json.put("body", body);
+        return json;
+    }
+
+    public void accecptJSON(JsonNode json) {
+        title = json.get("title").asText();
+        body = json.get("body").asText();
+        //TODO 기타 다른것들도 데이터를 집어 넣어 줘야 함.
+        
+        save();
+    }
 }
app/models/task/Line.java
--- app/models/task/Line.java
+++ app/models/task/Line.java
@@ -2,12 +2,19 @@
 
 import java.util.List;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
 
 import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.node.ArrayNode;
+import org.codehaus.jackson.node.ObjectNode;
 
+import com.avaje.ebean.Ebean;
+
+import play.Logger;
 import play.db.ebean.Model;
 import play.libs.Json;
 
@@ -16,13 +23,50 @@
     @Id
     public Long id;
     public String title;
+    
+    @OneToMany(cascade=CascadeType.ALL)
     public List<Card> cards;
     
     @ManyToOne
     public TaskBoard taskBoard;
     
+    private static Finder<Long, Line> find = new Finder<Long, Line>(Long.class, Line.class);
+    
     public JsonNode toJSON() {
-        // TODO Auto-generated method stub
-        return Json.newObject();
+        ObjectNode json = Json.newObject();
+        json.put("_id", id);
+        json.put("title", this.title);
+        ArrayNode arr = Json.newObject().arrayNode();
+        for(Card card : cards){
+            arr.add(card.toJSON());
+        }
+        json.put("cards", arr);
+        return json;
+    }
+
+    public static Line findById(Long id) {
+        return find.byId(id);
+    }
+
+    public void accecptJSON(JsonNode json) {
+        // TODO 한 라인에 정보들을 저장하면 된다.
+        //존재하지 않는 카드는 더하고 없는 카드는 삭제한다.
+        title = json.get("title").asText();
+        cards.clear();
+        JsonNode cardsJson = json.get("cards");
+        for(int i = 0; i < cardsJson.size(); i++) {
+            JsonNode cardJson = cardsJson.get(i);
+            Long cardId = cardJson.get("_id").asLong();
+            Card card = Card.findById(cardId);
+            if(card == null){
+                card = new Card();
+            }
+            cards.add(card);
+            card.line = this;
+            card.accecptJSON(cardJson);
+            card.save();
+        }
+        save();//왜 save가 안되는거야?
+        //아마 지워진걸 delete를 해줘야 할듯... 안하면 안되는듯...
     }
 }
app/models/task/TaskBoard.java
--- app/models/task/TaskBoard.java
+++ app/models/task/TaskBoard.java
@@ -6,14 +6,17 @@
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.node.ArrayNode;
 import models.Project;
 
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.node.ArrayNode;
+
+import play.Logger;
 import play.db.ebean.Model;
 import play.libs.Json;
 
@@ -67,24 +70,31 @@
         return find.where().eq("project.id", project.id).findUnique();
     }
     public void accecptJSON(JsonNode json) {
-        // TODO json객체를 taskboard객체로 전환한다. 단 이때 이미 있는걸 확인해야 한다.
-        //아니면 특정 카드만 보내면 _id 로 찾아서 그거만 변경?
-        
+        // 이미 있는 목록을 지워버리고 온거로만 채운다. 지원지면 난 몰라!
+        // TODO delete를 고려할것.
+        lines.clear();
+        for(int i =0; i < json.size(); i++){
+            JsonNode lineJson = json.get(i);
+            Long lineId = lineJson.get("_id").asLong();
+            Line line = Line.findById(lineId);
+            if(line == null){
+                line = new Line();
+            }
+            lines.add(line);
+            line.taskBoard = this;
+            line.accecptJSON(lineJson);
+            line.save();
+        }
+        save();
     }
    
     public JsonNode toJSON() {
         //라인중에서 넣을 것만 넣고 나머지는 다 위임한다.
         ArrayNode json = Json.newObject().arrayNode();
-        for(int i = 0; i < lines.size(); i++){
-            json.add(1);
+        
+        for(Line line : lines) {
+            json.add(line.toJSON());
         }
-        /*assert(lines != null);
-        assert(lines.size() == 2);
-        Iterator<Line> iter = lines.iterator();
-        while(iter.hasNext()){
-            Line line = iter.next();
-            json.add(1);
-        }*/
         return json;
     }
     
conf/initial-data.yml
--- conf/initial-data.yml
+++ conf/initial-data.yml
@@ -1109,49 +1109,59 @@
                             id: 1
 
 #Task
+taskBoards:
+    - !!models.task.TaskBoard
+        project:        !!models.Project
+                            id:  1
+lines:
+    - !!models.task.Line
+        title:          Box
+        taskBoard:      !!models.task.TaskBoard
+                            id:      1
+
+    - !!models.task.Line
+        title:          TODO
+        taskBoard:      !!models.task.TaskBoard
+                            id:      1
+
 cards:
     - !!models.task.Card
-        id:             1
+        title:          test title
         body:           test card
         assignee:
             - !!models.ProjectUser
                 id:     1
         labels:         
             - !!models.task.Label
-                id: 1
+                id:     1
         comments:
             - !!models.task.TaskComment
-                id: 1
+                id:     1
+        line:           !!models.task.Line
+                            id:     1
     - !!models.task.Card
-        id:             2
+        title:          alpha
         body:           alpha
         assignee:
             - !!models.ProjectUser
                 id:     1
+        line:           !!models.task.Line
+                            id:     1
+    - !!models.task.Card
+        title:          Beta
+        body:           beta
+        line:           !!models.task.Line
+                            id:     1
+        
     - !!models.task.TaskComment
         body:           test comment
         author:         !!models.ProjectUser
-                            id: 1
-taskBoards:
-    - !!models.task.TaskBoard
-        project:        !!models.Project
-                            id:  1
+                            id:     1
 
 labels:
     - !!models.task.Label
         name:           HELP
 
-lines:
-    - !!models.task.Line
-        title:          Box
-        taskBoard:      !!models.task.TaskBoard
-                            id:      1
-        
-    - !!models.task.Line
-        title:          TODO
-        taskBoard:      !!models.task.TaskBoard
-                            id:      1
-        
 checkLists:
     - !!models.task.CheckList
         title:          Box
test/models/task/CardTest.java
--- test/models/task/CardTest.java
+++ test/models/task/CardTest.java
@@ -4,6 +4,7 @@
 import models.ModelTest;
 import models.ProjectUser;
 
+import org.codehaus.jackson.JsonNode;
 import org.junit.Test;
 
 public class CardTest extends ModelTest<Card> {
@@ -89,4 +90,14 @@
         assertThat(card.checklist).isEqualTo(checklist);
         assertThat(checklist.id).isNotNull();
     }
+    @Test
+    public void toJSON() throws Exception {
+        //Given
+        Card card = Card.findById(1l);
+        //When
+        JsonNode json = card.toJSON();
+        //Then
+        assertThat(json.get("title").asText()).isEqualTo("test title");
+        assertThat(json.get("body").asText()).isEqualTo("test card");
+    }
 }
 
test/models/task/LineTest.java (added)
+++ test/models/task/LineTest.java
@@ -0,0 +1,26 @@
+package models.task;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static play.test.Helpers.fakeApplication;
+import static play.test.Helpers.running;
+
+import org.codehaus.jackson.JsonNode;
+import org.junit.Test;
+
+public class LineTest {
+    @Test
+    public void toJson() throws Exception {
+        running(fakeApplication(), new Runnable() {
+            @Override
+            public void run() {
+                // Given
+                Line line = Line.findById(1l);
+                // When
+                JsonNode json = line.toJSON();
+                // Then
+                assertThat(json.findValue("title").asText()).isEqualTo("Box");
+                assertThat(json.findValue("cards").size()).isEqualTo(3);
+            }
+        });
+    }
+}
test/models/task/TaskBoardTest.java
--- test/models/task/TaskBoardTest.java
+++ test/models/task/TaskBoardTest.java
@@ -1,7 +1,8 @@
 package models.task;
 
 import static org.fest.assertions.Assertions.assertThat;
-import models.ModelTest;
+import static play.test.Helpers.fakeApplication;
+import static play.test.Helpers.running;
 import models.Project;
 
 import org.codehaus.jackson.JsonNode;
@@ -9,57 +10,74 @@
 import org.junit.Test;
 
 import play.libs.Json;
-
 import controllers.ProjectApp;
 
-public class TaskBoardTest extends ModelTest<TaskBoard> {
+public class TaskBoardTest {
 
     @Test
     public void create() throws Exception {
-        // Given
-        Project project = ProjectApp.getProject("hobi", "nForge4java");
-        // When
-        TaskBoard taskboard = TaskBoard.create(project);
-        // Then
-        assertThat(taskboard.id).isNotNull();
-        assertThat(taskboard.lines.size()).isEqualTo(5);
-        assertThat(taskboard.labels.size()).isEqualTo(10);
-        assertThat(taskboard.project).isEqualTo(project);
+        running(fakeApplication(), new Runnable() {
+            @Override
+            public void run() {
+                // Given
+                Project project = ProjectApp.getProject("hobi", "nForge4java");
+                // When
+                TaskBoard taskboard = TaskBoard.create(project);
+                // Then
+                assertThat(taskboard.id).isNotNull();
+                assertThat(taskboard.lines.size()).isEqualTo(5);
+                assertThat(taskboard.labels.size()).isEqualTo(10);
+                assertThat(taskboard.project).isEqualTo(project);
+            }
+        });
     }
 
-    @Ignore @Test
+    @Test
     public void findByProject() throws Exception {
+        running(fakeApplication(), new Runnable() {
+            @Override
+            public void run() {
+                // Given
+                Project project = ProjectApp.getProject("hobi", "nForge4java");
+                // When
+                TaskBoard taskboard = TaskBoard.findByProject(project);
+                System.out.println(taskboard.labels);
+                // Then
+                assertThat(taskboard).isNotNull();
+                assertThat(taskboard.project).isEqualTo(project);
+            }
+        });
+    }
+
+    @Ignore
+    @Test
+    public void accecptJSON() throws Exception {
         // Given
         Project project = ProjectApp.getProject("hobi", "nForge4java");
+        JsonNode data = Json
+                .parse("[{'_id':'1','title':'BOX','cards':[{'_id':'2','title':'bbb','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00G'},{'_id':'3','title':'ccc','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00I'}],'$$hashKey':'004'},{'_id':'2','title':'TODO','cards':[{'_id':'4','title':'alpha','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00K'},{'_id':'6','title':'chaile','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00O'},{'_id':'1','title':'aaa','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00E'},{'_id':'7','title':'delta','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00Q'}],'$$hashKey':'006'},{'_id':'3','title':'Doing','cards':[{'_id':'5','title':'bravo','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00M'}],'$$hashKey':'008'},{'_id':'4','title':'Test','cards':[{'_id':'8','title':'check','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00S'},{'_id':'9','title':'test','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00U'}],'$$hashKey':'00A'},{'_id':'5','title':'Done','cards':[],'$$hashKey':'00C'}]");
         // When
-        TaskBoard taskboard = TaskBoard.findByProject(project);
+        TaskBoard taskBoard = TaskBoard.findByProject(project);
+        taskBoard.accecptJSON(data);
         // Then
-        assertThat(taskboard).isNotNull();
-        assertThat(taskboard.project).isEqualTo(project);
+        assertThat(taskBoard.lines.size()).isEqualTo(5);
+
     }
-    @Ignore @Test
-    public void accecptJSON() throws Exception{
-        //Given
-        JsonNode data = Json.parse("[{'_id':'1','title':'BOX','cards':[{'_id':'2','title':'bbb','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00G'},{'_id':'3','title':'ccc','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00I'}],'$$hashKey':'004'},{'_id':'2','title':'TODO','cards':[{'_id':'4','title':'alpha','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00K'},{'_id':'6','title':'chaile','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00O'},{'_id':'1','title':'aaa','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00E'},{'_id':'7','title':'delta','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00Q'}],'$$hashKey':'006'},{'_id':'3','title':'Doing','cards':[{'_id':'5','title':'bravo','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00M'}],'$$hashKey':'008'},{'_id':'4','title':'Test','cards':[{'_id':'8','title':'check','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00S'},{'_id':'9','title':'test','body':[],'comment':[],'assignee':[],'labels':[],'checkList':{},'dueDate':{},'storyPoint':-1,'$$hashKey':'00U'}],'$$hashKey':'00A'},{'_id':'5','title':'Done','cards':[],'$$hashKey':'00C'}]");
-        //When
-        TaskBoard project = TaskBoard.findByProject(getTestProject());
-        project.accecptJSON(data);
-        //Then
-        assertThat(project.lines.size()).isEqualTo(5);
-        
-    }
-    @Ignore @Test
+    @Test
     public void toJSON() throws Exception {
-        //현재 DB에 들어있는 놈을 JSON으로 내려 보내야 한다.
-        //Given
-        TaskBoard taskBoard = TaskBoard.findByProject(getTestProject());
-        //assertThat(taskBoard).isNotNull();
-        assertThat(taskBoard.lines).isNotNull();
-        assertThat(taskBoard.lines.size()).isEqualTo(2);
-        //When
-        JsonNode json = taskBoard.toJSON();
-        //Then
-        //assertThat(json.size()).isEqualTo(2);
+        running(fakeApplication(), new Runnable() {
+            @Override
+            public void run() {
+                // 현재 DB에 들어있는 놈을 JSON으로 내려 보내야 한다.
+                Project project = ProjectApp.getProject("hobi", "nForge4java");
+                // Given
+                TaskBoard taskBoard = TaskBoard.findByProject(project);
+                // When
+                JsonNode json = taskBoard.toJSON();
+                // Then
+                assertThat(json.size()).isEqualTo(2);
+            }
+        });
     }
 
 }
Add a comment
List