Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UpgradeNextMajorParentVersion produces code that SpotBug considers as errors #748

Open
gounthar opened this issue Jan 29, 2025 · 3 comments

Comments

@gounthar
Copy link
Collaborator

gounthar commented Jan 29, 2025

Plugin Modernizer version

plugin modernizer 999999-SNAPSHOT (2025-01-29T09:30:07Z)

What Operating System are you using

Debian / WSL

Reproduction steps

java -jar plugin-modernizer-cli/target/jenkins-plugin-modernizer-999999-SNAPSHOT.jar run --plugins vmanager-plugin --recipe UpgradeNextMajorParentVersion

Detected error

The recipe produced the following PR: jenkinsci/vmanager-plugin#15 .

[ERROR] Medium: Unread field: hudson.plugins.vmanager.VmgrBuilds.pipelineBuild [hudson.plugins.vmanager.VmgrBuilds] At VmgrBuilds.java:[line 27] URF_UNREAD_FIELD
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.InvokeExecutionTask.invoke(File, VirtualChannel): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.InvokeExecutionTask, org.jenkinsci.plugins.vmanager.InvokeExecutionTask] At InvokeExecutionTask.java:[line 86]Another occurrence at InvokeExecutionTask.java:[line 87] DM_DEFAULT_ENCODING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.InvokeExecutionTask.invoke(File, VirtualChannel) may fail to close stream [org.jenkinsci.plugins.vmanager.InvokeExecutionTask, org.jenkinsci.plugins.vmanager.InvokeExecutionTask] At InvokeExecutionTask.java:[line 86]Another occurrence at InvokeExecutionTask.java:[line 87] OS_OPEN_STREAM
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.LaunchHolder.abortVManagerSessions(Logger, String, boolean, String, String, TaskListener, boolean, int, String, String, int, int, boolean, boolean, List, String): String.getBytes() [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 560] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.LaunchHolder, org.jenkinsci.plugins.vmanager.LaunchHolder, org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 173]Another occurrence at LaunchHolder.java:[line 333]Another occurrence at LaunchHolder.java:[line 397] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher): String.getBytes() [org.jenkinsci.plugins.vmanager.LaunchHolder, org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 169]Another occurrence at LaunchHolder.java:[line 393] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.LaunchHolder.processErrorFromRespone(HttpURLConnection, Logger): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 592] DM_DEFAULT_ENCODING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher) invokes inefficient new String(String) constructor [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 384] DM_STRING_CTOR
[ERROR] Medium: Result of integer multiplication cast to long in org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher) [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 80] ICAST_INTEGER_MULTIPLY_CAST_TO_LONG
[ERROR] Medium: org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher) may fail to close stream [org.jenkinsci.plugins.vmanager.LaunchHolder, org.jenkinsci.plugins.vmanager.LaunchHolder, org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 333]Another occurrence at LaunchHolder.java:[line 173]Another occurrence at LaunchHolder.java:[line 397] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.LaunchHolder.processErrorFromRespone(HttpURLConnection, Logger) may fail to close stream [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 592] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.LaunchHolder.performWaiting(String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, boolean, String, Launcher) concatenates strings using + in a loop [org.jenkinsci.plugins.vmanager.LaunchHolder] At LaunchHolder.java:[line 371] SBSC_USE_STRINGBUFFER_CONCATENATION
[ERROR] Medium: Dead store to jobWorkingDir in org.jenkinsci.plugins.vmanager.ReportManager.emailSummaryReport() [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 718] DLS_DEAD_LOCAL_STORE
[ERROR] Medium: Dead store to jobRootDir in org.jenkinsci.plugins.vmanager.ReportManager.fetchFromRemoteURL(String) [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 455] DLS_DEAD_LOCAL_STORE
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.emailSummaryReport(): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 738] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.emailSummaryReport(): String.getBytes() [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 733] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.fetchFromRemoteURL(String): java.io.ByteArrayOutputStream.toString() [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 513] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.fetchFromRemoteURL(String): String.getBytes() [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 500] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.getReportFromWorkspace(): new String(byte[]) [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 777] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.retrievReportFromServer(boolean, Launcher): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 598]Another occurrence at ReportManager.java:[line 630] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.ReportManager.retrievReportFromServer(boolean, Launcher): String.getBytes() [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 593] DM_DEFAULT_ENCODING
[ERROR] Medium: Possible null pointer dereference of conn in org.jenkinsci.plugins.vmanager.ReportManager.emailSummaryReport() on exception path [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 765]Null value at ReportManager.java:[line 706]Known null at ReportManager.java:[line 723] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.ReportManager.fetchFromRemoteURL(String) on exception path [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 495]Null value at ReportManager.java:[line 476]Known null at ReportManager.java:[line 479] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of conn in org.jenkinsci.plugins.vmanager.ReportManager.retrievReportFromServer(boolean, Launcher) on exception path [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 684]Null value at ReportManager.java:[line 564]Known null at ReportManager.java:[line 584] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.ReportManager.buildPostParamForSummaryReport(boolean) due to return value of called method [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 255]Known null at ReportManager.java:[line 255] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.ReportManager.buildPostParamForSummaryReport(boolean) due to return value of called method [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 283]Known null at ReportManager.java:[line 283] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.ReportManager.buildPostParamForSummaryReport(boolean) due to return value of called method [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 308]Known null at ReportManager.java:[line 308] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.ReportManager.buildPostParamForSummaryReport(boolean) due to return value of called method [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] Dereferenced at ReportManager.java:[line 330]Known null at ReportManager.java:[line 330] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: org.jenkinsci.plugins.vmanager.ReportManager.emailSummaryReport() may fail to close stream [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 738] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.ReportManager.retrievReportFromServer(boolean, Launcher) may fail to close stream [org.jenkinsci.plugins.vmanager.ReportManager, org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 630]Another occurrence at ReportManager.java:[line 598] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.ReportManager.getReportEmailAddresses() concatenates strings using + in a loop [org.jenkinsci.plugins.vmanager.ReportManager] At ReportManager.java:[line 146] SBSC_USE_STRINGBUFFER_CONCATENATION
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.SessionNameIdHolder.getSessionNames(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, Utils): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.SessionNameIdHolder] At SessionNameIdHolder.java:[line 67] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.SessionNameIdHolder.getSessionNames(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, Utils): String.getBytes() [org.jenkinsci.plugins.vmanager.SessionNameIdHolder] At SessionNameIdHolder.java:[line 63] DM_DEFAULT_ENCODING
[ERROR] Medium: conn is null guaranteed to be dereferenced in org.jenkinsci.plugins.vmanager.SessionNameIdHolder.getSessionNames(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, Utils) on exception path [org.jenkinsci.plugins.vmanager.SessionNameIdHolder, org.jenkinsci.plugins.vmanager.SessionNameIdHolder, org.jenkinsci.plugins.vmanager.SessionNameIdHolder, org.jenkinsci.plugins.vmanager.SessionNameIdHolder] Dereferenced at SessionNameIdHolder.java:[line 97]Dereferenced at SessionNameIdHolder.java:[line 97]Null value at SessionNameIdHolder.java:[line 46]Known null at SessionNameIdHolder.java:[line 55] NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH
[ERROR] Medium: org.jenkinsci.plugins.vmanager.SessionNameIdHolder.getSessionNames(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, Utils) may fail to close stream [org.jenkinsci.plugins.vmanager.SessionNameIdHolder] At SessionNameIdHolder.java:[line 67] OS_OPEN_STREAM
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.SessionStatusHolder.dumpSessionStatus(boolean, Map, Utils, Launcher): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.SessionStatusHolder] At SessionStatusHolder.java:[line 102] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.SessionStatusHolder.dumpSessionStatus(boolean, Map, Utils, Launcher): String.getBytes() [org.jenkinsci.plugins.vmanager.SessionStatusHolder] At SessionStatusHolder.java:[line 98] DM_DEFAULT_ENCODING
[ERROR] Medium: conn is null guaranteed to be dereferenced in org.jenkinsci.plugins.vmanager.SessionStatusHolder.dumpSessionStatus(boolean, Map, Utils, Launcher) on exception path [org.jenkinsci.plugins.vmanager.SessionStatusHolder, org.jenkinsci.plugins.vmanager.SessionStatusHolder, org.jenkinsci.plugins.vmanager.SessionStatusHolder, org.jenkinsci.plugins.vmanager.SessionStatusHolder] Dereferenced at SessionStatusHolder.java:[line 135]Dereferenced at SessionStatusHolder.java:[line 135]Null value at SessionStatusHolder.java:[line 91]Known null at SessionStatusHolder.java:[line 95] NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH
[ERROR] Medium: Null passed for non-null parameter of writeSessionIntoFile(JSONObject, boolean, Map, Utils, Launcher) in org.jenkinsci.plugins.vmanager.SessionStatusHolder.dumpSessionStatus(boolean, Map, Utils, Launcher) [org.jenkinsci.plugins.vmanager.SessionStatusHolder, org.jenkinsci.plugins.vmanager.SessionStatusHolder, org.jenkinsci.plugins.vmanager.SessionStatusHolder] Method invoked at SessionStatusHolder.java:[line 118]Null value at SessionStatusHolder.java:[line 111]Known null at SessionStatusHolder.java:[line 112] NP_NULL_PARAM_DEREF
[ERROR] Medium: org.jenkinsci.plugins.vmanager.SessionStatusHolder.dumpSessionStatus(boolean, Map, Utils, Launcher) may fail to close stream [org.jenkinsci.plugins.vmanager.SessionStatusHolder] At SessionStatusHolder.java:[line 102] OS_OPEN_STREAM
[ERROR] Medium: Exception is caught when Exception is not thrown in org.jenkinsci.plugins.vmanager.SessionStatusHolder.writeSessionIntoFile(JSONObject, boolean, Map, Utils, Launcher) [org.jenkinsci.plugins.vmanager.SessionStatusHolder] At SessionStatusHolder.java:[line 255] REC_CATCH_EXCEPTION
[ERROR] Medium: Unread field: org.jenkinsci.plugins.vmanager.SessionStatusHolder.notInTestMode [org.jenkinsci.plugins.vmanager.SessionStatusHolder] At SessionStatusHolder.java:[line 396] URF_UNREAD_FIELD
[ERROR] High: org.jenkinsci.plugins.vmanager.SummaryReportParams.ctxData isn't final but should be [org.jenkinsci.plugins.vmanager.SummaryReportParams] At SummaryReportParams.java:[line 67] MS_SHOULD_BE_FINAL
[ERROR] High: org.jenkinsci.plugins.vmanager.SummaryReportParams.metricsData isn't final but should be [org.jenkinsci.plugins.vmanager.SummaryReportParams] At SummaryReportParams.java:[line 65] MS_SHOULD_BE_FINAL
[ERROR] High: org.jenkinsci.plugins.vmanager.SummaryReportParams.vPlanData isn't final but should be [org.jenkinsci.plugins.vmanager.SummaryReportParams] At SummaryReportParams.java:[line 66] MS_SHOULD_BE_FINAL
[ERROR] High: Boxing/unboxing to parse a primitive org.jenkinsci.plugins.vmanager.UnitTestFormatter.dumpXMLFile(String, int, String, Utils) [org.jenkinsci.plugins.vmanager.UnitTestFormatter] At UnitTestFormatter.java:[line 86] DM_BOXED_PRIMITIVE_FOR_PARSING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.UnitTestFormatter.dumpXMLFile(String, int, String, Utils) invokes inefficient new Integer(String) constructor; use Integer.valueOf(String) instead [org.jenkinsci.plugins.vmanager.UnitTestFormatter] At UnitTestFormatter.java:[line 86] DM_NUMBER_CTOR
[ERROR] Medium: Unread field: org.jenkinsci.plugins.vmanager.UnitTestFormatter.sessionId [org.jenkinsci.plugins.vmanager.UnitTestFormatter] At UnitTestFormatter.java:[line 16] URF_UNREAD_FIELD
[ERROR] Medium: Dead store to apiSessionURL in org.jenkinsci.plugins.vmanager.Utils.executeVSIFLaunch(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, String, boolean, String, String[], StepHolder, String, String, VMGRBuildArchiver, boolean, String, String, String[], String, Launcher, String) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 911] DLS_DEAD_LOCAL_STORE
[ERROR] Medium: Dead store to buildDir in org.jenkinsci.plugins.vmanager.Utils.moveFromNodeToMaster(String, Launcher, String) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1277] DLS_DEAD_LOCAL_STORE
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.batchExecManager(TaskListener, String, String, String, String, int, Launcher): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1306]Another occurrence at Utils.java:[line 1307] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.checkExtraStaticAttr(String, boolean, String, String, String): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 768] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.checkVAPIConnection(String, boolean, String, String): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 713] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.checkVAPIConnection(String, boolean, String, String): String.getBytes() [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 694] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.executeAPI(String, String, String, boolean, String, String, String, TaskListener, boolean, String, int, String, int, int, boolean): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1126] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.executeAPI(String, String, String, boolean, String, String, String, TaskListener, boolean, String, int, String, int, int, boolean): String.getBytes() [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1094] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.executeVSIFLaunch(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, String, boolean, String, String[], StepHolder, String, String, VMGRBuildArchiver, boolean, String, String, String[], String, Launcher, String): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1018] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.executeVSIFLaunch(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, String, boolean, String, String[], StepHolder, String, String, VMGRBuildArchiver, boolean, String, String, String[], String, Launcher, String): String.getBytes() [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 995] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.getVAPIConnection(String, boolean, String, String, String, boolean, String, int, String, TaskListener, int, int, boolean): new String(byte[]) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 894] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.getVAPIConnection(String, boolean, String, String, String, boolean, String, int, String, TaskListener, int, int, boolean): String.getBytes() [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 893] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.processErrorFromRespone(HttpURLConnection, TaskListener, boolean): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1211] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.standardReadFromDisk(String): new java.io.FileReader(String) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1271] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.Utils.standardWriteToDisk(String, String): new java.io.FileWriter(String) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1264] DM_DEFAULT_ENCODING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.loadDataFromInputFiles(String, int, String, String, TaskListener, boolean, String, String) invokes inefficient new String(String) constructor [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 164] DM_STRING_CTOR
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.loadFileCredentials(String, int, String, String, TaskListener, boolean) invokes inefficient new String(String) constructor [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 302] DM_STRING_CTOR
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.executeVSIFLaunch(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, String, boolean, String, String[], StepHolder, String, String, VMGRBuildArchiver, boolean, String, String, String[], String, Launcher, String) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 970]Null value at Utils.java:[line 949]Known null at Utils.java:[line 952] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.getVAPIConnection(String, boolean, String, String, String, boolean, String, int, String, TaskListener, int, int, boolean) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 886]Null value at Utils.java:[line 865]Known null at Utils.java:[line 868] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadDataFromInputFiles(String, int, String, String, TaskListener, boolean, String, String) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 153]Null value at Utils.java:[line 116]Known null at Utils.java:[line 136] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadFileCredentials(String, int, String, String, TaskListener, boolean) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 293]Null value at Utils.java:[line 260]Known null at Utils.java:[line 276] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadJSONAttrValuesInput(String, int, String, String, TaskListener) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 450]Null value at Utils.java:[line 402]Known null at Utils.java:[line 418] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadJSONDefineInput(String, int, String, String, TaskListener) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 506]Null value at Utils.java:[line 459]Known null at Utils.java:[line 475] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadJSONEnvInput(String, int, String, String, TaskListener) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 368]Null value at Utils.java:[line 331]Known null at Utils.java:[line 347] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadJSONFromFile(String, int, String, String, TaskListener, boolean) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 643]Null value at Utils.java:[line 610]Known null at Utils.java:[line 626] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference of reader in org.jenkinsci.plugins.vmanager.Utils.loadUserSyntaxForSummaryReport(String, int, String, String, TaskListener, boolean) on exception path [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 232]Null value at Utils.java:[line 199]Known null at Utils.java:[line 215] NP_NULL_ON_SOME_PATH_EXCEPTION
[ERROR] Medium: Possible null pointer dereference in new org.jenkinsci.plugins.vmanager.Utils(Run, TaskListener) due to return value of called method [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Dereferenced at Utils.java:[line 50]Known null at Utils.java:[line 50] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.Utils.batchExecManager(TaskListener, String, String, String, String, int, Launcher) due to return value of called method [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Method invoked at Utils.java:[line 1306]Known null at Utils.java:[line 1306] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.Utils.batchExecManager(TaskListener, String, String, String, String, int, Launcher) due to return value of called method [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Method invoked at Utils.java:[line 1307]Known null at Utils.java:[line 1307] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.standardWriteToDisk(String, String) may fail to clean up java.io.Writer on checked exception [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] Obligation to clean up resource created at Utils.java:[line 1264] is not dischargedPath continues at Utils.java:[line 1265] OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.batchExecManager(TaskListener, String, String, String, String, int, Launcher) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils, org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1306]Another occurrence at Utils.java:[line 1307] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.checkExtraStaticAttr(String, boolean, String, String, String) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 768] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.checkVAPIConnection(String, boolean, String, String) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 713] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.executeAPI(String, String, String, boolean, String, String, String, TaskListener, boolean, String, int, String, int, int, boolean) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1126] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.executeVSIFLaunch(String[], String, boolean, String, String, TaskListener, boolean, String, int, String, int, int, boolean, String, boolean, String, String[], StepHolder, String, String, VMGRBuildArchiver, boolean, String, String, String[], String, Launcher, String) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1018] OS_OPEN_STREAM
[ERROR] Medium: org.jenkinsci.plugins.vmanager.Utils.processErrorFromRespone(HttpURLConnection, TaskListener, boolean) may fail to close stream [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 1211] OS_OPEN_STREAM
[ERROR] Medium: Exceptional return value of java.io.File.renameTo(File) ignored in org.jenkinsci.plugins.vmanager.Utils.loadDataFromInputFiles(String, int, String, String, TaskListener, boolean, String, String) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 180] RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
[ERROR] Medium: Exceptional return value of java.io.File.delete() ignored in org.jenkinsci.plugins.vmanager.Utils.loadFileCredentials(String, int, String, String, TaskListener, boolean) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 312] RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
[ERROR] Medium: Exceptional return value of java.io.File.renameTo(File) ignored in org.jenkinsci.plugins.vmanager.Utils.loadJSONFromFile(String, int, String, String, TaskListener, boolean) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 659] RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
[ERROR] Medium: Exceptional return value of java.io.File.renameTo(File) ignored in org.jenkinsci.plugins.vmanager.Utils.loadUserSyntaxForSummaryReport(String, int, String, String, TaskListener, boolean) [org.jenkinsci.plugins.vmanager.Utils] At Utils.java:[line 241] RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.deleteSessions(Run, Logger): String.getBytes() [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver, org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 199]Another occurrence at VMGRBuildArchiver.java:[line 224] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.getVAPIConnection(String, boolean, String): new String(byte[]) [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 323] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.getVAPIConnection(String, boolean, String): String.getBytes() [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 322] DM_DEFAULT_ENCODING
[ERROR] High: Found reliance on default encoding in org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.processErrorFromRespone(HttpURLConnection, Logger): new java.io.InputStreamReader(InputStream) [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 258] DM_DEFAULT_ENCODING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.processErrorFromRespone(HttpURLConnection, Logger) may fail to close stream [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 258] OS_OPEN_STREAM
[ERROR] High: Self assignment of field VMGRBuildArchiver.vMGRBuildArchive in org.jenkinsci.plugins.vmanager.VMGRBuildArchiver.setVMGRBuildArchive(boolean) [org.jenkinsci.plugins.vmanager.VMGRBuildArchiver] At VMGRBuildArchiver.java:[line 79] SA_FIELD_SELF_ASSIGNMENT
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.VMGRLaunch.perform(AbstractBuild, Launcher, BuildListener) due to return value of called method [org.jenkinsci.plugins.vmanager.VMGRLaunch, org.jenkinsci.plugins.vmanager.VMGRLaunch] Dereferenced at VMGRLaunch.java:[line 488]Known null at VMGRLaunch.java:[line 487] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] Medium: Possible null pointer dereference of value in org.jenkinsci.plugins.vmanager.VMGRLaunch$DescriptorImpl.doCheckStaticAttributeList(String) [org.jenkinsci.plugins.vmanager.VMGRLaunch$DescriptorImpl, org.jenkinsci.plugins.vmanager.VMGRLaunch$DescriptorImpl] Dereferenced at VMGRLaunch.java:[line 964]Known null at VMGRLaunch.java:[line 954] NP_NULL_ON_SOME_PATH
[ERROR] Medium: Possible null pointer dereference of value in org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStep$DescriptorImpl.doCheckStaticAttributeList(String) [org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStep$DescriptorImpl, org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStep$DescriptorImpl] Dereferenced at VMGRLaunchStep.java:[line 739]Known null at VMGRLaunchStep.java:[line 729] NP_NULL_ON_SOME_PATH
[ERROR] High: Boxing/unboxing to parse a primitive org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl.run() [org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl] At VMGRLaunchStepImpl.java:[line 34] DM_BOXED_PRIMITIVE_FOR_PARSING
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl.run() invokes inefficient new Integer(String) constructor; use Integer.valueOf(String) instead [org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl] At VMGRLaunchStepImpl.java:[line 34] DM_NUMBER_CTOR
[ERROR] Medium: Exceptional return value of java.io.File.mkdir() ignored in org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl.run() [org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl] At VMGRLaunchStepImpl.java:[line 62] RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.VMGRLaunchStepImpl] At VMGRLaunchStepImpl.java:[lines 16-318] SE_NO_SERIALVERSIONID
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.post.DSLBuildAction is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.post.DSLBuildAction] At DSLBuildAction.java:[lines 28-118] SE_NO_SERIALVERSIONID
[ERROR] Medium: Do not catch NullPointerException like in org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction.getFinishedVMGRBuilds() [org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction] At DSLProjectAction.java:[line 73] DCN_NULLPOINTER_EXCEPTION
[ERROR] Medium: Dead store of org.jenkinsci.plugins.vmanager.dsl.post.DSLBuildAction.class in org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction.getFinishedVMGRBuilds() [org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction] At DSLProjectAction.java:[line 58] DLS_DEAD_STORE_OF_CLASS_LITERAL
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.post.DSLProjectAction] At DSLProjectAction.java:[lines 21-86] SE_NO_SERIALVERSIONID
[ERROR] Medium: Possible null pointer dereference in org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher.perform(Run, FilePath, Launcher, TaskListener) due to return value of called method [org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher, org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher] Dereferenced at DSLPublisher.java:[line 359]Known null at DSLPublisher.java:[line 358] NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
[ERROR] High: Class org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher defines non-transient non-serializable instance field summaryReportParams [org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher] In DSLPublisher.java SE_BAD_FIELD
[ERROR] High: Class org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher defines non-transient non-serializable instance field vAPIConnectionParam [org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher] In DSLPublisher.java SE_BAD_FIELD
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.post.DSLPublisher] At DSLPublisher.java:[lines 41-385] SE_NO_SERIALVERSIONID
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.post.ReportBuildAction is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.post.ReportBuildAction] At ReportBuildAction.java:[lines 23-82] SE_NO_SERIALVERSIONID
[ERROR] Medium: The field org.jenkinsci.plugins.vmanager.dsl.post.ReportBuildAction.listener is transient but isn't set by deserialization [org.jenkinsci.plugins.vmanager.dsl.post.ReportBuildAction] In ReportBuildAction.java SE_TRANSIENT_FIELD_NOT_RESTORED
[ERROR] Medium: org.jenkinsci.plugins.vmanager.dsl.post.VMGRPostLaunchStepImpl is Serializable; consider declaring a serialVersionUID [org.jenkinsci.plugins.vmanager.dsl.post.VMGRPostLaunchStepImpl] At VMGRPostLaunchStepImpl.java:[lines 13-49] SE_NO_SERIALVERSIONID
[INFO]


