[Notice] Announcing the End of Demo Server [Read me]
unknown 2012-08-13
apply URL change
@fbe22f1a82c32407c462725b867f018a5e58547f
app/controllers/IssueApp.java
--- app/controllers/IssueApp.java
+++ app/controllers/IssueApp.java
@@ -47,13 +47,10 @@
      *            이슈 해결 상태
      * @return
      */
-    public static Result issues(String projectName, String stateType) {
-        Project project = Project.findByName(projectName);
+    public static Result issues(String userName, String projectName, String stateType) {
+        Project project = ProjectApp.getProject(userName, projectName);
         Form<SearchCondition> issueParamForm = new Form<SearchCondition>(SearchCondition.class);
         SearchCondition issueParam = issueParamForm.bindFromRequest().get();
-        if (project == null) {
-            return notFound();
-        }
         Page<Issue> issues = Issue.findIssues(project.name, issueParam.pageNum,
                 StateType.getValue(stateType), issueParam.sortBy,
                 Direction.getValue(issueParam.orderBy), issueParam.filter, issueParam.milestone,
@@ -61,11 +58,8 @@
         return ok(issueList.render("title.issueList", issues, issueParam, project));
     }
 
-    public static Result issue(String projectName, Long issueId) {
-        Project project = Project.findByName(projectName);
-        if (project == null) {
-            return notFound();
-        }
+    public static Result issue(String userName, String projectName, Long issueId) {
+        Project project = ProjectApp.getProject(userName, projectName);
         Issue issueInfo = Issue.findById(issueId);
         if (issueInfo == null) {
             return ok(notExistingPage.render("title.post.notExistingPage", project));
@@ -75,21 +69,14 @@
         }
     }
 
-    public static Result newIssue(String projectName) {
-        Project project = Project.findByName(projectName);
-        if (project == null) {
-            return notFound();
-        }
+    public static Result newIssue(String userName, String projectName) {
+        Project project = ProjectApp.getProject(userName, projectName);
         return ok(newIssue.render("title.newIssue", new Form<Issue>(Issue.class), project));
     }
 
-    public static Result saveIssue(String projectName) {
+    public static Result saveIssue(String userName, String projectName) {
         Form<Issue> issueForm = new Form<Issue>(Issue.class).bindFromRequest();
-        Project project = Project.findByName(projectName);
-
-        if (project == null) {
-            return notFound();
-        }
+        Project project = ProjectApp.getProject(userName, projectName);
         if (issueForm.hasErrors()) {
             return badRequest(newIssue.render(issueForm.errors().toString(), issueForm, project));
         } else {
@@ -101,14 +88,13 @@
             newIssue.filePath = saveFile(request());
             Issue.create(newIssue);
         }
-        return redirect(routes.IssueApp.issues(project.name, StateType.ALL.stateType()));
+        return redirect(routes.IssueApp.issues(project.owner, project.name, StateType.ALL.stateType()));
     }
 
-    public static Result editIssue(String projectName, Long id) {
+    public static Result editIssue(String userName, String projectName, Long id) {
         Issue targetIssue = Issue.findById(id);
         Form<Issue> editForm = new Form<Issue>(Issue.class).fill(targetIssue);
-        Project project = Project.findByName(projectName);
-
+        Project project = ProjectApp.getProject(userName, projectName);
         if (UserApp.currentUser().id == targetIssue.reporterId
                 || RoleCheck.roleCheck(UserApp.currentUser().id, project.id,
                         PermissionResource.PROJECT,
@@ -117,14 +103,13 @@
             return ok(editIssue.render("title.editIssue", editForm, id, project));
         } else {
             return ok(issueError.render("post.edit.rejectNotAuthor",
-                    routes.IssueApp.issue(project.name, id), project));
+                    routes.IssueApp.issue(project.owner, project.name, id), project));
         }
     }
 
-    public static Result updateIssue(String projectName, Long id) {
+    public static Result updateIssue(String userName, String projectName, Long id) {
         Form<Issue> issueForm = new Form<Issue>(Issue.class).bindFromRequest();
-        Project projcet = Project.findByName(projectName);
-
+        Project project = ProjectApp.getProject(userName, projectName);
         if (issueForm.hasErrors()) {
             return badRequest(issueForm.errors().toString());
         } else {
@@ -132,25 +117,22 @@
             issue.reporterId = UserApp.currentUser().id;
             issue.id = id;
             issue.filePath = saveFile(request());
-            issue.project = projcet;
+            issue.project = project;
             Issue.edit(issue);
         }
-        return redirect(routes.IssueApp.issues(projcet.name, StateType.ALL.name()));
+        return redirect(routes.IssueApp.issues(project.owner, project.name, StateType.ALL.name()));
     }
 
-    public static Result deleteIssue(String projectName, Long issueId) {
-        Project project = Project.findByName(projectName);
-        if (project == null) {
-            return notFound();
-        }
+    public static Result deleteIssue(String userName, String projectName, Long issueId) {
+        Project project = ProjectApp.getProject(userName, projectName);
         Issue.delete(issueId);
-        return redirect(routes.IssueApp.issues(project.name, StateType.ALL.stateType()));
+        return redirect(routes.IssueApp.issues(project.owner, project.name, StateType.ALL.stateType()));
     }
 
-    public static Result saveComment(String projectName, Long issueId) {
+    public static Result saveComment(String userName, String projectName, Long issueId) {
         Form<IssueComment> commentForm = new Form<IssueComment>(IssueComment.class)
                 .bindFromRequest();
-        Project project = Project.findByName(projectName);
+        Project project = ProjectApp.getProject(userName, projectName);
         if (commentForm.hasErrors()) {
             return TODO;
         } else {
@@ -161,27 +143,21 @@
             IssueComment.create(comment);
             Issue.findById(issueId).numOfComments++;
             Issue.updateNumOfComments(issueId);
-            return redirect(routes.IssueApp.issue(project.name, issueId));
+            return redirect(routes.IssueApp.issue(project.owner, project.name, issueId));
         }
     }
 
-    public static Result deleteComment(String projectName, Long issueId, Long commentId) {
-        Project project = Project.findByName(projectName);
-        if (project == null) {
-            return notFound();
-        }
+    public static Result deleteComment(String userName, String projectName, Long issueId, Long commentId) {
+        Project project = ProjectApp.getProject(userName, projectName);
         IssueComment.delete(commentId);
         Issue.updateNumOfComments(issueId);
-        return redirect(routes.IssueApp.issue(project.name, issueId));
+        return redirect(routes.IssueApp.issue(project.owner, project.name, issueId));
     }
 
-    public static Result extractExcelFile(String projectName, String stateType) throws Exception {
-        Project project = Project.findByName(projectName);
+    public static Result extractExcelFile(String userName, String projectName, String stateType) throws Exception {
+        Project project = ProjectApp.getProject(userName, projectName);
         Form<SearchCondition> issueParamForm = new Form<SearchCondition>(SearchCondition.class);
         SearchCondition issueParam = issueParamForm.bindFromRequest().get();
-        if (project == null) {
-            return notFound();
-        }
         Page<Issue> issues = Issue.findIssues(project.name, issueParam.pageNum,
                 StateType.getValue(stateType), issueParam.sortBy,
                 Direction.getValue(issueParam.orderBy), issueParam.filter, issueParam.milestone,
@@ -192,7 +168,7 @@
         return ok(issueList.render("title.issueList", issues, issueParam, project));
     }
 
-    public static Result enrollAutoNotification(String projectName) throws Exception {
+    public static Result enrollAutoNotification(String userName, String projectName) throws Exception {
         return TODO;
     }
 
app/views/issue/editIssue.scala.html
--- app/views/issue/editIssue.scala.html
+++ app/views/issue/editIssue.scala.html
@@ -4,7 +4,7 @@
 
 @main(Messages(title), project) {
 
-    @form( action = routes.IssueApp.updateIssue(project.name, issueId), 
+    @form( action = routes.IssueApp.updateIssue(project.owner, project.name, issueId), 
             'enctype -> "multipart/form-data",
             'class -> "form-horizontal"){
             <fieldset>
app/views/issue/issue.scala.html
--- app/views/issue/issue.scala.html
+++ app/views/issue/issue.scala.html
@@ -5,9 +5,9 @@
 <div class="row">
 	<div class="span2 offset10">
 		<div id="board_btn_panel">
-			<a class="btn btn-primary" href="@routes.IssueApp.editIssue(project.name, issue.id)">@Messages("button.edit")</a> <a
+			<a class="btn btn-primary" href="@routes.IssueApp.editIssue(project.owner, project.name, issue.id)">@Messages("button.edit")</a> <a
 				data-toggle="modal" href="#deleteIssueConfirm" class="btn">@Messages("button.delete")</a>
-			<a class="btn" href="@routes.IssueApp.issues(project.name,"open")">@Messages("button.list")</a>
+			<a class="btn" href="@routes.IssueApp.issues(project.owner, project.name,"open")">@Messages("button.list")</a>
 		</div>
 	</div>
 </div>
@@ -74,7 +74,7 @@
 		    </div>
 		    <div class="modal-footer">
 		        <a class="btn btn-danger"
-		            href="@routes.IssueApp.deleteComment(project.name, issue.id, comment.id)">@Messages("button.yes")</a>
+		            href="@routes.IssueApp.deleteComment(project.owner, project.name, issue.id, comment.id)">@Messages("button.yes")</a>
 		        <a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a>
 		    </div>
         </div>
@@ -92,7 +92,7 @@
 <!-- 댓글 입력 폼 -->
 <hr />
 <div class="row">
-	@form(routes.IssueApp.saveComment(project.name, issue.id), 'enctype ->
+	@form(routes.IssueApp.saveComment(project.owner, project.name, issue.id), 'enctype ->
 	"multipart/form-data"){
 	<div class="span12">@textarea(commentForm("contents"))</div>
 	<div class="span6">@inputFile(commentForm("filePath"))</div>
@@ -115,7 +115,7 @@
 	</div>
 	<div class="modal-footer">
 		<a class="btn btn-danger"
-			href="@routes.IssueApp.deleteIssue(project.name, issue.id)">@Messages("button.yes")</a>
+			href="@routes.IssueApp.deleteIssue(project.owner, project.name, issue.id)">@Messages("button.yes")</a>
 		<a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a>
 	</div>
 </div>
app/views/issue/issueList.scala.html
--- app/views/issue/issueList.scala.html
+++ app/views/issue/issueList.scala.html
@@ -5,7 +5,7 @@
 
 @header(label:String, sortBy:String) = {
     <th>
-        <a sortBy="@sortBy" href="@routes.IssueApp.issues(project.name, param.stateType)">@label</a>
+        <a sortBy="@sortBy" href="@routes.IssueApp.issues(project.owner, project.name, param.stateType)">@label</a>
         @if(sortBy == param.sortBy){
         @if(param.orderBy == "desc"){
         <i class="icon-chevron-down"></i>
@@ -21,7 +21,7 @@
 	<div class="row">
 		<div span="span6">
 			<div class="pull-right">
-				<form id="searchForm" class="form-search form-inline" action="@routes.IssueApp.issues(project.name, param.stateType)" method="GET" >
+				<form id="searchForm" class="form-search form-inline" action="@routes.IssueApp.issues(project.owner, project.name, param.stateType)" method="GET" >
 					<select id="milestone" name="milestone">
 						<option class="blank" value ="">@Messages("issue.menu.milestoneSelectDefault")</option>@Milestone.options(project.id).map { v => <option id="changeMilestone" name ="milestone" value="@v._1" >@v._2</option>}
 					</select>
@@ -31,7 +31,7 @@
 					<input type="hidden" name="stateType" value="@param.stateType">
 					<button type="submit" id="searchSubmit" class="btn"> <i class="icon-search"> </i></button>
 				
-				<a class="btn btn-primary" href="@routes.IssueApp.newIssue(project.name)" >@Messages("issue.menu.new")</a>
+				<a class="btn btn-primary" href="@routes.IssueApp.newIssue(project.owner, project.name)" >@Messages("issue.menu.new")</a>
 				</form>
 			</div>
 		</div>
@@ -39,11 +39,11 @@
 	<div>
 		<ul class="nav nav-tabs" id="issue_list">
 			<li class="@if(param.stateType.equals("all")){active}">
-				<a href="@routes.IssueApp.issues(project.name,"all")">@Messages("issue.stateType.all")</a></li>
+				<a href="@routes.IssueApp.issues(project.owner, project.name,"all")">@Messages("issue.stateType.all")</a></li>
 			<li class="@if(param.stateType.equals("open")){active}">
-				<a href="@routes.IssueApp.issues(project.name, "open")">@Messages("issue.stateType.open")</a></li>
+				<a href="@routes.IssueApp.issues(project.owner, project.name, "open")">@Messages("issue.stateType.open")</a></li>
 			<li class="@if(param.stateType.equals("closed")){active}">
-				<a href="@routes.IssueApp.issues(project.name, "closed")">@Messages("issue.stateType.closed")</a></li>
+				<a href="@routes.IssueApp.issues(project.owner, project.name, "closed")">@Messages("issue.stateType.closed")</a></li>
 		</ul>
 				
 		@if(currentPage.getTotalRowCount == 0){
@@ -52,7 +52,7 @@
 			</div>
 		}else{
 		<div class="pull-right">
-			<form class="form-inline" id="checkboxForm" action="@routes.IssueApp.issues(project.name, param.stateType)" method="GET">
+			<form class="form-inline" id="checkboxForm" action="@routes.IssueApp.issues(project.owner, project.name, param.stateType)" method="GET">
 				
 				<input type="hidden" name="filter" value="@param.filter">
 				<input type="hidden" name="stateType" value="@param.stateType">
@@ -72,7 +72,7 @@
 		            	<label class="checkbox inline">
 		                	<input type="checkbox" name="fileAttachedCheck" id="fileAttachedCheckId" value="1"> @Messages("checkbox.fileAttached")
 		              	</label>
-		              	<a href="@routes.IssueApp.extractExcelFile(project.name, param.stateType)"><i class ="icon-download-alt"></i>@Messages("button.excelDownload")</a>
+		              	<a href="@routes.IssueApp.extractExcelFile(project.owner, project.name, param.stateType)"><i class ="icon-download-alt"></i>@Messages("button.excelDownload")</a>
 		            	</fieldset>
 		            </div>
 		        </div>
@@ -95,7 +95,7 @@
 						<tr>
 							<td>@issue.id</td>
 							<td>@Messages(issue.state())</td>
-							<td><a href="@routes.IssueApp.issue(project.name, issue.id)">@issue.title @if(issue.comments.size > 0){[@issue.comments.size]} @if(issue.filePath != null){<i class="icon-file">}</a></td>
+							<td><a href="@routes.IssueApp.issue(project.owner, project.name, issue.id)">@issue.title @if(issue.comments.size > 0){[@issue.comments.size]} @if(issue.filePath != null){<i class="icon-file">}</a></td>
 							<td>
 								@if(issue.assigneeId == null){
 								<em>@Messages("issue.noAssignee")</em>						
@@ -115,7 +115,7 @@
         @pagination(currentPage, 5, "pagination")
     </div>
     <div class="span2">
-        <a class="btn pull-right" href="@routes.IssueApp.enrollAutoNotification(project.name)"><i class="icon-ok"></i>@Messages("button.autoNotification")</a>
+        <a class="btn pull-right" href="@routes.IssueApp.enrollAutoNotification(project.owner, project.name)"><i class="icon-ok"></i>@Messages("button.autoNotification")</a>
     </div>
   </div>
  
app/views/issue/newIssue.scala.html
--- app/views/issue/newIssue.scala.html
+++ app/views/issue/newIssue.scala.html
@@ -7,7 +7,7 @@
 	<div class="page-header">
 		<h1>@Messages(title)</h1>
 	</div>
-    @form(action = routes.IssueApp.saveIssue(project.name), 
+    @form(action = routes.IssueApp.saveIssue(project.owner, project.name), 
     				'enctype -> "multipart/form-data",
     				'class -> "form-horizontal"){
     	<fieldset>
@@ -148,7 +148,7 @@
 	<div class="row pull-right">
 			<div class="actions">
 				<input type="submit" class="btn btn-primary" value="@Messages("button.save")"> 
-				<a href="@routes.IssueApp.issues(project.name, "all")" class="btn">@Messages("button.cancel")</a>
+				<a href="@routes.IssueApp.issues(project.owner, project.name, "all")" class="btn">@Messages("button.cancel")</a>
 			</div>
     </div>
  }
app/views/issue/notExistingPage.scala.html
--- app/views/issue/notExistingPage.scala.html
+++ app/views/issue/notExistingPage.scala.html
@@ -1,8 +1,8 @@
- @(title:String, project:Project)
+@(title:String, project:Project)
 
 @import helper.twitterBootstrap._
 
 @main(title, project) {
     <h1>존재하지 않는 게시물 입니다.</h1>
-    <a href="@routes.IssueApp.issues(project.name, "all")" class="btn">목록으로 가기</a>
+    <a href="@routes.IssueApp.issues(project.owner, project.name, "all")" class="btn">목록으로 가기</a>
 }
app/views/milestone/list.scala.html
--- app/views/milestone/list.scala.html
+++ app/views/milestone/list.scala.html
@@ -9,7 +9,7 @@
     routes.MilestoneApp.milestones(projectName, state, _sort, _direction)
 }
 @makeIssuesLink(mId: Long, _state: String) = @{
-    routes.IssueApp.issues(projectName, _state)+"&milestone="+mId
+    routes.IssueApp.issues(projectInst.owner, projectName, _state)+"&milestone="+mId
 }
 @sortMark(_sort: String) = @{
     /* TODO It will be chnaged. */
app/views/topmenu.scala.html
--- app/views/topmenu.scala.html
+++ app/views/topmenu.scala.html
@@ -17,8 +17,8 @@
         </li>
     }
     @roleCheck(session.get("userId"), project.id, models.enumeration.PermissionResource.ISSUE, models.enumeration.PermissionOperation.READ){
-        <li class="@isActiveMenu(routes.IssueApp.issues(project.name,"open"))">
-          <a href="@routes.IssueApp.issues(project.name,"open")">@Messages("menu.issue")</a>
+        <li class="@isActiveMenu(routes.IssueApp.issues(project.owner, project.name,"open"))">
+          <a href="@routes.IssueApp.issues(project.owner, project.name,"open")">@Messages("menu.issue")</a>
         </li>
     }
     @roleCheck(session.get("userId"), project.id, models.enumeration.PermissionResource.WIKI, models.enumeration.PermissionOperation.READ){
conf/routes
--- conf/routes
+++ conf/routes
@@ -55,17 +55,17 @@
 GET     /:projectName/milestone/:id/edit        controllers.MilestoneApp.editMilestone(projectName:String, id: Long)
 
 # Issues
-GET     /:projectName/issueList                 controllers.IssueApp.issues(projectName:String, stateType:String)
-GET     /:projectName/issues/new                controllers.IssueApp.newIssue(projectName:String)
-POST    /:projectName/issues/new                controllers.IssueApp.saveIssue(projectName:String)
-GET     /:projectName/issues/:id                controllers.IssueApp.issue(projectName:String, id:Long)
-POST    /:projectName/issue/:id/reply           controllers.IssueApp.saveComment(projectName:String, id:Long)
-GET     /:projectName/issue/:id/delete          controllers.IssueApp.deleteIssue(projectName:String, id:Long)
-GET     /:projectName/issue/:id/deleteComment   controllers.IssueApp.deleteComment(projectName:String, id:Long, commentId:Long)
-GET     /:projectName/issueList/excel           controllers.IssueApp.extractExcelFile(projectName:String, stateType:String)
-GET     /:projectName/issues/:id/edit           controllers.IssueApp.editIssue(projectName:String, id:Long)
-POST    /:projectName/issues/:id/edit           controllers.IssueApp.updateIssue(projectName:String, id:Long)
-GET     /:projectName/issueList/autonotify      controllers.IssueApp.enrollAutoNotification(projectName:String)
+GET     /:user/:project/issueList                 controllers.IssueApp.issues(user:String, project:String, stateType:String)
+GET     /:user/:project/issues/new                controllers.IssueApp.newIssue(user:String, project:String)
+POST    /:user/:project/issues/new                controllers.IssueApp.saveIssue(user:String, project:String)
+GET     /:user/:project/issues/:id                controllers.IssueApp.issue(user:String, project:String, id:Long)
+POST    /:user/:project/issue/:id/reply           controllers.IssueApp.saveComment(user:String, project:String, id:Long)
+GET     /:user/:project/issue/:id/delete          controllers.IssueApp.deleteIssue(user:String, project:String, id:Long)
+GET     /:user/:project/issue/:id/deleteComment   controllers.IssueApp.deleteComment(user:String, project:String, id:Long, commentId:Long)
+GET     /:user/:project/issueList/excel           controllers.IssueApp.extractExcelFile(user:String, project:String, stateType:String)
+GET     /:user/:project/issues/:id/edit           controllers.IssueApp.editIssue(user:String, project:String, id:Long)
+POST    /:user/:project/issues/:id/edit           controllers.IssueApp.updateIssue(user:String, project:String, id:Long)
+GET     /:user/:project/issueList/autonotify      controllers.IssueApp.enrollAutoNotification(user:String, project:String)
 
 # Git
 GET     /:projectName/info/refs                                        controllers.GitApp.advertise(projectName:String, service:String)
Add a comment
List