Refactoring various model managers

This commit is contained in:
Robin Shen 2023-03-02 12:42:00 +08:00
parent f99fc59ded
commit a811bb52cc
191 changed files with 1054 additions and 902 deletions

View File

@ -81,7 +81,7 @@ public class CloseMilestoneStep extends ServerSideStep {
if (build.canCloseMilestone(getAccessTokenSecret(), milestoneName)) {
milestone.setClosed(true);
milestoneManager.save(milestone);
milestoneManager.createOrUpdate(milestone);
} else {
throw new ExplicitException("This build is not authorized to close milestone '" + milestoneName + "'");
}

View File

@ -8,6 +8,8 @@ import io.onedev.server.model.AgentAttribute;
import io.onedev.server.persistence.dao.EntityManager;
public interface AgentAttributeManager extends EntityManager<AgentAttribute> {
void create(AgentAttribute attribute);
List<String> getAttributeNames();

View File

@ -1,22 +1,22 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Nullable;
import org.eclipse.jetty.websocket.api.Session;
import io.onedev.agent.AgentData;
import io.onedev.server.model.Agent;
import io.onedev.server.persistence.dao.EntityManager;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.criteria.Criteria;
import org.eclipse.jetty.websocket.api.Session;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public interface AgentManager extends EntityManager<Agent> {
void createOrUpdate(Agent agent);
String getAgentVersion();
Collection<String> getAgentLibs();

View File

@ -9,6 +9,8 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface AgentTokenManager extends EntityManager<AgentToken> {
void create(AgentToken token);
@Nullable
AgentToken find(String value);

View File

@ -5,4 +5,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface BuildDependenceManager extends EntityManager<BuildDependence> {
void create(BuildDependence dependence);
}

View File

@ -22,7 +22,7 @@ import io.onedev.server.util.StatusInfo;
import io.onedev.server.util.criteria.Criteria;
public interface BuildManager extends EntityManager<Build> {
@Nullable
Build find(Project project, long number);
@ -55,6 +55,8 @@ public interface BuildManager extends EntityManager<Build> {
Map<ObjectId, Map<String, Collection<StatusInfo>>> queryStatus(Project project, Collection<ObjectId> commitIds);
void create(Build build);
void update(Build build);
Map<Long, Long> queryUnfinished();

View File

@ -11,8 +11,10 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface BuildParamManager extends EntityManager<BuildParam> {
void create(BuildParam param);
void deleteParams(Build build);
Collection<String> getParamNames(@Nullable Project project);
}

View File

@ -8,5 +8,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface BuildQueryPersonalizationManager extends EntityManager<BuildQueryPersonalization> {
BuildQueryPersonalization find(Project project, User user);
void createOrUpdate(BuildQueryPersonalization buildQueryPersonalization);
}

View File

@ -33,5 +33,6 @@ public interface CodeCommentManager extends EntityManager<CodeComment> {
@Nullable
CodeComment findByUUID(String uuid);
void createOrUpdate(CodeComment comment);
}

View File

@ -1,10 +1,12 @@
package io.onedev.server.entitymanager;
import io.onedev.server.model.*;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.CodeCommentMention;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
public interface CodeCommentMentionManager extends EntityManager<CodeCommentMention> {
void mention(CodeComment comment, User user);
}

View File

@ -8,5 +8,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface CodeCommentQueryPersonalizationManager extends EntityManager<CodeCommentQueryPersonalization> {
CodeCommentQueryPersonalization find(Project project, User user);
void createOrUpdate(CodeCommentQueryPersonalization codeCommentQueryPersonalization);
}

View File

@ -5,6 +5,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface CodeCommentReplyManager extends EntityManager<CodeCommentReply> {
void save(CodeCommentReply reply);
void createOrUpdate(CodeCommentReply reply);
}

View File

@ -8,5 +8,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface CommitQueryPersonalizationManager extends EntityManager<CommitQueryPersonalization> {
CommitQueryPersonalization find(Project project, User user);
void createOrUpdate(CommitQueryPersonalization commitQueryPersonalization);
}

View File

@ -1,13 +1,13 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.Dashboard;
import io.onedev.server.model.DashboardGroupShare;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
public interface DashboardGroupShareManager extends EntityManager<DashboardGroupShare> {
void syncShares(Dashboard dashboard, Collection<String> groupNames);
}

View File

@ -1,13 +1,13 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.Dashboard;
import io.onedev.server.model.DashboardUserShare;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
public interface DashboardUserShareManager extends EntityManager<DashboardUserShare> {
void syncShares(Dashboard dashboard, Collection<String> userNames);
}

View File

@ -37,4 +37,6 @@ public interface EmailAddressManager extends EntityManager<EmailAddress> {
void sendVerificationEmail(EmailAddress emailAddress);
EmailAddressCache cloneCache();
void createOrUpdate(EmailAddress address);
}

View File

@ -6,5 +6,7 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface GitLfsLockManager extends EntityManager<GitLfsLock> {
GitLfsLock find(String path);
void create(GitLfsLock lock);
}

View File

@ -10,5 +10,6 @@ public interface GpgKeyManager extends EntityManager<GpgKey> {
@Nullable
SignatureVerificationKey findSignatureVerificationKey(long keyId);
void create(GpgKey gpgKey);
}

View File

@ -9,5 +9,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface GroupAuthorizationManager extends EntityManager<GroupAuthorization> {
void syncAuthorizations(Group group, Collection<GroupAuthorization> authorizations);
void createOrUpdate(GroupAuthorization authorization);
}

View File

@ -9,4 +9,5 @@ public interface IssueAuthorizationManager extends EntityManager<IssueAuthorizat
void authorize(Issue issue, User user);
void createOrUpdate(IssueAuthorization authorization);
}

View File

@ -11,8 +11,10 @@ public interface IssueFieldManager extends EntityManager<IssueField> {
void saveFields(Issue issue);
void onRenameUser(String oldName, String newName);
void onRenameGroup(String oldName, String newName);
void create(IssueField entity);
void onRenameGroup(String oldName, String newName);
void populateFields(Collection<Issue> issues);

View File

@ -1,17 +1,19 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueLink;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
public interface IssueLinkManager extends EntityManager<IssueLink> {
void syncLinks(LinkSpec spec, Issue issue, Collection<Issue> linkedIssues, boolean opposite);
void populateLinks(Collection<Issue> issues);
void create(IssueLink link);
void populateLinks(Collection<Issue> issues);
void loadDeepLinks(Issue issue);

View File

@ -2,12 +2,11 @@ package io.onedev.server.entitymanager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueMention;
import io.onedev.server.model.IssueVote;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
public interface IssueMentionManager extends EntityManager<IssueMention> {
void mention(Issue issue, User user);
}

View File

@ -1,12 +1,13 @@
package io.onedev.server.entitymanager;
import io.onedev.server.model.IssueQueryPersonalization;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.model.IssueQueryPersonalization;
import io.onedev.server.persistence.dao.EntityManager;
public interface IssueQueryPersonalizationManager extends EntityManager<IssueQueryPersonalization> {
IssueQueryPersonalization find(Project project, User user);
void createOrUpdate(IssueQueryPersonalization personalization);
}

View File

@ -10,5 +10,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface IssueScheduleManager extends EntityManager<IssueSchedule> {
void syncMilestones(Issue issue, Collection<Milestone> milestones);
void create(IssueSchedule schedule);
}

View File

@ -5,4 +5,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface IssueVoteManager extends EntityManager<IssueVote> {
void create(IssueVote vote);
}

View File

@ -13,5 +13,6 @@ public interface IssueWatchManager extends EntityManager<IssueWatch> {
IssueWatch find(Issue issue, User user);
void watch(Issue issue, User user, boolean watching);
void createOrUpdate(IssueWatch watch);
}

View File

@ -1,14 +1,15 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.LinkAuthorization;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.model.Role;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
public interface LinkAuthorizationManager extends EntityManager<LinkAuthorization> {
void syncAuthorizations(Role role, Collection<LinkSpec> authorizedLinks);
void create(LinkAuthorization authorization);
}

View File

@ -16,5 +16,7 @@ public interface LinkSpecManager extends EntityManager<LinkSpec> {
void updateOrders(List<LinkSpec> links);
void save(LinkSpec spec, @Nullable String oldName, @Nullable String oldOppositeName);
void update(LinkSpec spec, @Nullable String oldName, @Nullable String oldOppositeName);
void create(LinkSpec link);
}

View File

@ -1,18 +1,20 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import java.util.List;
import io.onedev.server.model.Membership;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
import java.util.List;
public interface MembershipManager extends EntityManager<Membership> {
void delete(Collection<Membership> memberships);
void syncMemberships(User user, Collection<String> groupNames);
List<User> queryMembers(User user);
void create(Membership membership);
List<User> queryMembers(User user);
}

View File

@ -17,4 +17,6 @@ public interface MilestoneManager extends EntityManager<Milestone> {
@Nullable
Milestone findNextOpen(Project project);
void createOrUpdate(Milestone milestone);
}

View File

@ -18,5 +18,6 @@ public interface PendingSuggestionApplyManager extends EntityManager<PendingSugg
void discard(@Nullable User user, PullRequest request);
List<PendingSuggestionApply> query(User user, PullRequest request);
void create(PendingSuggestionApply pendingApply);
}

View File

@ -5,4 +5,6 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface ProjectDynamicsManager extends EntityManager<ProjectDynamics> {
void create(ProjectDynamics dynamics);
}

View File

@ -47,6 +47,8 @@ public interface ProjectManager extends EntityManager<Project> {
void create(Project project);
void update(Project project);
void onDeleteBranch(Project project, String branchName);
void clone(Project project, String repositoryUrl);

View File

@ -4,5 +4,6 @@ import io.onedev.server.model.PullRequestAssignment;
import io.onedev.server.persistence.dao.EntityManager;
public interface PullRequestAssignmentManager extends EntityManager<PullRequestAssignment> {
void create(PullRequestAssignment assignment);
}

View File

@ -1,12 +1,14 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.PullRequestComment;
import io.onedev.server.persistence.dao.EntityManager;
import java.util.Collection;
public interface PullRequestCommentManager extends EntityManager<PullRequestComment> {
void save(PullRequestComment comment, Collection<String> notifiedEmailAddresses);
void createOrUpdate(PullRequestComment comment);
void createOrUpdate(PullRequestComment comment, Collection<String> notifiedEmailAddresses);
}

View File

@ -1,10 +1,12 @@
package io.onedev.server.entitymanager;
import io.onedev.server.model.*;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.PullRequestMention;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
public interface PullRequestMentionManager extends EntityManager<PullRequestMention> {
void mention(PullRequest request, User user);
}

View File

@ -8,5 +8,7 @@ import io.onedev.server.persistence.dao.EntityManager;
public interface PullRequestQueryPersonalizationManager extends EntityManager<PullRequestQueryPersonalization> {
PullRequestQueryPersonalization find(Project project, User user);
void createOrUpdate(PullRequestQueryPersonalization personalization);
}

View File

@ -13,5 +13,6 @@ public interface PullRequestReviewManager extends EntityManager<PullRequestRevie
void review(PullRequest request, boolean approved, @Nullable String note);
void populateReviews(Collection<PullRequest> requests);
void createOrUpdate(PullRequestReview review);
}

View File

@ -11,5 +11,7 @@ public interface PullRequestUpdateManager extends EntityManager<PullRequestUpdat
void checkUpdate(PullRequest request);
List<PullRequestUpdate> queryAfter(Long projectId, Long afterUpdateId, int count);
void create(PullRequestUpdate update);
}

View File

@ -13,4 +13,6 @@ public interface PullRequestWatchManager extends EntityManager<PullRequestWatch>
PullRequestWatch find(PullRequest request, User user);
void watch(PullRequest request, User user, boolean watching);
void createOrUpdate(PullRequestWatch watch);
}

View File

@ -14,4 +14,7 @@ public interface SshKeyManager extends EntityManager<SshKey> {
SshKey findByDigest(String digest);
void syncSshKeys(User user, Collection<String> sshKeys);
void create(SshKey sshKey);
}

View File

@ -12,5 +12,6 @@ public interface UserAuthorizationManager extends EntityManager<UserAuthorizatio
void syncAuthorizations(User user, Collection<UserAuthorization> authorizations);
void syncAuthorizations(Project project, Collection<UserAuthorization> authorizations);
void createOrUpdate(UserAuthorization authorization);
}

View File

@ -20,5 +20,6 @@ public interface UserInvitationManager extends EntityManager<UserInvitation> {
int count(@Nullable String term);
List<UserInvitation> query(@Nullable String term, int firstResult, int maxResults);
void create(UserInvitation invitation);
}

View File

@ -1,48 +1,47 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
import javax.inject.Inject;
import io.onedev.server.entitymanager.LabelManager;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.LabelSpec;
import io.onedev.server.model.support.EntityLabel;
import io.onedev.server.model.support.LabelSupport;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
public abstract class BaseEntityLabelManager<T extends EntityLabel> extends BaseEntityManager<T> {
private final LabelManager labelManager;
@Inject
public BaseEntityLabelManager(Dao dao, LabelManager labelManager) {
super(dao);
this.labelManager = labelManager;
}
@Transactional
public void sync(LabelSupport<T> entity, Collection<String> labelNames) {
var labelsToRemove = new HashSet<>();
entity.getLabels().stream()
.filter(it->!labelNames.contains(it.getSpec().getName()))
.forEach(it-> {delete(it); labelsToRemove.add(it);});
entity.getLabels().removeAll(labelsToRemove);
Collection<String> existingLabelNames = entity.getLabels().stream()
.map(it->it.getSpec().getName())
.collect(Collectors.toSet());
labelNames.stream().filter(it->!existingLabelNames.contains(it)).forEach(it-> {
var label = newEntityLabel((AbstractEntity) entity, labelManager.find(it));
save(label);
entity.getLabels().add(label);
});
}
protected abstract T newEntityLabel(AbstractEntity entity, LabelSpec spec);
package io.onedev.server.entitymanager.impl;
import io.onedev.server.entitymanager.LabelManager;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.LabelSpec;
import io.onedev.server.model.support.EntityLabel;
import io.onedev.server.model.support.LabelSupport;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import javax.inject.Inject;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
public abstract class BaseEntityLabelManager<T extends EntityLabel> extends BaseEntityManager<T> {
private final LabelManager labelManager;
@Inject
public BaseEntityLabelManager(Dao dao, LabelManager labelManager) {
super(dao);
this.labelManager = labelManager;
}
@Transactional
public void sync(LabelSupport<T> entity, Collection<String> labelNames) {
var labelsToRemove = new HashSet<>();
entity.getLabels().stream()
.filter(it->!labelNames.contains(it.getSpec().getName()))
.forEach(it-> {delete(it); labelsToRemove.add(it);});
entity.getLabels().removeAll(labelsToRemove);
Collection<String> existingLabelNames = entity.getLabels().stream()
.map(it->it.getSpec().getName())
.collect(Collectors.toSet());
labelNames.stream().filter(it->!existingLabelNames.contains(it)).forEach(it-> {
var label = newEntityLabel((AbstractEntity) entity, labelManager.find(it));
dao.persist(label);
entity.getLabels().add(label);
});
}
protected abstract T newEntityLabel(AbstractEntity entity, LabelSpec spec);
}

View File

@ -59,8 +59,8 @@ public class DefaultAgentAttributeManager extends BaseEntityManager<AgentAttribu
@Transactional
@Override
public void save(AgentAttribute attribute) {
super.save(attribute);
public void create(AgentAttribute attribute) {
dao.persist(attribute);
transactionManager.runAfterCommit(new Runnable() {
@ -101,7 +101,7 @@ public class DefaultAgentAttributeManager extends BaseEntityManager<AgentAttribu
attribute.setAgent(agent);
attribute.setName(entry.getKey());
attribute.setValue(entry.getValue());
save(attribute);
create(attribute);
agent.getAttributes().add(attribute);
}
}

View File

@ -192,14 +192,14 @@ public class DefaultAgentManager extends BaseEntityManager<Agent> implements Age
agent.setCpus(data.getCpus());
agent.setTemporal(data.isTemporal());
agent.setIpAddress(data.getIpAddress());
save(agent);
createOrUpdate(agent);
for (Map.Entry<String, String> entry: data.getAttributes().entrySet()) {
AgentAttribute attribute = new AgentAttribute();
attribute.setAgent(agent);
attribute.setName(entry.getKey());
attribute.setValue(entry.getValue());
attributeManager.save(attribute);
attributeManager.create(attribute);
agent.getAttributes().add(attribute);
}
} else if (agentSessions.containsKey(agent.getId())) {
@ -211,7 +211,7 @@ public class DefaultAgentManager extends BaseEntityManager<Agent> implements Age
agent.setIpAddress(data.getIpAddress());
agent.setCpus(data.getCpus());
agent.setTemporal(data.isTemporal());
save(agent);
createOrUpdate(agent);
attributeManager.syncAttributes(agent, data.getAttributes());
}
@ -245,21 +245,6 @@ public class DefaultAgentManager extends BaseEntityManager<Agent> implements Age
}
}
@Override
public void save(Agent agent) {
super.save(agent);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
osNames.put(agent.getOsName(), agent.getOsName());
osArchs.put(agent.getOsArch(), agent.getOsArch());
}
});
}
private void removeReferences(Agent agent) {
Query<?> query = getSession().createQuery("update Build set agent=null where agent=:agent");
query.setParameter("agent", agent);
@ -401,18 +386,33 @@ public class DefaultAgentManager extends BaseEntityManager<Agent> implements Age
dao.remove(agent.getToken());
}
@Transactional
@Override
public void createOrUpdate(Agent agent) {
dao.persist(agent);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
osNames.put(agent.getOsName(), agent.getOsName());
osArchs.put(agent.getOsArch(), agent.getOsArch());
}
});
}
@Transactional
@Override
public void pause(Agent agent) {
agent.setPaused(true);
save(agent);
createOrUpdate(agent);
}
@Transactional
@Override
public void resume(Agent agent) {
agent.setPaused(false);
save(agent);
createOrUpdate(agent);
}
@Override