To see bug detail using the Spotbugs GUI, use the following command "mvn spotbugs:gui"
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  48.271 s (Wall Clock)
[INFO] Finished at: 2025-01-29T14:56:42+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.github.spotbugs:spotbugs-maven-plugin:4.8.3.1:check (spotbugs) on project vmanager-plugin: failed with 112 bugs and 0 errors  -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Expected Results

No error when compiling. 😉
Could this be outside the scope of this tool, or is it something the contributor should address before submitting their PR?

I initially assumed that the plugin-modernizer handled the compilation before creating the PR. Your insights would be greatly appreciated!

Don't get me wrong, I will fix these Spotbug-detected issues by myself, but, is that something the tool could take care of?
I doubt it. 🤔

Thanks for your help.

@gounthar
Copy link
Collaborator Author

gounthar commented Feb 14, 2025

When issuing this command: mvn spotbugs:spotbugs -Dspotbugs.outputFile=target/spotbugs-report.xml, we get an XML file we can parse and transform thanks to something like that:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileOutputStream;

public class SpotBugsExclusionGenerator {

    public static void main(String[] args) {
        try {
            // Input and output file paths
            String inputFilePath = "spotbugs-report.xml";
            String outputFilePath = "spotbugs-exclude.xml";

            // Parse the SpotBugs report
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(inputFilePath));

            // Create a new document for the exclusion filter
            Document exclusionDocument = builder.newDocument();
            Element findBugsFilter = exclusionDocument.createElement("FindBugsFilter");
            exclusionDocument.appendChild(findBugsFilter);

            // Extract bug instances and add them to the exclusion filter
            NodeList bugInstances = document.getElementsByTagName("BugInstance");
            for (int i = 0; i < bugInstances.getLength(); i++) {
                Element bugInstance = (Element) bugInstances.item(i);
                String bugType = bugInstance.getAttribute("type");

                Element match = exclusionDocument.createElement("Match");
                Element bugPattern = exclusionDocument.createElement("Bug");
                bugPattern.setAttribute("pattern", bugType);
                match.appendChild(bugPattern);

                // Add class, method, and field details if available
                NodeList classes = bugInstance.getElementsByTagName("Class");
                if (classes.getLength() > 0) {
                    Element classElement = (Element) classes.item(0);
                    String className = classElement.getAttribute("classname");
                    Element classMatch = exclusionDocument.createElement("Class");
                    classMatch.setAttribute("name", className);
                    match.appendChild(classMatch);
                }

                NodeList methods = bugInstance.getElementsByTagName("Method");
                if (methods.getLength() > 0) {
                    Element methodElement = (Element) methods.item(0);
                    String methodName = methodElement.getAttribute("name");
                    Element methodMatch = exclusionDocument.createElement("Method");
                    methodMatch.setAttribute("name", methodName);
                    match.appendChild(methodMatch);
                }

                NodeList fields = bugInstance.getElementsByTagName("Field");
                if (fields.getLength() > 0) {
                    Element fieldElement = (Element) fields.item(0);
                    String fieldName = fieldElement.getAttribute("name");
                    Element fieldMatch = exclusionDocument.createElement("Field");
                    fieldMatch.setAttribute("name", fieldName);
                    match.appendChild(fieldMatch);
                }

                findBugsFilter.appendChild(match);
            }

            // Write the exclusion document to a file
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

            DOMSource source = new DOMSource(exclusionDocument);
            StreamResult result = new StreamResult(new FileOutputStream(outputFilePath));
            transformer.transform(source, result);

            System.out.println("Exclusion file generated successfully: " + outputFilePath);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

When executed, the code gives a result file such as:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<FindBugsFilter>
    <Match>
        <Bug pattern="DM_BOXED_PRIMITIVE_FOR_PARSING"/>
        <Class name="org.jenkinsci.plugins.vmanager.LaunchHolder"/>
        <Method name="performWaiting"/>
    </Match>
    <Match>
        <Bug pattern="DM_STRING_CTOR"/>
        <Class name="org.jenkinsci.plugins.vmanager.LaunchHolder"/>
        <Method name="performWaiting"/>
    </Match>
    <Match>
        <Bug pattern="SBSC_USE_STRINGBUFFER_CONCATENATION"/>
        <Class name="org.jenkinsci.plugins.vmanager.LaunchHolder"/>
        <Method name="performWaiting"/>
    </Match>
    <Match>
        <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
        <Class name="org.jenkinsci.plugins.vmanager.ReportManager"/>
        <Method name="buildPostParamForSummaryReport"/>
    </Match>
    <Match>
        <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
        <Class name="org.jenkinsci.plugins.vmanager.ReportManager"/>
        <Method name="buildPostParamForSummaryReport"/>
    </Match>
    <Match>
        <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
        <Class name="org.jenkinsci.plugins.vmanager.ReportManager"/>
        <Method name="buildPostParamForSummaryReport"/>
    </Match>
    <Match>
        <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
        <Class name="org.jenkinsci.plugins.vmanager.ReportManager"/>
        <Method name="buildPostParamForSummaryReport"/>
    </Match>
    <Match>
        <Bug pattern="NP_NULL_PARAM_DEREF"/>
        <Class name="org.jenkinsci.plugins.vmanager.SessionStatusHolder"/>
        <Method name="dumpSessionStatus"/>
    </Match>
    <Match>
        <Bug pattern="REC_CATCH_EXCEPTION"/>
        <Class name="org.jenkinsci.plugins.vmanager.SessionStatusHolder"/>
        <Method name="writeSessionIntoFile"/>
    </Match>
    <Match>
        <Bug pattern="URF_UNREAD_FIELD"/>
        <Class name="org.jenkinsci.plugins.vmanager.SessionStatusHolder"/>
        <Field name="notInTestMode"/>
    </Match>
    <Match>
        <Bug pattern="MS_SHOULD_BE_FINAL"/>
        <Class name="org.jenkinsci.plugins.vmanager.SummaryReportParams"/>
        <Field name="ctxData"/>
    </Match>
    <Match>
        <Bug pattern="MS_SHOULD_BE_FINAL"/>
        <Class name="org.jenkinsci.plugins.vmanager.SummaryReportParams"/>
        <Field name="metricsData"/>
    </Match>
    <Match>
        <Bug pattern="MS_SHOULD_BE_FINAL"/>
        <Class name="org.jenkinsci.plugins.vmanager.SummaryReportParams"/>
        <Field name="vPlanData"/>
    </Match>
    <Match>
        <Bug pattern="DM_BOXED_PRIMITIVE_FOR_PARSING"/>
        <Class name="org.jenkinsci.plugins.vmanager.UnitTestFormatter"/>
        <Method name="dumpXMLFile"/>
    </Match>
    <Match>
        <Bug pattern="URF_UNREAD_FIELD"/>
        <Class name="org.jenkinsci.plugins.vmanager.UnitTestFormatter"/>
        <Field name="sessionId"/>
    </Match>
</FindBugsFilter>

We could then add it to the pom.xml thanks to something like:

<build>
    <plugins>
      <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <configuration>
          <excludeFilterFile>spotbugs-exclude.xml</excludeFilterFile>
        </configuration>
      </plugin>
    </plugins>
  </build>

Could we create a recipe that does all that whenever we use a recipe that changes or upgrades the SpotBug version? 🤔

This process worked for this vmmanager-plugin PR.

@gounthar
Copy link
Collaborator Author

I tried this on this PR, and it allowed it to build. While it's not ideal to add exclusions to SpotBugs, it's something that can be done automatically. Unfortunately, we can't (as of today) automatically correct every flaw detected by SpotBugs.

@gounthar
Copy link
Collaborator Author

It looks like for Java 11, or the version of SpotBugs linked to Jenkins 2.462.x, the mvn spotbugs:spotbugs -Dspotbugs.outputFile=target/spotbugs-report.xml command does not produce the expected output.
I had to change the configuration in pom.xml:

<build>
    <plugins>
      <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <configuration>
          <excludeFilterFile>src/main/resources/spotbugs-exclude.xml</excludeFilterFile>
          <xmlOutput>true</xmlOutput>
          <outputDirectory>target</outputDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>

which generated a target/spotbugs.xml.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant