Continue to refactor various queries

This commit is contained in:
Robin Shen 2019-12-04 11:23:40 +08:00
parent d850cf14d0
commit c6b3b68bfa
199 changed files with 1108 additions and 1798 deletions

View File

@ -32,7 +32,6 @@ import javax.validation.Validator;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.credential.PasswordService;
import org.apache.shiro.subject.Subject;
import org.eclipse.jgit.lib.ObjectId;
@ -93,6 +92,7 @@ import io.onedev.server.security.permission.JobPermission;
import io.onedev.server.security.permission.ProjectPermission;
import io.onedev.server.util.BuildCommitAware;
import io.onedev.server.util.JobLogger;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.inputspec.SecretInput;
import io.onedev.server.util.patternset.PatternSet;
import io.onedev.server.util.script.identity.JobIdentity;

View File

@ -15,7 +15,6 @@ import io.onedev.server.entitymanager.BuildManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.security.permission.AccessProject;
import io.onedev.server.util.EditContext;
import io.onedev.server.util.SecurityUtils;
@ -58,8 +57,7 @@ public class ProjectDependency implements Serializable {
private static List<String> getProjectChoices() {
List<String> choices = new ArrayList<>();
Project project = ((ProjectPage)WicketUtils.getPage()).getProject();
User user = SecurityUtils.getUser();
for (Project each: OneDev.getInstance(ProjectManager.class).getPermittedProjects(user, new AccessProject())) {
for (Project each: OneDev.getInstance(ProjectManager.class).getPermittedProjects(new AccessProject())) {
if (!each.equals(project))
choices.add(each.getName());
}

View File

@ -11,7 +11,6 @@ import org.eclipse.jgit.lib.ObjectId;
import io.onedev.server.model.Build;
import io.onedev.server.model.Build.Status;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
@ -40,12 +39,11 @@ public interface BuildManager extends EntityManager<Build> {
Collection<Build> queryUnfinished();
List<Build> query(Project project, @Nullable User user, String term, int count);
List<Build> query(Project project, String term, int count);
List<Build> query(@Nullable Project project, @Nullable User user,
EntityQuery<Build> buildQuery, int firstResult, int maxResults);
List<Build> query(@Nullable Project project, EntityQuery<Build> buildQuery, int firstResult, int maxResults);
int count(@Nullable Project project, @Nullable User user, EntityCriteria<Build> buildCriteria);
int count(@Nullable Project project, EntityCriteria<Build> buildCriteria);
Collection<Long> getBuildIdsByProject(Long projectId);
@ -53,7 +51,7 @@ public interface BuildManager extends EntityManager<Build> {
Collection<String> getJobNames(@Nullable Project project);
List<String> queryVersions(Project project, @Nullable User user, String matchWith, int count);
List<String> queryVersions(Project project, String matchWith, int count);
Map<Project, Collection<String>> getAccessibleJobNames(@Nullable Project project, @Nullable User user);
Map<Project, Collection<String>> getAccessibleJobNames(@Nullable Project project);
}

View File

@ -29,10 +29,11 @@ public interface CodeCommentManager extends EntityManager<CodeComment> {
void create(CodeComment comment, @Nullable PullRequest request);
List<CodeComment> query(Project project, @Nullable PullRequest request, User user,
List<CodeComment> query(Project project, @Nullable PullRequest request,
EntityQuery<CodeComment> commentQuery, int firstResult, int maxResults);
int count(Project project, @Nullable PullRequest request, User user, EntityCriteria<CodeComment> commentCriteria);
int count(Project project, @Nullable PullRequest request,
EntityCriteria<CodeComment> commentCriteria);
void delete(User user, CodeComment comment);

View File

@ -10,7 +10,6 @@ import io.onedev.server.issue.StateSpec;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Milestone;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.search.entity.issue.IssueCriteria;
@ -29,14 +28,14 @@ public interface IssueManager extends EntityManager<Issue> {
void open(Issue issue);
List<Issue> query(@Nullable Project project, @Nullable User user, EntityQuery<Issue> issueQuery,
List<Issue> query(@Nullable Project project, EntityQuery<Issue> issueQuery,
int firstResult, int maxResults);
int count(@Nullable Project project, @Nullable User user, @Nullable IssueCriteria issueCriteria);
int count(@Nullable Project project, @Nullable IssueCriteria issueCriteria);
List<Issue> query(Project project, String term, int count);
int count(Milestone milestone, @Nullable User user, @Nullable StateSpec.Category category);
int count(Milestone milestone, @Nullable StateSpec.Category category);
Collection<String> getUndefinedStates();

View File

@ -9,7 +9,6 @@ import org.apache.shiro.authz.Permission;
import org.eclipse.jgit.lib.Repository;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.persistence.dao.EntityManager;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
@ -47,10 +46,10 @@ public interface ProjectManager extends EntityManager<Project> {
Repository getRepository(Project project);
Collection<Project> getPermittedProjects(@Nullable User user, Permission permission);
Collection<Project> getPermittedProjects(Permission permission);
List<Project> query(@Nullable User user, EntityQuery<Project> projecQuery, int firstResult, int maxResults);
List<Project> query(EntityQuery<Project> projecQuery, int firstResult, int maxResults);
int count(@Nullable User user, @Nullable EntityCriteria<Project> projectCriteria);
int count(EntityCriteria<Project> projectCriteria);
}

View File

@ -75,11 +75,10 @@ public interface PullRequestManager extends EntityManager<PullRequest> {
void checkQuality(PullRequest request);
List<PullRequest> query(@Nullable Project targetProject, @Nullable User user,
List<PullRequest> query(@Nullable Project targetProject,
EntityQuery<PullRequest> requestQuery, int firstResult, int maxResults);
int count(@Nullable Project targetProject, @Nullable User user,
EntityCriteria<PullRequest> requestCriteria);
int count(@Nullable Project targetProject, EntityCriteria<PullRequest> requestCriteria);
List<PullRequest> query(Project targetProject, String term, int count);

View File

@ -25,7 +25,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ThreadContext;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
@ -49,12 +49,12 @@ import io.onedev.commons.utils.FileUtils;
import io.onedev.commons.utils.match.StringMatcher;
import io.onedev.commons.utils.schedule.SchedulableTask;
import io.onedev.commons.utils.schedule.TaskScheduler;
import io.onedev.server.OneException;
import io.onedev.server.entitymanager.BuildDependenceManager;
import io.onedev.server.entitymanager.BuildManager;
import io.onedev.server.entitymanager.BuildParamManager;
import io.onedev.server.entitymanager.GroupManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.event.entity.EntityRemoved;
import io.onedev.server.event.system.SystemStarted;
import io.onedev.server.event.system.SystemStopping;
@ -79,11 +79,9 @@ import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.search.entity.EntitySort;
import io.onedev.server.search.entity.EntitySort.Direction;
import io.onedev.server.search.entity.build.BuildQuery;
import io.onedev.server.security.permission.ManageProject;
import io.onedev.server.security.permission.ProjectPermission;
import io.onedev.server.security.permission.SystemAdministration;
import io.onedev.server.storage.StorageManager;
import io.onedev.server.util.ProjectScopedNumber;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.facade.BuildFacade;
import io.onedev.server.util.patternset.PatternSet;
import io.onedev.server.util.query.BuildQueryConstants;
@ -111,6 +109,8 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
private final TransactionManager transactionManager;
private final UserManager userManager;
private final Map<Long, BuildFacade> builds = new HashMap<>();
private final ReadWriteLock buildsLock = new ReentrantReadWriteLock();
@ -124,7 +124,7 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Inject
public DefaultBuildManager(Dao dao, BuildParamManager buildParamManager,
TaskScheduler taskScheduler, BuildDependenceManager buildDependenceManager,
GroupManager groupManager, StorageManager storageManager,
GroupManager groupManager, StorageManager storageManager, UserManager userManager,
ProjectManager projectManager, TransactionManager transactionManager) {
super(dao);
this.buildParamManager = buildParamManager;
@ -132,6 +132,7 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
this.storageManager = storageManager;
this.groupManager = groupManager;
this.projectManager = projectManager;
this.userManager = userManager;
this.taskScheduler = taskScheduler;
this.transactionManager = transactionManager;
}
@ -292,16 +293,15 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Sessional
@Override
public List<Build> query(Project project, @Nullable User user, String term, int count) {
public List<Build> query(Project project, String term, int count) {
List<Build> builds = new ArrayList<>();
EntityCriteria<Build> criteria = newCriteria();
criteria.add(Restrictions.eq(BuildQueryConstants.ATTR_PROJECT, project));
Subject subject = User.asSubject(user);
if (!subject.isPermitted(new ProjectPermission(project, new ManageProject()))) {
if (!SecurityUtils.canManage(project)) {
List<Criterion> jobCriterions = new ArrayList<>();
for (String jobName: getAccessibleJobNames(project, user).get(project))
for (String jobName: getAccessibleJobNames(project).get(project))
jobCriterions.add(Restrictions.eq(BuildQueryConstants.ATTR_JOB, jobName));
if (!jobCriterions.isEmpty())
criteria.add(Restrictions.or(jobCriterions.toArray(new Criterion[jobCriterions.size()])));
@ -330,13 +330,13 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Sessional
@Override
public List<String> queryVersions(Project project, @Nullable User user, String matchWith, int count) {
public List<String> queryVersions(Project project, String matchWith, int count) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<String> criteriaQuery = builder.createQuery(String.class);
Root<Build> root = criteriaQuery.from(Build.class);
criteriaQuery.select(root.get(BuildQueryConstants.ATTR_VERSION)).distinct(true);
Collection<Predicate> predicates = getPredicates(project, root, builder, user);
Collection<Predicate> predicates = getPredicates(project, root, builder);
predicates.add(builder.like(
builder.lower(root.get(BuildQueryConstants.ATTR_VERSION)),
"%" + matchWith.toLowerCase() + "%"));
@ -365,22 +365,21 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
}
private Collection<Predicate> getPredicates(@Nullable Project project, Root<Build> root,
CriteriaBuilder builder, @Nullable User user) {
CriteriaBuilder builder) {
Collection<Predicate> predicates = new ArrayList<>();
Subject subject = User.asSubject(user);
if (project != null) {
predicates.add(builder.equal(root.get(BuildQueryConstants.ATTR_PROJECT), project));
if (!subject.isPermitted(new ProjectPermission(project, new ManageProject()))) {
if (!SecurityUtils.canManage(project)) {
List<Predicate> jobPredicates = new ArrayList<>();
for (String jobName: getAccessibleJobNames(project, user).get(project))
for (String jobName: getAccessibleJobNames(project).get(project))
jobPredicates.add(builder.equal(root.get(BuildQueryConstants.ATTR_JOB), jobName));
predicates.add(builder.or(jobPredicates.toArray(new Predicate[jobPredicates.size()])));
}
} else if (!subject.isPermitted(new SystemAdministration())) {
} else if (!SecurityUtils.isAdministrator()) {
List<Predicate> projectPredicates = new ArrayList<>();
for (Map.Entry<Project, Collection<String>> entry: getAccessibleJobNames(null, user).entrySet()) {
if (subject.isPermitted(new ProjectPermission(project, new ManageProject()))) {
for (Map.Entry<Project, Collection<String>> entry: getAccessibleJobNames(null).entrySet()) {
if (SecurityUtils.canManage(project)) {
projectPredicates.add(builder.equal(root.get(BuildQueryConstants.ATTR_PROJECT), entry.getKey()));
} else {
List<Predicate> jobPredicates = new ArrayList<>();
@ -397,22 +396,23 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
return predicates;
}
private Predicate[] getPredicates(io.onedev.server.search.entity.EntityCriteria<Build> criteria,
@Nullable Project project, Root<Build> root, CriteriaBuilder builder, @Nullable User user) {
Collection<Predicate> predicates = getPredicates(project, root, builder, user);
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder, user));
private Predicate[] getPredicates(@Nullable Project project,
io.onedev.server.search.entity.EntityCriteria<Build> criteria,
Root<Build> root, CriteriaBuilder builder) {
Collection<Predicate> predicates = getPredicates(project, root, builder);
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder));
return predicates.toArray(new Predicate[0]);
}
private CriteriaQuery<Build> buildCriteriaQuery(Session session, @Nullable Project project,
EntityQuery<Build> buildQuery, @Nullable User user) {
private CriteriaQuery<Build> buildCriteriaQuery(@Nullable Project project,
Session session, EntityQuery<Build> buildQuery) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Build> query = builder.createQuery(Build.class);
Root<Build> root = query.from(Build.class);
query.select(root).distinct(true);
query.where(getPredicates(buildQuery.getCriteria(), project, root, builder, user));
query.where(getPredicates(project, buildQuery.getCriteria(), root, builder));
List<javax.persistence.criteria.Order> orders = new ArrayList<>();
for (EntitySort sort: buildQuery.getSorts()) {
@ -431,9 +431,9 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Sessional
@Override
public List<Build> query(@Nullable Project project, @Nullable User user,
EntityQuery<Build> buildQuery, int firstResult, int maxResults) {
CriteriaQuery<Build> criteriaQuery = buildCriteriaQuery(getSession(), project, buildQuery, user);
public List<Build> query(@Nullable Project project, EntityQuery<Build> buildQuery,
int firstResult, int maxResults) {
CriteriaQuery<Build> criteriaQuery = buildCriteriaQuery(project, getSession(), buildQuery);
Query<Build> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
@ -442,13 +442,12 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Sessional
@Override
public int count(@Nullable Project project, @Nullable User user,
io.onedev.server.search.entity.EntityCriteria<Build> buildCriteria) {
public int count(@Nullable Project project, io.onedev.server.search.entity.EntityCriteria<Build> buildCriteria) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
Root<Build> root = criteriaQuery.from(Build.class);
criteriaQuery.where(getPredicates(buildCriteria, project, root, builder, user));
criteriaQuery.where(getPredicates(project, buildCriteria, root, builder));
criteriaQuery.select(builder.countDistinct(root));
return getSession().createQuery(criteriaQuery).uniqueResult().intValue();
@ -519,35 +518,45 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
@Override
public Boolean call() {
List<Build> builds = query(criteria, firstResult.get(), CLEANUP_BATCH);
if (!builds.isEmpty()) {
logger.debug("Checking build preserve condition: {}->{}",
firstResult.get()+1, firstResult.get()+builds.size());
}
for (Build build: builds) {
Project project = build.getProject();
Optional<BuildQuery> query = preserveConditions.get(project.getId());
if (query == null) {
try {
String queryString = project.getBuildSetting().getBuildsToPreserve();
query = Optional.of(BuildQuery.parse(project, queryString));
if (query.get().needsLogin())
throw new OneException("This query needs login which is not supported here");
} catch (Exception e) {
logger.error("Error parsing build preserve condition of project '{}'", project.getName(), e);
query = Optional.absent();
}
preserveConditions.put(project.getId(), query);
ThreadContext.bind(userManager.getRoot().asSubject());
User.push(null); // do not support various 'is me' criterias
try {
List<Build> builds = query(criteria, firstResult.get(), CLEANUP_BATCH);
if (!builds.isEmpty()) {
logger.debug("Checking build preserve condition: {}->{}",
firstResult.get()+1, firstResult.get()+builds.size());
}
if (query.isPresent()) {
if (!query.get().matches(build, null)) {
logger.debug("Preserve condition not satisfied, deleting build {}...", build.getId());
delete(build);
for (Build build: builds) {
Project project = build.getProject();
Optional<BuildQuery> query = preserveConditions.get(project.getId());
if (query == null) {
try {
String queryString = project.getBuildSetting().getBuildsToPreserve();
query = Optional.of(BuildQuery.parse(project, queryString));
} catch (Exception e) {
String message = String.format("Error parsing build preserve condition of project '%s'",
project.getName());
logger.error(message, e);
query = Optional.absent();
}
preserveConditions.put(project.getId(), query);
}
if (query.isPresent()) {
try {
if (!query.get().matches(build))
delete(build);
} catch (Exception e) {
String message = String.format("Error preserving build '%s'", build.getFQN());
logger.error(message, e);
}
}
}
}
firstResult.set(firstResult.get() + CLEANUP_BATCH);
return builds.size() == CLEANUP_BATCH;
firstResult.set(firstResult.get() + CLEANUP_BATCH);
return builds.size() == CLEANUP_BATCH;
} finally {
User.pop();
ThreadContext.unbindSubject();
}
}
})) {}
@ -742,12 +751,12 @@ public class DefaultBuildManager extends AbstractEntityManager<Build> implements
}
@Override
public Map<Project, Collection<String>> getAccessibleJobNames(@Nullable Project project, @Nullable User user) {
public Map<Project, Collection<String>> getAccessibleJobNames(@Nullable Project project) {
jobNamesLock.readLock().lock();
try {
Map<Project, Collection<String>> accessibleJobNames = new HashMap<>();
Subject subject = User.asSubject(user);
if (subject.isPermitted(new SystemAdministration())) {
User user = SecurityUtils.getUser();
if (SecurityUtils.isAdministrator()) {
for (Map.Entry<Long, Collection<String>> entry: jobNames.entrySet())
accessibleJobNames.put(projectManager.load(entry.getKey()), new HashSet<>(entry.getValue()));
} else {

View File

@ -236,8 +236,8 @@ public class DefaultCodeCommentManager extends AbstractEntityManager<CodeComment
}
private Predicate[] getPredicates(io.onedev.server.search.entity.EntityCriteria<CodeComment> criteria,
Project project, PullRequest request, Root<CodeComment> root, CriteriaBuilder builder, User user) {
private Predicate[] getPredicates(Project project, io.onedev.server.search.entity.EntityCriteria<CodeComment> criteria,
PullRequest request, Root<CodeComment> root, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if (request != null) {
Join<?, ?> relations = root.join(CodeCommentQueryConstants.ATTR_RELATIONS, JoinType.INNER);
@ -245,19 +245,19 @@ public class DefaultCodeCommentManager extends AbstractEntityManager<CodeComment
} else {
predicates.add(builder.equal(root.get(CodeCommentQueryConstants.ATTR_PROJECT), project));
}
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder, user));
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder));
return predicates.toArray(new Predicate[0]);
}
private CriteriaQuery<CodeComment> buildCriteriaQuery(Session session, Project project, PullRequest request,
EntityQuery<CodeComment> commentQuery, User user) {
private CriteriaQuery<CodeComment> buildCriteriaQuery(Project project, Session session,
PullRequest request, EntityQuery<CodeComment> commentQuery) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<CodeComment> query = builder.createQuery(CodeComment.class);
Root<CodeComment> root = query.from(CodeComment.class);
query.select(root).distinct(true);
query.where(getPredicates(commentQuery.getCriteria(), project, request, root, builder, user));
query.where(getPredicates(project, commentQuery.getCriteria(), request, root, builder));
List<javax.persistence.criteria.Order> orders = new ArrayList<>();
for (EntitySort sort: commentQuery.getSorts()) {
@ -276,9 +276,9 @@ public class DefaultCodeCommentManager extends AbstractEntityManager<CodeComment
@Sessional
@Override
public List<CodeComment> query(Project project, PullRequest request, User user, EntityQuery<CodeComment> commentQuery,
int firstResult, int maxResults) {
CriteriaQuery<CodeComment> criteriaQuery = buildCriteriaQuery(getSession(), project, request, commentQuery, user);
public List<CodeComment> query(Project project, PullRequest request,
EntityQuery<CodeComment> commentQuery, int firstResult, int maxResults) {
CriteriaQuery<CodeComment> criteriaQuery = buildCriteriaQuery(project, getSession(), request, commentQuery);
Query<CodeComment> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
@ -287,13 +287,13 @@ public class DefaultCodeCommentManager extends AbstractEntityManager<CodeComment
@Sessional
@Override
public int count(Project project, PullRequest request, User user,
public int count(Project project, PullRequest request,
io.onedev.server.search.entity.EntityCriteria<CodeComment> commentCriteria) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
Root<CodeComment> root = criteriaQuery.from(CodeComment.class);
criteriaQuery.where(getPredicates(commentCriteria, project, request, root, builder, user));
criteriaQuery.where(getPredicates(project, commentCriteria, request, root, builder));
criteriaQuery.select(builder.countDistinct(root));
return getSession().createQuery(criteriaQuery).uniqueResult().intValue();

View File

@ -11,7 +11,6 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.shiro.SecurityUtils;
import org.apache.wicket.util.lang.Objects;
import org.eclipse.jgit.lib.ObjectId;
@ -55,10 +54,12 @@ import io.onedev.server.persistence.TransactionManager;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.AbstractEntityManager;
import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.search.entity.issue.IssueCriteria;
import io.onedev.server.search.entity.issue.IssueQuery;
import io.onedev.server.search.entity.issue.StateCriteria;
import io.onedev.server.util.Input;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.patternset.PatternSet;
@Singleton
@ -228,20 +229,22 @@ public class DefaultIssueChangeManager extends AbstractEntityManager<IssueChange
if ((trigger.getJobNames() == null || PatternSet.fromString(trigger.getJobNames()).matches(new StringMatcher(), build.getJobName()))
&& build.getStatus() == Build.Status.SUCCESSFUL
&& (branches == null || project.isCommitOnBranches(commitId, branches))) {
IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), true);
List<IssueCriteria> criterias = new ArrayList<>();
for (String fromState: transition.getFromStates())
criterias.add(new StateCriteria(fromState));
criterias.add(query.getCriteria());
query = new IssueQuery(IssueCriteria.of(criterias), new ArrayList<>());
Build.push(build);
User.push(null); // do not support various 'is me' criterias
try {
IssueQuery query = IssueQuery.parse(project, trigger.getIssueQuery(), true);
List<IssueCriteria> criterias = new ArrayList<>();
for (String fromState: transition.getFromStates())
criterias.add(new StateCriteria(fromState));
criterias.add(query.getCriteria());
query = new IssueQuery(IssueCriteria.of(criterias), new ArrayList<>());
for (Issue issue: issueManager.query(project, null, query, 0, Integer.MAX_VALUE)) {
for (Issue issue: issueManager.query(project, query, 0, Integer.MAX_VALUE)) {
issue.removeFields(transition.getRemoveFields());
changeState(issue, transition.getToState(), new HashMap<>(), null, null);
}
} finally {
Build.pop();
User.pop();
}
}
}

View File

@ -67,8 +67,8 @@ import io.onedev.server.search.entity.issue.IssueCriteria;
import io.onedev.server.search.entity.issue.IssueQuery;
import io.onedev.server.search.entity.issue.MilestoneCriteria;
import io.onedev.server.security.permission.AccessProject;
import io.onedev.server.security.permission.SystemAdministration;
import io.onedev.server.util.ProjectScopedNumber;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.ValueSetEdit;
import io.onedev.server.util.facade.IssueFacade;
import io.onedev.server.util.inputspec.choiceinput.choiceprovider.SpecifiedChoices;
@ -180,30 +180,31 @@ public class DefaultIssueManager extends AbstractEntityManager<Issue> implements
});
}
private Predicate[] getPredicates(io.onedev.server.search.entity.EntityCriteria<Issue> criteria,
@Nullable Project project, Root<Issue> root, CriteriaBuilder builder, @Nullable User user) {
private Predicate[] getPredicates(@Nullable Project project,
io.onedev.server.search.entity.EntityCriteria<Issue> criteria, Root<Issue> root,
CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if (project != null) {
predicates.add(builder.equal(root.get(IssueQueryConstants.ATTR_PROJECT), project));
} else if (!User.asSubject(user).isPermitted(new SystemAdministration())) {
Collection<Project> projects = projectManager.getPermittedProjects(user, new AccessProject());
} else if (!SecurityUtils.isAdministrator()) {
Collection<Project> projects = projectManager.getPermittedProjects(new AccessProject());
if (!projects.isEmpty())
predicates.add(root.get(IssueQueryConstants.ATTR_PROJECT).in(projects));
else
predicates.add(builder.disjunction());
}
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder, user));
predicates.add(criteria.getPredicate(root, builder));
return predicates.toArray(new Predicate[0]);
}
private CriteriaQuery<Issue> buildCriteriaQuery(Session session, @Nullable Project project,
EntityQuery<Issue> issueQuery, @Nullable User user) {
private CriteriaQuery<Issue> buildCriteriaQuery(@Nullable Project project,
Session session, EntityQuery<Issue> issueQuery) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Issue> query = builder.createQuery(Issue.class);
Root<Issue> root = query.from(Issue.class);
query.where(getPredicates(issueQuery.getCriteria(), project, root, builder, user));
query.where(getPredicates(project, issueQuery.getCriteria(), root, builder));
List<javax.persistence.criteria.Order> orders = new ArrayList<>();
for (EntitySort sort: issueQuery.getSorts()) {
@ -235,9 +236,10 @@ public class DefaultIssueManager extends AbstractEntityManager<Issue> implements
@Sessional
@Override
public List<Issue> query(@Nullable Project project, @Nullable User user,
io.onedev.server.search.entity.EntityQuery<Issue> issueQuery, int firstResult, int maxResults) {
CriteriaQuery<Issue> criteriaQuery = buildCriteriaQuery(getSession(), project, issueQuery, user);
public List<Issue> query(@Nullable Project project,
io.onedev.server.search.entity.EntityQuery<Issue> issueQuery,
int firstResult, int maxResults) {
CriteriaQuery<Issue> criteriaQuery = buildCriteriaQuery(project, getSession(), issueQuery);
Query<Issue> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
@ -256,32 +258,32 @@ public class DefaultIssueManager extends AbstractEntityManager<Issue> implements
@Sessional
@Override
public int count(@Nullable Project project, @Nullable User user, IssueCriteria issueCriteria) {
public int count(@Nullable Project project,IssueCriteria issueCriteria) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
Root<Issue> root = criteriaQuery.from(Issue.class);
criteriaQuery.where(getPredicates(issueCriteria, project, root, builder, user));
criteriaQuery.where(getPredicates(project, issueCriteria, root, builder));
criteriaQuery.select(builder.count(root));
return getSession().createQuery(criteriaQuery).uniqueResult().intValue();
}
@Override
public int count(Milestone milestone, @Nullable User user, @Nullable StateSpec.Category category) {
public int count(Milestone milestone, @Nullable StateSpec.Category category) {
if (category != null) {
IssueCriteria criteria = getIssueSetting().getCategoryCriteria(category);
if (criteria != null) {
List<IssueCriteria> criterias = new ArrayList<>();
criterias.add(new MilestoneCriteria(milestone.getName()));
criterias.add(criteria);
return count(milestone.getProject(), user, new AndCriteria(criterias));
return count(milestone.getProject(), new AndCriteria(criterias));
} else {
return 0;
}
} else {
IssueCriteria criteria = new MilestoneCriteria(milestone.getName());
return count(milestone.getProject(), user, criteria);
return count(milestone.getProject(), criteria);
}
}
@ -631,5 +633,6 @@ public class DefaultIssueManager extends AbstractEntityManager<Issue> implements
} finally {
issuesLock.readLock().unlock();
}
}
}
}

View File

@ -13,7 +13,6 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.criteria.CriteriaBuilder;
@ -79,7 +78,6 @@ import io.onedev.server.search.entity.EntitySort;
import io.onedev.server.search.entity.EntitySort.Direction;
import io.onedev.server.search.entity.project.ProjectQuery;
import io.onedev.server.security.permission.AccessProject;
import io.onedev.server.security.permission.SystemAdministration;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.Usage;
import io.onedev.server.util.patternset.PatternSet;
@ -447,12 +445,13 @@ public class DefaultProjectManager extends AbstractEntityManager<Project> implem
@Sessional
@Override
public Collection<Project> getPermittedProjects(@Nullable User user, Permission permission) {
public Collection<Project> getPermittedProjects(Permission permission) {
Collection<Project> projects = new HashSet<>();
if (User.asSubject(user).isPermitted(new SystemAdministration())) {
if (SecurityUtils.isAdministrator()) {
projects.addAll(query());
} else {
User user = SecurityUtils.getUser();
if (user != null) {
for (Membership membership: user.getMemberships()) {
for (GroupAuthorization authorization: membership.getGroup().getProjectAuthorizations()) {
@ -477,14 +476,13 @@ public class DefaultProjectManager extends AbstractEntityManager<Project> implem
return projects;
}
private CriteriaQuery<Project> buildCriteriaQuery(Session session, EntityQuery<Project> projectQuery,
@Nullable User user) {
private CriteriaQuery<Project> buildCriteriaQuery(Session session, EntityQuery<Project> projectQuery) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Project> query = builder.createQuery(Project.class);
Root<Project> root = query.from(Project.class);
query.select(root).distinct(true);
query.where(getPredicates(projectQuery.getCriteria(), root, builder, user));
query.where(getPredicates(projectQuery.getCriteria(), root, builder));
List<javax.persistence.criteria.Order> orders = new ArrayList<>();
for (EntitySort sort: projectQuery.getSorts()) {
@ -502,25 +500,25 @@ public class DefaultProjectManager extends AbstractEntityManager<Project> implem
}
private Predicate[] getPredicates(io.onedev.server.search.entity.EntityCriteria<Project> criteria,
Root<Project> root, CriteriaBuilder builder, @Nullable User user) {
Root<Project> root, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if (!User.asSubject(user).isPermitted(new SystemAdministration())) {
Collection<Long> projectIds = getPermittedProjects(user, new AccessProject())
if (!SecurityUtils.isAdministrator()) {
Collection<Long> projectIds = getPermittedProjects(new AccessProject())
.stream().map(it->it.getId()).collect(Collectors.toSet());
if (!projectIds.isEmpty())
predicates.add(root.get(ProjectQueryConstants.ATTR_ID).in(projectIds));
else
predicates.add(builder.disjunction());
}
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder, user));
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder));
return predicates.toArray(new Predicate[0]);
}
@Sessional
@Override
public List<Project> query(User user, EntityQuery<Project> projectQuery, int firstResult, int maxResults) {
CriteriaQuery<Project> criteriaQuery = buildCriteriaQuery(getSession(), projectQuery, user);
public List<Project> query(EntityQuery<Project> projectQuery, int firstResult, int maxResults) {
CriteriaQuery<Project> criteriaQuery = buildCriteriaQuery(getSession(), projectQuery);
Query<Project> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
@ -529,12 +527,12 @@ public class DefaultProjectManager extends AbstractEntityManager<Project> implem
@Sessional
@Override
public int count(User user, io.onedev.server.search.entity.EntityCriteria<Project> projectCriteria) {
public int count(io.onedev.server.search.entity.EntityCriteria<Project> projectCriteria) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
Root<Project> root = criteriaQuery.from(Project.class);
criteriaQuery.where(getPredicates(projectCriteria, root, builder, user));
criteriaQuery.where(getPredicates(projectCriteria, root, builder));
criteriaQuery.select(builder.count(root));
return getSession().createQuery(criteriaQuery).uniqueResult().intValue();

View File

@ -123,7 +123,6 @@ import io.onedev.server.search.entity.EntitySort.Direction;
import io.onedev.server.search.entity.pullrequest.PullRequestQuery;
import io.onedev.server.security.permission.ProjectPermission;
import io.onedev.server.security.permission.ReadCode;
import io.onedev.server.security.permission.SystemAdministration;
import io.onedev.server.security.permission.WriteCode;
import io.onedev.server.util.ProjectAndBranch;
import io.onedev.server.util.ProjectScopedNumber;
@ -952,32 +951,33 @@ public class DefaultPullRequestManager extends AbstractEntityManager<PullRequest
return addedContributions;
}
private Predicate[] getPredicates(io.onedev.server.search.entity.EntityCriteria<PullRequest> criteria,
@Nullable Project targetProject, @Nullable User user, Root<PullRequest> root, CriteriaBuilder builder) {
private Predicate[] getPredicates(@Nullable Project targetProject,
io.onedev.server.search.entity.EntityCriteria<PullRequest> criteria,
Root<PullRequest> root, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if (targetProject != null) {
predicates.add(builder.equal(root.get("targetProject"), targetProject));
} else if (!User.asSubject(user).isPermitted(new SystemAdministration())) {
Collection<Project> projects = projectManager.getPermittedProjects(user, new ReadCode());
} else if (!SecurityUtils.isAdministrator()) {
Collection<Project> projects = projectManager.getPermittedProjects(new ReadCode());
if (!projects.isEmpty())
predicates.add(root.get(PullRequestQueryConstants.ATTR_TARGET_PROJECT).in(projects));
else
predicates.add(builder.disjunction());
}
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder, user));
if (criteria != null)
predicates.add(criteria.getPredicate(root, builder));
return predicates.toArray(new Predicate[0]);
}
private CriteriaQuery<PullRequest> buildCriteriaQuery(Session session, @Nullable Project targetProject,
User user, EntityQuery<PullRequest> requestQuery) {
EntityQuery<PullRequest> requestQuery) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<PullRequest> query = builder.createQuery(PullRequest.class);
Root<PullRequest> root = query.from(PullRequest.class);
query.select(root).distinct(true);
query.where(getPredicates(requestQuery.getCriteria(), targetProject, user, root, builder));
query.where(getPredicates(targetProject, requestQuery.getCriteria(), root, builder));
List<javax.persistence.criteria.Order> orders = new ArrayList<>();
for (EntitySort sort: requestQuery.getSorts()) {
@ -999,9 +999,9 @@ public class DefaultPullRequestManager extends AbstractEntityManager<PullRequest
@Sessional
@Override
public List<PullRequest> query(@Nullable Project targetProject, @Nullable User user,
public List<PullRequest> query(@Nullable Project targetProject,
EntityQuery<PullRequest> requestQuery, int firstResult, int maxResults) {
CriteriaQuery<PullRequest> criteriaQuery = buildCriteriaQuery(getSession(), targetProject, user, requestQuery);
CriteriaQuery<PullRequest> criteriaQuery = buildCriteriaQuery(getSession(), targetProject, requestQuery);
Query<PullRequest> query = getSession().createQuery(criteriaQuery);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
@ -1010,13 +1010,13 @@ public class DefaultPullRequestManager extends AbstractEntityManager<PullRequest
@Sessional
@Override
public int count(@Nullable Project targetProject, @Nullable User user,
public int count(@Nullable Project targetProject,
io.onedev.server.search.entity.EntityCriteria<PullRequest> requestCriteria) {
CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
Root<PullRequest> root = criteriaQuery.from(PullRequest.class);
criteriaQuery.where(getPredicates(requestCriteria, targetProject, user, root, builder));
criteriaQuery.where(getPredicates(targetProject, requestCriteria, root, builder));
criteriaQuery.select(builder.countDistinct(root));
return getSession().createQuery(criteriaQuery).uniqueResult().intValue();

View File

@ -70,7 +70,7 @@ public class BoardSpec implements Serializable {
}
@Editable(order=200, description="Optionally specify a base query to filter/order issues of the board")
@IssueQuery
@IssueQuery(withCurrentUserCriteria = true, withCurrentBuildCriteria = false)
@Nullable
public String getBaseQuery() {
return baseQuery;
@ -82,7 +82,7 @@ public class BoardSpec implements Serializable {
@Editable(order=250, description="Optionally specify a base query to filter/order issues in backlog. "
+ "Backlog issues are those not associating with any milestones")
@IssueQuery
@IssueQuery(withCurrentUserCriteria = true, withCurrentBuildCriteria = false)
@Nullable
public String getBacklogBaseQuery() {
return backlogBaseQuery;

View File

@ -74,7 +74,7 @@ public class BuildSuccessfulTrigger extends TransitionTrigger {
@Editable(order=300, description="Specify an issue query to filter issues eligible for this transition."
+ "This query will be combined with 'from states' criteria of this transition")
@IssueQuery
@IssueQuery(withCurrentUserCriteria = false, withCurrentBuildCriteria = true)
@NotEmpty
public String getIssueQuery() {
return issueQuery;

View File

@ -702,6 +702,10 @@ public class Build extends AbstractEntity implements Referenceable {
}
}
public String getFQN() {
return getProject().getName() + "#" + getNumber();
}
public Collection<String> getOnBranches() {
CommitInfoManager commitInfoManager = OneDev.getInstance(CommitInfoManager.class);
Collection<ObjectId> descendants = commitInfoManager.getDescendants(

View File

@ -505,5 +505,9 @@ public class Issue extends AbstractEntity implements Referenceable, AttachmentSt
public Project getAttachmentProject() {
return getProject();
}
public String getFQN() {
return getProject() + "#" + getNumber();
}
}

View File

@ -868,4 +868,8 @@ public class PullRequest extends AbstractEntity implements Referenceable, Attach
return getTargetProject();
}
public String getFQN() {
return getTargetProject() + "#" + getNumber();
}
}

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Stack;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
@ -15,7 +16,6 @@ import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
@ -38,6 +38,7 @@ import io.onedev.server.model.support.NamedProjectQuery;
import io.onedev.server.model.support.QuerySetting;
import io.onedev.server.model.support.issue.NamedIssueQuery;
import io.onedev.server.model.support.pullrequest.NamedPullRequestQuery;
import io.onedev.server.util.SecurityUtils;
import io.onedev.server.util.jackson.DefaultView;
import io.onedev.server.util.validation.annotation.UserName;
import io.onedev.server.util.watch.QuerySubscriptionSupport;
@ -55,7 +56,16 @@ public class User extends AbstractEntity implements AuthenticationInfo {
public static final Long ROOT_ID = 1L;
@Column(unique=true, nullable=false)
private static ThreadLocal<Stack<User>> stack = new ThreadLocal<Stack<User>>() {
@Override
protected Stack<User> initialValue() {
return new Stack<User>();
}
};
@Column(unique=true, nullable=false)
private String name;
@Column(length=1024, nullable=false)
@ -477,4 +487,20 @@ public class User extends AbstractEntity implements AuthenticationInfo {
return groups;
}
public static void push(User user) {
stack.get().push(user);
}
public static void pop() {
stack.get().pop();
}
@Nullable
public static User get() {
if (!stack.get().isEmpty())
return stack.get().peek();
else
return SecurityUtils.getUser();
}
}

View File

@ -34,7 +34,7 @@ public class NamedBuildQuery implements NamedQuery {
}
@Editable
@BuildQuery
@BuildQuery(withCurrentUserCriteria = true)
@NotEmpty
@Override
public String getQuery() {

View File

@ -29,7 +29,7 @@ public class ProjectBuildSetting implements Serializable {
@Editable(description="Specify builds to preserve. OneDev will run every night to remove builds not matching "
+ "query specified here")
@BuildQuery
@BuildQuery(withCurrentUserCriteria = false)
@NotEmpty
public String getBuildsToPreserve() {
return buildsToPreserve;

View File

@ -16,7 +16,7 @@ public class GlobalProjectSetting implements Serializable {
public GlobalProjectSetting() {
namedQueries.add(new NamedProjectQuery("All projects", "all"));
namedQueries.add(new NamedProjectQuery("My projects", "\"Owner\" is me"));
namedQueries.add(new NamedProjectQuery("My projects", "owned by me"));
}
public List<NamedProjectQuery> getNamedQueries() {

View File

@ -35,7 +35,7 @@ public class NamedIssueQuery implements NamedQuery {
}
@Editable
@IssueQuery
@IssueQuery(withCurrentUserCriteria = true, withCurrentBuildCriteria = false)
@NotEmpty
@Override
public String getQuery() {

View File

@ -9,6 +9,9 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.onedev.commons.launcher.loader.Listen;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.entitymanager.UrlManager;
@ -25,6 +28,8 @@ import io.onedev.server.search.entity.build.BuildQuery;
@Singleton
public class BuildNotificationManager {
private static final Logger logger = LoggerFactory.getLogger(BuildNotificationManager.class);
private final MailManager mailManager;
private final UrlManager urlManager;
@ -89,12 +94,18 @@ public class BuildNotificationManager {
for (Map.Entry<User, Collection<String>> entry: subscribedQueryStrings.entrySet()) {
User user = entry.getKey();
for (String queryString: entry.getValue()) {
User.push(user);
try {
if (BuildQuery.parse(event.getProject(), queryString).matches(build, user)) {
if (BuildQuery.parse(event.getProject(), queryString).matches(build)) {
notifyEmails.add(user.getEmail());
break;
}
} catch (Exception e) {
String message = String.format("Error processing build subscription (user: %s, build: %s, query: %s)",
user.getName(), build.getFQN(), queryString);
logger.error(message, e);
} finally {
User.pop();
}
}
}
@ -114,12 +125,18 @@ public class BuildNotificationManager {
for (Map.Entry<User, Collection<String>> entry: subscribedQueryStrings.entrySet()) {
User user = entry.getKey();
for (String queryString: entry.getValue()) {
User.push(user);
try {
if (BuildQuery.parse(null, queryString).matches(build, user)) {
if (BuildQuery.parse(null, queryString).matches(build)) {
notifyEmails.add(user.getEmail());
break;
}
} catch (Exception e) {
String message = String.format("Error processing build subscription (user: %s, build: %s, query: %s)",
user.getName(), build.getFQN(), queryString);
logger.error(message, e);
} finally {
User.pop();
}
}
}

View File

@ -11,6 +11,8 @@ import javax.inject.Singleton;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.onedev.commons.launcher.loader.Listen;
import io.onedev.server.entitymanager.UrlManager;
@ -20,11 +22,14 @@ import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.model.support.NamedQuery;
import io.onedev.server.persistence.annotation.Sessional;
import io.onedev.server.search.commit.CommitQuery;
@Singleton
public class CommitNotificationManager {
private static final Logger logger = LoggerFactory.getLogger(CommitNotificationManager.class);
private final MailManager mailManager;
private final UrlManager urlManager;
@ -63,12 +68,18 @@ public class CommitNotificationManager {
for (Map.Entry<User, Collection<String>> entry: subscribedQueryStrings.entrySet()) {
User user = entry.getKey();
for (String queryString: entry.getValue()) {
User.push(user);
try {
if (CommitQuery.parse(event.getProject(), queryString).matches(event, user)) {
if (CommitQuery.parse(project, queryString).matches(event)) {
notifyEmails.add(user.getEmail());
break;
}
} catch (Exception e) {
String message = String.format("Error processing commit subscription (user: %s, project: %s, commit: %s, query: %s)",
user.getName(), project.getName(), event.getNewCommitId().name(), queryString);
logger.error(message, e);
} finally {
User.pop();
}
}
}

View File

@ -9,7 +9,6 @@ import com.google.common.base.Preconditions;
import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.util.DateUtils;
public class AfterCriteria extends CommitCriteria {
@ -23,11 +22,6 @@ public class AfterCriteria extends CommitCriteria {
this.values = values;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
for (String value: values)
@ -35,7 +29,7 @@ public class AfterCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
RevCommit commit = event.getProject().getRevCommit(event.getNewCommitId(), true);
for (String value: values) {
if (!commit.getCommitterIdent().getWhen().after(DateUtils.parseRelaxed(value)))

View File

@ -25,15 +25,6 @@ public class AuthorCriteria extends CommitCriteria {
this.values = values;
}
@Override
public boolean needsLogin() {
for (String value: values) {
if (value == null) // authored by me
return true;
}
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
for (String value: values) {
@ -49,11 +40,14 @@ public class AuthorCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
RevCommit commit = event.getProject().getRevCommit(event.getNewCommitId(), true);
String authorEmail = commit.getAuthorIdent().getEmailAddress();
for (String value: values) {
if (value == null) { // authored by me
if (user.getEmail().equals(commit.getAuthorIdent().getEmailAddress()))
if (User.get() == null)
throw new OneException("Please login to perform this query");
else if (User.get().getEmail().equals(authorEmail))
return true;
} else {
if (matches("*" + value + "*", commit.getAuthorIdent()))

View File

@ -9,7 +9,6 @@ import com.google.common.base.Preconditions;
import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.util.DateUtils;
public class BeforeCriteria extends CommitCriteria {
@ -23,11 +22,6 @@ public class BeforeCriteria extends CommitCriteria {
this.values = values;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
for (String value: values)
@ -35,7 +29,7 @@ public class BeforeCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
RevCommit commit = event.getProject().getRevCommit(event.getNewCommitId(), true);
for (String value: values) {
if (!commit.getCommitterIdent().getWhen().before(DateUtils.parseRelaxed(value)))

View File

@ -8,7 +8,6 @@ import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
public abstract class CommitCriteria implements Serializable {
@ -19,10 +18,8 @@ public abstract class CommitCriteria implements Serializable {
return WildcardUtils.matchString(value, formatted);
}
public abstract boolean needsLogin();
public abstract void fill(Project project, RevListCommand command);
public abstract boolean matches(RefUpdated event, User user);
public abstract boolean matches(RefUpdated event);
}

View File

@ -28,7 +28,6 @@ import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.commit.CommitQueryParser.CriteriaContext;
public class CommitQuery implements Serializable {
@ -144,18 +143,14 @@ public class CommitQuery implements Serializable {
return new CommitQuery(criterias);
}
public boolean needsLogin() {
return criterias.stream().anyMatch(it->it.needsLogin());
}
private static String getValue(TerminalNode valueNode) {
return StringUtils.unescape(FenceAware.unfence(valueNode.getText()));
}
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
if (!event.getNewCommitId().equals(ObjectId.zeroId()))
return criterias.stream().allMatch(it->it.matches(event, user));
return criterias.stream().allMatch(it->it.matches(event));
else
return false;
}

View File

@ -25,15 +25,6 @@ public class CommitterCriteria extends CommitCriteria {
this.values = values;
}
@Override
public boolean needsLogin() {
for (String value: values) {
if (value == null) // committed by me
return true;
}
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
for (String value: values) {
@ -49,11 +40,14 @@ public class CommitterCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
RevCommit commit = event.getProject().getRevCommit(event.getNewCommitId(), true);
String committerEmail = commit.getCommitterIdent().getEmailAddress();
for (String value: values) {
if (value == null) { // committed by me
if (user.getEmail().equals(commit.getCommitterIdent().getEmailAddress()))
if (User.get() == null)
throw new OneException("Please login to perform this query");
else if (User.get().getEmail().equals(committerEmail))
return true;
} else {
if (matches("*" + value + "*", commit.getCommitterIdent()))

View File

@ -10,7 +10,7 @@ import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
public class MessageCriteria extends CommitCriteria {
@ -23,11 +23,6 @@ public class MessageCriteria extends CommitCriteria {
this.values = values;
}
@Override
public boolean needsLogin() {
return false;
}
public List<String> getValues() {
return values;
}
@ -39,7 +34,7 @@ public class MessageCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
RevCommit commit = event.getProject().getRevCommit(event.getNewCommitId(), true);
for (String value: values) {
if (WildcardUtils.matchString("*" + value + "*", commit.getFullMessage()))

View File

@ -15,7 +15,7 @@ import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.GitUtils;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
public class PathCriteria extends CommitCriteria {
@ -32,11 +32,6 @@ public class PathCriteria extends CommitCriteria {
return values;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
for (String value: values)
@ -44,7 +39,7 @@ public class PathCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
Project project = event.getProject();
RevCommit commit = project.getRevCommit(event.getNewCommitId(), true);

View File

@ -11,7 +11,6 @@ import com.google.common.base.Preconditions;
import io.onedev.server.event.RefUpdated;
import io.onedev.server.git.command.RevListCommand;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.commit.Revision.Scope;
public class RevisionCriteria extends CommitCriteria {
@ -25,11 +24,6 @@ public class RevisionCriteria extends CommitCriteria {
this.revisions = revisions;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public void fill(Project project, RevListCommand command) {
boolean ranged = false;
@ -52,7 +46,7 @@ public class RevisionCriteria extends CommitCriteria {
}
@Override
public boolean matches(RefUpdated event, User user) {
public boolean matches(RefUpdated event) {
List<Revision> untilRevisions = revisions.stream().filter(it->it.getScope() != Scope.SINCE).collect(Collectors.toList());
if (!untilRevisions.isEmpty()) {
for (Revision revision: untilRevisions) {

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.User;
public class AndCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<T> {
@ -21,31 +21,22 @@ public class AndCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<
}
@Override
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
for (EntityCriteria<T> criteria: criterias)
predicates.add(criteria.getPredicate(root, builder, user));
predicates.add(criteria.getPredicate(root, builder));
return builder.and(predicates.toArray(new Predicate[0]));
}
@Override
public boolean matches(T entity, User user) {
public boolean matches(T entity) {
for (EntityCriteria<T> criteria: criterias) {
if (!criteria.matches(entity, user))
if (!criteria.matches(entity))
return false;
}
return true;
}
@Override
public boolean needsLogin() {
for (EntityCriteria<T> criteria: criterias) {
if (criteria.needsLogin())
return true;
}
return false;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();

View File

@ -5,7 +5,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.Nullable;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
@ -14,7 +13,6 @@ import javax.persistence.criteria.Root;
import edu.emory.mathcs.backport.java.util.Collections;
import io.onedev.commons.utils.RangeBuilder;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.User;
public abstract class EntityCriteria<T extends AbstractEntity> implements Serializable {
@ -22,11 +20,9 @@ public abstract class EntityCriteria<T extends AbstractEntity> implements Serial
public static final int IN_CLAUSE_LIMIT = 1000;
public abstract Predicate getPredicate(Root<T> root, CriteriaBuilder builder, @Nullable User user);
public abstract Predicate getPredicate(Root<T> root, CriteriaBuilder builder);
public abstract boolean matches(T entity, @Nullable User user);
public abstract boolean needsLogin();
public abstract boolean matches(T entity);
protected Predicate inManyValues(CriteriaBuilder builder, Path<Long> attribute, Collection<Long> inValues,
Collection<Long> allValues) {

View File

@ -174,12 +174,8 @@ public abstract class EntityQuery<T extends AbstractEntity> implements Serializa
throw new OneException("Unable to find milestone: " + value);
}
public boolean needsLogin() {
return getCriteria() != null && getCriteria().needsLogin();
}
public boolean matches(T entity, User user) {
return getCriteria() == null || getCriteria().matches(entity, user);
public boolean matches(T entity) {
return getCriteria() == null || getCriteria().matches(entity);
}
@Override

View File

@ -5,7 +5,6 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.User;
public class NotCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<T> {
@ -18,18 +17,13 @@ public class NotCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<
}
@Override
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder, User user) {
return criteria.getPredicate(root, builder, user).not();
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder) {
return criteria.getPredicate(root, builder).not();
}
@Override
public boolean matches(T entity, User user) {
return !criteria.matches(entity, user);
}
@Override
public boolean needsLogin() {
return criteria.needsLogin();
public boolean matches(T entity) {
return !criteria.matches(entity);
}
@Override

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.User;
public class OrCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<T> {
@ -21,26 +21,17 @@ public class OrCriteriaHelper<T extends AbstractEntity> extends EntityCriteria<T
}
@Override
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<T> root, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
for (EntityCriteria<T> criteria: criterias)
predicates.add(criteria.getPredicate(root, builder, user));
predicates.add(criteria.getPredicate(root, builder));
return builder.or(predicates.toArray(new Predicate[0]));
}
@Override
public boolean matches(T entity, User user) {
public boolean matches(T entity) {
for (EntityCriteria<T> criteria: criterias) {
if (criteria.matches(entity, user))
return true;
}
return false;
}
@Override
public boolean needsLogin() {
for (EntityCriteria<T> criteria: criterias) {
if (criteria.needsLogin())
if (criteria.matches(entity))
return true;
}
return false;

View File

@ -7,13 +7,21 @@ import java.util.Optional;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.Issue;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
import io.onedev.server.model.support.NamedQuery;
import io.onedev.server.model.support.QuerySetting;
public abstract class QueryWatchBuilder<T extends AbstractEntity> {
private static final Logger logger = LoggerFactory.getLogger(QueryWatchBuilder.class);
private final Map<String, Optional<EntityQuery<T>>> parsedQueries = new HashMap<>();
private final Map<User, Boolean> watches = new HashMap<>();
@ -42,19 +50,37 @@ public abstract class QueryWatchBuilder<T extends AbstractEntity> {
private boolean matches(@Nullable NamedQuery namedQuery, User user) {
if (namedQuery != null) {
Optional<EntityQuery<T>> entityQuery = parsedQueries.get(namedQuery.getQuery());
if (entityQuery == null) {
try {
entityQuery = Optional.of(parse(namedQuery.getQuery()));
} catch (Exception e) {
entityQuery = Optional.empty();
User.push(user);
try {
Optional<EntityQuery<T>> entityQuery = parsedQueries.get(namedQuery.getQuery());
if (entityQuery == null) {
try {
entityQuery = Optional.of(parse(namedQuery.getQuery()));
} catch (Exception e) {
entityQuery = Optional.empty();
}
parsedQueries.put(namedQuery.getQuery(), entityQuery);
}
parsedQueries.put(namedQuery.getQuery(), entityQuery);
return entityQuery.isPresent() && entityQuery.get().matches(getEntity());
} catch (Exception e) {
String message;
if (getEntity() instanceof Issue) {
Issue issue = (Issue) getEntity();
message = String.format("Error processing watches (user: %s, issue: %s, query: %s)",
user.getName(), issue.getFQN(), namedQuery.getQuery());
} else if (getEntity() instanceof PullRequest) {
PullRequest request = (PullRequest) getEntity();
message = String.format("Error processing watches (user: %s, pull request: %s, query: %s)",
user.getName(), request.getFQN(), namedQuery.getQuery());
} else {
throw new RuntimeException("Unexpected watch entity type: " + getEntity().getClass());
}
logger.error(message, e);
} finally {
User.pop();
}
return entityQuery.isPresent() && entityQuery.get().matches(getEntity(), user);
} else {
return false;
}
}
return false;
}
protected abstract T getEntity();

View File

@ -11,7 +11,7 @@ import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.PullRequestBuild;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class AssociatedWithPullRequestCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_PULL_REQUEST_BUILDS, JoinType.LEFT);
return builder.and(
builder.equal(root.get(BuildQueryConstants.ATTR_PROJECT), request.getTargetProject()),
@ -38,16 +38,11 @@ public class AssociatedWithPullRequestCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getProject().equals(request.getTargetProject())
&& build.getPullRequestBuilds().stream().anyMatch(it -> it.getRequest().equals(request));
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.AssociatedWithPullRequest) + " " + BuildQuery.quote(value);

View File

@ -5,7 +5,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -14,20 +14,15 @@ public class AssociatedWithPullRequestsCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
return builder.isNotEmpty(root.get(BuildQueryConstants.ATTR_PULL_REQUEST_BUILDS));
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return !build.getPullRequestBuilds().isEmpty();
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.AssociatedWithPullRequests);

View File

@ -9,6 +9,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -27,21 +28,16 @@ public class CancelledByCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<User> attribute = root.get(BuildQueryConstants.ATTR_CANCELLER);
return builder.equal(attribute, this.user);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return Objects.equals(build.getCanceller(), this.user);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.CancelledBy) + " " + BuildQuery.quote(value);

View File

@ -5,6 +5,7 @@ import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.OneException;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
@ -15,26 +16,21 @@ public class CancelledByMeCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
if (user != null) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
if (User.get() != null) {
Path<User> attribute = root.get(BuildQueryConstants.ATTR_CANCELLER);
return builder.equal(attribute, user);
return builder.equal(attribute, User.get());
} else {
return builder.disjunction();
throw new OneException("Please login to perform this query");
}
}
@Override
public boolean matches(Build build, User user) {
if (user != null)
return user.equals(build.getCanceller());
public boolean matches(Build build) {
if (User.get() != null)
return User.get().equals(build.getCanceller());
else
return false;
}
@Override
public boolean needsLogin() {
return true;
throw new OneException("Please login to perform this query");
}
@Override

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class CancelledCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.CANCELLED);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.CANCELLED;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Cancelled);

View File

@ -9,7 +9,7 @@ import org.eclipse.jgit.lib.ObjectId;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -27,7 +27,7 @@ public class CommitCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> projectAttribute = BuildQuery.getPath(root, BuildQueryConstants.ATTR_PROJECT);
Path<?> commitAttribute = BuildQuery.getPath(root, BuildQueryConstants.ATTR_COMMIT);
return builder.and(
@ -36,15 +36,10 @@ public class CommitCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getProject().equals(project) && build.getCommitHash().equals(commitId.name());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_COMMIT) + " " + BuildQuery.getRuleName(BuildQueryLexer.Is) + " " + BuildQuery.quote(commitId.name());

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.BuildDependence;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -29,13 +29,13 @@ public class DependenciesOfCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_DEPENDENTS, JoinType.LEFT);
return builder.equal(join.get(BuildDependence.ATTR_DEPENDENT), build);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
for (BuildDependence dependence: this.build.getDependencies()) {
if (dependence.getDependency().equals(build))
return true;
@ -43,11 +43,6 @@ public class DependenciesOfCriteria extends EntityCriteria<Build> {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.DependenciesOf) + " " + BuildQuery.quote(value);

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.BuildDependence;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -29,13 +29,13 @@ public class DependsOnCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_DEPENDENCIES, JoinType.LEFT);
return builder.equal(join.get(BuildDependence.ATTR_DEPENDENCY), build);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
for (BuildDependence dependence: this.build.getDependents()) {
if (dependence.getDependent().equals(build))
return true;
@ -43,11 +43,6 @@ public class DependsOnCriteria extends EntityCriteria<Build> {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.DependsOn) + " " + BuildQuery.quote(value);

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class FailedCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.FAILED);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.FAILED;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Failed);

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class FinishDateCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Date> attribute = root.get(BuildQueryConstants.ATTR_FINISH_DATE);
if (operator == BuildQueryLexer.IsBefore)
return builder.lessThan(attribute, date);
@ -39,18 +39,13 @@ public class FinishDateCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (operator == BuildQueryLexer.IsBefore)
return build.getFinishDate().before(date);
else
return build.getFinishDate().after(date);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_FINISH_DATE) + " "

View File

@ -18,7 +18,7 @@ import io.onedev.server.infomanager.CommitInfoManager;
import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -46,7 +46,7 @@ public class FixedIssueCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Long> attribute = root.get(BuildQueryConstants.ATTR_ID);
Project project = issue.getProject();
Collection<ObjectId> fixCommits = getCommitInfoManager().getFixCommits(project, issue.getNumber());
@ -61,7 +61,7 @@ public class FixedIssueCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (build.getProject().equals(issue.getProject())) {
Collection<ObjectId> fixCommits = getCommitInfoManager().getFixCommits(build.getProject(), issue.getNumber());
for (ObjectId commit: fixCommits) {
@ -73,11 +73,6 @@ public class FixedIssueCriteria extends EntityCriteria<Build> {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.FixedIssue) + " " + BuildQuery.quote(value);

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -22,22 +22,17 @@ public class JobCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<String> attribute = root.get(BuildQueryConstants.ATTR_JOB);
String normalized = jobName.toLowerCase().replace("*", "%");
return builder.like(builder.lower(attribute), normalized);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return WildcardUtils.matchString(jobName.toLowerCase(), build.getJobName().toLowerCase());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_JOB) + " "

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.ProjectScopedNumber;
@ -31,7 +31,7 @@ public class NumberCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Long> attribute = root.get(BuildQueryConstants.ATTR_NUMBER);
Predicate numberPredicate;
if (operator == BuildQueryLexer.Is)
@ -46,7 +46,7 @@ public class NumberCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (build.getProject().equals(number.getProject())) {
if (operator == BuildQueryLexer.Is)
return build.getNumber() == number.getNumber();
@ -59,11 +59,6 @@ public class NumberCriteria extends EntityCriteria<Build> {
}
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_NUMBER) + " "

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.BuildParam;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -28,7 +28,7 @@ public class ParamCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_PARAMS, JoinType.LEFT);
return builder.and(
builder.equal(join.get(BuildParam.ATTR_NAME), name),
@ -36,7 +36,7 @@ public class ParamCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
List<String> paramValues = build.getParamMap().get(name);
if (paramValues == null || paramValues.isEmpty())
return value == null;
@ -44,11 +44,6 @@ public class ParamCriteria extends EntityCriteria<Build> {
return paramValues.contains(value);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(name) + " "

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class PendingCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.PENDING);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.PENDING;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Pending);

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
import io.onedev.server.util.query.ProjectQueryConstants;
@ -24,7 +24,7 @@ public class ProjectCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<String> attribute = root
.join(BuildQueryConstants.ATTR_PROJECT, JoinType.INNER)
.get(ProjectQueryConstants.ATTR_NAME);
@ -33,16 +33,11 @@ public class ProjectCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return WildcardUtils.matchString(projectName.toLowerCase(),
build.getProject().getName().toLowerCase());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_PROJECT) + " "

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class QueueingDateCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Date> attribute = root.get(BuildQueryConstants.ATTR_QUEUEING_DATE);
if (operator == BuildQueryLexer.IsBefore)
return builder.lessThan(attribute, date);
@ -39,18 +39,13 @@ public class QueueingDateCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (operator == BuildQueryLexer.IsBefore)
return build.getPendingDate().before(date);
else
return build.getPendingDate().after(date);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_QUEUEING_DATE) + " "

View File

@ -11,7 +11,7 @@ import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.PullRequestBuild;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class RequiredByPullRequestCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_PULL_REQUEST_BUILDS, JoinType.LEFT);
return builder.and(
@ -40,16 +40,11 @@ public class RequiredByPullRequestCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getProject().equals(request.getTargetProject())
&& build.getPullRequestBuilds().stream().anyMatch(it -> it.getRequest().equals(request) && it.isRequired());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.RequiredByPullRequest) + " " + BuildQuery.quote(value);

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.PullRequestBuild;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -17,21 +17,16 @@ public class RequiredByPullRequestsCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(BuildQueryConstants.ATTR_PULL_REQUEST_BUILDS, JoinType.LEFT);
return builder.equal(join.get(PullRequestBuild.ATTR_REQUIRED), true);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getPullRequestBuilds().stream().anyMatch(it->it.isRequired());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.RequiredByPullRequests);

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class RunningCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.RUNNING);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.RUNNING;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Running);

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class RunningDateCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Date> attribute = root.get(BuildQueryConstants.ATTR_RUNNING_DATE);
if (operator == BuildQueryLexer.IsBefore)
return builder.lessThan(attribute, date);
@ -39,18 +39,13 @@ public class RunningDateCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (operator == BuildQueryLexer.IsBefore)
return build.getRunningDate().before(date);
else
return build.getRunningDate().after(date);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_RUNNING_DATE) + " "

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -30,7 +30,7 @@ public class SubmitDateCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<Date> attribute = root.get(BuildQueryConstants.ATTR_SUBMIT_DATE);
if (operator == BuildQueryLexer.IsBefore)
return builder.lessThan(attribute, date);
@ -39,18 +39,13 @@ public class SubmitDateCriteria extends EntityCriteria<Build> {
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
if (operator == BuildQueryLexer.IsBefore)
return build.getSubmitDate().before(date);
else
return build.getSubmitDate().after(date);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_SUBMIT_DATE) + " "

View File

@ -9,6 +9,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.BuildQueryConstants;
@ -27,21 +28,16 @@ public class SubmittedByCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<User> attribute = root.get(BuildQueryConstants.ATTR_SUBMITTER);
return builder.equal(attribute, this.user);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return Objects.equals(build.getSubmitter(), this.user);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.SubmittedBy) + " " + BuildQuery.quote(value);

View File

@ -5,6 +5,7 @@ import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.OneException;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
@ -15,26 +16,21 @@ public class SubmittedByMeCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
if (user != null) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
if (User.get() != null) {
Path<User> attribute = root.get(BuildQueryConstants.ATTR_SUBMITTER);
return builder.equal(attribute, user);
return builder.equal(attribute, User.get());
} else {
return builder.disjunction();
throw new OneException("Please login to perform this query");
}
}
@Override
public boolean matches(Build build, User user) {
if (user != null)
return user.equals(build.getSubmitter());
public boolean matches(Build build) {
if (User.get() != null)
return User.get().equals(build.getSubmitter());
else
return false;
}
@Override
public boolean needsLogin() {
return true;
throw new OneException("Please login to perform this query");
}
@Override

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class SuccessfulCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.SUCCESSFUL);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.SUCCESSFUL;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Successful);

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class TimedOutCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.TIMED_OUT);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.TIMED_OUT;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.TimedOut);

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -22,23 +22,18 @@ public class VersionCriteria extends EntityCriteria<Build> {
}
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<String> attribute = root.get(BuildQueryConstants.ATTR_VERSION);
String normalized = value.toLowerCase().replace("*", "%");
return builder.like(builder.lower(attribute), normalized);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
String version = build.getVersion();
return version != null && WildcardUtils.matchString(value.toLowerCase(), version.toLowerCase());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.quote(BuildQueryConstants.FIELD_VERSION) + " "

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.BuildQueryConstants;
@ -15,21 +15,16 @@ public class WaitingCriteria extends EntityCriteria<Build> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Build> root, CriteriaBuilder builder) {
Path<?> attribute = root.get(BuildQueryConstants.ATTR_STATUS);
return builder.equal(attribute, Build.Status.WAITING);
}
@Override
public boolean matches(Build build, User user) {
public boolean matches(Build build) {
return build.getStatus() == Build.Status.WAITING;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return BuildQuery.getRuleName(BuildQueryLexer.Waiting);

View File

@ -7,7 +7,7 @@ query
;
criteria
: CreatedByMe #OperatorCriteria
: operator=CreatedByMe #OperatorCriteria
| operator=(CreatedBy|OnCommit) WS+ criteriaValue=Quoted #OperatorValueCriteria
| criteriaField=Quoted WS+ operator=(Is|IsBefore|IsAfter|IsGreaterThan|IsLessThan|Contains) WS+ criteriaValue=Quoted #FieldOperatorValueCriteria
| criteria WS+ And WS+ criteria #AndCriteria

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -22,22 +22,17 @@ public class ContentCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Expression<String> attribute = root.get(CodeCommentQueryConstants.ATTR_CONTENT);
return builder.like(builder.lower(attribute), "%" + value.toLowerCase().replace('*', '%') + "%");
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
String content = comment.getContent();
return WildcardUtils.matchString("*" + value.toLowerCase() + "*", content);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_CONTENT) + " "

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -29,7 +29,7 @@ public class CreateDateCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<Date> attribute = root.get(CodeCommentQueryConstants.ATTR_CREATE_DATE);
if (operator == CodeCommentQueryLexer.IsBefore)
return builder.lessThan(attribute, value);
@ -38,18 +38,13 @@ public class CreateDateCriteria extends EntityCriteria<CodeComment> {
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
if (operator == CodeCommentQueryLexer.IsBefore)
return comment.getCreateDate().before(value);
else
return comment.getCreateDate().after(value);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_CREATE_DATE) + " "

View File

@ -27,21 +27,16 @@ public class CreatedByCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<User> attribute = root.get(CodeCommentQueryConstants.ATTR_USER);
return builder.equal(attribute, this.user);
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
return Objects.equals(comment.getUser(), this.user);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.getRuleName(CodeCommentQueryLexer.CreatedBy)

View File

@ -5,6 +5,7 @@ import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.OneException;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
@ -15,26 +16,21 @@ public class CreatedByMeCriteria extends EntityCriteria<CodeComment> {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
if (user != null) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
if (User.get() != null) {
Path<?> attribute = root.get(CodeCommentQueryConstants.ATTR_USER);
return builder.equal(attribute, user);
return builder.equal(attribute, User.get());
} else {
return builder.disjunction();
throw new OneException("Please login to perform this query");
}
}
@Override
public boolean matches(CodeComment comment, User user) {
if (user != null)
return user.equals(comment.getUser());
public boolean matches(CodeComment comment) {
if (User.get() != null)
return User.get().equals(comment.getUser());
else
return false;
}
@Override
public boolean needsLogin() {
return true;
throw new OneException("Please login to perform this query");
}
@Override

View File

@ -9,7 +9,7 @@ import org.eclipse.jgit.lib.ObjectId;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -27,7 +27,7 @@ public class OnCommitCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<?> projectAttribute = CodeCommentQuery.getPath(root, CodeCommentQueryConstants.ATTR_PROJECT);
Path<?> commitAttribute = CodeCommentQuery.getPath(root, CodeCommentQueryConstants.ATTR_COMMIT);
return builder.and(
@ -36,16 +36,11 @@ public class OnCommitCriteria extends EntityCriteria<CodeComment> {
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
return comment.getProject().equals(project)
&& comment.getMarkPos().getCommit().equals(commitId.name());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.getRuleName(CodeCommentQueryLexer.OnCommit) + " " + CodeCommentQuery.quote(commitId.name());

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -22,7 +22,7 @@ public class PathCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<String> attribute = CodeCommentQuery.getPath(root, CodeCommentQueryConstants.ATTR_PATH);
String normalized = value.toLowerCase().replace('*', '%');
if (normalized.endsWith("/"))
@ -31,15 +31,10 @@ public class PathCriteria extends EntityCriteria<CodeComment> {
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
return WildcardUtils.matchPath(value.toLowerCase(), comment.getMarkPos().getPath().toLowerCase());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_PATH) + " "

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -24,7 +24,7 @@ public class ReplyCountCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<Integer> attribute = root.get(CodeCommentQueryConstants.ATTR_REPLY_COUNT);
if (operator == CodeCommentQueryLexer.Is)
return builder.equal(attribute, value);
@ -35,7 +35,7 @@ public class ReplyCountCriteria extends EntityCriteria<CodeComment> {
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
if (operator == CodeCommentQueryLexer.Is)
return comment.getReplyCount() == value;
else if (operator == CodeCommentQueryLexer.IsLessThan)
@ -44,11 +44,6 @@ public class ReplyCountCriteria extends EntityCriteria<CodeComment> {
return comment.getReplyCount() > value;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_REPLY_COUNT) + " " + CodeCommentQuery.getRuleName(operator) + " " + CodeCommentQuery.quote(String.valueOf(value));

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.CodeCommentReply;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -25,14 +25,14 @@ public class ReplyCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(CodeCommentQueryConstants.ATTR_REPLIES, JoinType.LEFT);
Path<String> attribute = join.get(CodeCommentReply.ATTR_CONTENT);
return builder.like(builder.lower(attribute), "%" + value.toLowerCase().replace('*', '%') + "%");
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
for (CodeCommentReply reply: comment.getReplies()) {
String content = reply.getContent();
if (WildcardUtils.matchString("*" + value.toLowerCase() + "*", content))
@ -41,11 +41,6 @@ public class ReplyCriteria extends EntityCriteria<CodeComment> {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_REPLY) + " " + CodeCommentQuery.getRuleName(CodeCommentQueryLexer.Contains) + " " + CodeCommentQuery.quote(value);

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.util.query.CodeCommentQueryConstants;
@ -29,7 +29,7 @@ public class UpdateDateCriteria extends EntityCriteria<CodeComment> {
}
@Override
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<CodeComment> root, CriteriaBuilder builder) {
Path<Date> attribute = CodeCommentQuery.getPath(root, CodeCommentQueryConstants.ATTR_UPDATE_DATE);
if (operator == CodeCommentQueryLexer.IsBefore)
return builder.lessThan(attribute, value);
@ -38,21 +38,18 @@ public class UpdateDateCriteria extends EntityCriteria<CodeComment> {
}
@Override
public boolean matches(CodeComment comment, User user) {
public boolean matches(CodeComment comment) {
if (operator == CodeCommentQueryLexer.IsBefore)
return comment.getUpdateDate().before(value);
else
return comment.getUpdateDate().after(value);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_UPDATE_DATE) + " " + CodeCommentQuery.getRuleName(operator) + " " + CodeCommentQuery.quote(rawValue);
return CodeCommentQuery.quote(CodeCommentQueryConstants.FIELD_UPDATE_DATE) + " "
+ CodeCommentQuery.getRuleName(operator) + " "
+ CodeCommentQuery.quote(rawValue);
}
}

View File

@ -12,7 +12,6 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.AndCriteriaHelper;
import io.onedev.server.search.entity.ParensAware;
import io.onedev.server.util.ValueSetEdit;
@ -29,18 +28,13 @@ public class AndCriteria extends IssueCriteria implements ParensAware {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
return new AndCriteriaHelper<Issue>(criterias).getPredicate(root, builder, user);
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
return new AndCriteriaHelper<Issue>(criterias).getPredicate(root, builder);
}
@Override
public boolean matches(Issue issue, User user) {
return new AndCriteriaHelper<Issue>(criterias).matches(issue, user);
}
@Override
public boolean needsLogin() {
return new AndCriteriaHelper<Issue>(criterias).needsLogin();
public boolean matches(Issue issue) {
return new AndCriteriaHelper<Issue>(criterias).matches(issue);
}
@Override

View File

@ -9,7 +9,7 @@ import javax.persistence.criteria.Predicate;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.User;
public class BooleanFieldCriteria extends FieldCriteria {
@ -23,20 +23,15 @@ public class BooleanFieldCriteria extends FieldCriteria {
}
@Override
public Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
public Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
return builder.equal(field.get(IssueField.ATTR_VALUE), String.valueOf(value));
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
return Objects.equals(value, issue.getFieldValue(getFieldName()));
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " " + IssueQuery.getRuleName(IssueQueryLexer.Is) + " " + IssueQuery.quote(String.valueOf(value));

View File

@ -11,7 +11,7 @@ import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.IssueQueryConstants;
@ -30,23 +30,18 @@ public class BuildFieldCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
return builder.and(
builder.equal(field.getParent().get(IssueQueryConstants.ATTR_PROJECT), build.getProject()),
builder.equal(field.get(IssueField.ATTR_ORDINAL), build.getNumber()));
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Object fieldValue = issue.getFieldValue(getFieldName());
return issue.getProject().equals(build.getProject()) && Objects.equals(fieldValue, build.getNumber());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " "

View File

@ -15,8 +15,8 @@ import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.User;
import io.onedev.server.model.support.administration.GlobalIssueSetting;
import io.onedev.server.util.ValueSetEdit;
import io.onedev.server.util.inputspec.choiceinput.choiceprovider.SpecifiedChoices;
import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
@ -42,7 +42,7 @@ public class ChoiceFieldCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
if (allowMultiple) {
return builder.equal(field.get(IssueField.ATTR_VALUE), value);
} else {
@ -57,7 +57,7 @@ public class ChoiceFieldCriteria extends FieldCriteria {
@SuppressWarnings("unchecked")
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Object fieldValue = issue.getFieldValue(getFieldName());
if (allowMultiple) {
return ((List<String>)fieldValue).contains(value);
@ -71,11 +71,6 @@ public class ChoiceFieldCriteria extends FieldCriteria {
}
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " " + IssueQuery.getRuleName(operator) + " " + IssueQuery.quote(value);

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
public class CommentCountCriteria extends IssueCriteria {
@ -23,7 +23,7 @@ public class CommentCountCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Path<Integer> attribute = root.get(IssueQueryConstants.ATTR_COMMENT_COUNT);
if (operator == IssueQueryLexer.Is)
return builder.equal(attribute, value);
@ -34,7 +34,7 @@ public class CommentCountCriteria extends IssueCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
if (operator == IssueQueryLexer.Is)
return issue.getCommentCount() == value;
else if (operator == IssueQueryLexer.IsGreaterThan)
@ -43,11 +43,6 @@ public class CommentCountCriteria extends IssueCriteria {
return issue.getCommentCount() < value;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_COMMENT_COUNT) + " "

View File

@ -9,7 +9,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueComment;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
public class CommentCriteria extends IssueCriteria {
@ -23,14 +23,14 @@ public class CommentCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
From<?, ?> join = root.join(IssueQueryConstants.ATTR_COMMENTS, JoinType.LEFT);
Path<String> attribute = join.get(IssueComment.PATH_CONTENT);
return builder.like(builder.lower(attribute), "%" + value.toLowerCase() + "%");
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
for (IssueComment comment: issue.getComments()) {
if (comment.getContent().toLowerCase().contains(value.toLowerCase()))
return true;
@ -38,11 +38,6 @@ public class CommentCriteria extends IssueCriteria {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_COMMENT) + " "

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Predicate;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
public class DateFieldCriteria extends FieldCriteria {
@ -29,7 +29,7 @@ public class DateFieldCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
if (operator == IssueQueryLexer.IsBefore)
return builder.lessThan(field.get(IssueField.ATTR_ORDINAL), date.getTime());
else
@ -37,7 +37,7 @@ public class DateFieldCriteria extends FieldCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Date fieldValue = (Date) issue.getFieldValue(getFieldName());
if (operator == IssueQueryLexer.IsBefore)
return fieldValue != null && fieldValue.before(date);
@ -45,11 +45,6 @@ public class DateFieldCriteria extends FieldCriteria {
return fieldValue != null && fieldValue.after(date);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " " + IssueQuery.getRuleName(operator)

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
public class DescriptionCriteria extends IssueCriteria {
@ -21,22 +21,17 @@ public class DescriptionCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Expression<String> attribute = root.get(IssueQueryConstants.ATTR_DESCRIPTION);
return builder.like(builder.lower(attribute), "%" + value.toLowerCase().replace('*', '%') + "%");
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
String description = issue.getDescription();
return description != null && WildcardUtils.matchString("*" + value.toLowerCase() + "*", description);
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_DESCRIPTION) + " "

View File

@ -14,8 +14,8 @@ import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.User;
import io.onedev.server.model.support.administration.GlobalIssueSetting;
import io.onedev.server.util.query.IssueQueryConstants;
public abstract class FieldCriteria extends IssueCriteria {
@ -33,13 +33,13 @@ public abstract class FieldCriteria extends IssueCriteria {
}
@Override
public final Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public final Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Join<?, ?> join = root.join(IssueQueryConstants.ATTR_FIELDS, JoinType.LEFT);
Predicate namePredicate = builder.equal(join.get(IssueField.ATTR_NAME), getFieldName());
return builder.and(namePredicate, getValuePredicate(join, builder, user));
return builder.and(namePredicate, getValuePredicate(join, builder));
}
protected abstract Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user);
protected abstract Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder);
@Override
public Collection<String> getUndefinedFields() {

View File

@ -10,6 +10,7 @@ import javax.persistence.criteria.Join;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import io.onedev.server.OneException;
import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
@ -29,15 +30,15 @@ public class FieldOperatorCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
Path<?> attribute = field.get(IssueField.ATTR_VALUE);
if (operator == IssueQueryLexer.IsEmpty) {
return builder.isNull(attribute);
} else if (operator == IssueQueryLexer.IsMe) {
if (user != null)
return builder.equal(attribute, user.getName());
if (User.get() != null)
return builder.equal(attribute, User.get().getName());
else
return builder.disjunction();
throw new OneException("Please login to perform this query");
} else {
Build build = Build.get();
if (build != null) {
@ -51,21 +52,21 @@ public class FieldOperatorCriteria extends FieldCriteria {
return builder.disjunction();
}
} else {
return builder.disjunction();
throw new OneException("No build in query context");
}
}
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Object fieldValue = issue.getFieldValue(getFieldName());
if (operator == IssueQueryLexer.IsEmpty) {
return fieldValue == null;
} else if (operator == IssueQueryLexer.IsMe) {
if (user != null)
return Objects.equals(fieldValue, user.getName());
if (User.get() != null)
return Objects.equals(fieldValue, User.get().getName());
else
return false;
throw new OneException("Please login to perform this query");
} else {
Build build = Build.get();
if (build != null) {
@ -77,16 +78,11 @@ public class FieldOperatorCriteria extends FieldCriteria {
.anyMatch(it->it.equals(fieldValue));
}
} else {
return false;
throw new OneException("No build in query context");
}
}
}
@Override
public boolean needsLogin() {
return operator == IssueQueryLexer.IsMe;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " " + IssueQuery.getRuleName(operator);

View File

@ -26,7 +26,7 @@ import io.onedev.server.git.GitUtils;
import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.IssueUtils;
import io.onedev.server.util.ProjectAwareCommitId;
@ -79,7 +79,7 @@ public class FixedBetweenCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Set<Long> fixedIssueNumbers = new HashSet<>();
Repository repository = project.getRepository();
@ -114,7 +114,7 @@ public class FixedBetweenCriteria extends IssueCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
if (project.equals(issue.getProject())) {
Repository repository = issue.getProject().getRepository();
ObjectId mergeBaseId = GitUtils.getMergeBase(repository, firstCommitId, secondCommitId);
@ -138,11 +138,6 @@ public class FixedBetweenCriteria extends IssueCriteria {
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return getRuleName(IssueQueryLexer.FixedBetween) + " "

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.IssueQueryConstants;
@ -33,7 +33,7 @@ public class FixedInCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Collection<Long> fixedIssueNumbers = build.getFixedIssueNumbers();
if (!fixedIssueNumbers.isEmpty()) {
return builder.and(
@ -45,16 +45,11 @@ public class FixedInCriteria extends IssueCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
return issue.getProject().equals(build.getProject())
&& build.getFixedIssueNumbers().contains(issue.getNumber());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.getRuleName(IssueQueryLexer.FixedInBuild) + " " + IssueQuery.quote(value);

View File

@ -4,35 +4,29 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.OneException;
import io.onedev.server.model.Build;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
public class FixedInCurrentBuildCriteria extends IssueCriteria {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
Build build = Build.get();
if (build != null)
return new FixedInCriteria(build).getPredicate(root, builder, user);
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
if (Build.get() != null)
return new FixedInCriteria(Build.get()).getPredicate(root, builder);
else
return builder.disjunction();
throw new OneException("No build in query context");
}
@Override
public boolean matches(Issue issue, User user) {
Build build = Build.get();
if (build != null)
return new FixedInCriteria(build).matches(issue, user);
public boolean matches(Issue issue) {
if (Build.get() != null)
return new FixedInCriteria(Build.get()).matches(issue);
else
return false;
}
@Override
public boolean needsLogin() {
return false;
throw new OneException("No build in query context");
}
@Override

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Predicate;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.query.IssueQueryConstants;
@ -29,23 +29,18 @@ public class IssueFieldCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
return builder.and(
builder.equal(field.getParent().get(IssueQueryConstants.ATTR_PROJECT), issue.getProject()),
builder.equal(field.get(IssueField.ATTR_ORDINAL), issue.getNumber()));
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Object fieldValue = issue.getFieldValue(getFieldName());
return issue.getProject().equals(this.issue.getProject()) && Objects.equals(fieldValue, this.issue.getNumber());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " "

View File

@ -35,7 +35,6 @@ import io.onedev.server.issue.fieldspec.TextField;
import io.onedev.server.issue.fieldspec.UserChoiceField;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.model.support.administration.GlobalIssueSetting;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.search.entity.EntitySort;
@ -404,13 +403,8 @@ public class IssueQuery extends EntityQuery<Issue> {
}
@Override
public boolean needsLogin() {
return criteria != null && criteria.needsLogin();
}
@Override
public boolean matches(Issue issue, User user) {
return criteria == null || criteria.matches(issue, user);
public boolean matches(Issue issue) {
return criteria == null || criteria.matches(issue);
}
public static String getRuleName(int rule) {

View File

@ -11,7 +11,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Milestone;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
public class MilestoneCriteria extends IssueCriteria {
@ -25,25 +25,20 @@ public class MilestoneCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Path<String> attribute = root.join(IssueQueryConstants.ATTR_MILESTONE, JoinType.LEFT).get(Milestone.ATTR_NAME);
String normalized = milestoneName.toLowerCase().replace("*", "%");
return builder.like(builder.lower(attribute), normalized);
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
if (issue.getMilestone() != null)
return WildcardUtils.matchString(milestoneName.toLowerCase(), issue.getMilestone().getName().toLowerCase());
else
return false;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_MILESTONE) + " "

View File

@ -6,7 +6,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
public class MilestoneIsEmptyCriteria extends IssueCriteria {
@ -14,20 +14,15 @@ public class MilestoneIsEmptyCriteria extends IssueCriteria {
private static final long serialVersionUID = 1L;
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
return builder.isNull(root.join(IssueQueryConstants.ATTR_MILESTONE, JoinType.LEFT));
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
return issue.getMilestone() == null;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_MILESTONE) + " "

View File

@ -7,7 +7,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.NotCriteriaHelper;
import io.onedev.server.util.ValueSetEdit;
import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue;
@ -23,18 +23,13 @@ public class NotCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
return new NotCriteriaHelper<Issue>(criteria).getPredicate(root, builder, user);
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
return new NotCriteriaHelper<Issue>(criteria).getPredicate(root, builder);
}
@Override
public boolean matches(Issue issue, User user) {
return new NotCriteriaHelper<Issue>(criteria).matches(issue, user);
}
@Override
public boolean needsLogin() {
return new NotCriteriaHelper<Issue>(criteria).needsLogin();
public boolean matches(Issue issue) {
return new NotCriteriaHelper<Issue>(criteria).matches(issue);
}
@Override

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.util.ProjectScopedNumber;
import io.onedev.server.util.query.IssueQueryConstants;
@ -30,7 +30,7 @@ public class NumberCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Path<Long> attribute = root.get(IssueQueryConstants.ATTR_NUMBER);
Predicate numberPredicate;
@ -47,7 +47,7 @@ public class NumberCriteria extends IssueCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
if (issue.getProject().equals(number.getProject())) {
if (operator == IssueQueryLexer.Is)
return issue.getNumber() == number.getNumber();
@ -60,11 +60,6 @@ public class NumberCriteria extends IssueCriteria {
}
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_NUMBER) + " "

View File

@ -10,7 +10,7 @@ import javax.persistence.criteria.Predicate;
import io.onedev.server.model.Issue;
import io.onedev.server.model.IssueField;
import io.onedev.server.model.User;
public class NumericFieldCriteria extends FieldCriteria {
@ -27,7 +27,7 @@ public class NumericFieldCriteria extends FieldCriteria {
}
@Override
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder, User user) {
protected Predicate getValuePredicate(Join<?, ?> field, CriteriaBuilder builder) {
Path<Integer> attribute = field.get(IssueField.ATTR_ORDINAL);
if (operator == IssueQueryLexer.Is)
return builder.equal(attribute, value);
@ -38,7 +38,7 @@ public class NumericFieldCriteria extends FieldCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
Integer fieldValue = (Integer) issue.getFieldValue(getFieldName());
if (operator == IssueQueryLexer.Is)
return Objects.equals(fieldValue, value);
@ -48,11 +48,6 @@ public class NumericFieldCriteria extends FieldCriteria {
return fieldValue != null && fieldValue < value;
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(getFieldName()) + " " + IssueQuery.getRuleName(operator) + " "

View File

@ -12,7 +12,7 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.search.entity.OrCriteriaHelper;
import io.onedev.server.search.entity.ParensAware;
import io.onedev.server.util.ValueSetEdit;
@ -29,18 +29,13 @@ public class OrCriteria extends IssueCriteria implements ParensAware {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
return new OrCriteriaHelper<Issue>(criterias).getPredicate(root, builder, user);
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
return new OrCriteriaHelper<Issue>(criterias).getPredicate(root, builder);
}
@Override
public boolean matches(Issue issue, User user) {
return new OrCriteriaHelper<Issue>(criterias).matches(issue, user);
}
@Override
public boolean needsLogin() {
return new OrCriteriaHelper<Issue>(criterias).needsLogin();
public boolean matches(Issue issue) {
return new OrCriteriaHelper<Issue>(criterias).matches(issue);
}
@Override

View File

@ -8,7 +8,7 @@ import javax.persistence.criteria.Root;
import io.onedev.commons.utils.match.WildcardUtils;
import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.util.query.IssueQueryConstants;
import io.onedev.server.util.query.ProjectQueryConstants;
@ -23,7 +23,7 @@ public class ProjectCriteria extends IssueCriteria {
}
@Override
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder, User user) {
public Predicate getPredicate(Root<Issue> root, CriteriaBuilder builder) {
Path<String> attribute = root
.join(IssueQueryConstants.ATTR_PROJECT, JoinType.INNER)
.get(ProjectQueryConstants.ATTR_NAME);
@ -32,16 +32,11 @@ public class ProjectCriteria extends IssueCriteria {
}
@Override
public boolean matches(Issue issue, User user) {
public boolean matches(Issue issue) {
return WildcardUtils.matchString(projectName.toLowerCase(),
issue.getProject().getName().toLowerCase());
}
@Override
public boolean needsLogin() {
return false;
}
@Override
public String toString() {
return IssueQuery.quote(IssueQueryConstants.FIELD_PROJECT) + " "

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