View File

@ -23,6 +23,11 @@ public class DefaultAgentTokenManager extends BaseEntityManager<AgentToken> impl
super(dao);
}
@Override
public void create(AgentToken token) {
dao.persist(token);
}
@Override
public AgentToken find(String value) {
EntityCriteria<AgentToken> criteria = newCriteria();

View File

@ -5,6 +5,7 @@ import javax.inject.Singleton;
import io.onedev.server.entitymanager.BuildDependenceManager;
import io.onedev.server.model.BuildDependence;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@ -16,4 +17,10 @@ public class DefaultBuildDependenceManager extends BaseEntityManager<BuildDepend
super(dao);
}
@Transactional
@Override
public void create(BuildDependence dependence) {
dao.persist(dependence);
}
}

View File

@ -184,9 +184,12 @@ public class DefaultBuildManager extends BaseEntityManager<Build> implements Bui
@Transactional
@Override
public void save(Build build) {
super.save(build);
public void update(Build build) {
dao.persist(build);
updateCacheAfterCommit(build);
}
private void updateCacheAfterCommit(Build build) {
BuildFacade facade = build.getFacade();
String jobName = build.getJobName();
transactionManager.runAfterCommit(new Runnable() {
@ -196,7 +199,7 @@ public class DefaultBuildManager extends BaseEntityManager<Build> implements Bui
cache.put(facade.getId(), facade);
populateJobNames(facade.getProjectId(), jobName);
}
});
}
@ -429,11 +432,14 @@ public class DefaultBuildManager extends BaseEntityManager<Build> implements Bui
Preconditions.checkArgument(build.isNew());
build.setNumberScope(build.getProject().getForkRoot());
build.setNumber(numberGenerator.getNextSequence(build.getNumberScope()));
save(build);
dao.persist(build);
updateCacheAfterCommit(build);
for (BuildParam param: build.getParams())
buildParamManager.save(param);
buildParamManager.create(param);
for (BuildDependence dependence: build.getDependencies())
buildDependenceManager.save(dependence);
buildDependenceManager.create(dependence);
}
private Collection<Predicate> getPredicates(@Nullable Project project, From<Build, Build> root, CriteriaBuilder builder) {

View File

@ -1,19 +1,5 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.query.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.entitymanager.BuildParamManager;
import io.onedev.server.event.Listen;
@ -27,6 +13,14 @@ import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import org.hibernate.query.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.*;
@Singleton
public class DefaultBuildParamManager extends BaseEntityManager<BuildParam> implements BuildParamManager {
@ -78,8 +72,8 @@ public class DefaultBuildParamManager extends BaseEntityManager<BuildParam> impl
@Transactional
@Override
public void save(BuildParam param) {
super.save(param);
public void create(BuildParam param) {
dao.persist(param);
Long projectId = param.getBuild().getProject().getId();
String paramName = param.getName();
@ -111,7 +105,7 @@ public class DefaultBuildParamManager extends BaseEntityManager<BuildParam> impl
}
return paramNames;
}
@Transactional
@Listen
public void on(EntityRemoved event) {

View File

@ -40,7 +40,7 @@ public class DefaultBuildQueryPersonalizationManager extends BaseEntityManager<B
@Transactional
@Override
public void save(BuildQueryPersonalization personalization) {
public void createOrUpdate(BuildQueryPersonalization personalization) {
Collection<String> retainNames = new HashSet<>();
retainNames.addAll(personalization.getQueries().stream()
.map(it->NamedQuery.PERSONAL_NAME_PREFIX+it.getName()).collect(Collectors.toSet()));
@ -52,7 +52,7 @@ public class DefaultBuildQueryPersonalizationManager extends BaseEntityManager<B
if (!personalization.isNew())
delete(personalization);
} else {
super.save(personalization);
dao.persist(personalization);
}
}

View File

@ -89,7 +89,7 @@ public class DefaultCodeCommentManager extends BaseEntityManager<CodeComment> im
@Transactional
@Override
public void save(CodeComment comment) {
public void createOrUpdate(CodeComment comment) {
if (comment.isNew()) {
LastActivity lastActivity = new LastActivity();
lastActivity.setUser(comment.getUser());

View File

@ -1,8 +1,9 @@
package io.onedev.server.entitymanager.impl;
import io.onedev.server.entitymanager.CodeCommentMentionManager;
import io.onedev.server.entitymanager.IssueMentionManager;
import io.onedev.server.model.*;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.CodeCommentMention;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@ -24,8 +25,8 @@ public class DefaultCodeCommentMentionManager extends BaseEntityManager<CodeComm
CodeCommentMention mention = new CodeCommentMention();
mention.setComment(comment);
mention.setUser(user);
save(mention);
dao.persist(mention);
}
}
}

View File

@ -35,12 +35,12 @@ public class DefaultCodeCommentQueryPersonalizationManager extends BaseEntityMan
@Transactional
@Override
public void save(CodeCommentQueryPersonalization setting) {
public void createOrUpdate(CodeCommentQueryPersonalization setting) {
if (setting.getQueries().isEmpty()) {
if (!setting.isNew())
delete(setting);
} else {
super.save(setting);
dao.persist(setting);
}
}

View File

@ -28,7 +28,7 @@ public class DefaultCodeCommentReplyManager extends BaseEntityManager<CodeCommen
@Transactional
@Override
public void save(CodeCommentReply reply) {
public void createOrUpdate(CodeCommentReply reply) {
if (reply.isNew()) {
dao.persist(reply);

View File

@ -1,14 +1,5 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.CommitQueryPersonalizationManager;
import io.onedev.server.model.CommitQueryPersonalization;
import io.onedev.server.model.Project;
@ -19,6 +10,13 @@ import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.persistence.dao.EntityCriteria;
import org.hibernate.criterion.Restrictions;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
@Singleton
public class DefaultCommitQueryPersonalizationManager extends BaseEntityManager<CommitQueryPersonalization>
@ -40,7 +38,7 @@ public class DefaultCommitQueryPersonalizationManager extends BaseEntityManager<
@Transactional
@Override
public void save(CommitQueryPersonalization personalization) {
public void createOrUpdate(CommitQueryPersonalization personalization) {
Collection<String> retainNames = new HashSet<>();
retainNames.addAll(personalization.getQueries().stream()
.map(it->NamedQuery.PERSONAL_NAME_PREFIX+it.getName()).collect(Collectors.toSet()));
@ -52,7 +50,7 @@ public class DefaultCommitQueryPersonalizationManager extends BaseEntityManager<
if (!personalization.isNew())
delete(personalization);
} else {
super.save(personalization);
dao.persist(personalization);
}
}

View File

@ -60,9 +60,9 @@ public class DefaultDashboardGroupShareManager extends BaseEntityManager<Dashboa
MapDifference<String, DashboardGroupShare> diff = Maps.difference(currentMap, syncMap);
diff.entriesOnlyOnLeft().values().forEach(share -> delete(share));
diff.entriesOnlyOnRight().values().forEach(share -> save(share));
diff.entriesOnlyOnRight().values().forEach(share -> dao.persist(share));
}
@Override
public List<DashboardGroupShare> query() {
return query(true);

View File

@ -70,7 +70,7 @@ public class DefaultDashboardUserShareManager extends BaseEntityManager<Dashboar
MapDifference<String, DashboardUserShare> diff = Maps.difference(currentMap, syncMap);
diff.entriesOnlyOnLeft().values().forEach(share -> delete(share));
diff.entriesOnlyOnRight().values().forEach(share -> save(share));
diff.entriesOnlyOnRight().values().forEach(share -> dao.persist(share));
}
}

View File

@ -137,7 +137,7 @@ public class DefaultEmailAddressManager extends BaseEntityManager<EmailAddress>
@Transactional
@Override
public void save(EmailAddress emailAddress) {
public void createOrUpdate(EmailAddress emailAddress) {
boolean isNew = emailAddress.isNew();
emailAddress.setValue(emailAddress.getValue().toLowerCase());

View File

@ -3,6 +3,7 @@ package io.onedev.server.entitymanager.impl;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.persistence.annotation.Transactional;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.GitLfsLockManager;
@ -27,4 +28,10 @@ public class DefaultGitLfsLockManager extends BaseEntityManager<GitLfsLock> impl
return find(criteria);
}
@Transactional
@Override
public void create(GitLfsLock lock) {
dao.persist(lock);
}
}

View File

@ -154,5 +154,11 @@ public class DefaultGpgKeyManager extends BaseEntityManager<GpgKey> implements G
return null;
}
}
@Transactional
@Override
public void create(GpgKey gpgKey) {
dao.persist(gpgKey);
}
}

View File

@ -33,7 +33,7 @@ public class DefaultGroupAuthorizationManager extends BaseEntityManager<GroupAut
if (newAuthorization.getProject().equals(authorization.getProject())) {
found = true;
authorization.setRole(newAuthorization.getRole());
save(authorization);
dao.persist(authorization);
}
}
if (!found) {
@ -52,11 +52,17 @@ public class DefaultGroupAuthorizationManager extends BaseEntityManager<GroupAut
}
if (!found) {
group.getAuthorizations().add(newAuthorization);
save(newAuthorization);
dao.persist(newAuthorization);
}
}
}
@Transactional
@Override
public void createOrUpdate(GroupAuthorization authorization) {
dao.persist(authorization);
}
@Override
public List<GroupAuthorization> query() {
return query(true);

View File

@ -47,8 +47,14 @@ public class DefaultIssueAuthorizationManager extends BaseEntityManager<IssueAut
authorization.setIssue(issue);
authorization.setUser(user);
issue.getAuthorizations().add(authorization);
save(authorization);
createOrUpdate(authorization);
}
}
@Transactional
@Override
public void createOrUpdate(IssueAuthorization authorization) {
dao.persist(authorization);
}
}

