From fe1c8fc21a5af6e4525264d58b86977222b52af1 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 20 May 2021 20:24:46 +0200 Subject: [PATCH] Fixed SAT findings (#10722) Signed-off-by: Christoph Weitkamp --- .../internal/LogReaderHandlerFactory.java | 6 +-- .../config/LogReaderConfiguration.java | 20 +++++---- .../filereader/AbstractLogFileReader.java | 2 + .../internal/filereader/FileTailer.java | 20 ++++++--- .../filereader/api/FileReaderException.java | 3 ++ .../filereader/api/FileReaderListener.java | 8 +++- .../filereader/api/LogFileReader.java | 3 ++ .../internal/handler/LogHandler.java | 44 +++++++++++-------- .../internal/searchengine/SearchEngine.java | 5 ++- .../main/resources/OH-INF/thing/reader.xml | 14 +++--- 10 files changed, 78 insertions(+), 47 deletions(-) diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/LogReaderHandlerFactory.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/LogReaderHandlerFactory.java index 9feae99ff..c720fc49a 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/LogReaderHandlerFactory.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/LogReaderHandlerFactory.java @@ -14,10 +14,7 @@ package org.openhab.binding.logreader.internal; import static org.openhab.binding.logreader.internal.LogReaderBindingConstants.THING_READER; -import java.util.Collections; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -40,8 +37,7 @@ import org.osgi.service.component.annotations.Component; @NonNullByDefault public class LogReaderHandlerFactory extends BaseThingHandlerFactory { - private static final Set SUPPORTED_THING_TYPES_UIDS = Collections - .unmodifiableSet(Stream.of(THING_READER).collect(Collectors.toSet())); + private static final Set SUPPORTED_THING_TYPES_UIDS = Set.of(THING_READER); @Override public boolean supportsThingType(ThingTypeUID thingTypeUID) { diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/config/LogReaderConfiguration.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/config/LogReaderConfiguration.java index d781dfc98..6295d1055 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/config/LogReaderConfiguration.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/config/LogReaderConfiguration.java @@ -12,20 +12,24 @@ */ package org.openhab.binding.logreader.internal.config; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + /** * Configuration class for {@link LogReaderBinding} binding. * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public class LogReaderConfiguration { - public String filePath; - public int refreshRate; - public String warningPatterns; - public String warningBlacklistingPatterns; - public String errorPatterns; - public String errorBlacklistingPatterns; - public String customPatterns; - public String customBlacklistingPatterns; + public String filePath = "${OPENHAB_LOGDIR}/openhab.log"; + public int refreshRate = 1000; + public String warningPatterns = "WARN+"; + public @Nullable String warningBlacklistingPatterns; + public String errorPatterns = "ERROR+"; + public @Nullable String errorBlacklistingPatterns; + public @Nullable String customPatterns; + public @Nullable String customBlacklistingPatterns; @Override public String toString() { diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/AbstractLogFileReader.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/AbstractLogFileReader.java index daf8bc24b..1b85f55ed 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/AbstractLogFileReader.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/AbstractLogFileReader.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.logreader.internal.filereader.api.FileReaderListener; import org.openhab.binding.logreader.internal.filereader.api.LogFileReader; import org.slf4j.Logger; @@ -26,6 +27,7 @@ import org.slf4j.LoggerFactory; * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public abstract class AbstractLogFileReader implements LogFileReader { private final Logger logger = LoggerFactory.getLogger(AbstractLogFileReader.class); diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/FileTailer.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/FileTailer.java index 91b375a81..fa24a06d7 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/FileTailer.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/FileTailer.java @@ -19,6 +19,7 @@ import java.util.concurrent.Executors; import org.apache.commons.io.input.Tailer; import org.apache.commons.io.input.TailerListener; import org.apache.commons.io.input.TailerListenerAdapter; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.logreader.internal.filereader.api.FileReaderException; import org.openhab.binding.logreader.internal.filereader.api.LogFileReader; @@ -30,17 +31,21 @@ import org.slf4j.LoggerFactory; * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public class FileTailer extends AbstractLogFileReader implements LogFileReader { - private final Logger logger = LoggerFactory.getLogger(FileTailer.class); - private Tailer tailer; - private ExecutorService executor; + private @Nullable Tailer tailer; + private @Nullable ExecutorService executor; TailerListener logListener = new TailerListenerAdapter() { @Override public void handle(@Nullable String line) { + if (line == null) { + return; + } + sendLineToListeners(line); } @@ -51,6 +56,10 @@ public class FileTailer extends AbstractLogFileReader implements LogFileReader { @Override public void handle(@Nullable Exception e) { + if (e == null) { + return; + } + sendExceptionToListeners(e); } @@ -62,12 +71,13 @@ public class FileTailer extends AbstractLogFileReader implements LogFileReader { @Override public void start(String filePath, long refreshRate) throws FileReaderException { - tailer = new Tailer(new File(filePath), logListener, refreshRate, true, false, true); + Tailer localTailer = new Tailer(new File(filePath), logListener, refreshRate, true, false, true); executor = Executors.newSingleThreadExecutor(); try { logger.debug("Start executor"); - executor.execute(tailer); + executor.execute(localTailer); logger.debug("Executor started"); + this.tailer = localTailer; } catch (Exception e) { throw new FileReaderException(e); } diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderException.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderException.java index 3f54eeb7a..b58b912e1 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderException.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderException.java @@ -12,11 +12,14 @@ */ package org.openhab.binding.logreader.internal.filereader.api; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * Exception for file reader errors. * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public class FileReaderException extends Exception { private static final long serialVersionUID = 1272957002073978608L; diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderListener.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderListener.java index 963066f2b..7cc7d542f 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderListener.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/FileReaderListener.java @@ -12,11 +12,15 @@ */ package org.openhab.binding.logreader.internal.filereader.api; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + /** * Interface for file reader listeners. * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public interface FileReaderListener { /** @@ -35,12 +39,12 @@ public interface FileReaderListener { * * @param line the line. */ - void handle(String line); + void handle(@Nullable String line); /** * This method is called when exception has occurred. * * @param ex the exception. */ - void handle(Exception ex); + void handle(@Nullable Exception ex); } diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/LogFileReader.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/LogFileReader.java index e00338c46..29491c9f8 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/LogFileReader.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/filereader/api/LogFileReader.java @@ -12,11 +12,14 @@ */ package org.openhab.binding.logreader.internal.filereader.api; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * Interface for log file readers. * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public interface LogFileReader { /** diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/handler/LogHandler.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/handler/LogHandler.java index 0b7ede39e..d83bffac8 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/handler/LogHandler.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/handler/LogHandler.java @@ -17,6 +17,8 @@ import static org.openhab.binding.logreader.internal.LogReaderBindingConstants.* import java.time.ZonedDateTime; import java.util.regex.PatternSyntaxException; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.logreader.internal.config.LogReaderConfiguration; import org.openhab.binding.logreader.internal.filereader.api.FileReaderListener; import org.openhab.binding.logreader.internal.filereader.api.LogFileReader; @@ -42,16 +44,17 @@ import org.slf4j.LoggerFactory; * @author Miika Jukka - Initial contribution * @author Pauli Anttila - Rewrite */ +@NonNullByDefault public class LogHandler extends BaseThingHandler implements FileReaderListener { private final Logger logger = LoggerFactory.getLogger(LogHandler.class); - private LogReaderConfiguration configuration; + private final LogFileReader fileReader; - private LogFileReader fileReader; + private @NonNullByDefault({}) LogReaderConfiguration configuration; - private SearchEngine errorEngine; - private SearchEngine warningEngine; - private SearchEngine customEngine; + private @Nullable SearchEngine errorEngine; + private @Nullable SearchEngine warningEngine; + private @Nullable SearchEngine customEngine; public LogHandler(Thing thing, LogFileReader fileReader) { super(thing); @@ -97,8 +100,9 @@ public class LogHandler extends BaseThingHandler implements FileReaderListener { try { warningEngine = new SearchEngine(configuration.warningPatterns, configuration.warningBlacklistingPatterns); errorEngine = new SearchEngine(configuration.errorPatterns, configuration.errorBlacklistingPatterns); - customEngine = new SearchEngine(configuration.customPatterns, configuration.customBlacklistingPatterns); - + String customPatterns = configuration.customPatterns; + customEngine = new SearchEngine(customPatterns != null ? customPatterns : "", + configuration.customBlacklistingPatterns); } catch (PatternSyntaxException e) { logger.debug("Illegal search pattern syntax '{}'. ", e.getMessage(), e); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, e.getMessage()); @@ -124,13 +128,17 @@ public class LogHandler extends BaseThingHandler implements FileReaderListener { shutdown(); } - private void updateChannel(ChannelUID channelUID, Command command, SearchEngine matcher) { - if (command instanceof DecimalType) { - matcher.setMatchCount(((DecimalType) command).longValue()); - } else if (command instanceof RefreshType) { - updateState(channelUID.getId(), new DecimalType(matcher.getMatchCount())); + private void updateChannel(ChannelUID channelUID, Command command, @Nullable SearchEngine matcher) { + if (matcher != null) { + if (command instanceof DecimalType) { + matcher.setMatchCount(((DecimalType) command).longValue()); + } else if (command instanceof RefreshType) { + updateState(channelUID.getId(), new DecimalType(matcher.getMatchCount())); + } else { + logger.debug("Unsupported command '{}' received for channel '{}'", command, channelUID); + } } else { - logger.debug("Unsupported command '{}' received for channel '{}'", command, channelUID); + logger.debug("Cannot update channel as SearchEngine is null."); } } @@ -171,7 +179,7 @@ public class LogHandler extends BaseThingHandler implements FileReaderListener { } @Override - public void handle(String line) { + public void handle(@Nullable String line) { if (line == null) { return; } @@ -180,17 +188,17 @@ public class LogHandler extends BaseThingHandler implements FileReaderListener { updateStatus(ThingStatus.ONLINE); } - if (errorEngine.isMatching(line)) { + if (errorEngine != null && errorEngine.isMatching(line)) { updateChannelIfLinked(CHANNEL_ERRORS, new DecimalType(errorEngine.getMatchCount())); updateChannelIfLinked(CHANNEL_LASTERROR, new StringType(line)); triggerChannel(CHANNEL_NEWERROR, line); } - if (warningEngine.isMatching(line)) { + if (warningEngine != null && warningEngine.isMatching(line)) { updateChannelIfLinked(CHANNEL_WARNINGS, new DecimalType(warningEngine.getMatchCount())); updateChannelIfLinked(CHANNEL_LASTWARNING, new StringType(line)); triggerChannel(CHANNEL_NEWWARNING, line); } - if (customEngine.isMatching(line)) { + if (customEngine != null && customEngine.isMatching(line)) { updateChannelIfLinked(CHANNEL_CUSTOMEVENTS, new DecimalType(customEngine.getMatchCount())); updateChannelIfLinked(CHANNEL_LASTCUSTOMEVENT, new StringType(line)); triggerChannel(CHANNEL_NEWCUSTOM, line); @@ -198,7 +206,7 @@ public class LogHandler extends BaseThingHandler implements FileReaderListener { } @Override - public void handle(Exception ex) { + public void handle(@Nullable Exception ex) { final String msg = ex != null ? ex.getMessage() : ""; logger.debug("Error while trying to read log file: {}. ", msg, ex); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, msg); diff --git a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/searchengine/SearchEngine.java b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/searchengine/SearchEngine.java index 2af9a9771..df1e2a6d6 100644 --- a/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/searchengine/SearchEngine.java +++ b/bundles/org.openhab.binding.logreader/src/main/java/org/openhab/binding/logreader/internal/searchengine/SearchEngine.java @@ -18,6 +18,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; /** @@ -25,6 +26,7 @@ import org.eclipse.jdt.annotation.Nullable; * * @author Pauli Anttila - Initial contribution */ +@NonNullByDefault public class SearchEngine { private List matchers; @@ -39,7 +41,7 @@ public class SearchEngine { * @param blacklistingPatterns search patterns to bypass results which have found by the initial search patterns. * */ - public SearchEngine(String patterns, String blacklistingPatterns) throws PatternSyntaxException { + public SearchEngine(String patterns, @Nullable String blacklistingPatterns) throws PatternSyntaxException { matchers = compilePatterns(patterns); blacklistingMatchers = compilePatterns(blacklistingPatterns); } @@ -80,7 +82,6 @@ public class SearchEngine { */ private List compilePatterns(@Nullable String patterns) throws PatternSyntaxException { List patternsList = new ArrayList<>(); - if (patterns != null && !patterns.isEmpty()) { String list[] = patterns.split("\\|"); if (list.length > 0) { diff --git a/bundles/org.openhab.binding.logreader/src/main/resources/OH-INF/thing/reader.xml b/bundles/org.openhab.binding.logreader/src/main/resources/OH-INF/thing/reader.xml index bdcfc3534..5ebb0bec5 100644 --- a/bundles/org.openhab.binding.logreader/src/main/resources/OH-INF/thing/reader.xml +++ b/bundles/org.openhab.binding.logreader/src/main/resources/OH-INF/thing/reader.xml @@ -29,34 +29,34 @@ Path to log file. Empty will default to ${OPENHAB_LOGDIR}/openhab.log ${OPENHAB_LOGDIR}/openhab.log - + Refresh rate in milliseconds for reading logs 1000 - + Search patterns separated by | character for error events. Empty will default to ERROR+ ERROR+ - + Search patterns for blacklisting unwanted error events separated by | character. - + Search patterns separated by | character for warning events. Empty will default to WARN+ WARN+ - + Search patterns for blacklisting unwanted warning events separated by | character. - + Search patterns separated by | character for custom events. - + Search patterns for blacklisting unwanted custom events separated by | character.