chore: Refactoring input param of issues

This commit is contained in:
Robin Shen 2025-09-05 10:04:20 +08:00
parent 3f024b687b
commit 18a69b8b25
21 changed files with 76 additions and 181 deletions

View File

@ -14,7 +14,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.util.Input;
import io.onedev.server.buildspecmodel.inputspec.Input;
public class ParamCombination implements Serializable {

View File

@ -6,7 +6,7 @@ import io.onedev.server.annotation.Editable;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.model.Build;
import io.onedev.server.util.Input;
import io.onedev.server.buildspecmodel.inputspec.Input;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

View File

@ -4,17 +4,18 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import javax.validation.constraints.NotEmpty;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.model.Build;
import io.onedev.server.util.Input;
import io.onedev.server.annotation.ChoiceProvider;
import io.onedev.server.annotation.Editable;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.model.Build;
@Editable(name="Use value of specified parameter/secret")
public class PassthroughValues implements ValuesProvider {

View File

@ -8201,6 +8201,16 @@ public class DataMigrator {
autoMergeUserElement.detach();
}
dom.writeToFile(file, false);
} else if (file.getName().startsWith("IssueChanges.xml")) {
try {
var content = FileUtils.readFileToString(file, UTF_8);
content = StringUtils.replace(content,
"io.onedev.server.util.Input",
"io.onedev.server.buildspecmodel.inputspec.Input");
FileUtils.writeStringToFile(file, content, UTF_8.name());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -113,7 +113,7 @@ import io.onedev.server.search.entity.issue.StateCriteria;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.taskschedule.SchedulableTask;
import io.onedev.server.taskschedule.TaskScheduler;
import io.onedev.server.util.Input;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.util.ProjectScope;
import io.onedev.server.util.ProjectScopedCommit;
import io.onedev.server.util.concurrent.BatchWorkManager;

View File

@ -1,6 +1,13 @@
package io.onedev.server.event.project.issue;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.entitymanager.GroupManager;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.Group;
@ -8,17 +15,10 @@ import io.onedev.server.model.Issue;
import io.onedev.server.model.User;
import io.onedev.server.model.support.issue.field.spec.FieldSpec;
import io.onedev.server.util.CommitAware;
import io.onedev.server.util.Input;
import io.onedev.server.util.ProjectScopedCommit;
import io.onedev.server.util.commenttext.CommentText;
import io.onedev.server.util.commenttext.MarkdownText;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class IssueOpened extends IssueEvent implements CommitAware {
private static final long serialVersionUID = 1L;

View File

@ -76,6 +76,7 @@ import io.onedev.server.buildspec.job.Job;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.ParamUtils;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.buildspecmodel.inputspec.SecretInput;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.entitymanager.AccessTokenManager;
@ -94,7 +95,6 @@ import io.onedev.server.search.entity.SortField;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.ComponentContext;
import io.onedev.server.util.FilenameUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.artifact.ArtifactInfo;
import io.onedev.server.util.artifact.DirectoryInfo;
import io.onedev.server.util.criteria.Criteria;

View File

@ -71,6 +71,7 @@ import io.onedev.commons.utils.ExplicitException;
import io.onedev.server.OneDev;
import io.onedev.server.annotation.Editable;
import io.onedev.server.attachment.AttachmentStorageSupport;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.entitymanager.GroupManager;
import io.onedev.server.entitymanager.PullRequestManager;
@ -91,7 +92,6 @@ import io.onedev.server.search.entity.EntitySort;
import io.onedev.server.search.entity.IssueSortField;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.ComponentContext;
import io.onedev.server.util.Input;
import io.onedev.server.util.ProjectScopedCommit;
import io.onedev.server.util.facade.IssueFacade;
import io.onedev.server.web.UrlManager;

View File

@ -7,7 +7,7 @@ import java.util.stream.Collectors;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.model.Iteration;
import io.onedev.server.util.Input;
import io.onedev.server.buildspecmodel.inputspec.Input;
public class IssueBatchUpdateData extends IssueFieldChangeData {

View File

@ -1,6 +1,5 @@
package io.onedev.server.model.support.issue.changedata;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@ -21,19 +20,15 @@ import io.onedev.server.model.User;
import io.onedev.server.model.support.issue.field.spec.FieldSpec;
import io.onedev.server.notification.ActivityDetail;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
import io.onedev.server.buildspecmodel.inputspec.Input;
public class IssueFieldChangeData extends IssueChangeData {
private static final long serialVersionUID = 1L;
protected final Map<String, Serializable> oldFields;
protected final Map<String, Input> oldFields;
protected final Map<String, Serializable> newFields;
private transient Map<String, Input> convertedOldFields;
private transient Map<String, Input> convertedNewFields;
protected final Map<String, Input> newFields;
public IssueFieldChangeData(Map<String, Input> oldFields, Map<String, Input> newFields) {
this.oldFields = copyNonEmptyFields(oldFields);
@ -41,33 +36,11 @@ public class IssueFieldChangeData extends IssueChangeData {
}
public Map<String, Input> getOldFields() {
if (convertedOldFields == null) {
convertedOldFields = new LinkedHashMap<>();
for (Map.Entry<String, Serializable> entry: oldFields.entrySet()) {
if (entry.getValue() instanceof Input) {
convertedOldFields.put(entry.getKey(), (Input) entry.getValue());
} else {
io.onedev.server.buildspecmodel.inputspec.Input input = (io.onedev.server.buildspecmodel.inputspec.Input) entry.getValue();
convertedOldFields.put(entry.getKey(), new Input(input.getName(), input.getType(), input.getValues()));
}
}
}
return convertedOldFields;
return oldFields;
}
public Map<String, Input> getNewFields() {
if (convertedNewFields == null) {
convertedNewFields = new LinkedHashMap<>();
for (Map.Entry<String, Serializable> entry: newFields.entrySet()) {
if (entry.getValue() instanceof Input) {
convertedNewFields.put(entry.getKey(), (Input) entry.getValue());
} else {
io.onedev.server.buildspecmodel.inputspec.Input input = (io.onedev.server.buildspecmodel.inputspec.Input) entry.getValue();
convertedNewFields.put(entry.getKey(), new Input(input.getName(), input.getType(), input.getValues()));
}
}
}
return convertedNewFields;
return newFields;
}
private List<String> getDisplayValues(Input input) {
@ -94,20 +67,20 @@ public class IssueFieldChangeData extends IssueChangeData {
public Map<String, String> getOldFieldValues() {
Map<String, String> oldFieldValues = new LinkedHashMap<>();
for (Map.Entry<String, Input> entry: getOldFields().entrySet())
for (Map.Entry<String, Input> entry: oldFields.entrySet())
oldFieldValues.put(entry.getKey(), StringUtils.join(getDisplayValues(entry.getValue())));
return oldFieldValues;
}
public Map<String, String> getNewFieldValues() {
Map<String, String> newFieldValues = new LinkedHashMap<>();
for (Map.Entry<String, Input> entry: getNewFields().entrySet())
for (Map.Entry<String, Input> entry: newFields.entrySet())
newFieldValues.put(entry.getKey(), StringUtils.join(getDisplayValues(entry.getValue())));
return newFieldValues;
}
private Map<String, Serializable> copyNonEmptyFields(Map<String, Input> fields) {
Map<String, Serializable> copy = new LinkedHashMap<>();
private Map<String, Input> copyNonEmptyFields(Map<String, Input> fields) {
Map<String, Input> copy = new LinkedHashMap<>();
for (Map.Entry<String, Input> entry: fields.entrySet()) {
if (!entry.getValue().getValues().isEmpty())
copy.put(entry.getKey(), entry.getValue());
@ -135,8 +108,8 @@ public class IssueFieldChangeData extends IssueChangeData {
public Map<String, Collection<User>> getNewUsers() {
UserManager userManager = OneDev.getInstance(UserManager.class);
Map<String, Collection<User>> newUsers = new HashMap<>();
for (Input oldField: getOldFields().values()) {
Input newField = getNewFields().get(oldField.getName());
for (Input oldField: oldFields.values()) {
Input newField = newFields.get(oldField.getName());
if (newField != null
&& !describe(oldField).equals(describe(newField))
&& newField.getType().equals(FieldSpec.USER)) {
@ -150,8 +123,8 @@ public class IssueFieldChangeData extends IssueChangeData {
newUsers.put(newField.getName(), newUsersOfField);
}
}
for (Input newField: getNewFields().values()) {
if (!getOldFields().containsKey(newField.getName())
for (Input newField: newFields.values()) {
if (!oldFields.containsKey(newField.getName())
&& newField.getType().equals(FieldSpec.USER)) {
Set<User> usersOfField = newField.getValues()
.stream()
@ -169,8 +142,8 @@ public class IssueFieldChangeData extends IssueChangeData {
public Map<String, Group> getNewGroups() {
Map<String, Group> newGroups = new HashMap<>();
GroupManager groupManager = OneDev.getInstance(GroupManager.class);
for (Input oldField: getOldFields().values()) {
Input newField = getNewFields().get(oldField.getName());
for (Input oldField: oldFields.values()) {
Input newField = newFields.get(oldField.getName());
if (newField != null
&& !describe(oldField).equals(describe(newField))
&& newField.getType().equals(FieldSpec.GROUP)
@ -180,8 +153,8 @@ public class IssueFieldChangeData extends IssueChangeData {
newGroups.put(newField.getName(), group);
}
}
for (Input newField: getNewFields().values()) {
if (!getOldFields().containsKey(newField.getName())
for (Input newField: newFields.values()) {
if (!oldFields.containsKey(newField.getName())
&& newField.getType().equals(FieldSpec.GROUP)
&& !newField.getValues().isEmpty()) {
Group group = groupManager.find(newField.getValues().iterator().next());

View File

@ -3,8 +3,8 @@ package io.onedev.server.model.support.issue.changedata;
import java.util.LinkedHashMap;
import java.util.Map;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.notification.ActivityDetail;
import io.onedev.server.util.Input;
public class IssueStateChangeData extends IssueFieldChangeData {

View File

@ -1,94 +0,0 @@
package io.onedev.server.util;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Nullable;
import javax.validation.ValidationException;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.buildspecmodel.inputspec.SecretInput;
import io.onedev.server.model.support.issue.field.spec.FieldSpec;
public class Input implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(Input.class);
private final String name;
private final String type;
private final List<String> values;
public Input(String name, String type, List<String> values) {
this.name = name;
this.type = type;
this.values = values;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
public List<String> getValues() {
return values;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (other instanceof Input) {
Input otherField = (Input) other;
return new EqualsBuilder()
.append(getName(), otherField.getName())
.append(getType(), otherField.getType())
.append(getValues(), otherField.getValues())
.isEquals();
} else {
return false;
}
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(getName())
.append(getType())
.append(getValues())
.toHashCode();
}
@Nullable
public Object getTypedValue(@Nullable InputSpec inputSpec) {
if (inputSpec != null) {
try {
return inputSpec.convertToObject(getValues());
} catch (ValidationException e) {
String displayValue;
if (type.equals(FieldSpec.SECRET))
displayValue = SecretInput.MASK;
else
displayValue = "" + getValues();
logger.error("Error converting input (name: {}, value: {}, error: {})",
getName(), displayValue, e.getMessage());
return null;
}
} else {
return null;
}
}
}

View File

@ -1,19 +1,12 @@
package io.onedev.server.util.interpolative;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.buildspec.job.JobVariable;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.model.Build;
import io.onedev.server.model.support.build.JobProperty;
import io.onedev.server.util.GroovyUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.interpolative.Interpolative.Segment;
import io.onedev.server.util.interpolative.Interpolative.Segment.Type;
import io.onedev.server.web.editable.EditableStringTransformer;
import static io.onedev.k8shelper.KubernetesHelper.ATTRIBUTES;
import static io.onedev.k8shelper.KubernetesHelper.PAUSE;
import static io.onedev.k8shelper.KubernetesHelper.PLACEHOLDER_PREFIX;
import static io.onedev.k8shelper.KubernetesHelper.PLACEHOLDER_SUFFIX;
import static io.onedev.k8shelper.KubernetesHelper.WORKSPACE;
import static io.onedev.server.web.translation.Translation._T;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -21,8 +14,20 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;
import static io.onedev.k8shelper.KubernetesHelper.*;
import static io.onedev.server.web.translation.Translation._T;
import javax.annotation.Nullable;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.buildspec.job.JobVariable;
import io.onedev.server.buildspec.param.ParamCombination;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.model.Build;
import io.onedev.server.model.support.build.JobProperty;
import io.onedev.server.util.GroovyUtils;
import io.onedev.server.util.interpolative.Interpolative.Segment;
import io.onedev.server.util.interpolative.Interpolative.Segment.Type;
import io.onedev.server.web.editable.EditableStringTransformer;
public class VariableInterpolator {

View File

@ -7,9 +7,9 @@ import org.apache.wicket.model.Model;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.buildspec.param.spec.ParamSpec;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.buildspecmodel.inputspec.SecretInput;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
public class ParamValuesLabel extends Label {

View File

@ -54,6 +54,7 @@ import com.google.common.collect.Sets;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.data.migration.VersionedXmlDoc;
import io.onedev.server.entitymanager.AuditManager;
import io.onedev.server.entitymanager.BuildManager;
@ -77,7 +78,6 @@ import io.onedev.server.security.SecurityUtils;
import io.onedev.server.security.permission.JobPermission;
import io.onedev.server.security.permission.RunJob;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
import io.onedev.server.web.WebConstants;
import io.onedev.server.web.WebSession;
import io.onedev.server.web.behavior.BuildQueryBehavior;

View File

@ -33,6 +33,7 @@ import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.buildspec.BuildSpec;
import io.onedev.server.buildspec.job.Job;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.entitymanager.BuildLabelManager;
import io.onedev.server.entityreference.EntityReference;
import io.onedev.server.git.BlobIdent;
@ -43,7 +44,6 @@ import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.criteria.Criteria;
import io.onedev.server.web.asset.emoji.Emojis;
import io.onedev.server.web.behavior.ChangeObserver;

View File

@ -29,6 +29,7 @@ import org.eclipse.jgit.lib.ObjectId;
import org.unbescape.html.HtmlEscape;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.buildspecmodel.inputspec.InputContext;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.buildspecmodel.inputspec.SecretInput;
@ -57,7 +58,6 @@ import io.onedev.server.util.ColorUtils;
import io.onedev.server.util.ComponentContext;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.EditContext;
import io.onedev.server.util.Input;
import io.onedev.server.web.ajaxlistener.AttachAjaxIndicatorListener;
import io.onedev.server.web.ajaxlistener.DisableGlobalAjaxIndicatorListener;
import io.onedev.server.web.component.MultilineLabel;

View File

@ -76,6 +76,7 @@ import com.google.common.collect.Sets;
import edu.emory.mathcs.backport.java.util.Collections;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.data.migration.VersionedXmlDoc;
import io.onedev.server.entitymanager.AuditManager;
import io.onedev.server.entitymanager.IssueLinkManager;
@ -106,7 +107,6 @@ import io.onedev.server.security.SecurityUtils;
import io.onedev.server.security.permission.AccessProject;
import io.onedev.server.timetracking.TimeTrackingManager;
import io.onedev.server.util.DateUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.LinkDescriptor;
import io.onedev.server.util.ProjectScope;
import io.onedev.server.util.facade.ProjectCache;

View File

@ -46,6 +46,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.common.collect.Lists;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.entitymanager.IssueChangeManager;
import io.onedev.server.entitymanager.IssueVoteManager;
import io.onedev.server.entitymanager.IssueWatchManager;
@ -63,7 +64,6 @@ import io.onedev.server.search.entity.issue.IssueQuery;
import io.onedev.server.search.entity.issue.IssueQueryLexer;
import io.onedev.server.search.entity.issue.StateCriteria;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.Similarities;
import io.onedev.server.web.WebConstants;
import io.onedev.server.web.ajaxlistener.AttachAjaxIndicatorListener;

View File

@ -32,6 +32,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
import org.hibernate.Hibernate;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.entitymanager.IssueLinkManager;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.model.Issue;
@ -40,7 +41,6 @@ import io.onedev.server.model.Iteration;
import io.onedev.server.model.Project;
import io.onedev.server.model.support.issue.BoardSpec;
import io.onedev.server.model.support.issue.field.spec.FieldSpec;
import io.onedev.server.util.Input;
import io.onedev.server.util.LinkDescriptor;
import io.onedev.server.web.ajaxlistener.AttachAjaxIndicatorListener;
import io.onedev.server.web.ajaxlistener.AttachAjaxIndicatorListener.AttachMode;

View File

@ -37,6 +37,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.buildspecmodel.inputspec.Input;
import io.onedev.server.data.migration.VersionedXmlDoc;
import io.onedev.server.entitymanager.IssueLinkManager;
import io.onedev.server.entitymanager.IssueManager;
@ -50,7 +51,6 @@ import io.onedev.server.model.support.QueryPersonalization;
import io.onedev.server.model.support.issue.NamedIssueQuery;
import io.onedev.server.model.support.issue.ProjectIssueSetting;
import io.onedev.server.security.SecurityUtils;
import io.onedev.server.util.Input;
import io.onedev.server.util.LinkDescriptor;
import io.onedev.server.web.ajaxlistener.AttachAjaxIndicatorListener;
import io.onedev.server.web.behavior.ChangeObserver;