View File

@ -174,7 +174,7 @@ public class DefaultIssueChangeManager extends BaseEntityManager<IssueChange>
@Transactional
@Override
public void addSchedule(Issue issue, Milestone milestone) {
issueScheduleManager.save(issue.addSchedule(milestone));
issueScheduleManager.create(issue.addSchedule(milestone));
IssueChange change = new IssueChange();
change.setIssue(issue);

View File

@ -47,12 +47,18 @@ public class DefaultIssueFieldManager extends BaseEntityManager<IssueField> impl
query.executeUpdate();
}
for (IssueField entity: issue.getFields()) {
if (entity.isNew())
save(entity);
for (IssueField field: issue.getFields()) {
if (field.isNew())
create(field);
}
}
@Transactional
@Override
public void create(IssueField field) {
dao.persist(field);
}
@Transactional
@Override
public void onRenameGroup(String oldName, String newName) {

View File

@ -1,166 +1,172 @@
package io.onedev.server.entitymanager.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Hibernate;
import org.hibernate.query.Query;
import io.onedev.server.entitymanager.IssueFieldManager;
import io.onedev.server.entitymanager.IssueLinkManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueLink;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@Singleton
public class DefaultIssueLinkManager extends BaseEntityManager<IssueLink> implements IssueLinkManager {
private final IssueFieldManager fieldManager;
@Inject
public DefaultIssueLinkManager(Dao dao, IssueFieldManager fieldManager) {
super(dao);
this.fieldManager = fieldManager;
}
@Transactional
@Override
public void syncLinks(LinkSpec spec, Issue issue, Collection<Issue> linkedIssues, boolean opposite) {
if (spec.getOpposite() != null) {
Collection<IssueLink> links = opposite?issue.getSourceLinks():issue.getTargetLinks();
for (IssueLink link: links) {
if (link.getSpec().equals(spec) && !linkedIssues.contains(link.getLinked(issue)))
delete(link);
}
for (Issue linkedIssue: linkedIssues) {
boolean found = false;
for (IssueLink link: links) {
if (link.getSpec().equals(spec) && link.getLinked(issue).equals(linkedIssue)) {
found = true;
break;
}
}
if (!found) {
IssueLink link = new IssueLink();
link.setSpec(spec);
if (opposite) {
link.setSource(linkedIssue);
link.setTarget(issue);
} else {
link.setSource(issue);
link.setTarget(linkedIssue);
}
save(link);
}
}
} else {
for (IssueLink link: issue.getLinks()) {
if (link.getSpec().equals(spec) && !linkedIssues.contains(link.getLinked(issue)))
delete(link);
}
for (Issue linkedIssue: linkedIssues) {
boolean found = false;
for (IssueLink link: issue.getLinks()) {
if (link.getSpec().equals(spec) && link.getLinked(issue).equals(linkedIssue)) {
found = true;
break;
}
}
if (!found) {
IssueLink link = new IssueLink();
link.setSpec(spec);
link.setSource(issue);
link.setTarget(linkedIssue);
save(link);
}
}
}
}
@Sessional
@Override
public void populateLinks(Collection<Issue> issues) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<IssueLink> linkQuery = builder.createQuery(IssueLink.class);
Root<IssueLink> linkRoot = linkQuery.from(IssueLink.class);
linkQuery.select(linkRoot);
linkQuery.where(builder.or(
linkRoot.get(IssueLink.PROP_SOURCE).in(issues),
linkRoot.get(IssueLink.PROP_TARGET).in(issues)));
for (Issue issue: issues) {
issue.setSourceLinks(new ArrayList<>());
issue.setTargetLinks(new ArrayList<>());
}
for (IssueLink link: getSession().createQuery(linkQuery).getResultList()) {
issues.stream().filter(it->it.equals(link.getSource())).forEach(it->it.getTargetLinks().add(link));
issues.stream().filter(it->it.equals(link.getTarget())).forEach(it->it.getSourceLinks().add(link));
}
}
@Sessional
@Override
public void loadDeepLinks(Issue issue) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
Root<IssueLink> root = criteriaQuery.from(IssueLink.class);
criteriaQuery.multiselect(root, root.get(IssueLink.PROP_SOURCE), root.get(IssueLink.PROP_TARGET));
criteriaQuery.where(builder.or(
builder.equal(root.get(IssueLink.PROP_SOURCE), issue),
builder.equal(root.get(IssueLink.PROP_TARGET), issue)));
Query<Object[]> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(0);
query.setMaxResults(Integer.MAX_VALUE);
List<IssueLink> sourceLinks = new ArrayList<>();
List<IssueLink> targetLinks = new ArrayList<>();
List<Object[]> results = query.getResultList();
if (!results.isEmpty()) {
Map<Long, Issue> issues = new HashMap<>();
for (Object[] row: results) {
IssueLink link = (IssueLink) row[0];
Issue source = (Issue) row[1];
Issue target = (Issue) row[2];
if (!source.equals(issue))
sourceLinks.add(link);
issues.put(source.getId(), source);
if (!target.equals(issue))
targetLinks.add(link);
issues.put(target.getId(), target);
}
if (Hibernate.isInitialized(issue.getFields())) {
issues.remove(issue.getId());
fieldManager.populateFields(issues.values());
populateLinks(issues.values());
} else {
fieldManager.populateFields(issues.values());
issues.remove(issue.getId());
populateLinks(issues.values());
}
}
issue.setSourceLinks(sourceLinks);
issue.setTargetLinks(targetLinks);
}
}
package io.onedev.server.entitymanager.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Hibernate;
import org.hibernate.query.Query;
import io.onedev.server.entitymanager.IssueFieldManager;
import io.onedev.server.entitymanager.IssueLinkManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueLink;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@Singleton
public class DefaultIssueLinkManager extends BaseEntityManager<IssueLink> implements IssueLinkManager {
private final IssueFieldManager fieldManager;
@Inject
public DefaultIssueLinkManager(Dao dao, IssueFieldManager fieldManager) {
super(dao);
this.fieldManager = fieldManager;
}
@Transactional
@Override
public void syncLinks(LinkSpec spec, Issue issue, Collection<Issue> linkedIssues, boolean opposite) {
if (spec.getOpposite() != null) {
Collection<IssueLink> links = opposite?issue.getSourceLinks():issue.getTargetLinks();
for (IssueLink link: links) {
if (link.getSpec().equals(spec) && !linkedIssues.contains(link.getLinked(issue)))
delete(link);
}
for (Issue linkedIssue: linkedIssues) {
boolean found = false;
for (IssueLink link: links) {
if (link.getSpec().equals(spec) && link.getLinked(issue).equals(linkedIssue)) {
found = true;
break;
}
}
if (!found) {
IssueLink link = new IssueLink();
link.setSpec(spec);
if (opposite) {
link.setSource(linkedIssue);
link.setTarget(issue);
} else {
link.setSource(issue);
link.setTarget(linkedIssue);
}
create(link);
}
}
} else {
for (IssueLink link: issue.getLinks()) {
if (link.getSpec().equals(spec) && !linkedIssues.contains(link.getLinked(issue)))
delete(link);
}
for (Issue linkedIssue: linkedIssues) {
boolean found = false;
for (IssueLink link: issue.getLinks()) {
if (link.getSpec().equals(spec) && link.getLinked(issue).equals(linkedIssue)) {
found = true;
break;
}
}
if (!found) {
IssueLink link = new IssueLink();
link.setSpec(spec);
link.setSource(issue);
link.setTarget(linkedIssue);
create(link);
}
}
}
}
@Transactional
@Override
public void create(IssueLink link) {
dao.persist(link);
}
@Sessional
@Override
public void populateLinks(Collection<Issue> issues) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<IssueLink> linkQuery = builder.createQuery(IssueLink.class);
Root<IssueLink> linkRoot = linkQuery.from(IssueLink.class);
linkQuery.select(linkRoot);
linkQuery.where(builder.or(
linkRoot.get(IssueLink.PROP_SOURCE).in(issues),
linkRoot.get(IssueLink.PROP_TARGET).in(issues)));
for (Issue issue: issues) {
issue.setSourceLinks(new ArrayList<>());
issue.setTargetLinks(new ArrayList<>());
}
for (IssueLink link: getSession().createQuery(linkQuery).getResultList()) {
issues.stream().filter(it->it.equals(link.getSource())).forEach(it->it.getTargetLinks().add(link));
issues.stream().filter(it->it.equals(link.getTarget())).forEach(it->it.getSourceLinks().add(link));
}
}
@Sessional
@Override
public void loadDeepLinks(Issue issue) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
Root<IssueLink> root = criteriaQuery.from(IssueLink.class);
criteriaQuery.multiselect(root, root.get(IssueLink.PROP_SOURCE), root.get(IssueLink.PROP_TARGET));
criteriaQuery.where(builder.or(
builder.equal(root.get(IssueLink.PROP_SOURCE), issue),
builder.equal(root.get(IssueLink.PROP_TARGET), issue)));
Query<Object[]> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(0);
query.setMaxResults(Integer.MAX_VALUE);
List<IssueLink> sourceLinks = new ArrayList<>();
List<IssueLink> targetLinks = new ArrayList<>();
List<Object[]> results = query.getResultList();
if (!results.isEmpty()) {
Map<Long, Issue> issues = new HashMap<>();
for (Object[] row: results) {
IssueLink link = (IssueLink) row[0];
Issue source = (Issue) row[1];
Issue target = (Issue) row[2];
if (!source.equals(issue))
sourceLinks.add(link);
issues.put(source.getId(), source);
if (!target.equals(issue))
targetLinks.add(link);
issues.put(target.getId(), target);
}
if (Hibernate.isInitialized(issue.getFields())) {
issues.remove(issue.getId());
fieldManager.populateFields(issues.values());
populateLinks(issues.values());
} else {
fieldManager.populateFields(issues.values());
issues.remove(issue.getId());
populateLinks(issues.values());
}
}
issue.setSourceLinks(sourceLinks);
issue.setTargetLinks(targetLinks);
}
}

