Associate user belongings with unknown account when user is deleted

This commit is contained in:
Robin Shen 2021-07-21 22:54:02 +08:00
parent 4bc51d9a09
commit 184409f558
57 changed files with 297 additions and 337 deletions

View File

@ -53,8 +53,6 @@ import io.onedev.server.util.schedule.TaskScheduler;
public class OneDev extends AbstractPlugin implements Serializable {
public static final String NAME = "OneDev";
private static final Logger logger = LoggerFactory.getLogger(OneDev.class);
private final Provider<JettyLauncher> jettyLauncherProvider;

View File

@ -822,7 +822,6 @@ public class DefaultJobManager implements JobManager, Runnable, CodePullAuthoriz
build.setSubmitter(SecurityUtils.getUser());
build.setSubmitReason(reason);
build.setCanceller(null);
build.setCancellerName(null);
buildParamManager.deleteParams(build);
for (Map.Entry<String, List<String>> entry: paramMap.entrySet()) {

View File

@ -47,6 +47,14 @@ public interface UserManager extends EntityManager<User> {
*/
User getSystem();
/**
* Find unknown user in the system.
*
* @return
* unknown user. Never be <tt>null</tt>
*/
User getUnknown();
/**
* Find user of specified name.
* <p>

View File

@ -58,7 +58,6 @@ import io.onedev.commons.launcher.loader.ListenerRegistry;
import io.onedev.commons.utils.ExceptionUtils;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.LockUtils;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.BuildManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.entitymanager.PullRequestAssignmentManager;
@ -318,7 +317,7 @@ public class DefaultPullRequestManager extends BaseEntityManager<PullRequest> im
mergeCommit = targetHeadCommit;
for (RevCommit commit: commits) {
PersonIdent committer = commit.getCommitterIdent();
if (committer.getName().equals(OneDev.NAME) && committer.getEmailAddress().length() == 0
if (committer.getName().equals(User.SYSTEM_NAME) && committer.getEmailAddress().length() == 0
|| !commit.getParent(0).equals(mergeCommit)) {
CommitBuilder commitBuilder = new CommitBuilder();
commitBuilder.setAuthor(commit.getAuthorIdent());

View File

@ -156,6 +156,12 @@ public class DefaultUserManager extends BaseEntityManager<User> implements UserM
return load(User.SYSTEM_ID);
}
@Sessional
@Override
public User getUnknown() {
return load(User.UNKNOWN_ID);
}
@Transactional
@Override
public void delete(User user) {
@ -181,82 +187,74 @@ public class DefaultUserManager extends BaseEntityManager<User> implements UserM
usage.checkInUse("User '" + user.getName() + "'");
Query<?> query = getSession().createQuery("update PullRequest set submitter=null, submitterName=:submitterName "
+ "where submitter=:submitter");
Query<?> query = getSession().createQuery("update PullRequest set submitter=:unknown where submitter=:submitter");
query.setParameter("submitter", user);
query.setParameter("submitterName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update Build set submitter=null, submitterName=:submitterName "
+ "where submitter=:submitter");
query = getSession().createQuery("update Build set submitter=:unknown where submitter=:submitter");
query.setParameter("submitter", user);
query.setParameter("submitterName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update Build set canceller=null, cancellerName=:cancellerName "
+ "where canceller=:canceller");
query = getSession().createQuery("update Build set canceller=:unknown where canceller=:canceller");
query.setParameter("canceller", user);
query.setParameter("cancellerName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update PullRequest set closeInfo.user=null, "
+ "closeInfo.userName=:userName where closeInfo.user=:user");
query = getSession().createQuery("update PullRequest set closeInfo.user=:unknown where closeInfo.user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update PullRequest set lastUpdate.user=null, "
+ "lastUpdate.userName=:userName where lastUpdate.user=:user");
query = getSession().createQuery("update PullRequest set lastUpdate.user=:unknown where lastUpdate.user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update PullRequestChange set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update PullRequestChange set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update PullRequestComment set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update PullRequestComment set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update CodeComment set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update CodeComment set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update CodeComment set lastUpdate.user=null, lastUpdate.userName=:userName "
+ "where lastUpdate.user=:user");
query = getSession().createQuery("update CodeComment set lastUpdate.user=:unknown where lastUpdate.user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update CodeCommentReply set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update CodeCommentReply set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update Issue set submitter=null, submitterName=:submitterName "
+ "where submitter=:submitter");
query = getSession().createQuery("update Issue set submitter=:unknown where submitter=:submitter");
query.setParameter("submitter", user);
query.setParameter("submitterName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update Issue set lastUpdate.user=null, lastUpdate.userName=:userName "
+ "where lastUpdate.user=:user");
query = getSession().createQuery("update Issue set lastUpdate.user=:unknown where lastUpdate.user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update IssueComment set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update IssueComment set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
query = getSession().createQuery("update IssueChange set user=null, userName=:userName where user=:user");
query = getSession().createQuery("update IssueChange set user=:unknown where user=:user");
query.setParameter("user", user);
query.setParameter("userName", user.getDisplayName());
query.setParameter("unknown", getUnknown());
query.executeUpdate();
dao.remove(user);
@ -307,7 +305,7 @@ public class DefaultUserManager extends BaseEntityManager<User> implements UserM
@Override
public List<User> query() {
EntityCriteria<User> criteria = newCriteria();
criteria.add(Restrictions.not(Restrictions.eq("id", User.SYSTEM_ID)));
criteria.add(Restrictions.gt("id", 0L));
criteria.setCacheable(true);
return query(criteria);
}

View File

@ -106,11 +106,20 @@ public class DefaultDataManager implements DataManager, Serializable {
if (system == null) {
system = new User();
system.setId(User.SYSTEM_ID);
system.setName(OneDev.NAME);
system.setEmail("no email");
system.setName(User.SYSTEM_NAME);
system.setEmail("system email");
system.setPassword("no password");
userManager.replicate(system);
}
User unknown = userManager.get(User.UNKNOWN_ID);
if (unknown == null) {
unknown = new User();
unknown.setId(User.UNKNOWN_ID);
unknown.setName(User.UNKNOWN_NAME);
unknown.setEmail("unknown email");
unknown.setPassword("no password");
userManager.replicate(unknown);
}
User administrator = userManager.get(User.ROOT_ID);
if (administrator == null) {
administrator = new User();

View File

@ -32,6 +32,7 @@ import io.onedev.commons.launcher.bootstrap.Bootstrap;
import io.onedev.commons.utils.FileUtils;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.model.User;
import io.onedev.server.util.Pair;
@Singleton
@ -2600,5 +2601,103 @@ public class DataMigrator {
}
}
}
private void useUnknownUser(Element element, String field) {
Element userNameElement = element.element(field + "Name");
if (userNameElement != null) {
userNameElement.detach();
if (element.element(field) == null)
element.addElement(field).setText("-2");
}
}
private void migrate61(File dataDir, Stack<Integer> versions) {
for (File file: dataDir.listFiles()) {
if (file.getName().startsWith("PullRequests.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements()) {
useUnknownUser(element.element("lastUpdate"), "user");
useUnknownUser(element, "submitter");
}
dom.writeToFile(file, false);
} else if (file.getName().startsWith("Builds.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements()) {
useUnknownUser(element, "submitter");
useUnknownUser(element, "canceller");
}
dom.writeToFile(file, false);
} else if (file.getName().startsWith("CodeComments.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements()) {
useUnknownUser(element.element("lastUpdate"), "user");
useUnknownUser(element, "user");
}
dom.writeToFile(file, false);
} else if (file.getName().startsWith("CodeCommentReplys.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements())
useUnknownUser(element, "user");
dom.writeToFile(file, false);
} else if (file.getName().startsWith("Issues.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements()) {
useUnknownUser(element.element("lastUpdate"), "user");
useUnknownUser(element, "submitter");
}
dom.writeToFile(file, false);
} else if (file.getName().startsWith("IssueChanges.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements())
useUnknownUser(element, "user");
dom.writeToFile(file, false);
} else if (file.getName().startsWith("PullRequestChanges.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements())
useUnknownUser(element, "user");
dom.writeToFile(file, false);
} else if (file.getName().startsWith("IssueComments.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements())
useUnknownUser(element, "user");
dom.writeToFile(file, false);
} else if (file.getName().startsWith("PullRequestComments.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements())
useUnknownUser(element, "user");
dom.writeToFile(file, false);
} else if (file.getName().startsWith("Users.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element: dom.getRootElement().elements()) {
if (element.elementTextTrim("id").equals("-1"))
element.element("email").setText("system email");
}
if (file.getName().equals("Users.xml")) {
Element element = dom.getRootElement().addElement("io.onedev.server.model.User");
element.addAttribute("revision", "0.0");
element.addElement("id").setText("-2");
element.addElement("name").setText("Unknown");
element.addElement("password").setText("no password");
element.addElement("ssoInfo").addElement("subject").setText(UUID.randomUUID().toString());
element.addElement("email").setText("unknown email");
element.addElement("alternateEmails");
element.addElement("accessToken").setText(RandomStringUtils.randomAlphanumeric(User.ACCESS_TOKEN_LEN));
element.addElement("userProjectQueries");
element.addElement("userIssueQueries");
element.addElement("userIssueQueryWatches");
element.addElement("issueQueryWatches");
element.addElement("userPullRequestQueries");
element.addElement("userPullRequestQueryWatches");
element.addElement("pullRequestQueryWatches");
element.addElement("userBuildQueries");
element.addElement("userBuildQuerySubscriptions");
element.addElement("buildQuerySubscriptions");
}
dom.writeToFile(file, false);
}
}
}
}

View File

@ -1,6 +1,5 @@
package io.onedev.server.model;
import static io.onedev.server.model.Build.PROP_CANCELLER_NAME;
import static io.onedev.server.model.Build.PROP_COMMIT;
import static io.onedev.server.model.Build.PROP_FINISH_DATE;
import static io.onedev.server.model.Build.PROP_FINISH_DAY;
@ -10,7 +9,6 @@ import static io.onedev.server.model.Build.PROP_PENDING_DATE;
import static io.onedev.server.model.Build.PROP_REF_NAME;
import static io.onedev.server.model.Build.PROP_RUNNING_DATE;
import static io.onedev.server.model.Build.PROP_STATUS;
import static io.onedev.server.model.Build.PROP_SUBMITTER_NAME;
import static io.onedev.server.model.Build.PROP_SUBMIT_DATE;
import static io.onedev.server.model.Build.PROP_VERSION;
@ -102,8 +100,8 @@ import io.onedev.server.web.util.WicketUtils;
@Entity
@Table(
indexes={@Index(columnList="o_project_id"), @Index(columnList="o_submitter_id"), @Index(columnList="o_canceller_id"),
@Index(columnList="o_request_id"), @Index(columnList=PROP_SUBMITTER_NAME),
@Index(columnList=PROP_CANCELLER_NAME), @Index(columnList=PROP_COMMIT),
@Index(columnList="o_request_id"),
@Index(columnList=PROP_COMMIT),
@Index(columnList=PROP_NUMBER), @Index(columnList=PROP_JOB),
@Index(columnList=PROP_STATUS), @Index(columnList=PROP_REF_NAME),
@Index(columnList=PROP_SUBMIT_DATE), @Index(columnList=PROP_PENDING_DATE),
@ -271,15 +269,12 @@ public class Build extends AbstractEntity implements Referenceable {
private Project project;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
private User submitter;
private String submitterName;
@ManyToOne(fetch=FetchType.LAZY)
private User canceller;
private String cancellerName;
@Column(nullable=false)
private String jobName;
@ -377,7 +372,6 @@ public class Build extends AbstractEntity implements Referenceable {
this.project = project;
}
@Nullable
public User getSubmitter() {
return submitter;
}
@ -386,24 +380,6 @@ public class Build extends AbstractEntity implements Referenceable {
this.submitter = submitter;
}
@Nullable
public String getSubmitterName() {
return submitterName;
}
public void setSubmitterName(String submitterName) {
this.submitterName = submitterName;
}
@Nullable
public String getCancellerName() {
return cancellerName;
}
public void setCancellerName(String cancellerName) {
this.cancellerName = cancellerName;
}
@Nullable
public User getCanceller() {
return canceller;

View File

@ -93,11 +93,9 @@ public class CodeComment extends AbstractEntity implements AttachmentStorageSupp
private Project project;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
private User user;
private String userName;
@Column(nullable=false, length=MAX_CONTENT_LEN)
private String content;
@ -143,7 +141,6 @@ public class CodeComment extends AbstractEntity implements AttachmentStorageSupp
this.request = request;
}
@Nullable
public User getUser() {
return user;
}
@ -152,15 +149,6 @@ public class CodeComment extends AbstractEntity implements AttachmentStorageSupp
this.user = user;
}
@Nullable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}

View File

@ -28,11 +28,9 @@ public class CodeCommentReply extends AbstractEntity {
private CodeComment comment;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
private User user;
private String userName;
@Column(nullable=false)
private Date date;
@ -56,15 +54,6 @@ public class CodeCommentReply extends AbstractEntity {
this.user = user;
}
@Nullable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getDate() {
return date;
}

View File

@ -4,9 +4,9 @@ import static io.onedev.server.model.Issue.PROP_COMMENT_COUNT;
import static io.onedev.server.model.Issue.PROP_NO_SPACE_TITLE;
import static io.onedev.server.model.Issue.PROP_NUMBER;
import static io.onedev.server.model.Issue.PROP_STATE;
import static io.onedev.server.model.Issue.PROP_UUID;
import static io.onedev.server.model.Issue.PROP_SUBMIT_DATE;
import static io.onedev.server.model.Issue.PROP_TITLE;
import static io.onedev.server.model.Issue.PROP_UUID;
import static io.onedev.server.model.Issue.PROP_VOTE_COUNT;
import java.io.Serializable;
@ -191,10 +191,9 @@ public class Issue extends AbstractEntity implements Referenceable, AttachmentSt
private Milestone milestone;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
private User submitter;
private String submitterName;
@Column(nullable=false)
private Date submitDate = new Date();
@ -329,15 +328,6 @@ public class Issue extends AbstractEntity implements Referenceable, AttachmentSt
this.submitter = submitter;
}
@Nullable
public String getSubmitterName() {
return submitterName;
}
public void setSubmitterName(String submitterName) {
this.submitterName = submitterName;
}
public Date getSubmitDate() {
return submitDate;
}

View File

@ -2,6 +2,7 @@ package io.onedev.server.model;
import java.util.Date;
import javax.annotation.Nullable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
@ -25,11 +26,8 @@ public class IssueChange extends AbstractEntity {
private Issue issue;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
private User user;
private String userName;
@Column(nullable=false)
private Date date;
@ -45,6 +43,7 @@ public class IssueChange extends AbstractEntity {
this.issue = issue;
}
@Nullable
public User getUser() {
return user;
}
@ -53,14 +52,6 @@ public class IssueChange extends AbstractEntity {
this.user = user;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getDate() {
return date;
}

View File

@ -28,11 +28,9 @@ public class IssueComment extends AbstractEntity {
private Issue issue;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
private User user;
private String userName;
@Column(nullable=false)
private Date date = new Date();
@ -55,14 +53,6 @@ public class IssueComment extends AbstractEntity {
this.user = user;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getDate() {
return date;
}

View File

@ -25,7 +25,7 @@ public class IssueVote extends AbstractEntity {
private Issue issue;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
private User user;
@Column(nullable=false)

View File

@ -86,7 +86,7 @@ import io.onedev.server.web.util.WicketUtils;
@Index(columnList=LastUpdate.COLUMN_DATE), @Index(columnList="o_sourceProject_id"),
@Index(columnList="o_submitter_id"), @Index(columnList=MergePreview.COLUMN_HEAD_COMMIT_HASH),
@Index(columnList=CloseInfo.COLUMN_DATE), @Index(columnList=CloseInfo.COLUMN_STATUS),
@Index(columnList=CloseInfo.COLUMN_USER), @Index(columnList=CloseInfo.COLUMN_USER_NAME),
@Index(columnList=CloseInfo.COLUMN_USER),
@Index(columnList="o_numberScope_id")},
uniqueConstraints={@UniqueConstraint(columnNames={"o_numberScope_id", PROP_NUMBER})})
//use dynamic update in order not to overwrite other edits while background threads change update date
@ -221,13 +221,10 @@ public class PullRequest extends AbstractEntity implements Referenceable, Attach
private String description;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
@OptimisticLock(excluded=true)
private User submitter;
@OptimisticLock(excluded=true)
private String submitterName;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
private Project numberScope;
@ -363,7 +360,6 @@ public class PullRequest extends AbstractEntity implements Referenceable, Attach
* @return
* the user submitting the pull request
*/
@Nullable
public User getSubmitter() {
return submitter;
}
@ -372,11 +368,6 @@ public class PullRequest extends AbstractEntity implements Referenceable, Attach
this.submitter = submitter;
}
@Nullable
public String getSubmitterName() {
return submitterName;
}
public Project getNumberScope() {
return numberScope;
}

View File

@ -25,11 +25,8 @@ public class PullRequestChange extends AbstractEntity {
private PullRequest request;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
private User user;
private String userName;
@Column(nullable=false)
private Date date;
@ -62,15 +59,6 @@ public class PullRequestChange extends AbstractEntity {
this.user = user;
}
@Nullable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getDate() {
return date;
}

View File

@ -30,11 +30,9 @@ public class PullRequestComment extends AbstractEntity {
private PullRequest request;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn
@JoinColumn(nullable=false)
private User user;
private String userName;
@Column(nullable=false, length=MAX_CONTENT_LEN)
private String content;
@ -49,7 +47,6 @@ public class PullRequestComment extends AbstractEntity {
this.request = request;
}
@Nullable
public User getUser() {
return user;
}
@ -58,15 +55,6 @@ public class PullRequestComment extends AbstractEntity {
this.user = user;
}
@Nullable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}

View File

@ -72,10 +72,16 @@ public class User extends AbstractEntity implements AuthenticationInfo, NameAwar
public static final int ACCESS_TOKEN_LEN = 40;
public static final Long UNKNOWN_ID = -2L;
public static final Long SYSTEM_ID = -1L;
public static final Long ROOT_ID = 1L;
public static final String SYSTEM_NAME = "OneDev";
public static final String UNKNOWN_NAME = "Unknown";
public static final String EXTERNAL_MANAGED = "external_managed";
public static final String PROP_NAME = "name";
@ -561,6 +567,10 @@ public class User extends AbstractEntity implements AuthenticationInfo, NameAwar
return SYSTEM_ID.equals(getId());
}
public boolean isUnknown() {
return UNKNOWN_ID.equals(getId());
}
public Collection<UserAuthorization> getAuthorizations() {
return authorizations;
}
@ -591,17 +601,6 @@ public class User extends AbstractEntity implements AuthenticationInfo, NameAwar
return groups;
}
public static User from(@Nullable User user, @Nullable String displayName) {
if (user == null) {
user = new User();
if (displayName != null)
user.setName(displayName);
else
user.setName("Unknown");
}
return user;
}
public static void push(User user) {
stack.get().push(user);
}

View File

@ -3,6 +3,7 @@ package io.onedev.server.model.support;
import java.io.Serializable;
import java.util.Date;
import javax.annotation.Nullable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
@ -33,10 +34,6 @@ public class LastUpdate implements Serializable {
@OptimisticLock(excluded=true)
private User user;
@Column(name=COLUMN_USER_NAME)
@OptimisticLock(excluded=true)
private String userName;
@Column(name=COLUMN_DATE, nullable=false)
@OptimisticLock(excluded=true)
private Date date;
@ -45,6 +42,7 @@ public class LastUpdate implements Serializable {
@OptimisticLock(excluded=true)
private String activity;
@Nullable
public User getUser() {
return user;
}
@ -53,14 +51,6 @@ public class LastUpdate implements Serializable {
this.user = user;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getDate() {
return date;
}

View File

@ -7,16 +7,16 @@ import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import io.onedev.commons.utils.WordUtils;
import io.onedev.server.OneDev;
import io.onedev.server.git.GitUtils;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
public enum MergeStrategy {
CREATE_MERGE_COMMIT("Add all commits from source branch to target branch with a merge commit.") {
@Override
public ObjectId merge(PullRequest request, String commitMessage) {
PersonIdent user = new PersonIdent(OneDev.NAME, "");
PersonIdent user = new PersonIdent(User.SYSTEM_NAME, "");
Repository repository = request.getTargetProject().getRepository();
ObjectId requestHead = request.getLatestUpdate().getHeadCommit();
ObjectId targetHead = request.getTarget().getObjectId();
@ -35,7 +35,7 @@ public enum MergeStrategy {
if (GitUtils.isMergedInto(repository, null, targetHead, requestHead)) {
return requestHead;
} else {
PersonIdent user = new PersonIdent(OneDev.NAME, "");
PersonIdent user = new PersonIdent(User.SYSTEM_NAME, "");
return GitUtils.merge(repository, targetHead, requestHead, false, user, user,
commitMessage, false);
}
@ -49,7 +49,7 @@ public enum MergeStrategy {
Repository repository = request.getTargetProject().getRepository();
ObjectId requestHead = request.getLatestUpdate().getHeadCommit();
ObjectId targetHead = request.getTarget().getObjectId();
PersonIdent committer = new PersonIdent(OneDev.NAME, "");
PersonIdent committer = new PersonIdent(User.SYSTEM_NAME, "");
PersonIdent author = request.getSubmitter().asPerson();
return GitUtils.merge(repository, targetHead, requestHead, true, committer, author,
commitMessage, false);
@ -63,7 +63,7 @@ public enum MergeStrategy {
Repository repository = request.getTargetProject().getRepository();
ObjectId requestHead = request.getLatestUpdate().getHeadCommit();
ObjectId targetHead = request.getTarget().getObjectId();
PersonIdent user = new PersonIdent(OneDev.NAME, "");
PersonIdent user = new PersonIdent(User.SYSTEM_NAME, "");
return GitUtils.rebase(repository, requestHead, targetHead, user);
}

View File

@ -272,7 +272,7 @@ public class UserResource {
throw new InvalidParamException("Count should not be greater than " + RestConstants.MAX_PAGE_SIZE);
EntityCriteria<User> criteria = EntityCriteria.of(User.class);
criteria.add(Restrictions.not(Restrictions.eq("id", User.SYSTEM_ID)));
criteria.add(Restrictions.gt("id", 0L));
if (name != null)
criteria.add(Restrictions.ilike("name", name.replace('*', '%'), MatchMode.EXACT));
if (fullName != null)

View File

@ -17,6 +17,7 @@ import org.slf4j.LoggerFactory;
import com.google.common.net.HttpHeaders;
import io.onedev.server.OneDev;
import io.onedev.server.model.User;
import io.onedev.server.web.ExpectedExceptionContribution;
public class ExceptionUtils extends io.onedev.commons.utils.ExceptionUtils {
@ -47,7 +48,7 @@ public class ExceptionUtils extends io.onedev.commons.utils.ExceptionUtils {
private static void requireAuthentication(HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
String authcHeader = HttpServletRequest.BASIC_AUTH + " realm=\"" + OneDev.NAME + "\"";
String authcHeader = HttpServletRequest.BASIC_AUTH + " realm=\"" + User.SYSTEM_NAME + "\"";
response.setHeader(HttpHeaders.WWW_AUTHENTICATE, authcHeader);
}

View File

@ -8,6 +8,7 @@ import javax.validation.ConstraintValidatorContext;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.User;
import io.onedev.server.persistence.SessionManager;
import io.onedev.server.util.validation.annotation.UserName;
@ -36,7 +37,7 @@ public class UserNameValidator implements ConstraintValidator<UserName, String>
}
constraintContext.buildConstraintViolationWithTemplate(message).addConstraintViolation();
return false;
} else if (value.equals("new") || value.equals(OneDev.NAME)) {
} else if (value.equals("new") || value.equals(User.SYSTEM_NAME) || value.equals(User.UNKNOWN_NAME)) {
constraintContext.disableDefaultConstraintViolation();
String message = this.message;
if (message.length() == 0)
@ -61,7 +62,8 @@ public class UserNameValidator implements ConstraintValidator<UserName, String>
if (suffix > 1)
suggestedUserName += suffix;
if (!suggestedUserName.equals("new")
&& !suggestedUserName.equals(OneDev.NAME)
&& !suggestedUserName.equals(User.SYSTEM_NAME)
&& !suggestedUserName.equals(User.UNKNOWN_NAME)
&& userManager.findByName(suggestedUserName) == null) {
return suggestedUserName;
}

View File

@ -12,8 +12,6 @@ import io.onedev.server.util.facade.UserFacade;
public interface AvatarManager {
String getAvatarUrl(@Nullable Long userId, String displayName);
String getAvatarUrl(User user);
String getAvatarUrl(PersonIdent personIdent);

View File

@ -20,7 +20,6 @@ import io.onedev.commons.launcher.bootstrap.Bootstrap;
import io.onedev.commons.utils.FileUtils;
import io.onedev.commons.utils.LockUtils;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.Project;
@ -49,18 +48,11 @@ public class DefaultAvatarManager implements AvatarManager {
@Sessional
@Override
public String getAvatarUrl(User user) {
return getAvatarUrl(user.getId(), user.getDisplayName());
}
@Sessional
@Override
public String getAvatarUrl(Long userId, String displayName) {
if (userId == null) {
if (user.isUnknown()) {
return AVATARS_BASE_URL + "user.png";
} else if (userId.equals(User.SYSTEM_ID)) {
} else if (user.isSystem()) {
return AVATARS_BASE_URL + "onedev.png";
} else {
User user = OneDev.getInstance(UserManager.class).load(userId);
File uploadedFile = getUploaded(new UserFacade(user));
if (uploadedFile.exists())
return AVATARS_BASE_URL + "uploaded/users/" + user.getId() + ".jpg?version=" + uploadedFile.lastModified();
@ -75,7 +67,7 @@ public class DefaultAvatarManager implements AvatarManager {
@Override
public String getAvatarUrl(PersonIdent personIdent) {
if (StringUtils.isBlank(personIdent.getEmailAddress())) {
if (personIdent.getName().equals(OneDev.NAME))
if (personIdent.getName().equals(User.SYSTEM_NAME))
return AVATARS_BASE_URL + "onedev.png";
else
return AVATARS_BASE_URL + "user.png";

View File

@ -31,7 +31,6 @@ import io.onedev.server.git.GitUtils;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
@ -67,13 +66,11 @@ public abstract class BuildSidePanel extends Panel {
@Override
protected void onBeforeRender() {
User submitter = User.from(getBuild().getSubmitter(), getBuild().getSubmitterName());
addOrReplace(new UserIdentPanel("submitter", submitter, Mode.NAME));
User canceller = User.from(getBuild().getCanceller(), getBuild().getCancellerName());
UserIdentPanel cancellerIdentPanel = new UserIdentPanel("canceller", canceller, Mode.NAME);
cancellerIdentPanel.setVisible(getBuild().getStatus() == Build.Status.CANCELLED
&& (getBuild().getCanceller() != null || getBuild().getCancellerName() != null));
addOrReplace(cancellerIdentPanel);
addOrReplace(new UserIdentPanel("submitter", getBuild().getSubmitter(), Mode.NAME));
if (getBuild().getStatus() == Build.Status.CANCELLED && getBuild().getCanceller() != null)
addOrReplace(new UserIdentPanel("canceller", getBuild().getCanceller(), Mode.NAME));
else
addOrReplace(new WebMarkupContainer("canceller").setVisible(false));
super.onBeforeRender();
}

View File

@ -45,7 +45,6 @@ import io.onedev.server.entitymanager.CodeCommentManager;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
import io.onedev.server.model.support.LastUpdate;
import io.onedev.server.search.entity.EntityCriteria;
import io.onedev.server.search.entity.EntitySort;
@ -401,9 +400,8 @@ public abstract class CodeCommentListPanel extends Panel {
Fragment fragment = new Fragment(componentId, "lastUpdateFrag", CodeCommentListPanel.this);
LastUpdate lastUpdate = comment.getLastUpdate();
if (lastUpdate.getUser() != null || lastUpdate.getUserName() != null) {
User user = User.from(lastUpdate.getUser(), lastUpdate.getUserName());
fragment.add(new UserIdentPanel("user", user, Mode.NAME));
if (lastUpdate.getUser() != null) {
fragment.add(new UserIdentPanel("user", lastUpdate.getUser(), Mode.NAME));
} else {
fragment.add(new WebMarkupContainer("user").setVisible(false));
}

View File

@ -99,9 +99,8 @@ public abstract class CodeCommentPanel extends Panel {
}));
User user = User.from(getComment().getUser(), getComment().getUserName());
commentContainer.add(new UserIdentPanel("userAvatar", user, Mode.AVATAR));
commentContainer.add(new Label("userName", user.getDisplayName()));
commentContainer.add(new UserIdentPanel("userAvatar", getComment().getUser(), Mode.AVATAR));
commentContainer.add(new Label("userName", getComment().getUser().getDisplayName()));
commentContainer.add(new Label("action", "commented"));
commentContainer.add(new Label("date", DateUtils.formatAge(getComment().getCreateDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(getComment().getCreateDate()))));
@ -248,9 +247,8 @@ public abstract class CodeCommentPanel extends Panel {
replyContainer.setMarkupId(reply.getAnchor());
replyContainer.add(AttributeAppender.append("name", reply.getAnchor()));
User user = User.from(reply.getUser(), reply.getUserName());
replyContainer.add(new UserIdentPanel("userAvatar", user, Mode.AVATAR));
replyContainer.add(new Label("userName", user.getDisplayName()));
replyContainer.add(new UserIdentPanel("userAvatar", reply.getUser(), Mode.AVATAR));
replyContainer.add(new Label("userName", reply.getUser().getDisplayName()));
replyContainer.add(new Label("action", "replied"));
replyContainer.add(new Label("date", DateUtils.formatAge(reply.getDate()))

View File

@ -48,10 +48,7 @@ public class IssueChangeActivity implements IssueActivity {
@Override
public User getUser() {
if (getChange().getUser() != null || getChange().getUserName() != null)
return User.from(getChange().getUser(), getChange().getUserName());
else
return null;
return getChange().getUser();
}
}

View File

@ -23,8 +23,6 @@ class IssueChangePanel extends GenericPanel<IssueChange> {
IssueChange change = getModelObject();
if (change.getUser() != null)
add(new Label("user", change.getUser().getDisplayName()));
else if (change.getUserName() != null)
add(new Label("user", change.getUserName()));
else
add(new WebMarkupContainer("user").setVisible(false));

View File

@ -60,7 +60,7 @@ public class IssueCommentedActivity implements IssueActivity {
@Override
public User getUser() {
return User.from(getComment().getUser(), getComment().getUserName());
return getComment().getUser();
}
}

View File

@ -36,8 +36,7 @@ class IssueCommentedPanel extends GenericPanel<IssueComment> {
protected void onInitialize() {
super.onInitialize();
User user = User.from(getComment().getUser(), getComment().getUserName());
add(new Label("user", user.getDisplayName()));
add(new Label("user", getComment().getUser().getDisplayName()));
add(new Label("age", DateUtils.formatAge(getComment().getDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(getComment().getDate()))));

View File

@ -48,7 +48,7 @@ public class IssueOpenedActivity implements IssueActivity {
@Override
public User getUser() {
return User.from(getIssue().getSubmitter(), getIssue().getSubmitterName());
return getIssue().getSubmitter();
}
}

View File

@ -34,7 +34,7 @@ class IssueOpenedPanel extends GenericPanel<Issue> {
super.onInitialize();
Issue issue = getIssue();
add(new Label("user", User.from(issue.getSubmitter(), issue.getSubmitterName()).getDisplayName()));
add(new Label("user", issue.getSubmitter().getDisplayName()));
add(new Label("age", DateUtils.formatAge(issue.getSubmitDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(issue.getSubmitDate()))));

View File

@ -75,8 +75,11 @@ public abstract class FieldValuesPanel extends Panel implements EditContext {
protected void populateItem(ListItem<String> item) {
String value = item.getModelObject();
if (getField().getType().equals(FieldSpec.USER)) {
User user = User.from(OneDev.getInstance(UserManager.class).findByName(value), value);
item.add(new UserIdentPanel("value", user, userFieldDisplayMode));
User user = OneDev.getInstance(UserManager.class).findByName(value);
if (user != null)
item.add(new UserIdentPanel("value", user, userFieldDisplayMode));
else
item.add(new Label("value", value));
} else if (getField().getType().equals(FieldSpec.ISSUE)) {
Issue issue = OneDev.getInstance(IssueManager.class)
.find(getIssue().getProject(), Long.valueOf(value));

View File

@ -61,7 +61,6 @@ import io.onedev.server.imports.IssueImporter;
import io.onedev.server.imports.IssueImporterContribution;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.model.support.LastUpdate;
import io.onedev.server.model.support.administration.GlobalIssueSetting;
import io.onedev.server.model.support.issue.field.spec.ChoiceField;
@ -1195,12 +1194,10 @@ public abstract class IssueListPanel extends Panel {
fragment.add(fieldsView);
LastUpdate lastUpdate = issue.getLastUpdate();
if (lastUpdate.getUser() != null || lastUpdate.getUserName() != null) {
User user = User.from(lastUpdate.getUser(), lastUpdate.getUserName());
fragment.add(new UserIdentPanel("user", user, Mode.NAME));
} else {
if (lastUpdate.getUser() != null)
fragment.add(new UserIdentPanel("user", lastUpdate.getUser(), Mode.NAME));
else
fragment.add(new WebMarkupContainer("user").setVisible(false));
}
fragment.add(new Label("activity", lastUpdate.getActivity()));
fragment.add(new Label("date", DateUtils.formatAge(lastUpdate.getDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(lastUpdate.getDate()))));

View File

@ -55,7 +55,6 @@ import io.onedev.server.entitymanager.PullRequestReviewManager;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.PullRequestReview;
import io.onedev.server.model.User;
import io.onedev.server.model.support.LastUpdate;
import io.onedev.server.search.entity.EntityQuery;
import io.onedev.server.search.entity.EntitySort;
@ -618,12 +617,10 @@ public abstract class PullRequestListPanel extends Panel {
}
LastUpdate lastUpdate = request.getLastUpdate();
if (lastUpdate.getUser() != null || lastUpdate.getUserName() != null) {
User user = User.from(lastUpdate.getUser(), lastUpdate.getUserName());
fragment.add(new UserIdentPanel("user", user, Mode.NAME));
} else {
if (lastUpdate.getUser() != null)
fragment.add(new UserIdentPanel("user", lastUpdate.getUser(), Mode.NAME));
else
fragment.add(new WebMarkupContainer("user").setVisible(false));
}
fragment.add(new Label("activity", lastUpdate.getActivity()));
fragment.add(new Label("date", DateUtils.formatAge(lastUpdate.getDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(lastUpdate.getDate()))));

View File

@ -1,7 +1,5 @@
package io.onedev.server.web.component.user;
import javax.annotation.Nullable;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebComponent;
@ -18,14 +16,10 @@ public class UserAvatar extends WebComponent {
private boolean system;
public UserAvatar(String id, @Nullable Long userId, String displayName) {
super(id);
url = getAvatarManager().getAvatarUrl(userId, displayName);
system = (userId != null && userId == -1);
}
public UserAvatar(String id, User user) {
this(id, user.getId(), user.getDisplayName());
super(id);
url = getAvatarManager().getAvatarUrl(user);
system = user.isSystem();
}
public UserAvatar(String id, PersonIdent personIdent) {

View File

@ -39,7 +39,7 @@ public class AvatarEditPanel extends GenericPanel<User> {
protected void onInitialize() {
super.onInitialize();
add(new UserAvatar("avatar", getUser().getId(), getUser().getDisplayName()));
add(new UserAvatar("avatar", getUser()));
add(new Link<Void>("useDefault") {

View File

@ -11,6 +11,7 @@ import org.unbescape.html.HtmlEscape;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.User;
import io.onedev.server.util.facade.UserFacade;
import io.onedev.server.web.component.user.UserAvatar;
@ -47,7 +48,7 @@ public class PersonCardPanel extends Panel {
builder.append("<div>" + HtmlEscape.escapeHtml5(displayName) + " <i>(" + gitRole + ")</i></div>");
if (StringUtils.isBlank(personIdent.getEmailAddress())) {
if (personIdent.getName().equals(OneDev.NAME))
if (personIdent.getName().equals(User.SYSTEM_NAME))
builder.append("<i>System Account</i>");
else
builder.append("<i>No OneDev Account</i>");

View File

@ -1,12 +1,11 @@
package io.onedev.server.web.component.user.card;
import javax.annotation.Nullable;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.unbescape.html.HtmlEscape;
import io.onedev.server.OneDev;
@ -15,18 +14,26 @@ import io.onedev.server.model.User;
import io.onedev.server.web.component.user.UserAvatar;
@SuppressWarnings("serial")
public class UserCardPanel extends Panel {
public class UserCardPanel extends GenericPanel<User> {
private final Long userId;
private final String displayName;
public UserCardPanel(String id, @Nullable Long userId, String displayName) {
public UserCardPanel(String id, User user) {
super(id);
this.userId = userId;
this.displayName = displayName;
Long userId = user.getId();
setModel(new LoadableDetachableModel<User>() {
@Override
protected User load() {
return OneDev.getInstance(UserManager.class).load(userId);
}
});
}
private User getUser() {
return getModelObject();
}
@Override
protected void onInitialize() {
super.onInitialize();
@ -34,19 +41,17 @@ public class UserCardPanel extends Panel {
WebMarkupContainer container = new WebMarkupContainer("container");
add(container);
container.add(new UserAvatar("avatar", userId, displayName));
container.add(new UserAvatar("avatar", getUser()));
StringBuilder builder = new StringBuilder();
builder.append("<div>" + HtmlEscape.escapeHtml5(displayName) + "</div>");
builder.append("<div>" + HtmlEscape.escapeHtml5(getUser().getDisplayName()) + "</div>");
if (userId == null) {
builder.append("<i>No OneDev account</i>");
} else if (User.SYSTEM_ID.equals(userId)) {
if (getUser().isUnknown())
builder.append("<i>Unknown Account</i>");
else if (getUser().isSystem())
builder.append("<i>System Account</i>");
} else {
User user = OneDev.getInstance(UserManager.class).load(userId);
builder.append("<i>@" + HtmlEscape.escapeHtml5(user.getName()) + "</i>");
}
else
builder.append("<i>@" + HtmlEscape.escapeHtml5(getUser().getDisplayName()) + "</i>");
container.add(new Label("info", builder.toString()).setEscapeModelStrings(false));
}

View File

@ -6,8 +6,11 @@ import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.LoadableDetachableModel;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.User;
import io.onedev.server.web.behavior.dropdown.DropdownHoverBehavior;
import io.onedev.server.web.component.floating.AlignPlacement;
@ -15,27 +18,35 @@ import io.onedev.server.web.component.user.UserAvatar;
import io.onedev.server.web.component.user.card.UserCardPanel;
@SuppressWarnings("serial")
public class UserIdentPanel extends Panel {
public class UserIdentPanel extends GenericPanel<User> {
private final Long userId;
private final String displayName;
private final Mode mode;
public UserIdentPanel(String id, User user, Mode mode) {
super(id);
userId = user.getId();
displayName = user.getDisplayName();
this.mode = mode;
Long userId = user.getId();
setModel(new LoadableDetachableModel<User>() {
@Override
protected User load() {
return OneDev.getInstance(UserManager.class).load(userId);
}
});
}
private User getUser() {
return getModelObject();
}
@Override
protected void onInitialize() {
super.onInitialize();
add(new UserAvatar("avatar", userId, displayName).setVisible(mode != Mode.NAME));
add(new Label("name", displayName).setVisible(mode != Mode.AVATAR));
add(new UserAvatar("avatar", getUser()).setVisible(mode != Mode.NAME));
add(new Label("name", getUser().getDisplayName()).setVisible(mode != Mode.AVATAR));
add(AttributeAppender.append("class", "user"));
@ -43,7 +54,7 @@ public class UserIdentPanel extends Panel {
@Override
protected Component newContent(String id) {
return new UserCardPanel(id, userId, displayName);
return new UserCardPanel(id, getUser());
}
});

View File

@ -75,7 +75,7 @@ public class UserListPage extends AdministrationPage {
private EntityCriteria<User> getCriteria() {
EntityCriteria<User> criteria = EntityCriteria.of(User.class);
criteria.add(Restrictions.not(Restrictions.eq("id", User.SYSTEM_ID)));
criteria.add(Restrictions.gt("id", 0L));
if (query != null) {
criteria.add(Restrictions.or(
Restrictions.ilike("name", query, MatchMode.ANYWHERE),

View File

@ -15,7 +15,8 @@ import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import io.onedev.commons.utils.ExplicitException;
import com.google.common.base.Preconditions;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.User;
@ -45,8 +46,7 @@ public abstract class UserPage extends AdministrationPage {
throw new RestartResponseException(UserListPage.class);
Long userId = Long.valueOf(userIdString);
if (userId == User.SYSTEM_ID)
throw new ExplicitException("System user is not accessible");
Preconditions.checkArgument(userId > 0);
userModel = new LoadableDetachableModel<User>() {

View File

@ -249,7 +249,7 @@ abstract class BoardColumnPanel extends Panel implements EditContext {
WebMarkupContainer head = new WebMarkupContainer("head");
if (user != null) {
head.add(new WebMarkupContainer("title").setVisible(false));
head.add(new UserIdentPanel("userIdent", User.from(user, user.getDisplayName()), Mode.AVATAR_AND_NAME));
head.add(new UserIdentPanel("userIdent", user, Mode.AVATAR_AND_NAME));
} else {
head.add(new Label("title", title).setEscapeModelStrings(false));
head.add(new WebMarkupContainer("userIdent").setVisible(false));

View File

@ -1014,8 +1014,7 @@ public abstract class PullRequestDetailPage extends ProjectPage implements PullR
});
User submitter = User.from(request.getSubmitter(), request.getSubmitterName());
statusAndBranchesContainer.add(new UserIdentPanel("user", submitter, Mode.NAME));
statusAndBranchesContainer.add(new UserIdentPanel("user", request.getSubmitter(), Mode.NAME));
statusAndBranchesContainer.add(new Label("date", DateUtils.formatAge(request.getSubmitDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(request.getSubmitDate()))));

View File

@ -49,10 +49,7 @@ public class PullRequestChangeActivity implements PullRequestActivity {
@Override
public User getUser() {
if (getChange().getUser() != null || getChange().getUserName() != null)
return User.from(getChange().getUser(), getChange().getUserName());
else
return null;
return getChange().getUser();
}
}

View File

@ -28,8 +28,6 @@ class PullRequestChangePanel extends GenericPanel<PullRequestChange> {
if (change.getUser() != null)
add(new Label("user", change.getUser().getDisplayName()));
else if (change.getUserName() != null)
add(new Label("user", change.getUserName()));
else
add(new WebMarkupContainer("user").setVisible(false));

View File

@ -57,7 +57,7 @@ public class PullRequestCommentedActivity implements PullRequestActivity {
@Override
public User getUser() {
return User.from(getComment().getUser(), getComment().getUserName());
return getComment().getUser();
}
}

View File

@ -39,7 +39,7 @@ class PullRequestCommentedPanel extends GenericPanel<PullRequestComment> {
protected void onInitialize() {
super.onInitialize();
add(new Label("user", User.from(getComment().getUser(), getComment().getUserName()).getDisplayName()));
add(new Label("user", getComment().getUser().getDisplayName()));
add(new Label("age", DateUtils.formatAge(getComment().getDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(getComment().getDate()))));

View File

@ -49,7 +49,7 @@ public class PullRequestOpenedActivity implements PullRequestActivity {
@Override
public User getUser() {
return User.from(getRequest().getSubmitter(), getRequest().getSubmitterName());
return getRequest().getSubmitter();
}
}

View File

@ -34,7 +34,7 @@ class PullRequestOpenedPanel extends GenericPanel<PullRequest> {
super.onInitialize();
PullRequest request = getPullRequest();
add(new Label("user", User.from(request.getSubmitter(), request.getSubmitterName()).getDisplayName()));
add(new Label("user", request.getSubmitter().getDisplayName()));
add(new Label("age", DateUtils.formatAge(request.getSubmitDate()))
.add(new AttributeAppender("title", DateUtils.formatDateTime(request.getSubmitDate()))));

View File

@ -197,7 +197,7 @@ public class SuggestionUtils {
Restrictions.ilike(User.PROP_NAME, "%" + matchWith + "%"),
Restrictions.ilike(User.PROP_EMAIL, "%" + matchWith + "%"),
Restrictions.ilike(User.PROP_FULL_NAME, "%" + matchWith + "%")));
criteria.add(Restrictions.not(Restrictions.eq("id", User.SYSTEM_ID)));
criteria.add(Restrictions.gt("id", 0L));
for (User user: OneDev.getInstance(UserManager.class).query(criteria)) {
LinearRange match = LinearRange.match(user.getName(), matchWith);

View File

@ -189,10 +189,7 @@ public class ImportUtils {
if (user != null) {
issue.setSubmitter(user);
} else {
String submitterName = userNode.get("full_name").asText();
if (StringUtils.isBlank(submitterName))
submitterName = userNode.get("login").asText();
issue.setSubmitterName(submitterName);
issue.setSubmitter(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(userNode.get("login").asText());
}
@ -204,7 +201,6 @@ public class ImportUtils {
lastUpdate.setActivity("Opened");
lastUpdate.setDate(issue.getSubmitDate());
lastUpdate.setUser(issue.getSubmitter());
lastUpdate.setUserName(issue.getSubmitterName());
issue.setLastUpdate(lastUpdate);
List<JsonNode> assigneeNodes = new ArrayList<>();
@ -282,10 +278,7 @@ public class ImportUtils {
if (user != null) {
comment.setUser(user);
} else {
String fullName = userNode.get("full_name").asText();
if (StringUtils.isBlank(fullName))
fullName = userNode.get("login").asText();
comment.setUserName(fullName);
comment.setUser(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(userNode.get("username").asText());
}
issue.getComments().add(comment);

View File

@ -175,7 +175,7 @@ public class ImportUtils {
if (user != null) {
issue.setSubmitter(user);
} else {
issue.setSubmitterName(login);
issue.setSubmitter(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}
@ -187,7 +187,6 @@ public class ImportUtils {
lastUpdate.setActivity("Opened");
lastUpdate.setDate(issue.getSubmitDate());
lastUpdate.setUser(issue.getSubmitter());
lastUpdate.setUserName(issue.getSubmitterName());
issue.setLastUpdate(lastUpdate);
for (JsonNode assigneeNode: issueNode.get("assignees")) {
@ -221,7 +220,7 @@ public class ImportUtils {
if (user != null) {
comment.setUser(user);
} else {
comment.setUserName(login);
comment.setUser(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}

View File

@ -228,7 +228,7 @@ public class ImportUtils {
if (user != null) {
issue.setSubmitter(user);
} else {
issue.setSubmitterName(authorNode.get("name").asText());
issue.setSubmitter(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(authorNode.get("username").asText());
}
@ -240,7 +240,6 @@ public class ImportUtils {
lastUpdate.setActivity("Opened");
lastUpdate.setDate(issue.getSubmitDate());
lastUpdate.setUser(issue.getSubmitter());
lastUpdate.setUserName(issue.getSubmitterName());
issue.setLastUpdate(lastUpdate);
List<JsonNode> assigneeNodes = new ArrayList<>();
@ -371,7 +370,7 @@ public class ImportUtils {
if (user != null) {
comment.setUser(user);
} else {
comment.setUserName(authorNode.get("name").asText());
comment.setUser(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(authorNode.get("username").asText());
}
issue.getComments().add(comment);

View File

@ -295,18 +295,17 @@ public class ImportUtils {
if (issueNode.hasNonNull("reporter")) {
JsonNode reporterNode = issueNode.get("reporter");
String email = getEmail(reporterNode);
String fullName = reporterNode.get("name").asText();
String login = reporterNode.get("login").asText();
if (email != null) {
User user = OneDev.getInstance(UserManager.class).findByEmail(email);
if (user != null) {
issue.setSubmitter(user);
} else {
issue.setSubmitterName(fullName);
issue.setSubmitter(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}
} else {
issue.setSubmitterName(fullName);
issue.setSubmitter(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}
} else {
@ -317,7 +316,6 @@ public class ImportUtils {
lastUpdate.setActivity("Opened");
lastUpdate.setDate(issue.getSubmitDate());
lastUpdate.setUser(issue.getSubmitter());
lastUpdate.setUserName(issue.getSubmitterName());
issue.setLastUpdate(lastUpdate);
StateSpec initialState = getIssueSetting().getInitialStateSpec();
@ -723,18 +721,17 @@ public class ImportUtils {
if (commentNode.hasNonNull("author")) {
JsonNode authorNode = commentNode.get("author");
String email = getEmail(authorNode);
String fullName = authorNode.get("name").asText();
String login = authorNode.get("login").asText();
if (email != null) {
User user = OneDev.getInstance(UserManager.class).findByEmail(email);
if (user != null) {
comment.setUser(user);
} else {
comment.setUserName(fullName);
comment.setUser(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}
} else {
comment.setUserName(fullName);
comment.setUser(OneDev.getInstance(UserManager.class).getUnknown());
nonExistentLogins.add(login);
}
} else {