/** * Yona, 21st Century Project Hosting SW *

* Copyright Yona & Yobi Authors & NAVER Corp. * https://yona.io **/ package models; import com.avaje.ebean.Ebean; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Page; import com.avaje.ebean.RawSqlBuilder; import models.enumeration.ProjectScope; import models.enumeration.RequestState; import models.enumeration.ResourceType; import models.enumeration.RoleType; import models.resource.GlobalResource; import models.resource.Resource; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.NoHeadException; import org.joda.time.DateTime; import org.joda.time.Duration; import org.tmatesoft.svn.core.SVNException; import play.data.validation.Constraints; import play.db.ebean.Model; import play.db.ebean.Transactional; import playRepository.*; import utils.CacheStore; import utils.FileUtil; import utils.JodaDateUtil; import validation.ExConstraints; import javax.annotation.Nonnull; import javax.persistence.*; import javax.servlet.ServletException; import java.io.IOException; import java.util.*; import static utils.CacheStore.getProjectCacheKey; import static utils.CacheStore.projectMap; import static utils.HttpUtil.decodeUrlString; @Entity public class Project extends Model implements LabelOwner { private static final long serialVersionUID = 1L; public static final play.db.ebean.Model.Finder find = new Finder<>(Long.class, Project.class); private static final int DRAFT_TIME_IN_MILLIS = 1000 * 60 * 60; @Id public Long id; @Constraints.Required @Constraints.Pattern("^[a-zA-Z0-9-_\\.가-힣]+$") @ExConstraints.Restricted({".", "..", ".git"}) public String name; public String overview; public String vcs; public String siteurl; public String owner; public Date createdDate; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) public Set issues; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) public List projectUser; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) public List posts; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) public List milestones; /** Project Notification */ @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) public List notifications; private long lastIssueNumber; private long lastPostingNumber; public boolean isCodeAccessibleMemberOnly; @ManyToMany public Set

Parameter "#1" is not set; SQL statement: delete from issue_comment where (issue_id in (?) [90012-168]]
* * @see * BUG 420 : SQLException with CascadeType.REMOVE */ @Override public void delete() { CacheStore.refreshProjectMap(); projectMap.remove(getProjectCacheKey(this.owner, this.name)); deleteProjectTransfer(); deleteFork(); deleteCommentThreads(); deletePullRequests(); if(this.hasForks()) { for(Project fork : forkingProjects) { fork.deletePullRequests(); fork.deleteOriginal(); fork.update(); } } // Issues must be deleted before issue labels because issues may refer // issue labels. for(Issue issue : issues) { issue.delete(); } for(IssueLabelCategory category : IssueLabelCategory.findByProject(this)) { category.delete(); } for (Assignee assignee : assignees) { assignee.delete(); } for (Webhook webhook : webhooks) { webhook.delete(); } for(Posting posting : posts) { posting.delete(); } for (Label label : labels) { label.delete(this); label.update(); } super.delete(); } private void deleteProjectTransfer() { List pts = ProjectTransfer.findByProject(this); for(ProjectTransfer pt : pts) { pt.delete(); } } private void deleteOriginal() { this.originalProject = null; } private void deletePullRequests() { List sentPullRequests = PullRequest.findSentPullRequests(this); for(PullRequest pullRequest : sentPullRequests) { CommentThread.deleteByPullRequest(pullRequest); pullRequest.delete(); } List allReceivedRequests = PullRequest.allReceivedRequests(this); for(PullRequest pullRequest : allReceivedRequests) { CommentThread.deleteByPullRequest(pullRequest); pullRequest.delete(); } } private void deleteCommentThreads() { for(CommentThread commentThread : this.commentThreads) { commentThread.delete(); } } public static String newProjectName(String loginId, String projectName) { Project project = Project.findByOwnerAndProjectName(loginId, projectName); if(project == null) { return projectName; } for(int i = 1 ; ; i++) { String newProjectName = projectName + "-" + i; project = Project.findByOwnerAndProjectName(loginId, newProjectName); if(project == null) { return newProjectName; } } } /** * @see #newProjectName(String, String) */ public static Project copy(Project project, String owner) { Project copyProject = new Project(); copyProject.name = newProjectName(owner, project.name); copyProject.overview = project.overview; copyProject.vcs = project.vcs; copyProject.owner = owner; copyProject.projectScope = project.projectScope; copyProject.menuSetting = new ProjectMenuSetting(project.menuSetting); copyProject.menuSetting.project = copyProject; copyProject.menuSetting.save(); return copyProject; } @Override public Set