View File

@ -214,7 +214,7 @@ public class DefaultIssueManager extends BaseEntityManager<Issue> implements Iss
authorization.setIssue(issue);
authorization.setUser(issue.getSubmitter());
issue.getAuthorizations().add(authorization);
authorizationManager.save(authorization);
authorizationManager.createOrUpdate(authorization);
updateCacheAfterCommit(Lists.newArrayList(issue));
listenerRegistry.post(new IssueOpened(issue));

View File

@ -25,8 +25,8 @@ public class DefaultIssueMentionManager extends BaseEntityManager<IssueMention>
IssueMention mention = new IssueMention();
mention.setIssue(issue);
mention.setUser(user);
save(mention);
dao.persist(mention);
}
}
}

View File

@ -1,14 +1,5 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.IssueQueryPersonalizationManager;
import io.onedev.server.model.IssueQueryPersonalization;
import io.onedev.server.model.Project;
@ -19,6 +10,13 @@ import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.persistence.dao.EntityCriteria;
import org.hibernate.criterion.Restrictions;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
@Singleton
public class DefaultIssueQueryPersonalizationManager extends BaseEntityManager<IssueQueryPersonalization>
@ -40,7 +38,7 @@ public class DefaultIssueQueryPersonalizationManager extends BaseEntityManager<I
@Transactional
@Override
public void save(IssueQueryPersonalization personalization) {
public void createOrUpdate(IssueQueryPersonalization personalization) {
Collection<String> retainNames = new HashSet<>();
retainNames.addAll(personalization.getQueries().stream()
.map(it->NamedQuery.PERSONAL_NAME_PREFIX+it.getName()).collect(Collectors.toSet()));
@ -52,7 +50,7 @@ public class DefaultIssueQueryPersonalizationManager extends BaseEntityManager<I
if (!personalization.isNew())
delete(personalization);
} else {
super.save(personalization);
dao.persist(personalization);
}
}

