diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index e4850c6361..1e0693c456 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -1035,7 +1035,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { } // this reads from arbitrary URL - private final class Unpack extends MasterToSlaveFileCallable { + private static final class Unpack extends MasterToSlaveFileCallable { private final URL archive; Unpack(URL archive) { this.archive = archive; @@ -2938,7 +2938,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { public @CheckForNull String validateAntFileMask(final String fileMasks, final int bound, final boolean caseSensitive) throws IOException, InterruptedException { return act(new ValidateAntFileMask(fileMasks, caseSensitive, bound)); } - private class ValidateAntFileMask extends MasterToSlaveFileCallable { + private static class ValidateAntFileMask extends MasterToSlaveFileCallable { private final String fileMasks; private final boolean caseSensitive; private final int bound; diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 9902dc3921..4d2e1e63f3 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -88,6 +88,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.ServiceLoader; import java.util.Set; @@ -271,10 +272,6 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } } LOGGER.log(WARNING, String.format("Provided custom plugin manager [%s] does not provide any of the suitable constructors. Using default.", pmClassName)); - } catch(NullPointerException e) { - // Class.forName and Class.getConstructor are supposed to never return null though a broken ClassLoader - // could break the contract. Just in case we introduce this specific catch to avoid polluting the logs with NPEs. - LOGGER.log(WARNING, String.format("Unable to instantiate custom plugin manager [%s]. Using default.", pmClassName)); } catch(ClassCastException e) { LOGGER.log(WARNING, String.format("Provided class [%s] does not extend PluginManager. Using default.", pmClassName)); } catch(Exception e) { @@ -647,7 +644,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } names.add(fileName); - copyBundledPlugin(url, fileName); + copyBundledPlugin(Objects.requireNonNull(url), fileName); copiedPlugins.add(url); try { addDependencies(url, fromPath, dependencies); @@ -910,9 +907,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas plugins.add(p); if (p.isActive()) activePlugins.add(p); - synchronized (((UberClassLoader) uberClassLoader).loaded) { - ((UberClassLoader) uberClassLoader).loaded.clear(); - } + ((UberClassLoader) uberClassLoader).loaded.clear(); // TODO antimodular; perhaps should have a PluginListener to complement ExtensionListListener? CustomClassFilter.Contributed.load(); @@ -1743,7 +1738,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas void cleanup(); } - class FileUploadPluginCopier implements PluginCopier { + static class FileUploadPluginCopier implements PluginCopier { private FileItem fileItem; FileUploadPluginCopier(FileItem fileItem) { @@ -1761,7 +1756,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } } - class UrlPluginCopier implements PluginCopier { + static class UrlPluginCopier implements PluginCopier { private String url; UrlPluginCopier(String url) { diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index e7875e95bd..717c1df919 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -134,7 +134,7 @@ public final class TcpSlaveAgentListener extends Thread { } try { return new URL(Jenkins.get().getRootUrl()).getHost(); - } catch (MalformedURLException | NullPointerException e) { + } catch (MalformedURLException e) { throw new IllegalStateException("Could not get TcpSlaveAgentListener host name", e); } } diff --git a/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java b/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java index f29bb4b4e2..06ed43cb1a 100644 --- a/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java +++ b/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java @@ -51,7 +51,7 @@ public final class MemoryUsageMonitor extends PeriodicWork { /** * A memory group is conceptually a set of memory pools. */ - public final class MemoryGroup { + public static final class MemoryGroup { private final List pools = new ArrayList<>(); /** diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 1c55c30ce8..94f67f9029 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -2454,7 +2454,7 @@ public class Queue extends ResourceController implements Saveable { @Restricted(NoExternalUse.class) @ExportedBean(defaultVisibility = 999) @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "it is exported, so it might be used") - public class StubItem { + public static class StubItem { @Exported public StubTask task; diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index d72b24a668..e331a9e0c1 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -100,6 +100,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -814,6 +815,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run collated; diff --git a/core/src/main/java/hudson/triggers/SlowTriggerAdminMonitor.java b/core/src/main/java/hudson/triggers/SlowTriggerAdminMonitor.java index bfba8a072b..67f7da9315 100644 --- a/core/src/main/java/hudson/triggers/SlowTriggerAdminMonitor.java +++ b/core/src/main/java/hudson/triggers/SlowTriggerAdminMonitor.java @@ -94,7 +94,7 @@ public class SlowTriggerAdminMonitor extends AdministrativeMonitor { return HttpResponses.redirectViaContextPath("/manage"); } - public class Value { + public static class Value { private final LocalDateTime time; private Class trigger; diff --git a/core/src/main/java/hudson/util/RemotingDiagnostics.java b/core/src/main/java/hudson/util/RemotingDiagnostics.java index 5c435ae0b0..0ae676035c 100644 --- a/core/src/main/java/hudson/util/RemotingDiagnostics.java +++ b/core/src/main/java/hudson/util/RemotingDiagnostics.java @@ -148,6 +148,7 @@ public final class RemotingDiagnostics { } return out.toString(); } + private static final long serialVersionUID = 1L; } /** diff --git a/core/src/main/java/jenkins/FilePathFilterAggregator.java b/core/src/main/java/jenkins/FilePathFilterAggregator.java index 728700a775..0702bebb80 100644 --- a/core/src/main/java/jenkins/FilePathFilterAggregator.java +++ b/core/src/main/java/jenkins/FilePathFilterAggregator.java @@ -30,7 +30,7 @@ class FilePathFilterAggregator extends FilePathFilter { @Override public int compareTo(Entry that) { - double result = Double.compare(this.ordinal, that.ordinal); + int result = Double.compare(this.ordinal, that.ordinal); if (result < 0) return -1; if (result > 0) return 1; diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index aa5888197e..e95eab1fad 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2432,11 +2432,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ public @Nullable String getRootUrl() throws IllegalStateException { final JenkinsLocationConfiguration config = JenkinsLocationConfiguration.get(); - if (config == null) { - // Try to get standard message if possible - final Jenkins j = Jenkins.get(); - throw new IllegalStateException("Jenkins instance " + j + " has been successfully initialized, but JenkinsLocationConfiguration is undefined."); - } String url = config.getUrl(); if(url!=null) { return Util.ensureEndsWith(url,"/"); @@ -2453,7 +2448,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @CheckForNull public String getConfiguredRootUrl() { JenkinsLocationConfiguration config = JenkinsLocationConfiguration.get(); - return config != null ? config.getUrl() : null; + return config.getUrl(); } /** diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index adec27c4f2..8454bf7f67 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -43,6 +43,7 @@ import hudson.widgets.HistoryWidget; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.RunIdMigrator; @@ -362,10 +363,7 @@ public abstract class LazyBuildMixIn & Queue.Task & if (r == null) { // having two neighbors pointing to each other is important to make RunMap.removeValue work - JobT _parent = asRun().getParent(); - if (_parent == null) { - throw new IllegalStateException("no parent for " + asRun().number); - } + JobT _parent = Objects.requireNonNull(asRun().getParent(), "no parent for " + asRun().number); RunT pb = _parent.getLazyBuildMixIn()._getRuns().search(asRun().number - 1, AbstractLazyLoadRunMap.Direction.DESC); if (pb != null) { pb.getRunMixIn().nextBuildR = createReference(); // establish bi-di link diff --git a/core/src/main/java/jenkins/security/NonSerializableSecurityContext.java b/core/src/main/java/jenkins/security/NonSerializableSecurityContext.java index 4e47cb20ca..334948e7ce 100644 --- a/core/src/main/java/jenkins/security/NonSerializableSecurityContext.java +++ b/core/src/main/java/jenkins/security/NonSerializableSecurityContext.java @@ -42,7 +42,9 @@ import org.springframework.security.core.userdetails.UserDetails; * @see hudson.security.HttpSessionContextIntegrationFilter2 * @since 1.509 */ -@SuppressFBWarnings(value = "SE_TRANSIENT_FIELD_NOT_RESTORED", justification = "It is not intended to be serialized. Default values will be used in case of deserialization") +@SuppressFBWarnings( + value = {"SE_NO_SERIALVERSIONID", "SE_TRANSIENT_FIELD_NOT_RESTORED"}, + justification = "It is not intended to be serialized. Default values will be used in case of deserialization") @Restricted(NoExternalUse.class) public class NonSerializableSecurityContext implements SecurityContext { private transient Authentication authentication; diff --git a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java index 09a236a04d..98bcac0f7b 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java +++ b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java @@ -65,12 +65,16 @@ public class AdminWhitelistRule implements StaplerProxy { // overwrite 30-default.conf with what we think is the best from the core. // this file shouldn't be touched by anyone. For local customization, use other files in the conf dir. // 0-byte file is used as a signal from the admin to prevent this overwriting - placeDefaultRule( - new File(jenkins.getRootDir(), "secrets/whitelisted-callables.d/default.conf"), - getClass().getResourceAsStream("callable.conf")); - placeDefaultRule( - new File(jenkins.getRootDir(), "secrets/filepath-filters.d/30-default.conf"), - transformForWindows(getClass().getResourceAsStream("filepath-filter.conf"))); + try (InputStream callable = getClass().getResourceAsStream("callable.conf")) { + placeDefaultRule( + new File(jenkins.getRootDir(), "secrets/whitelisted-callables.d/default.conf"), + callable); + } + try (InputStream filepathFilter = getClass().getResourceAsStream("filepath-filter.conf")) { + placeDefaultRule( + new File(jenkins.getRootDir(), "secrets/filepath-filters.d/30-default.conf"), + transformForWindows(filepathFilter)); + } this.whitelisted = new CallableWhitelistConfig( new File(jenkins.getRootDir(),"secrets/whitelisted-callables.d/gui.conf")); diff --git a/core/src/main/java/jenkins/slaves/StandardOutputSwapper.java b/core/src/main/java/jenkins/slaves/StandardOutputSwapper.java index 29b3df3fc3..d7e9381f04 100644 --- a/core/src/main/java/jenkins/slaves/StandardOutputSwapper.java +++ b/core/src/main/java/jenkins/slaves/StandardOutputSwapper.java @@ -66,6 +66,7 @@ public class StandardOutputSwapper extends ComputerListener { } } + @SuppressFBWarnings(value = "OBL_UNSATISFIED_OBLIGATION", justification = "the obligation is satisfied with libc(7)") private void swap(StandardOutputStream stdout) throws IOException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, UnsatisfiedLinkError { // duplicate the OS file descriptor and create FileOutputStream around it int out = GNUCLibrary.LIBC.dup(1); diff --git a/src/spotbugs/spotbugs-excludes.xml b/src/spotbugs/spotbugs-excludes.xml index 11df143247..5e5911a1f3 100644 --- a/src/spotbugs/spotbugs-excludes.xml +++ b/src/spotbugs/spotbugs-excludes.xml @@ -82,10 +82,6 @@ - - - - @@ -95,13 +91,6 @@ - - - - - - - @@ -184,10 +173,6 @@ - - - - @@ -236,10 +221,6 @@ - - - - @@ -400,31 +381,10 @@ - - - - - - - - - - - - - - - - - - - - - @@ -522,12 +482,7 @@ - - - - - - + @@ -624,11 +579,7 @@ - - - - - + @@ -648,30 +599,6 @@ - - - - - - - - - - - - - - - - - - - - - - - -