diff --git a/src/main/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinition.java b/src/main/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinition.java index 8454766..73f66c3 100644 --- a/src/main/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinition.java +++ b/src/main/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinition.java @@ -86,7 +86,7 @@ public class GitParameterDefinition extends ParameterDefinition implements Compa public static boolean allowAnyParameterValue = SystemProperties.getBoolean(ALLOW_ANY_PARAMETER_VALUE_PROPERTY_NAME, false); - private final UUID uuid; + private UUID uuid; private String type; private String branch; private String tagFilter; @@ -128,6 +128,15 @@ public GitParameterDefinition( setBranchFilter(branchFilter); } + private Object readResolve() { + // Jobs created before UUID was introduced can deserialize with a null UUID. + // Assign one to preserve stable identity matching and prevent null handling bugs. + if (uuid == null) { + uuid = UUID.randomUUID(); + } + return this; + } + @Override public ParameterValue createValue(StaplerRequest2 request) { String value[] = request.getParameterValues(getName()); @@ -323,7 +332,13 @@ public Boolean getQuickFilterEnabled() { @Override public int compareTo(GitParameterDefinition pd) { - return pd.uuid.equals(uuid) ? 0 : -1; + if (pd == null) { + return -1; + } + if (this == pd) { + return 0; + } + return uuid != null && pd.uuid != null && pd.uuid.equals(uuid) ? 0 : -1; } /* Set of values allowed for this parameter definition */ diff --git a/src/test/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinitionTest.java b/src/test/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinitionTest.java index ca8cb61..8856f92 100644 --- a/src/test/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinitionTest.java +++ b/src/test/java/net/uaznia/lukanus/hudson/plugins/gitparameter/GitParameterDefinitionTest.java @@ -27,9 +27,11 @@ import hudson.tasks.Shell; import hudson.util.FormValidation; import hudson.util.FormValidation.Kind; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.UUID; import net.sf.json.JSONObject; import net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.DescriptorImpl; import net.uaznia.lukanus.hudson.plugins.gitparameter.jobs.JobWrapper; @@ -54,6 +56,12 @@ @WithJenkins class GitParameterDefinitionTest { + private static void setUuid(GitParameterDefinition definition, UUID uuid) throws Exception { + Field uuidField = GitParameterDefinition.class.getDeclaredField("uuid"); + uuidField.setAccessible(true); + uuidField.set(definition, uuid); + } + // Test Descriptor.getProjectSCM() @Test void testGetProjectSCM(JenkinsRule jenkins) throws Exception { @@ -466,6 +474,62 @@ void testSearchInFolders(JenkinsRule jenkins) throws Exception { assertEquals("folder/job1", Utils.getParentJob(gitParameterDefinition).getFullName()); } + @Test + void testSearchInFoldersWithNullUuid(JenkinsRule jenkins) throws Exception { + MockFolder folder = jenkins.createFolder("folder"); + FreeStyleProject job1 = folder.createProject(FreeStyleProject.class, "job1"); + + GitParameterDefinition gitParameterDefinition = new GitParameterDefinition( + NAME, + "asdf", + "other", + "description", + "branch", + ".*", + "*", + SortMode.NONE, + SelectedValue.NONE, + null, + false); + + setUuid(gitParameterDefinition, null); + job1.addProperty(new ParametersDefinitionProperty(gitParameterDefinition)); + assertEquals("folder/job1", Utils.getParentJob(gitParameterDefinition).getFullName()); + } + + @Test + void testCompareToWithNullUuidDoesNotThrow() throws Exception { + GitParameterDefinition left = new GitParameterDefinition( + "left", + PT_BRANCH, + "origin/develop", + "description", + "origin/develop", + ".*", + "*", + SortMode.NONE, + SelectedValue.NONE, + null, + false); + GitParameterDefinition right = new GitParameterDefinition( + "right", + PT_BRANCH, + "origin/develop", + "description", + "origin/develop", + ".*", + "*", + SortMode.NONE, + SelectedValue.NONE, + null, + false); + + setUuid(right, null); + + assertEquals(-1, left.compareTo(right)); + assertEquals(0, right.compareTo(right)); + } + @Test void testBranchFilterValidation(JenkinsRule jenkins) { final DescriptorImpl descriptor = new DescriptorImpl();