View File

@ -43,5 +43,11 @@ public class DefaultIssueScheduleManager extends BaseEntityManager<IssueSchedule
}
}
}
@Transactional
@Override
public void create(IssueSchedule schedule) {
dao.persist(schedule);
}
}

View File

@ -19,10 +19,10 @@ public class DefaultIssueVoteManager extends BaseEntityManager<IssueVote>
}
@Transactional
public void save(IssueVote vote) {
if (vote.isNew())
vote.getIssue().setVoteCount(vote.getIssue().getVoteCount()+1);
super.save(vote);
@Override
public void create(IssueVote vote) {
vote.getIssue().setVoteCount(vote.getIssue().getVoteCount()+1);
dao.persist(vote);
}
@Transactional

View File

@ -3,6 +3,7 @@ package io.onedev.server.entitymanager.impl;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.persistence.annotation.Transactional;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.IssueWatchManager;
@ -35,8 +36,14 @@ public class DefaultIssueWatchManager extends BaseEntityManager<IssueWatch>
IssueWatch watch = (IssueWatch) issue.getWatch(user, true);
if (watch.isNew()) {
watch.setWatching(watching);
save(watch);
createOrUpdate(watch);
}
}
@Transactional
@Override
public void createOrUpdate(IssueWatch watch) {
dao.persist(watch);
}
}

View File

