mirror of
https://github.com/theonedev/onedev.git
synced 2025-12-08 18:26:30 +00:00
HA support for entity visit info
This commit is contained in:
parent
0e58e3c2f5
commit
13d0201e9e
@ -235,10 +235,10 @@ import io.onedev.server.infomanager.CommitInfoManager;
|
||||
import io.onedev.server.infomanager.DefaultCommitInfoManager;
|
||||
import io.onedev.server.infomanager.DefaultIssueInfoManager;
|
||||
import io.onedev.server.infomanager.DefaultPullRequestInfoManager;
|
||||
import io.onedev.server.infomanager.DefaultUserInfoManager;
|
||||
import io.onedev.server.infomanager.DefaultVisitInfoManager;
|
||||
import io.onedev.server.infomanager.IssueInfoManager;
|
||||
import io.onedev.server.infomanager.PullRequestInfoManager;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.jetty.DefaultJettyLauncher;
|
||||
import io.onedev.server.jetty.JettyLauncher;
|
||||
import io.onedev.server.job.DefaultJobManager;
|
||||
@ -443,7 +443,7 @@ public class CoreModule extends AbstractPluginModule {
|
||||
bind(RoleManager.class).to(DefaultRoleManager.class);
|
||||
bind(CommitInfoManager.class).to(DefaultCommitInfoManager.class);
|
||||
bind(IssueInfoManager.class).to(DefaultIssueInfoManager.class);
|
||||
bind(UserInfoManager.class).to(DefaultUserInfoManager.class);
|
||||
bind(VisitInfoManager.class).to(DefaultVisitInfoManager.class);
|
||||
bind(BatchWorkManager.class).to(DefaultBatchWorkManager.class);
|
||||
bind(WorkExecutor.class).to(DefaultWorkExecutor.class);
|
||||
bind(GroupManager.class).to(DefaultGroupManager.class);
|
||||
|
||||
@ -1,228 +0,0 @@
|
||||
package io.onedev.server.infomanager;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import io.onedev.server.event.codecomment.CodeCommentEvent;
|
||||
import io.onedev.server.event.entity.EntityRemoved;
|
||||
import io.onedev.server.event.issue.IssueEvent;
|
||||
import io.onedev.server.event.pubsub.Listen;
|
||||
import io.onedev.server.event.pullrequest.PullRequestCodeCommentEvent;
|
||||
import io.onedev.server.event.pullrequest.PullRequestEvent;
|
||||
import io.onedev.server.model.CodeComment;
|
||||
import io.onedev.server.model.Issue;
|
||||
import io.onedev.server.model.PullRequest;
|
||||
import io.onedev.server.model.User;
|
||||
import io.onedev.server.persistence.annotation.Transactional;
|
||||
import io.onedev.server.storage.StorageManager;
|
||||
import jetbrains.exodus.env.Environment;
|
||||
import jetbrains.exodus.env.Store;
|
||||
import jetbrains.exodus.env.Transaction;
|
||||
import jetbrains.exodus.env.TransactionalComputable;
|
||||
import jetbrains.exodus.env.TransactionalExecutable;
|
||||
|
||||
/**
|
||||
* Store project visit information here as we only need to load a single database to sort projects based on user
|
||||
* visit information
|
||||
*
|
||||
* @author robin
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class DefaultUserInfoManager extends AbstractMultiEnvironmentManager implements UserInfoManager {
|
||||
|
||||
private static final int INFO_VERSION = 6;
|
||||
|
||||
private static final String PULL_REQUEST_VISIT_STORE = "pullRequestVisit";
|
||||
|
||||
private static final String PULL_REQUEST_CODE_COMMENTS_VISIT_STORE = "pullRequestCodeCommentsVisit";
|
||||
|
||||
private static final String CODE_COMMENT_VISIT_STORE = "codeCommentVisit";
|
||||
|
||||
private static final String ISSUE_VISIT_STORE = "issueVisit";
|
||||
|
||||
private final StorageManager storageManager;
|
||||
|
||||
@Inject
|
||||
public DefaultUserInfoManager(StorageManager storageManager) {
|
||||
this.storageManager = storageManager;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Listen
|
||||
public void on(EntityRemoved event) {
|
||||
if (event.getEntity() instanceof User)
|
||||
removeEnv(event.getEntity().getId().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected File getEnvDir(String envKey) {
|
||||
return storageManager.getUserInfoDir(Long.valueOf(envKey));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEnvVersion() {
|
||||
return INFO_VERSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitIssue(User user, Issue issue) {
|
||||
Environment env = getEnv(issue.getProject().getId().toString());
|
||||
Store store = getStore(env, ISSUE_VISIT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), issue.getId())), time);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitPullRequest(User user, PullRequest request) {
|
||||
Environment env = getEnv(request.getTargetProject().getId().toString());
|
||||
Store store = getStore(env, PULL_REQUEST_VISIT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), time);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitCodeComment(User user, CodeComment comment) {
|
||||
Environment env = getEnv(comment.getProject().getId().toString());
|
||||
Store store = getStore(env, CODE_COMMENT_VISIT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), comment.getId())), time);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getPullRequestVisitDate(User user, PullRequest request) {
|
||||
Environment env = getEnv(request.getTargetProject().getId().toString());
|
||||
Store store = getStore(env, PULL_REQUEST_VISIT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getIssueVisitDate(User user, Issue issue) {
|
||||
Environment env = getEnv(issue.getProject().getId().toString());
|
||||
Store store = getStore(env, ISSUE_VISIT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), issue.getId())), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getCodeCommentVisitDate(User user, CodeComment comment) {
|
||||
Environment env = getEnv(comment.getProject().getId().toString());
|
||||
Store store = getStore(env, CODE_COMMENT_VISIT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), comment.getId())), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(IssueEvent event) {
|
||||
if (event.getUser() != null)
|
||||
visitIssue(event.getUser(), event.getIssue());
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(CodeCommentEvent event) {
|
||||
if (event.getUser() != null)
|
||||
visitCodeComment(event.getUser(), event.getComment());
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(PullRequestEvent event) {
|
||||
if (event.getUser() != null) {
|
||||
visitPullRequest(event.getUser(), event.getRequest());
|
||||
if (event instanceof PullRequestCodeCommentEvent)
|
||||
visitPullRequestCodeComments(event.getUser(), event.getRequest());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitPullRequestCodeComments(User user, PullRequest request) {
|
||||
Environment env = getEnv(request.getTargetProject().getId().toString());
|
||||
Store store = getStore(env, PULL_REQUEST_CODE_COMMENTS_VISIT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), time);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getPullRequestCodeCommentsVisitDate(User user, PullRequest request) {
|
||||
Environment env = getEnv(request.getTargetProject().getId().toString());
|
||||
Store store = getStore(env, PULL_REQUEST_CODE_COMMENTS_VISIT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,368 @@
|
||||
package io.onedev.server.infomanager;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.ObjectStreamException;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import io.onedev.commons.loader.ManagedSerializedForm;
|
||||
import io.onedev.commons.utils.FileUtils;
|
||||
import io.onedev.server.cluster.ClusterManager;
|
||||
import io.onedev.server.cluster.ClusterTask;
|
||||
import io.onedev.server.entitymanager.ProjectManager;
|
||||
import io.onedev.server.event.codecomment.CodeCommentEvent;
|
||||
import io.onedev.server.event.entity.EntityRemoved;
|
||||
import io.onedev.server.event.issue.IssueEvent;
|
||||
import io.onedev.server.event.pubsub.Listen;
|
||||
import io.onedev.server.event.pullrequest.PullRequestCodeCommentEvent;
|
||||
import io.onedev.server.event.pullrequest.PullRequestEvent;
|
||||
import io.onedev.server.model.CodeComment;
|
||||
import io.onedev.server.model.Issue;
|
||||
import io.onedev.server.model.Project;
|
||||
import io.onedev.server.model.PullRequest;
|
||||
import io.onedev.server.model.User;
|
||||
import io.onedev.server.persistence.annotation.Transactional;
|
||||
import io.onedev.server.storage.StorageManager;
|
||||
import jetbrains.exodus.env.Environment;
|
||||
import jetbrains.exodus.env.Store;
|
||||
import jetbrains.exodus.env.Transaction;
|
||||
import jetbrains.exodus.env.TransactionalComputable;
|
||||
import jetbrains.exodus.env.TransactionalExecutable;
|
||||
|
||||
/**
|
||||
* Store project visit information here as we only need to load a single database to sort projects based on user
|
||||
* visit information
|
||||
*
|
||||
* @author robin
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class DefaultVisitInfoManager extends AbstractMultiEnvironmentManager
|
||||
implements VisitInfoManager, Serializable {
|
||||
|
||||
private static final int INFO_VERSION = 6;
|
||||
|
||||
private static final String INFO_DIR = "visit";
|
||||
|
||||
private static final String PULL_REQUEST_STORE = "pullRequest";
|
||||
|
||||
private static final String PULL_REQUEST_CODE_COMMENT_STORE = "pullRequestCodeComment";
|
||||
|
||||
private static final String CODE_COMMENT_STORE = "codeComment";
|
||||
|
||||
private static final String ISSUE_STORE = "issue";
|
||||
|
||||
private final StorageManager storageManager;
|
||||
|
||||
private final ProjectManager projectManager;
|
||||
|
||||
private final ClusterManager clusterManager;
|
||||
|
||||
@Inject
|
||||
public DefaultVisitInfoManager(StorageManager storageManager, ProjectManager projectManager,
|
||||
ClusterManager clusterManager) {
|
||||
this.storageManager = storageManager;
|
||||
this.projectManager = projectManager;
|
||||
this.clusterManager = clusterManager;
|
||||
}
|
||||
|
||||
public Object writeReplace() throws ObjectStreamException {
|
||||
return new ManagedSerializedForm(VisitInfoManager.class);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Listen
|
||||
public void on(EntityRemoved event) {
|
||||
if (event.getEntity() instanceof Project) {
|
||||
Long projectId = event.getEntity().getId();
|
||||
UUID storageServerUUID = projectManager.getStorageServerUUID(projectId, false);
|
||||
if (storageServerUUID != null) {
|
||||
clusterManager.runOnServer(storageServerUUID, new ClusterTask<Void>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
removeEnv(projectId.toString());
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected File getEnvDir(String envKey) {
|
||||
File infoDir = new File(storageManager.getProjectInfoDir(Long.valueOf(envKey)), INFO_DIR);
|
||||
FileUtils.createDir(infoDir);
|
||||
return infoDir;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEnvVersion() {
|
||||
return INFO_VERSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitIssue(User user, Issue issue) {
|
||||
Long projectId = issue.getProject().getId();
|
||||
Long userId = user.getId();
|
||||
Long issueId = issue.getId();
|
||||
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, ISSUE_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, issueId)), time);
|
||||
}
|
||||
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitPullRequest(User user, PullRequest request) {
|
||||
Long projectId = request.getProject().getId();
|
||||
Long userId = user.getId();
|
||||
Long requestId = request.getId();
|
||||
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, PULL_REQUEST_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), time);
|
||||
}
|
||||
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitCodeComment(User user, CodeComment comment) {
|
||||
Long projectId = comment.getProject().getId();
|
||||
Long userId = user.getId();
|
||||
Long commentId = comment.getId();
|
||||
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, CODE_COMMENT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, commentId)), time);
|
||||
}
|
||||
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitPullRequestCodeComments(User user, PullRequest request) {
|
||||
Long userId = user.getId();
|
||||
Long projectId = request.getProject().getId();
|
||||
Long requestId = request.getId();
|
||||
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, PULL_REQUEST_CODE_COMMENT_STORE);
|
||||
env.executeInTransaction(new TransactionalExecutable() {
|
||||
|
||||
@Override
|
||||
public void execute(Transaction txn) {
|
||||
long time = new DateTime().plusSeconds(1).getMillis();
|
||||
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), time);
|
||||
}
|
||||
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getPullRequestVisitDate(User user, PullRequest request) {
|
||||
Long userId = user.getId();
|
||||
Long requestId = request.getId();
|
||||
Long projectId = request.getProject().getId();
|
||||
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Date call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, PULL_REQUEST_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getIssueVisitDate(User user, Issue issue) {
|
||||
Long userId = user.getId();
|
||||
Long projectId = issue.getProject().getId();
|
||||
Long issueId = issue.getId();
|
||||
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Date call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, ISSUE_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, issueId)), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getCodeCommentVisitDate(User user, CodeComment comment) {
|
||||
Long projectId = comment.getProject().getId();
|
||||
Long commentId = comment.getId();
|
||||
Long userId = user.getId();
|
||||
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Date call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, CODE_COMMENT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, commentId)), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getPullRequestCodeCommentsVisitDate(User user, PullRequest request) {
|
||||
Long userId = user.getId();
|
||||
Long projectId = request.getProject().getId();
|
||||
Long requestId = request.getId();
|
||||
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Date call() throws Exception {
|
||||
Environment env = getEnv(projectId.toString());
|
||||
Store store = getStore(env, PULL_REQUEST_CODE_COMMENT_STORE);
|
||||
return env.computeInTransaction(new TransactionalComputable<Date>() {
|
||||
|
||||
@Override
|
||||
public Date compute(Transaction txn) {
|
||||
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), -1);
|
||||
if (millis != -1)
|
||||
return new Date(millis);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(IssueEvent event) {
|
||||
if (event.getUser() != null)
|
||||
visitIssue(event.getUser(), event.getIssue());
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(CodeCommentEvent event) {
|
||||
if (event.getUser() != null)
|
||||
visitCodeComment(event.getUser(), event.getComment());
|
||||
}
|
||||
|
||||
@Listen
|
||||
public void on(PullRequestEvent event) {
|
||||
if (event.getUser() != null) {
|
||||
visitPullRequest(event.getUser(), event.getRequest());
|
||||
if (event instanceof PullRequestCodeCommentEvent)
|
||||
visitPullRequestCodeComments(event.getUser(), event.getRequest());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -9,7 +9,7 @@ import io.onedev.server.model.Issue;
|
||||
import io.onedev.server.model.PullRequest;
|
||||
import io.onedev.server.model.User;
|
||||
|
||||
public interface UserInfoManager {
|
||||
public interface VisitInfoManager {
|
||||
|
||||
void visitPullRequest(User user, PullRequest request);
|
||||
|
||||
@ -30,7 +30,7 @@ import com.google.common.collect.Lists;
|
||||
import io.onedev.server.OneDev;
|
||||
import io.onedev.server.attachment.AttachmentStorageSupport;
|
||||
import io.onedev.server.git.service.GitService;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.support.CompareContext;
|
||||
import io.onedev.server.model.support.LastUpdate;
|
||||
import io.onedev.server.model.support.Mark;
|
||||
@ -246,7 +246,7 @@ public class CodeComment extends ProjectBelonging implements AttachmentStorageSu
|
||||
public boolean isVisitedAfter(Date date) {
|
||||
User user = SecurityUtils.getUser();
|
||||
if (user != null) {
|
||||
Date visitDate = OneDev.getInstance(UserInfoManager.class).getCodeCommentVisitDate(user, this);
|
||||
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getCodeCommentVisitDate(user, this);
|
||||
return visitDate != null && visitDate.getTime()>date.getTime();
|
||||
} else {
|
||||
return true;
|
||||
|
||||
@ -61,7 +61,7 @@ import io.onedev.server.entitymanager.UserManager;
|
||||
import io.onedev.server.entityreference.Referenceable;
|
||||
import io.onedev.server.infomanager.CommitInfoManager;
|
||||
import io.onedev.server.infomanager.PullRequestInfoManager;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.support.EntityWatch;
|
||||
import io.onedev.server.model.support.LastUpdate;
|
||||
import io.onedev.server.model.support.ProjectBelonging;
|
||||
@ -570,7 +570,7 @@ public class Issue extends ProjectBelonging implements Referenceable, Attachment
|
||||
public boolean isVisitedAfter(Date date) {
|
||||
User user = SecurityUtils.getUser();
|
||||
if (user != null) {
|
||||
Date visitDate = OneDev.getInstance(UserInfoManager.class).getIssueVisitDate(user, this);
|
||||
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getIssueVisitDate(user, this);
|
||||
return visitDate != null && visitDate.getTime()>date.getTime();
|
||||
} else {
|
||||
return true;
|
||||
|
||||
@ -53,7 +53,7 @@ import io.onedev.server.entitymanager.UserManager;
|
||||
import io.onedev.server.entityreference.Referenceable;
|
||||
import io.onedev.server.git.GitUtils;
|
||||
import io.onedev.server.git.service.GitService;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.support.BranchProtection;
|
||||
import io.onedev.server.model.support.EntityWatch;
|
||||
import io.onedev.server.model.support.LabelSupport;
|
||||
@ -743,7 +743,7 @@ public class PullRequest extends ProjectBelonging
|
||||
public boolean isVisitedAfter(Date date) {
|
||||
User user = SecurityUtils.getUser();
|
||||
if (user != null) {
|
||||
Date visitDate = OneDev.getInstance(UserInfoManager.class).getPullRequestVisitDate(user, this);
|
||||
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getPullRequestVisitDate(user, this);
|
||||
return visitDate != null && visitDate.getTime()>date.getTime();
|
||||
} else {
|
||||
return true;
|
||||
@ -753,7 +753,7 @@ public class PullRequest extends ProjectBelonging
|
||||
public boolean isCodeCommentsVisitedAfter(Date date) {
|
||||
User user = SecurityUtils.getUser();
|
||||
if (user != null) {
|
||||
Date visitDate = OneDev.getInstance(UserInfoManager.class).getPullRequestCodeCommentsVisitDate(user, this);
|
||||
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getPullRequestCodeCommentsVisitDate(user, this);
|
||||
return visitDate != null && visitDate.getTime()>date.getTime();
|
||||
} else {
|
||||
return true;
|
||||
|
||||
@ -25,7 +25,7 @@ import io.onedev.server.event.issue.IssueCommented;
|
||||
import io.onedev.server.event.issue.IssueEvent;
|
||||
import io.onedev.server.event.issue.IssueOpened;
|
||||
import io.onedev.server.event.pubsub.Listen;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.mail.MailManager;
|
||||
import io.onedev.server.markdown.MarkdownManager;
|
||||
import io.onedev.server.markdown.MentionParser;
|
||||
@ -55,11 +55,11 @@ public class IssueNotificationManager extends AbstractNotificationManager {
|
||||
|
||||
private final UserManager userManager;
|
||||
|
||||
private final UserInfoManager userInfoManager;
|
||||
private final VisitInfoManager userInfoManager;
|
||||
|
||||
@Inject
|
||||
public IssueNotificationManager(MarkdownManager markdownManager, MailManager mailManager,
|
||||
IssueWatchManager watchManager, UserInfoManager userInfoManager, UserManager userManager,
|
||||
IssueWatchManager watchManager, VisitInfoManager userInfoManager, UserManager userManager,
|
||||
SettingManager settingManager, IssueAuthorizationManager authorizationManager) {
|
||||
super(markdownManager, settingManager);
|
||||
this.mailManager = mailManager;
|
||||
|
||||
@ -34,7 +34,7 @@ import io.onedev.server.event.pullrequest.PullRequestReviewRequested;
|
||||
import io.onedev.server.event.pullrequest.PullRequestReviewerRemoved;
|
||||
import io.onedev.server.event.pullrequest.PullRequestUnassigned;
|
||||
import io.onedev.server.event.pullrequest.PullRequestUpdated;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.mail.MailManager;
|
||||
import io.onedev.server.markdown.MarkdownManager;
|
||||
import io.onedev.server.markdown.MentionParser;
|
||||
@ -68,13 +68,13 @@ public class PullRequestNotificationManager extends AbstractNotificationManager
|
||||
|
||||
private final PullRequestWatchManager pullRequestWatchManager;
|
||||
|
||||
private final UserInfoManager userInfoManager;
|
||||
private final VisitInfoManager userInfoManager;
|
||||
|
||||
private final UserManager userManager;
|
||||
|
||||
@Inject
|
||||
public PullRequestNotificationManager(MailManager mailManager, MarkdownManager markdownManager,
|
||||
PullRequestWatchManager pullRequestWatchManager, UserInfoManager userInfoManager,
|
||||
PullRequestWatchManager pullRequestWatchManager, VisitInfoManager userInfoManager,
|
||||
UserManager userManager, SettingManager settingManager) {
|
||||
super(markdownManager, settingManager);
|
||||
this.mailManager = mailManager;
|
||||
|
||||
@ -25,7 +25,6 @@ import io.onedev.server.event.pubsub.Listen;
|
||||
import io.onedev.server.event.system.SystemStarting;
|
||||
import io.onedev.server.model.Build;
|
||||
import io.onedev.server.model.Project;
|
||||
import io.onedev.server.model.User;
|
||||
import io.onedev.server.persistence.TransactionManager;
|
||||
import io.onedev.server.persistence.annotation.Transactional;
|
||||
|
||||
@ -70,12 +69,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
return new File(getProjectsDir(), String.valueOf(projectId));
|
||||
}
|
||||
|
||||
private File getUserDir(Long userId) {
|
||||
File userDir = new File(getUsersDir(), String.valueOf(userId));
|
||||
FileUtils.createDir(userDir);
|
||||
return userDir;
|
||||
}
|
||||
|
||||
private File getProjectSubdir(Long projectId, String subdirName) {
|
||||
File projectDir = getProjectDir(projectId);
|
||||
if (projectDir.exists()) {
|
||||
@ -106,7 +99,7 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
public File getProjectAttachmentDir(Long projectId) {
|
||||
return getProjectSubdir(projectId, "attachment");
|
||||
}
|
||||
|
||||
|
||||
private File getBuildsDir(Long projectId) {
|
||||
return getProjectSubdir(projectId, "builds");
|
||||
}
|
||||
@ -131,13 +124,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
FileUtils.createDir(new File(buildDir, Build.ARTIFACTS_DIR));
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getInfoDir() {
|
||||
File infoDir = new File(Bootstrap.getSiteDir(), "info");
|
||||
FileUtils.createDir(infoDir);
|
||||
return infoDir;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getIndexDir() {
|
||||
File indexDir = new File(Bootstrap.getSiteDir(), "index");
|
||||
@ -155,14 +141,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
FileUtils.deleteDir(projectDir);
|
||||
}
|
||||
}
|
||||
for (File userDir: getUsersDir().listFiles()) {
|
||||
if (new File(userDir, OLD_DELETE_MARK1).exists()
|
||||
|| new File(userDir, OLD_DELETE_MARK2).exists()
|
||||
|| new File(userDir, DELETE_MARK).exists()) {
|
||||
logger.info("Deleting directory marked for deletion: " + userDir);
|
||||
FileUtils.deleteDir(userDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@ -235,22 +213,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
|
||||
}
|
||||
|
||||
if (event.getEntity() instanceof User) {
|
||||
transactionManager.runAfterCommit(new ClusterRunnable() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
new File(getUserDir(id), DELETE_MARK).createNewFile();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -261,18 +223,5 @@ public class DefaultStorageManager implements StorageManager, Serializable {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private File getUsersDir() {
|
||||
File usersDir = new File(Bootstrap.getSiteDir(), "users");
|
||||
FileUtils.createDir(usersDir);
|
||||
return usersDir;
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getUserInfoDir(Long userId) {
|
||||
File infoDir = new File(getUserDir(userId), "info");
|
||||
FileUtils.createDir(infoDir);
|
||||
return infoDir;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -36,8 +36,6 @@ public interface StorageManager {
|
||||
|
||||
void initArtifactsDir(Long projectId, Long buildNumber);
|
||||
|
||||
File getInfoDir();
|
||||
|
||||
File getIndexDir();
|
||||
|
||||
/**
|
||||
@ -48,8 +46,6 @@ public interface StorageManager {
|
||||
*/
|
||||
File getProjectAttachmentDir(Long projectId);
|
||||
|
||||
File getUserInfoDir(Long userId);
|
||||
|
||||
/**
|
||||
* Get directory to store build related files such as logs, artifacts and reports
|
||||
*
|
||||
|
||||
@ -43,7 +43,7 @@ import io.onedev.server.entitymanager.CodeCommentReplyManager;
|
||||
import io.onedev.server.entitymanager.CodeCommentStatusChangeManager;
|
||||
import io.onedev.server.entitymanager.UrlManager;
|
||||
import io.onedev.server.entitymanager.UserManager;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.CodeComment;
|
||||
import io.onedev.server.model.CodeCommentReply;
|
||||
import io.onedev.server.model.CodeCommentStatusChange;
|
||||
@ -431,7 +431,7 @@ public abstract class CodeCommentPanel extends Panel {
|
||||
prevActivityContainer = newActivityContainer;
|
||||
}
|
||||
|
||||
OneDev.getInstance(UserInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -447,7 +447,7 @@ public abstract class CodeCommentPanel extends Panel {
|
||||
@Override
|
||||
protected void onBeforeRender() {
|
||||
if (SecurityUtils.getUser() != null)
|
||||
OneDev.getInstance(UserInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
|
||||
super.onBeforeRender();
|
||||
}
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
|
||||
import io.onedev.server.OneDev;
|
||||
import io.onedev.server.entitymanager.IssueManager;
|
||||
import io.onedev.server.entitymanager.SettingManager;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.Issue;
|
||||
import io.onedev.server.model.Project;
|
||||
import io.onedev.server.model.support.inputspec.InputContext;
|
||||
@ -319,7 +319,7 @@ abstract class CardDetailPanel extends GenericPanel<Issue> implements InputConte
|
||||
@Override
|
||||
public void onEndRequest(RequestCycle cycle) {
|
||||
if (SecurityUtils.getUser() != null)
|
||||
OneDev.getInstance(UserInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -32,7 +32,7 @@ import io.onedev.server.OneDev;
|
||||
import io.onedev.server.entitymanager.IssueLinkManager;
|
||||
import io.onedev.server.entitymanager.IssueManager;
|
||||
import io.onedev.server.entitymanager.SettingManager;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.Issue;
|
||||
import io.onedev.server.model.Project;
|
||||
import io.onedev.server.model.support.inputspec.InputContext;
|
||||
@ -273,7 +273,7 @@ public abstract class IssueDetailPage extends ProjectIssuesPage implements Input
|
||||
@Override
|
||||
public void onEndRequest(RequestCycle cycle) {
|
||||
if (SecurityUtils.getUser() != null)
|
||||
OneDev.getInstance(UserInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -67,7 +67,7 @@ import io.onedev.server.entitymanager.PullRequestWatchManager;
|
||||
import io.onedev.server.entityreference.Referenceable;
|
||||
import io.onedev.server.git.GitUtils;
|
||||
import io.onedev.server.git.service.RefFacade;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.AbstractEntity;
|
||||
import io.onedev.server.model.Build;
|
||||
import io.onedev.server.model.Project;
|
||||
@ -680,7 +680,7 @@ public abstract class PullRequestDetailPage extends ProjectPage implements PullR
|
||||
@Override
|
||||
public void onEndRequest(RequestCycle cycle) {
|
||||
if (SecurityUtils.getUser() != null)
|
||||
OneDev.getInstance(UserInfoManager.class).visitPullRequest(SecurityUtils.getUser(), getPullRequest());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitPullRequest(SecurityUtils.getUser(), getPullRequest());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -17,7 +17,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import io.onedev.server.OneDev;
|
||||
import io.onedev.server.infomanager.UserInfoManager;
|
||||
import io.onedev.server.infomanager.VisitInfoManager;
|
||||
import io.onedev.server.model.Project;
|
||||
import io.onedev.server.model.PullRequest;
|
||||
import io.onedev.server.security.SecurityUtils;
|
||||
@ -151,7 +151,7 @@ public class PullRequestCodeCommentsPage extends PullRequestDetailPage {
|
||||
@Override
|
||||
public void onEndRequest(RequestCycle cycle) {
|
||||
if (SecurityUtils.getUser() != null)
|
||||
OneDev.getInstance(UserInfoManager.class).visitPullRequestCodeComments(SecurityUtils.getUser(), getPullRequest());
|
||||
OneDev.getInstance(VisitInfoManager.class).visitPullRequestCodeComments(SecurityUtils.getUser(), getPullRequest());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user