@ -1,71 +1,70 @@
package io.onedev.server.entitymanager.impl;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.LabelManager;
import io.onedev.server.model.LabelSpec;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.persistence.dao.EntityCriteria;
@Singleton
public class DefaultLabelManager extends BaseEntityManager<LabelSpec> implements LabelManager {
@Inject
public DefaultLabelManager(Dao dao) {
super(dao);
}
@Override
public LabelSpec find(String name) {
EntityCriteria<LabelSpec> criteria = EntityCriteria.of(LabelSpec.class);
criteria.add(Restrictions.eq(LabelSpec.PROP_NAME, name));
return find(criteria);
}
private EntityCriteria<LabelSpec> getCriteria(@Nullable String term) {
EntityCriteria<LabelSpec> criteria = EntityCriteria.of(LabelSpec.class);
if (term != null)
criteria.add(Restrictions.ilike(LabelSpec.PROP_NAME, term, MatchMode.ANYWHERE));
else
criteria.setCacheable(true);
return criteria;
}
@Sessional
@Override
public List<LabelSpec> query(String term, int firstResult, int maxResults) {
EntityCriteria<LabelSpec> criteria = getCriteria(term);
criteria.addOrder(Order.asc(LabelSpec.PROP_NAME));
return query(criteria, firstResult, maxResults);
}
@Sessional
@Override
public int count(String term) {
return count(getCriteria(term));
}
@Transactional
@Override
public void sync(List<LabelSpec> labels) {
for (var label: labels) {
save(label);
}
for (var existingLabel: query()) {
if (!labels.contains(existingLabel))
delete(existingLabel);
}
}
package io.onedev.server.entitymanager.impl;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.LabelManager;
import io.onedev.server.model.LabelSpec;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.persistence.dao.EntityCriteria;
@Singleton
public class DefaultLabelManager extends BaseEntityManager<LabelSpec> implements LabelManager {
@Inject
public DefaultLabelManager(Dao dao) {
super(dao);
}
@Override
public LabelSpec find(String name) {
EntityCriteria<LabelSpec> criteria = EntityCriteria.of(LabelSpec.class);
criteria.add(Restrictions.eq(LabelSpec.PROP_NAME, name));
return find(criteria);
}
private EntityCriteria<LabelSpec> getCriteria(@Nullable String term) {
EntityCriteria<LabelSpec> criteria = EntityCriteria.of(LabelSpec.class);
if (term != null)
criteria.add(Restrictions.ilike(LabelSpec.PROP_NAME, term, MatchMode.ANYWHERE));
else
criteria.setCacheable(true);
return criteria;
}
@Sessional
@Override
public List<LabelSpec> query(String term, int firstResult, int maxResults) {
EntityCriteria<LabelSpec> criteria = getCriteria(term);
criteria.addOrder(Order.asc(LabelSpec.PROP_NAME));
return query(criteria, firstResult, maxResults);
}
@Sessional
@Override
public int count(String term) {
return count(getCriteria(term));
}
@Transactional
@Override
public void sync(List<LabelSpec> labels) {
for (var label: labels)
dao.persist(label);
for (var existingLabel: query()) {
if (!labels.contains(existingLabel))
delete(existingLabel);
}
}
}

View File

@ -1,49 +1,55 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.entitymanager.LinkAuthorizationManager;
import io.onedev.server.model.LinkAuthorization;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.model.Role;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@Singleton
public class DefaultLinkAuthorizationManager extends BaseEntityManager<LinkAuthorization> implements LinkAuthorizationManager {
@Inject
public DefaultLinkAuthorizationManager(Dao dao) {
super(dao);
}
@Transactional
@Override
public void syncAuthorizations(Role role, Collection<LinkSpec> authorizedLinks) {
for (LinkAuthorization authorization: role.getLinkAuthorizations()) {
if (!authorizedLinks.contains(authorization.getLink()))
delete(authorization);
}
for (LinkSpec link: authorizedLinks) {
boolean found = false;
for (LinkAuthorization authorization: role.getLinkAuthorizations()) {
if (authorization.getLink().equals(link)) {
found = true;
break;
}
}
if (!found) {
LinkAuthorization authorization = new LinkAuthorization();
authorization.setLink(link);
authorization.setRole(role);
save(authorization);
}
}
}
}
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.entitymanager.LinkAuthorizationManager;
import io.onedev.server.model.LinkAuthorization;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.model.Role;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@Singleton
public class DefaultLinkAuthorizationManager extends BaseEntityManager<LinkAuthorization> implements LinkAuthorizationManager {
@Inject
public DefaultLinkAuthorizationManager(Dao dao) {
super(dao);
}
@Transactional
@Override
public void syncAuthorizations(Role role, Collection<LinkSpec> authorizedLinks) {
for (LinkAuthorization authorization: role.getLinkAuthorizations()) {
if (!authorizedLinks.contains(authorization.getLink()))
delete(authorization);
}
for (LinkSpec link: authorizedLinks) {
boolean found = false;
for (LinkAuthorization authorization: role.getLinkAuthorizations()) {
if (authorization.getLink().equals(link)) {
found = true;
break;
}
}
if (!found) {
LinkAuthorization authorization = new LinkAuthorization();
authorization.setLink(link);
authorization.setRole(role);
create(authorization);
}
}
}
@Transactional
@Override
public void create(LinkAuthorization authorization) {
dao.persist(authorization);
}
}

View File

@ -1,173 +1,179 @@
package io.onedev.server.entitymanager.impl;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.entitymanager.LinkSpecManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.event.Listen;
import io.onedev.server.event.system.SystemStarted;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.persistence.TransactionManager;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.search.entity.issue.IssueQueryUpdater;
import io.onedev.server.util.facade.LinkSpecFacade;
import io.onedev.server.util.usage.Usage;
@Singleton
public class DefaultLinkSpecManager extends BaseEntityManager<LinkSpec> implements LinkSpecManager {
private final SettingManager settingManager;
private final TransactionManager transactionManager;
private final ClusterManager clusterManager;
private volatile Map<String, Long> ids;
private volatile Map<Long, LinkSpecFacade> cache;
@Inject
public DefaultLinkSpecManager(Dao dao, SettingManager settingManager, TransactionManager transactionManager,
ClusterManager clusterManager) {
super(dao);
this.settingManager = settingManager;
this.transactionManager = transactionManager;
this.clusterManager = clusterManager;
}
@Sessional
@Listen
public void on(SystemStarted event) {
ids = clusterManager.getHazelcastInstance().getReplicatedMap("linkSpecIds");
cache = clusterManager.getHazelcastInstance().getReplicatedMap("linkSpecCache");
for (LinkSpec link: query(true)) {
ids.put(link.getName(), link.getId());
String oppositeName = link.getOpposite()!=null?link.getOpposite().getName():null;
if (oppositeName != null)
ids.put(oppositeName, link.getId());
cache.put(link.getId(), link.getFacade());
}
}
@Sessional
@Override
public LinkSpec find(String name) {
Long linkId = ids.get(name);
if (linkId != null) {
LinkSpecFacade facade = cache.get(linkId);
if (facade != null && (name.equals(facade.getName()) || name.equals(facade.getOppositeName())))
return load(linkId);
}
return null;
}
@Override
public List<LinkSpec> queryAndSort() {
List<LinkSpec> links = query(true);
links.sort(Comparator.comparing(LinkSpec::getOrder));
return links;
}
@Transactional
@Override
public void updateOrders(List<LinkSpec> links) {
for (int i=0; i<links.size(); i++) {
LinkSpec link = links.get(i);
link.setOrder(i+1);
save(link);
}
}
@Transactional
@Override
public void save(LinkSpec spec, String oldName, String oldOppositeName) {
if (oldName != null) {
if (oldOppositeName != null) {
if (spec.getOpposite() == null) {
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(oldOppositeName));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(oldOppositeName));
}
usage.checkInUse("Opposite side of issue link '" + oldName + "'");
} else if (!oldOppositeName.equals(spec.getOpposite().getName())){
settingManager.onRenameLink(oldOppositeName, spec.getOpposite().getName());
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
updater.onRenameLink(oldOppositeName, spec.getOpposite().getName());
}
}
}
if (!oldName.equals(spec.getName())) {
settingManager.onRenameLink(oldName, spec.getName());
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
updater.onRenameLink(oldName, spec.getName());
}
}
}
super.save(spec);
LinkSpecFacade facade = new LinkSpecFacade(spec);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
cache.put(facade.getId(), facade);
ids.put(facade.getName(), facade.getId());
if (facade.getOppositeName() != null)
ids.put(facade.getOppositeName(), facade.getId());
}
});
}
@Transactional
public void delete(LinkSpec spec) {
if (spec.getOpposite() != null) {
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(spec.getOpposite().getName()));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(spec.getOpposite().getName()));
}
usage.checkInUse("Opposite side of issue link '" + spec.getName() + "'");
}
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(spec.getName()));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(spec.getName()));
}
usage.checkInUse("Issue link '" + spec.getName() + "'");
super.delete(spec);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
cache.remove(spec.getId());
ids.remove(spec.getName());
if (spec.getOpposite() != null)
ids.remove(spec.getOpposite().getName());
}
});
}
}
package io.onedev.server.entitymanager.impl;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.entitymanager.LinkSpecManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.event.Listen;
import io.onedev.server.event.system.SystemStarted;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.persistence.TransactionManager;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.search.entity.issue.IssueQueryUpdater;
import io.onedev.server.util.facade.LinkSpecFacade;
import io.onedev.server.util.usage.Usage;
@Singleton
public class DefaultLinkSpecManager extends BaseEntityManager<LinkSpec> implements LinkSpecManager {
private final SettingManager settingManager;
private final TransactionManager transactionManager;
private final ClusterManager clusterManager;
private volatile Map<String, Long> ids;
private volatile Map<Long, LinkSpecFacade> cache;
@Inject
public DefaultLinkSpecManager(Dao dao, SettingManager settingManager, TransactionManager transactionManager,
ClusterManager clusterManager) {
super(dao);
this.settingManager = settingManager;
this.transactionManager = transactionManager;
this.clusterManager = clusterManager;
}
@Sessional
@Listen
public void on(SystemStarted event) {
ids = clusterManager.getHazelcastInstance().getReplicatedMap("linkSpecIds");
cache = clusterManager.getHazelcastInstance().getReplicatedMap("linkSpecCache");
for (LinkSpec link: query(true)) {
ids.put(link.getName(), link.getId());
String oppositeName = link.getOpposite()!=null?link.getOpposite().getName():null;
if (oppositeName != null)
ids.put(oppositeName, link.getId());
cache.put(link.getId(), link.getFacade());
}
}
@Sessional
@Override
public LinkSpec find(String name) {
Long linkId = ids.get(name);
if (linkId != null) {
LinkSpecFacade facade = cache.get(linkId);
if (facade != null && (name.equals(facade.getName()) || name.equals(facade.getOppositeName())))
return load(linkId);
}
return null;
}
@Override
public List<LinkSpec> queryAndSort() {
List<LinkSpec> links = query(true);
links.sort(Comparator.comparing(LinkSpec::getOrder));
return links;
}
@Transactional
@Override
public void updateOrders(List<LinkSpec> links) {
for (int i=0; i<links.size(); i++) {
LinkSpec link = links.get(i);
link.setOrder(i+1);
dao.persist(link);
}
}
@Transactional
@Override
public void update(LinkSpec spec, String oldName, String oldOppositeName) {
if (oldName != null) {
if (oldOppositeName != null) {
if (spec.getOpposite() == null) {
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(oldOppositeName));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(oldOppositeName));
}
usage.checkInUse("Opposite side of issue link '" + oldName + "'");
} else if (!oldOppositeName.equals(spec.getOpposite().getName())){
settingManager.onRenameLink(oldOppositeName, spec.getOpposite().getName());
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
updater.onRenameLink(oldOppositeName, spec.getOpposite().getName());
}
}
}
if (!oldName.equals(spec.getName())) {
settingManager.onRenameLink(oldName, spec.getName());
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
updater.onRenameLink(oldName, spec.getName());
}
}
}
dao.persist(spec);
LinkSpecFacade facade = new LinkSpecFacade(spec);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
cache.put(facade.getId(), facade);
ids.put(facade.getName(), facade.getId());
if (facade.getOppositeName() != null)
ids.put(facade.getOppositeName(), facade.getId());
}
});
}
@Transactional
@Override
public void create(LinkSpec link) {
dao.persist(link);
}
@Transactional
public void delete(LinkSpec spec) {
if (spec.getOpposite() != null) {
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(spec.getOpposite().getName()));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(spec.getOpposite().getName()));
}
usage.checkInUse("Opposite side of issue link '" + spec.getName() + "'");
}
Usage usage = new Usage();
usage.add(settingManager.onDeleteLink(spec.getName()));
for (LinkSpec link: query(true)) {
for (IssueQueryUpdater updater: link.getQueryUpdaters())
usage.add(updater.onDeleteLink(spec.getName()));
}
usage.checkInUse("Issue link '" + spec.getName() + "'");
super.delete(spec);
transactionManager.runAfterCommit(new Runnable() {
@Override
public void run() {
cache.remove(spec.getId());
ids.remove(spec.getName());
if (spec.getOpposite() != null)
ids.remove(spec.getOpposite().getName());
}
});
}
}

View File

@ -83,7 +83,13 @@ public class DefaultMembershipManager extends BaseEntityManager<Membership> impl
MapDifference<String, Membership> diff = Maps.difference(currentMap, syncMap);
diff.entriesOnlyOnLeft().values().forEach(membership -> delete(membership));
diff.entriesOnlyOnRight().values().forEach(membership -> save(membership));
diff.entriesOnlyOnRight().values().forEach(membership -> dao.persist(membership));
}
@Transactional
@Override
public void create(Membership membership) {
dao.persist(membership);
}
@Sessional

View File

@ -5,6 +5,7 @@ import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.persistence.annotation.Transactional;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
@ -75,5 +76,11 @@ public class DefaultMilestoneManager extends BaseEntityManager<Milestone> implem
criteria.addOrder(Order.asc(Milestone.PROP_DUE_DATE));
return find(criteria);
}
@Transactional
@Override
public void createOrUpdate(Milestone milestone) {
dao.persist(milestone);
}
}

View File

@ -123,4 +123,10 @@ public class DefaultPendingSuggestionApplyManager extends BaseEntityManager<Pend
return getSession().createQuery(criteriaQuery).list();
}
@Transactional
@Override
public void create(PendingSuggestionApply pendingSuggestionApply) {
dao.persist(pendingSuggestionApply);
}
}

View File

@ -37,4 +37,10 @@ public class DefaultProjectDynamicsManager extends BaseEntityManager<ProjectDyna
}
}
@Transactional
@Override
public void create(ProjectDynamics dynamics) {
dao.persist(dynamics);
}
}

View File

@ -208,7 +208,7 @@ public class DefaultProjectManager extends BaseEntityManager<Project>
@Transactional
@Override
public void save(Project project) {
public void update(Project project) {
String oldPath = project.getPath();
String newPath = project.calcPath();
if (!newPath.equals(oldPath)) {
@ -278,9 +278,9 @@ public class DefaultProjectManager extends BaseEntityManager<Project>
create(parent);
project.setPath(project.calcPath());
ProjectDynamics update = new ProjectDynamics();
project.setDynamics(update);
dynamicsManager.save(update);
ProjectDynamics dynamics = new ProjectDynamics();
project.setDynamics(dynamics);
dynamicsManager.create(dynamics);
dao.persist(project);
var projectDir = storageManager.getProjectDir(project.getId());
@ -295,7 +295,7 @@ public class DefaultProjectManager extends BaseEntityManager<Project>
authorization.setProject(project);
authorization.setUser(SecurityUtils.getUser());
authorization.setRole(roleManager.getOwner());
userAuthorizationManager.save(authorization);
userAuthorizationManager.createOrUpdate(authorization);
updateStorageServer(project);
listenerRegistry.post(new ProjectCreated(project));
@ -1009,7 +1009,7 @@ public class DefaultProjectManager extends BaseEntityManager<Project>
public void move(Collection<Project> projects, Project parent) {
for (Project project : projects) {
project.setParent(parent);
save(project);
update(project);
}
}

View File

@ -29,8 +29,8 @@ public class DefaultPullRequestAssignmentManager extends BaseEntityManager<PullR
@Transactional
@Override
public void save(PullRequestAssignment assignment) {
super.save(assignment);
public void create(PullRequestAssignment assignment) {
dao.persist(assignment);
listenerRegistry.post(new PullRequestAssigned(
SecurityUtils.getUser(), new Date(),

View File

@ -30,8 +30,8 @@ public class DefaultPullRequestCommentManager extends BaseEntityManager<PullRequ
@Transactional
@Override
public void save(PullRequestComment comment) {
save(comment, Lists.newArrayList());
public void createOrUpdate(PullRequestComment comment) {
createOrUpdate(comment, Lists.newArrayList());
}
@Transactional
@ -42,8 +42,9 @@ public class DefaultPullRequestCommentManager extends BaseEntityManager<PullRequ
request.setCommentCount(request.getCommentCount()-1);
}
@Transactional
@Override
public void save(PullRequestComment comment, Collection<String> notifiedEmailAddresses) {
public void createOrUpdate(PullRequestComment comment, Collection<String> notifiedEmailAddresses) {
boolean isNew = comment.isNew();
dao.persist(comment);
if (isNew) {

View File

@ -320,7 +320,7 @@ public class DefaultPullRequestManager extends BaseEntityManager<PullRequest>
ObjectId.fromString(request.getLatestUpdate().getHeadCommitHash()), null);
for (PullRequestUpdate update: request.getUpdates())
updateManager.save(update);
updateManager.create(update);
for (PullRequestReview review: request.getReviews())
dao.persist(review);
@ -425,7 +425,7 @@ public class DefaultPullRequestManager extends BaseEntityManager<PullRequest>
for (PullRequestReview review: request.getReviews()) {
if (review.isNew() || review.isDirty())
reviewManager.save(review);
reviewManager.createOrUpdate(review);
}
Project targetProject = request.getTargetProject();
@ -957,7 +957,7 @@ public class DefaultPullRequestManager extends BaseEntityManager<PullRequest>
throw new ExplicitException("Description too long");
request.setDescription(description);
referenceManager.addReferenceChange(request, description);
save(request);
dao.persist(request);
}
}

View File

@ -1,8 +1,9 @@
package io.onedev.server.entitymanager.impl;
import io.onedev.server.entitymanager.IssueMentionManager;
import io.onedev.server.entitymanager.PullRequestMentionManager;
import io.onedev.server.model.*;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.PullRequestMention;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@ -24,8 +25,8 @@ public class DefaultPullRequestMentionManager extends BaseEntityManager<PullRequ
PullRequestMention mention = new PullRequestMention();
mention.setRequest(request);
mention.setUser(user);
save(mention);
dao.persist(mention);
}
}
}

View File

@ -1,14 +1,5 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.hibernate.criterion.Restrictions;
import io.onedev.server.entitymanager.PullRequestQueryPersonalizationManager;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequestQueryPersonalization;
@ -19,6 +10,13 @@ import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.persistence.dao.EntityCriteria;
import org.hibernate.criterion.Restrictions;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collection;
import java.util.HashSet;
import java.util.stream.Collectors;
@Singleton
public class DefaultPullRequestQueryPersonalizationManager extends BaseEntityManager<PullRequestQueryPersonalization>
@ -40,7 +38,7 @@ public class DefaultPullRequestQueryPersonalizationManager extends BaseEntityMan
@Transactional
@Override
public void save(PullRequestQueryPersonalization personalization) {
public void createOrUpdate(PullRequestQueryPersonalization personalization) {
Collection<String> retainNames = new HashSet<>();
retainNames.addAll(personalization.getQueries().stream()
.map(it->NamedQuery.PERSONAL_NAME_PREFIX+it.getName()).collect(Collectors.toSet()));
@ -52,7 +50,7 @@ public class DefaultPullRequestQueryPersonalizationManager extends BaseEntityMan
if (!personalization.isNew())
delete(personalization);
} else {
super.save(personalization);
dao.persist(personalization);
}
}

View File

@ -48,9 +48,9 @@ public class DefaultPullRequestReviewManager extends BaseEntityManager<PullReque
@Transactional
@Override
public void save(PullRequestReview review) {
public void createOrUpdate(PullRequestReview review) {
review.setDirty(false);
super.save(review);
dao.persist(review);
if (review.getStatus() == Status.PENDING) {
listenerRegistry.post(new PullRequestReviewRequested(
@ -92,7 +92,7 @@ public class DefaultPullRequestReviewManager extends BaseEntityManager<PullReque
else
review.setStatus(PullRequestReview.Status.REQUESTED_FOR_CHANGES);
save(review);
createOrUpdate(review);
PullRequestChange change = new PullRequestChange();
change.setDate(review.getStatusDate());

View File

@ -41,8 +41,8 @@ public class DefaultPullRequestUpdateManager extends BaseEntityManager<PullReque
@Transactional
@Override
public void save(PullRequestUpdate update) {
super.save(update);
public void create(PullRequestUpdate update) {
dao.persist(update);
PullRequest request = update.getRequest();
if (!request.getTargetProject().equals(request.getSourceProject())) {
if (request.getTargetProject().findPullRequestWithLFS()) {
@ -72,7 +72,7 @@ public class DefaultPullRequestUpdateManager extends BaseEntityManager<PullReque
update.setHeadCommitHash(request.getSource().getObjectName());
update.setTargetHeadCommitHash(request.getTarget().getObjectName());
request.getUpdates().add(update);
save(update);
create(update);
gitService.updateRef(request.getTargetProject(), request.getHeadRef(),
ObjectId.fromString(request.getLatestUpdate().getHeadCommitHash()), null);

View File

@ -35,8 +35,13 @@ public class DefaultPullRequestWatchManager extends BaseEntityManager<PullReques
PullRequestWatch watch = (PullRequestWatch) request.getWatch(user, true);
if (watch.isNew()) {
watch.setWatching(watching);
save(watch);
dao.persist(watch);
}
}
@Override
public void createOrUpdate(PullRequestWatch watch) {
dao.persist(watch);
}
}

View File

@ -146,7 +146,7 @@ public class DefaultRoleManager extends BaseEntityManager<Role> implements RoleM
for (Project project: role.getDefaultProjects()) {
project.setDefaultRole(null);
projectManager.save(project);
projectManager.update(project);
}
dao.remove(role);

View File

@ -66,11 +66,17 @@ public class DefaultSshKeyManager extends BaseEntityManager<SshKey> implements S
diff.entriesOnlyOnRight().values().forEach(sshKey -> {
if (findByDigest(sshKey.getDigest()) == null)
save(sshKey);
create(sshKey);
else
logger.warn("SSH key is already in use (digest: {})", sshKey.getDigest());
});
}
@Transactional
@Override
public void create(SshKey sshKey) {
dao.persist(sshKey);
}
}

View File

@ -34,7 +34,7 @@ public class DefaultUserAuthorizationManager extends BaseEntityManager<UserAutho
if (newAuthorization.getProject().equals(authorization.getProject())) {
found = true;
authorization.setRole(newAuthorization.getRole());
save(authorization);
dao.persist(authorization);
}
}
if (!found) {
@ -53,7 +53,7 @@ public class DefaultUserAuthorizationManager extends BaseEntityManager<UserAutho
}
if (!found) {
user.getProjectAuthorizations().add(newAuthorization);
save(newAuthorization);
dao.persist(newAuthorization);
}
}
}
@ -78,7 +78,7 @@ public class DefaultUserAuthorizationManager extends BaseEntityManager<UserAutho
if (newAuthorization.getUser().equals(authorization.getUser())) {
found = true;
authorization.setRole(newAuthorization.getRole());
save(authorization);
dao.persist(authorization);
}
}
if (!found) {
@ -97,9 +97,15 @@ public class DefaultUserAuthorizationManager extends BaseEntityManager<UserAutho
}
if (!found) {
project.getUserAuthorizations().add(newAuthorization);
save(newAuthorization);
dao.persist(newAuthorization);
}
}
}
@Transactional
@Override
public void createOrUpdate(UserAuthorization authorization) {
dao.persist(authorization);
}
}

View File

@ -7,6 +7,7 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.onedev.server.persistence.annotation.Transactional;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
@ -95,6 +96,12 @@ public class DefaultUserInvitationManager extends BaseEntityManager<UserInvitati
return query(criteria, firstResult, maxResults);
}
@Transactional
@Override
public void create(UserInvitation invitation) {
dao.persist(invitation);
}
@Sessional
@Override
public int count(String term) {

View File

@ -340,7 +340,7 @@ public class GitLfsFilter implements Filter {
lock = new GitLfsLock();
lock.setPath(path);
lock.setOwner(SecurityUtils.getUser());
lockManager.save(lock);
lockManager.create(lock);
httpResponse.setStatus(SC_CREATED);
} else {
httpResponse.setStatus(SC_CONFLICT);

View File

@ -589,7 +589,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
build.setRetryDate(new Date());
build.setStatus(Status.WAITING);
listenerRegistry.post(new BuildRetrying(build));
buildManager.save(build);
buildManager.update(build);
}
});
@ -609,7 +609,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
build.setPendingDate(new Date());
build.setStatus(Status.PENDING);
listenerRegistry.post(new BuildPending(build));
buildManager.save(build);
buildManager.update(build);
}
});
@ -653,7 +653,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
build.setStatus(Build.Status.FAILED);
logManager.newLogger(build).error(errorMessage);
build.setFinishDate(new Date());
buildManager.save(build);
buildManager.update(build);
listenerRegistry.post(new BuildFinished(build));
}
@ -777,7 +777,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
param.setType(type);
param.setValue(value);
build.getParams().add(param);
buildParamManager.save(param);
buildParamManager.create(param);
}
} else {
BuildParam param = new BuildParam();
@ -785,10 +785,10 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
param.setName(paramSpec.getName());
param.setType(type);
build.getParams().add(param);
buildParamManager.save(param);
buildParamManager.create(param);
}
}
buildManager.save(build);
buildManager.update(build);
buildSubmitted(build);
} finally {
JobAuthorizationContext.pop();
@ -969,7 +969,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
build.setStatus(Status.CANCELLED);
build.setFinishDate(new Date());
build.setCanceller(userManager.load(userId));
buildManager.save(build);
buildManager.update(build);
listenerRegistry.post(new BuildFinished(build));
}
}
@ -1243,7 +1243,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
} catch (InterruptedException ignored) {
} finally {
build.setFinishDate(new Date());
buildManager.save(build);
buildManager.update(build);
listenerRegistry.post(new BuildFinished(build));
}
}
@ -1457,7 +1457,7 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
public void run() {
Build build = buildManager.load(jobContext.getBuildId());
build.setJobWorkspace(jobWorkspace);
buildManager.save(build);
buildManager.update(build);
}
});

View File

@ -458,7 +458,7 @@ public class DefaultMailManager implements MailManager, Serializable {
IssueWatch watch = issueWatchManager.find(issue, user);
if (watch != null) {
watch.setWatching(false);
issueWatchManager.save(watch);
issueWatchManager.createOrUpdate(watch);
String subject = "Unsubscribed successfully from issue " + issue.getFQN();
String body = "You will no longer receive notifications of issue " + issue.getFQN() + " unless mentioned. "
+ "However if you subscribed to certain issue queries, you may still get notifications of newly "
@ -484,7 +484,7 @@ public class DefaultMailManager implements MailManager, Serializable {
PullRequestWatch watch = pullRequestWatchManager.find(pullRequest, user);
if (watch != null) {
watch.setWatching(false);
pullRequestWatchManager.save(watch);
pullRequestWatchManager.createOrUpdate(watch);
String subject = "Unsubscribed successfully from pull request " + pullRequest.getFQN();
String body = "You will no longer receive notifications of pull request " + pullRequest.getFQN()
+ " unless mentioned. However if you subscribed to certain pull request queries, you may still "
@ -705,7 +705,7 @@ public class DefaultMailManager implements MailManager, Serializable {
String content = stripQuotationAndSignature(sendSetting, getText(pullRequest.getProject(), pullRequest.getUUID(), message, null));
if (content != null) {
comment.setContent(decorateContent(content));
pullRequestCommentManager.save(comment, receiverEmailAddresses);
pullRequestCommentManager.createOrUpdate(comment, receiverEmailAddresses);
}
}
@ -790,7 +790,7 @@ public class DefaultMailManager implements MailManager, Serializable {
emailAddress.setPrimary(true);
emailAddress.setGit(true);
emailAddress.setOwner(user);
emailAddressManager.save(emailAddress);
emailAddressManager.createOrUpdate(emailAddress);
boolean found = false;
for (UserAuthorization authorization: user.getProjectAuthorizations()) {
@ -804,7 +804,7 @@ public class DefaultMailManager implements MailManager, Serializable {
authorization.setUser(user);
authorization.setProject(project);
authorization.setRole(role);
authorizationManager.save(authorization);
authorizationManager.createOrUpdate(authorization);
}
return user;

View File

@ -92,7 +92,7 @@ public class BuildQueryPersonalization extends AbstractEntity implements QueryPe
@Override
public void onUpdated() {
OneDev.getInstance(BuildQueryPersonalizationManager.class).save(this);
OneDev.getInstance(BuildQueryPersonalizationManager.class).createOrUpdate(this);
}
}

View File

@ -80,7 +80,7 @@ public class CodeCommentQueryPersonalization extends AbstractEntity implements Q
@Override
public void onUpdated() {
OneDev.getInstance(CodeCommentQueryPersonalizationManager.class).save(this);
OneDev.getInstance(CodeCommentQueryPersonalizationManager.class).createOrUpdate(this);
}
}

View File

@ -96,7 +96,7 @@ public class CommitQueryPersonalization extends AbstractEntity implements QueryP
@Override
public void onUpdated() {
OneDev.getInstance(CommitQueryPersonalizationManager.class).save(this);
OneDev.getInstance(CommitQueryPersonalizationManager.class).createOrUpdate(this);
}
}

View File

@ -97,7 +97,7 @@ public class IssueQueryPersonalization extends AbstractEntity implements QueryPe
@Override
public void onUpdated() {
OneDev.getInstance(IssueQueryPersonalizationManager.class).save(this);
OneDev.getInstance(IssueQueryPersonalizationManager.class).createOrUpdate(this);
}
}

Some files were not shown because too many files have changed in this diff Show More