From e3436aa10ff8edc8917bbe6cb37623d06b036f5e Mon Sep 17 00:00:00 2001 From: "p.zahnen" Date: Wed, 14 Jan 2026 16:05:23 +0100 Subject: [PATCH 1/2] refactor logging and scheduling in core implementations --- .../ii/xtraplatform/base/app/StoreImpl.java | 59 ++++---- .../base/app/SubstitutionsImpl.java | 10 +- .../base/app/VolatileRegistryImpl.java | 138 +++++++++++------- 3 files changed, 120 insertions(+), 87 deletions(-) diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/StoreImpl.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/StoreImpl.java index 787d690a..5c4e36b9 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/StoreImpl.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/StoreImpl.java @@ -16,9 +16,6 @@ import de.ii.xtraplatform.base.domain.StoreSource; import de.ii.xtraplatform.base.domain.StoreSource.Content; import de.ii.xtraplatform.base.domain.StoreSource.Mode; -import de.ii.xtraplatform.base.domain.StoreSource.Type; -import de.ii.xtraplatform.base.domain.StoreSourceFs; -import java.nio.file.Path; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -35,17 +32,15 @@ public class StoreImpl implements Store { private static final Logger LOGGER = LoggerFactory.getLogger(StoreImpl.class); - private final Path dataDirectory; private final StoreConfiguration storeConfiguration; private final List sources; @Inject StoreImpl(AppContext appContext) { - this(appContext.getDataDir(), appContext.getConfiguration().getStore()); + this(appContext.getConfiguration().getStore()); } - public StoreImpl(Path dataDirectory, StoreConfiguration storeConfiguration) { - this.dataDirectory = dataDirectory; + public StoreImpl(StoreConfiguration storeConfiguration) { this.storeConfiguration = storeConfiguration; this.sources = storeConfiguration.getSources().stream() @@ -54,30 +49,30 @@ public StoreImpl(Path dataDirectory, StoreConfiguration storeConfiguration) { info(); } - public void info() { - LOGGER.info( - "Loading store ({}{}{})", - storeConfiguration.isReadOnly() ? "read-only" : "writable", - storeConfiguration.isWatch() ? ", watching for changes" : "", - storeConfiguration.isFiltered() - ? String.format(", filtered by %s", storeConfiguration.getFilter().get().getAsLabel()) - : ""); - - sources.forEach( - s -> { - String src = - Objects.equals(s.getType(), Type.FS_KEY) - ? ((StoreSourceFs) s).getAbsolutePath(dataDirectory).toString() - : s.getSrc(); - String mode = storeConfiguration.isReadOnly() ? "" : String.format(" [%s]", s.getMode()); - String subType = - (s.getContent() == Content.RESOURCES || s.getContent() == Content.VALUES) - && s.getPrefix().isPresent() - ? String.format(" [%s]", s.getPrefix().get()) - : ""; - - LOGGER.info(" {} [{}]{}{}", s.getLabelSpaces(), s.getContent(), subType, mode); - }); + @SuppressWarnings("PMD.CognitiveComplexity") + private void info() { + if (LOGGER.isInfoEnabled()) { + LOGGER.info( + "Loading store ({}{}{})", + storeConfiguration.isReadOnly() ? "read-only" : "writable", + storeConfiguration.isWatch() ? ", watching for changes" : "", + storeConfiguration.isFiltered() + ? String.format(", filtered by %s", storeConfiguration.getFilter().get().getAsLabel()) + : ""); + + sources.forEach( + s -> { + String mode = + storeConfiguration.isReadOnly() ? "" : String.format(" [%s]", s.getMode()); + String subType = + (s.getContent() == Content.RESOURCES || s.getContent() == Content.VALUES) + && s.getPrefix().isPresent() + ? String.format(" [%s]", s.getPrefix().get()) + : ""; + + LOGGER.info(" {} [{}]{}{}", s.getLabelSpaces(), s.getContent(), subType, mode); + }); + } } @Override @@ -99,7 +94,7 @@ public List get(Content content) { source -> source.getContent() == content || source.getContent() == Content.ALL - || (content.isEvent() && source.getContent() == Content.ENTITIES)) + || content.isEvent() && source.getContent() == Content.ENTITIES) .collect(Collectors.toUnmodifiableList()); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/SubstitutionsImpl.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/SubstitutionsImpl.java index f1f07d04..c7e4c62a 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/SubstitutionsImpl.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/SubstitutionsImpl.java @@ -70,6 +70,8 @@ public VariableSubstitutor(boolean strict, boolean substitutionInVariables) { this.setEnableSubstitutionInVariables(substitutionInVariables); } + @Override + @SuppressWarnings("PMD.PreserveStackTrace") protected boolean substitute(TextStringBuilder buf, int offset, int length) { try { return super.substitute(buf, offset, length); @@ -92,9 +94,11 @@ private static Map extract(Map constants, String result.putAll( extract((Map) entry.getValue(), prefix + entry.getKey() + ".")); } else if (entry.getValue() instanceof List) { - LOGGER.warn( - "Ignoring list value for substitution '{}'. Only scalar values and maps are supported.", - prefix + entry.getKey()); + if (LOGGER.isWarnEnabled()) { + LOGGER.warn( + "Ignoring list value for substitution '{}'. Only scalar values and maps are supported.", + prefix + entry.getKey()); + } } else { result.put(prefix + entry.getKey(), entry.getValue().toString()); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/VolatileRegistryImpl.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/VolatileRegistryImpl.java index c9a7bd6b..a30518bb 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/VolatileRegistryImpl.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/app/VolatileRegistryImpl.java @@ -42,6 +42,7 @@ @Singleton @AutoBind +@SuppressWarnings("PMD.TooManyMethods") public class VolatileRegistryImpl implements VolatileRegistry { private static final Logger LOGGER = LoggerFactory.getLogger(VolatileRegistryImpl.class); @@ -77,7 +78,6 @@ public class VolatileRegistryImpl implements VolatileRegistry { this.cancelTasks = new ArrayDeque<>(); this.onRegister = new ArrayList<>(); this.onUnRegister = new ArrayList<>(); - this.currentSchedule = null; this.currentRate = 0; } @@ -108,13 +108,14 @@ public void register(Volatile2 dependency) { polls.put(dependency.getUniqueKey(), polling); intervals.put(dependency.getUniqueKey(), 0); - schedulePoll((polling).getIntervalMs()); + schedulePoll(polling.getIntervalMs()); } } } } @Override + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") public synchronized void unregister(Volatile2 dependency) { synchronized (this) { volatiles.remove(dependency.getUniqueKey()); @@ -131,32 +132,42 @@ public synchronized void unregister(Volatile2 dependency) { @Override public void change(Volatile2 dependency, State from, State to) { String key = dependency.getUniqueKey(); + logStateChange(from, to, key); + notifyWatchers(key, from, to); + } + private void logStateChange(State from, State to, String key) { if (LOGGER.isDebugEnabled(MARKER.DI)) { LOGGER.debug(MARKER.DI, "Volatile state changed from {} to {}: {}", from, to, key); } + } + private void notifyWatchers(String key, State from, State to) { synchronized (this) { if (watchers.containsKey(key)) { for (ChangeHandler handler : watchers.get(key)) { - if (Objects.nonNull(handler)) { - changeExecutor.submit( - () -> { - try { - handler.change(from, to); - } catch (Throwable e) { - // ignore - if (LOGGER.isDebugEnabled()) { - LogContext.errorAsDebug(LOGGER, e, "Error in volatile watcher"); - } - } - }); - } + executeHandler(handler, from, to); } } } } + private void executeHandler(ChangeHandler handler, State from, State to) { + if (Objects.nonNull(handler)) { + changeExecutor.submit( + () -> { + try { + handler.change(from, to); + } catch (Throwable e) { + // ignore + if (LOGGER.isDebugEnabled()) { + LogContext.errorAsDebug(LOGGER, e, "Error in volatile watcher"); + } + } + }); + } + } + @Override public Runnable watch(Volatile2 dependency, ChangeHandler handler) { String key = dependency.getUniqueKey(); @@ -224,48 +235,71 @@ public void listen(BiConsumer onRegister, Consumer on } private void schedulePoll(int delayMs) { - if (delayMs > 0 && currentRate > delayMs || currentRate <= 0) { - if (Objects.nonNull(currentSchedule)) { - // LOGGER.debug("Cancelling current polling schedule"); - currentSchedule.cancel(false); - } + if (shouldReschedulePoll(delayMs)) { + cancelCurrentScheduleIfExists(); + startNewPollingSchedule(delayMs); + } + } - this.currentRate = delayMs; - if (LOGGER.isDebugEnabled(MARKER.DI)) { - LOGGER.debug(MARKER.DI, "Scheduling polling every {}ms", delayMs); + private boolean shouldReschedulePoll(int delayMs) { + return delayMs > 0 && currentRate > delayMs || currentRate <= 0; + } + + private void cancelCurrentScheduleIfExists() { + if (Objects.nonNull(currentSchedule)) { + // LOGGER.debug("Cancelling current polling schedule"); + currentSchedule.cancel(false); + } + } + + private void startNewPollingSchedule(int delayMs) { + this.currentRate = delayMs; + if (LOGGER.isDebugEnabled(MARKER.DI)) { + LOGGER.debug(MARKER.DI, "Scheduling polling every {}ms", delayMs); + } + this.currentSchedule = + pollingExecutor.scheduleWithFixedDelay( + () -> executePollingCycle(delayMs), delayMs, delayMs, TimeUnit.MILLISECONDS); + } + + private void executePollingCycle(int delayMs) { + processCancelTasks(); + processPollingIntervals(delayMs); + } + + private void processCancelTasks() { + while (!cancelTasks.isEmpty()) { + cancelTasks.remove().run(); + } + } + + private void processPollingIntervals(int delayMs) { + for (Map.Entry entry : intervals.entrySet()) { + String key = entry.getKey(); + int interval = entry.getValue() - delayMs; + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Checking {} in {}ms", key, interval); } - this.currentSchedule = - pollingExecutor.scheduleWithFixedDelay( - () -> { - while (!cancelTasks.isEmpty()) { - cancelTasks.remove().run(); - } - - for (Map.Entry entry : intervals.entrySet()) { - String key = entry.getKey(); - int interval = entry.getValue() - delayMs; - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Checking {} in {}ms", key, interval); - } - if (interval <= 0) { - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Checking {} now", key); - } - Polling polling = polls.get(key); - interval = polling.getIntervalMs(); + if (interval <= 0) { + interval = executePolling(key); + } - Future future = pollingExecutor.submit(polling::poll); - cancelTasks.add(() -> future.cancel(true)); - } + intervals.put(key, interval); + } + } - intervals.put(key, interval); - } - }, - delayMs, - delayMs, - TimeUnit.MILLISECONDS); + private int executePolling(String key) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Checking {} now", key); } + Polling polling = polls.get(key); + int interval = polling.getIntervalMs(); + + Future future = pollingExecutor.submit(polling::poll); + cancelTasks.add(() -> future.cancel(true)); + + return interval; } } From de21b6271a34a6abd806573ca814062b6fa822bb Mon Sep 17 00:00:00 2001 From: "p.zahnen" Date: Thu, 22 Jan 2026 15:38:08 +0000 Subject: [PATCH 2/2] refactor enums, logging, and code quality annotations --- .../auth/app/external/XacmlRequest.java | 4 +- .../base/domain/AppConfiguration.java | 1 + .../xtraplatform/base/domain/AppLauncher.java | 26 ++++++----- .../base/domain/AuthConfiguration.java | 19 +++++--- .../base/domain/CfgStoreDriverFs.java | 3 -- .../base/domain/ConfigurationReader.java | 14 +----- .../ii/xtraplatform/base/domain/Jackson.java | 5 +-- .../base/domain/JacksonProvider.java | 8 ++-- .../xtraplatform/base/domain/LogContext.java | 23 +++++++--- .../base/domain/LoggingConfiguration.java | 1 + .../base/domain/LoggingFilter.java | 7 ++- .../base/domain/RegistryState.java | 2 + .../base/domain/ServerConfiguration.java | 1 + .../base/domain/StoreSourceDefault.java | 1 + .../base/domain/StoreSourceFs.java | 1 + .../base/domain/StoreSourceHttp.java | 1 + .../base/domain/StoreSourceHttpFetcher.java | 21 +++------ .../base/domain/StoreSourceS3.java | 1 + .../domain/resiliency/AbstractVolatile.java | 14 +++--- .../resiliency/AbstractVolatileComposed.java | 23 ++++++---- .../domain/resiliency/DelayedVolatile.java | 1 + .../base/domain/resiliency/HealthChecks.java | 6 +-- .../VolatileUnavailableException.java | 2 + .../base/domain/util/JacksonModules.java | 5 ++- .../base/domain/util/LambdaWithException.java | 12 +++-- .../base/domain/util/ZipWalker.java | 44 ++++++------------- 26 files changed, 125 insertions(+), 121 deletions(-) diff --git a/xtraplatform-auth/src/main/java/de/ii/xtraplatform/auth/app/external/XacmlRequest.java b/xtraplatform-auth/src/main/java/de/ii/xtraplatform/auth/app/external/XacmlRequest.java index 65cc62a9..ada953b7 100644 --- a/xtraplatform-auth/src/main/java/de/ii/xtraplatform/auth/app/external/XacmlRequest.java +++ b/xtraplatform-auth/src/main/java/de/ii/xtraplatform/auth/app/external/XacmlRequest.java @@ -65,7 +65,7 @@ public XacmlRequest( actionAttributes.forEach((id, value) -> add(id, value, action, geoXacmlVersion)); Request = - version == XacmlJsonVersion._1_0 + version == XacmlJsonVersion.V1_0 ? request10(subject.build(), resource.build(), action.build()) : request11(subject.build(), resource.build(), action.build()); } @@ -80,7 +80,7 @@ private static void add( new Attribute( id, value, - geoXacmlVersion == GeoXacmlVersion._1_0 + geoXacmlVersion == GeoXacmlVersion.V1_0 ? "urn:ogc:def:dataType:geoxacml:1.0:geometry" : "urn:ogc:def:geoxacml:3.0:data-type:geometry")); return; diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppConfiguration.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppConfiguration.java index c5cd43b1..a6801260 100755 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppConfiguration.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppConfiguration.java @@ -239,6 +239,7 @@ public void setServerFactory(ServerFactory factory) { @JsonIgnore @Override + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") public synchronized void setLoggingFactory(LoggingFactory factory) { throw new NotImplementedException(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppLauncher.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppLauncher.java index 4a79e762..e1332202 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppLauncher.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AppLauncher.java @@ -55,7 +55,6 @@ public class AppLauncher implements AppContext { private static final Logger LOGGER = LoggerFactory.getLogger(AppLauncher.class); private static final String ENV_VAR = "XTRAPLATFORM_ENV"; - private static final String DATA_DIR_NAME = "data"; private static final String TMP_DIR_NAME = "tmp"; private final String name; @@ -79,7 +78,6 @@ public AppLauncher(String name, String version) { (ThreadPoolExecutor) Executors.newCachedThreadPool( new ThreadFactoryBuilder().setNameFormat("startup-%d").build()); // ); - ; } @Override @@ -134,8 +132,10 @@ public String init(String[] args, Map baseConfigs) throws IO List buffer = configurationReader.loadMergedLogging(Optional.empty(), env); long initStart = Instant.now().toEpochMilli(); - LOGGER.info("--------------------------------------------------"); - LOGGER.info("Starting {} v{}", name, version); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("--------------------------------------------------"); + LOGGER.info("Starting {} v{}", name, version); + } this.cfg = configurationReader.loadMergedConfig(Map.of(), env); @@ -234,7 +234,9 @@ private void start(AppLifeCycle lifecycle) { } public void stop(App modules) { - LOGGER.info("Shutting down {}", name); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Shutting down {}", name); + } modules.lifecycle().get().stream() .sorted(Comparator.comparingInt(AppLifeCycle::getPriority).reversed()) @@ -256,11 +258,13 @@ public void stop(App modules) { startupExecutor.shutdownNow(); - LOGGER.info("Stopped {}", name); - LOGGER.info("--------------------------------------------------"); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Stopped {}", name); + LOGGER.info("--------------------------------------------------"); + } } - private Optional getDataDir(String[] args) { + private Optional getDataDir(String... args) { return Arrays.stream(args) .filter(s -> s.startsWith("--data-dir=")) .map(s -> Path.of(s.substring(s.indexOf('=') + 1))) @@ -268,7 +272,7 @@ private Optional getDataDir(String[] args) { .findFirst(); } - private OptionalLong getStartTime(String[] args) { + private OptionalLong getStartTime(String... args) { return Arrays.stream(args) .filter(s -> s.startsWith("--start-time=")) .mapToLong(s -> Long.parseLong(s.substring(s.indexOf('=') + 1))) @@ -339,7 +343,7 @@ private Optional findDriver(StoreSource storeSource, boolean war .filter( d -> { if (!d.isAvailable(storeSource)) { - if (warn) { + if (warn && LOGGER.isWarnEnabled()) { LOGGER.warn( "{} for {} is not available.", Content.CFG.getLabel(), @@ -352,7 +356,7 @@ private Optional findDriver(StoreSource storeSource, boolean war }) .findFirst(); - if (driver.isEmpty() && !foundUnavailable[0]) { + if (driver.isEmpty() && !foundUnavailable[0] && LOGGER.isErrorEnabled()) { LOGGER.error("No cfg driver found for source {}.", storeSource.getLabel()); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AuthConfiguration.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AuthConfiguration.java index b971f182..359fd9be 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AuthConfiguration.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/AuthConfiguration.java @@ -491,9 +491,16 @@ enum AuthProviderType { XACML_JSON } + @SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass") String OIDC = "OIDC"; + + @SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass") String USER_INFO = "USER_INFO"; + + @SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass") String JWT = "JWT"; + + @SuppressWarnings("PMD.FieldDeclarationsShouldBeAtStartOfClass") String XACML_JSON = "XACML_JSON"; @JsonTypeInfo( @@ -596,7 +603,7 @@ interface XacmlJson extends AuthProvider { */ @Value.Default default XacmlJsonVersion getVersion() { - return XacmlJsonVersion._1_1; + return XacmlJsonVersion.V1_1; } /** @@ -629,8 +636,8 @@ default GeoXacmlVersion getGeoXacmlVersion() { } enum XacmlJsonVersion { - _1_0("1.0"), - _1_1("1.1"); + V1_0("1.0"), + V1_1("1.1"); private final String stringRepresentation; XacmlJsonVersion(String stringRepresentation) { @@ -649,14 +656,14 @@ public static XacmlJsonVersion fromString(String type) { return v; } } - return _1_1; + return V1_1; } } enum GeoXacmlVersion { NONE("NONE"), - _1_0("1.0"), - _3_0("3.0"); + V1_0("1.0"), + V3_0("3.0"); private final String stringRepresentation; GeoXacmlVersion(String stringRepresentation) { diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/CfgStoreDriverFs.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/CfgStoreDriverFs.java index 74b279b8..e8c5a8ee 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/CfgStoreDriverFs.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/CfgStoreDriverFs.java @@ -18,12 +18,9 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class CfgStoreDriverFs implements CfgStoreDriver { - private static final Logger LOGGER = LoggerFactory.getLogger(CfgStoreDriverFs.class); static final Path CFG_YML = Path.of("cfg.yml"); private final Path dataDirectory; diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ConfigurationReader.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ConfigurationReader.java index 34b0ec90..f85e4a08 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ConfigurationReader.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ConfigurationReader.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ext.Java7Support; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; import com.google.common.collect.ImmutableMap; @@ -86,15 +85,6 @@ enum APPENDER { private final ObjectMapper mergeMapper; private final EnvironmentVariableSubstitutor envSubstitutor; - // workaround for https://github.com/FasterXML/jackson-databind/issues/4078 - static { - try { - Java7Support java7Support = Java7Support.instance(); - } catch (Throwable e) { - // ignore - } - } - public ConfigurationReader(Map configsToMergeAfterBase) { this.configsToMergeAfterBase = configsToMergeAfterBase; @@ -141,7 +131,7 @@ public AppConfiguration loadMergedConfig(Map userCfgs, Cons applyLogFormat(builder.getLoggingFactory(), env); - applyForcedDefaults(builder, env); + applyForcedDefaults(builder); return builder.toImmutable(); } @@ -241,7 +231,7 @@ private static void applyLogFormat(LoggingConfiguration loggingConfiguration, Co }); } - private static void applyForcedDefaults(AppConfiguration cfg, Constants.ENV env) { + private static void applyForcedDefaults(AppConfiguration cfg) { cfg.getServerFactory().setRegisterDefaultExceptionMappers(false); cfg.getServerFactory() diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/Jackson.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/Jackson.java index a50e1290..4cf0e2f8 100755 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/Jackson.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/Jackson.java @@ -10,11 +10,8 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; -/** - * @author zahnen - */ public interface Jackson { - public ObjectMapper getDefaultObjectMapper(); + ObjectMapper getDefaultObjectMapper(); ObjectMapper getNewObjectMapper(JsonFactory jsonFactory); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/JacksonProvider.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/JacksonProvider.java index 91083b15..f2be6fdb 100755 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/JacksonProvider.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/JacksonProvider.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.DatabindContext; @@ -39,7 +38,6 @@ import de.ii.xtraplatform.base.domain.JacksonSubTypeIds.JacksonSubType; import io.dropwizard.jackson.CaffeineModule; import io.dropwizard.jackson.FuzzyEnumModule; -import java.time.Instant; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -101,11 +99,13 @@ private ObjectMapper configureMapper(ObjectMapper mapper) { return optimize ? configured.registerModule(new AfterburnerModule()) : configured; } + @SuppressWarnings("PMD.UnnecessaryModifier") @Override public ObjectMapper getDefaultObjectMapper() { return jsonMapper; } + @SuppressWarnings("PMD.UnnecessaryModifier") @Override public ObjectMapper getNewObjectMapper(JsonFactory jsonFactory) { return configureMapper(new ObjectMapper(jsonFactory)); @@ -134,9 +134,6 @@ private Multimap getIdMapping() { } public abstract static class IntervalMixin { - IntervalMixin( - @JsonProperty("start") Instant startInclusive, @JsonProperty("end") Instant endExclusive) {} - @JsonIgnore abstract boolean isEmpty(); @@ -229,6 +226,7 @@ class DynamicHandlerInstantiator extends HandlerInstantiator { private final Map typeIdResolvers; DynamicHandlerInstantiator() { + super(); this.typeIdResolvers = new HashMap<>(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LogContext.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LogContext.java index d3553ce9..e602f96d 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LogContext.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LogContext.java @@ -26,7 +26,14 @@ /** * @author zahnen */ -public class LogContext { +@SuppressWarnings("PMD.TooManyMethods") +public final class LogContext { + + private static final String MESSAGE_SUFFIX = ": {}"; + + private LogContext() { + // static class + } public enum CONTEXT { SERVICE, @@ -78,6 +85,7 @@ public static MDC.MDCCloseable putCloseable(CONTEXT context, String value) { } public interface MdcCloseable extends Closeable { + @Override void close(); } @@ -160,7 +168,7 @@ public static void error( logger, Level.ERROR, throwable, - messagePrefix.isEmpty() ? "{}" : messagePrefix + ": {}", + messagePrefix.isEmpty() ? "{}" : messagePrefix + MESSAGE_SUFFIX, args); } @@ -178,7 +186,7 @@ public static void errorAsInfo( Object[] args = Arrays.copyOf(messagePrefixArgs, messagePrefixArgs.length + 1); args[messagePrefixArgs.length] = getMessage(throwable); - logThrowable(logger, Level.INFO, throwable, messagePrefix + ": {}", args); + logThrowable(logger, Level.INFO, throwable, messagePrefix + MESSAGE_SUFFIX, args); } /** @@ -195,7 +203,7 @@ public static void errorAsWarn( Object[] args = Arrays.copyOf(messagePrefixArgs, messagePrefixArgs.length + 1); args[messagePrefixArgs.length] = getMessage(throwable); - logThrowable(logger, Level.INFO, throwable, messagePrefix + ": {}", args); + logThrowable(logger, Level.INFO, throwable, messagePrefix + MESSAGE_SUFFIX, args); } /** @@ -212,7 +220,7 @@ public static void errorAsDebug( Object[] args = Arrays.copyOf(messagePrefixArgs, messagePrefixArgs.length + 1); args[messagePrefixArgs.length] = getMessage(throwable); - logThrowable(logger, Level.DEBUG, throwable, messagePrefix + ": {}", args); + logThrowable(logger, Level.DEBUG, throwable, messagePrefix + MESSAGE_SUFFIX, args); } /** @@ -230,14 +238,15 @@ public static void errorChain( int max = 3; int numMessages = 0; String[] messages = new String[max]; - String prefix = messagePrefix; + StringBuilder prefixBuilder = new StringBuilder(messagePrefix); while (Objects.nonNull(current) && max > 0) { messages[numMessages] = getMessage(current); - prefix += ": {}"; + prefixBuilder.append(MESSAGE_SUFFIX); numMessages++; max--; current = current.getCause(); } + String prefix = prefixBuilder.toString(); Object[] args = Arrays.copyOf(messagePrefixArgs, messagePrefixArgs.length + numMessages); if (numMessages >= 0) { diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingConfiguration.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingConfiguration.java index 1cfe48ef..ec4d1ee8 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingConfiguration.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingConfiguration.java @@ -83,6 +83,7 @@ * *

*/ +@SuppressWarnings("PMD.DataClass") @DocFile(path = "application/20-configuration", name = "20-logging.md") @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, defaultImpl = LoggingConfiguration.class) public class LoggingConfiguration extends DefaultLoggingFactory { diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingFilter.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingFilter.java index b8de11e7..aa09a4ff 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingFilter.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/LoggingFilter.java @@ -19,6 +19,7 @@ /** * @author zahnen */ +@SuppressWarnings("PMD.GodClass") public class LoggingFilter extends TurboFilter { private boolean showThirdPartyLoggers; @@ -47,6 +48,7 @@ public LoggingFilter( boolean stackTraces, boolean wiring, boolean jobs) { + super(); this.showThirdPartyLoggers = showThirdPartyLoggers; this.apiRequests = apiRequests; this.apiRequestUsers = apiRequestUsers; @@ -62,6 +64,7 @@ public LoggingFilter( } @Override + @SuppressWarnings({"PMD.CognitiveComplexity", "PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) public FilterReply decide( Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { @@ -80,13 +83,13 @@ public FilterReply decide( if (sqlQueries && (Objects.equals(marker, MARKER.SQL) - || logger.getName().equals("slick.jdbc.JdbcBackend.benchmark"))) { + || "slick.jdbc.JdbcBackend.benchmark".equals(logger.getName()))) { return FilterReply.ACCEPT; } if (sqlResults && (Objects.equals(marker, MARKER.SQL_RESULT) - || logger.getName().equals("slick.jdbc.StatementInvoker.result"))) { + || "slick.jdbc.StatementInvoker.result".equals(logger.getName()))) { return FilterReply.ACCEPT; } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/RegistryState.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/RegistryState.java index 3a1001f0..36c12962 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/RegistryState.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/RegistryState.java @@ -51,6 +51,7 @@ public Optional get(String... componentPropertyValues) { } @Override + @SuppressWarnings({"PMD.AvoidSynchronizedAtMethodLevel", "PMD.AvoidDeeplyNestedIfStmts"}) public synchronized Optional onArrival(T ref) { if (Objects.nonNull(ref)) { Optional identifier = getComponentIdentifier(ref, componentProperties); @@ -71,6 +72,7 @@ public synchronized Optional onArrival(T ref) { } @Override + @SuppressWarnings({"PMD.AvoidSynchronizedAtMethodLevel", "PMD.AvoidDeeplyNestedIfStmts"}) public synchronized Optional onDeparture(T ref) { if (Objects.nonNull(ref)) { Optional identifier = getComponentIdentifier(ref, componentProperties); diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ServerConfiguration.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ServerConfiguration.java index ce03161b..49f9c40b 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ServerConfiguration.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/ServerConfiguration.java @@ -124,6 +124,7 @@ public void setExternalUrl(final String externalUrl) { // needed because @JsonProperty for the getter is missing in AbstractServerFactory @JsonProperty + @Override public Boolean getRegisterDefaultExceptionMappers() { return super.getRegisterDefaultExceptionMappers(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceDefault.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceDefault.java index d8722b4f..9f3193a0 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceDefault.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceDefault.java @@ -19,6 +19,7 @@ public interface StoreSourceDefault extends StoreSourceFs { @JsonProperty(StoreSource.TYPE_PROP) @Value.Derived + @Override default String getType() { return Type.FS.name(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceFs.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceFs.java index 93546ca4..342cade0 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceFs.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceFs.java @@ -26,6 +26,7 @@ default Mode getDesiredMode() { } @Value.Default + @Override default boolean isWatchable() { return !isArchive(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttp.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttp.java index 5874f8cf..2b053d14 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttp.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttp.java @@ -31,6 +31,7 @@ default Mode getDesiredMode() { @JsonIgnore @Value.Derived + @Override default boolean isWatchable() { return false; } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttpFetcher.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttpFetcher.java index cccaabf1..17a797ab 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttpFetcher.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceHttpFetcher.java @@ -64,21 +64,14 @@ && isNewerThan(cachePath, Minutes.of(5))) { } URI uri = URI.create(storeSource.getSrc()); - InputStream asInputStream; - try { - asInputStream = getAsInputStream(uri.toString()); - } catch (Throwable e) { - LogContext.error(LOGGER, e, "Could not load HTTP store source from {}", storeSource.getSrc()); - return Optional.empty(); - } - - try { + try (InputStream asInputStream = getAsInputStream(uri.toString())) { Files.createDirectories(cachePath.getParent()); Files.copy(asInputStream, cachePath, StandardCopyOption.REPLACE_EXISTING); PULLED.put(cachePath, Instant.now().toEpochMilli()); - } catch (IOException e) { - LogContext.error(LOGGER, e, "Could not cache HTTP store source to {}", cachePath); + } catch (Throwable e) { + LogContext.error( + LOGGER, e, "Could not load or cache HTTP store source from {}", storeSource.getSrc()); return Optional.empty(); } @@ -93,9 +86,9 @@ Path getAbsolutePath(StoreSource storeSource) { } private InputStream getAsInputStream(String url) { - try { - CloseableHttpResponse response = httpClient.execute(new HttpGet(url)); - return response.getEntity().getContent(); + try (CloseableHttpResponse response = httpClient.execute(new HttpGet(url))) { + byte[] data = response.getEntity().getContent().readAllBytes(); + return new java.io.ByteArrayInputStream(data); } catch (IOException e) { throw new IllegalArgumentException(e); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceS3.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceS3.java index e920ea0d..f5357b47 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceS3.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/StoreSourceS3.java @@ -36,6 +36,7 @@ default Mode getDesiredMode() { @JsonIgnore @Value.Derived + @Override default boolean isWatchable() { return false; } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatile.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatile.java index b604c30c..348cced2 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatile.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatile.java @@ -12,21 +12,17 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public abstract class AbstractVolatile implements Volatile2, VolatileRegistered { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractVolatile.class); - protected final VolatileRegistry volatileRegistry; private final boolean noHealth; private final String uniqueKey; private final Set capabilities; private State state; - private String message; private boolean started; + private Optional message = Optional.empty(); protected AbstractVolatile(VolatileRegistry volatileRegistry) { this(volatileRegistry, null); @@ -51,10 +47,11 @@ protected AbstractVolatile( this.uniqueKey = uniqueKey; this.capabilities = Set.of(capabilities); this.state = State.UNAVAILABLE; - this.message = null; + this.message = Optional.empty(); this.started = false; } + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") protected synchronized void onVolatileStart() { if (!started) { volatileRegistry.register(this); @@ -62,6 +59,7 @@ protected synchronized void onVolatileStart() { } } + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") protected synchronized void onVolatileStop() { if (started) { this.started = false; @@ -85,7 +83,7 @@ public State getState() { @Override public Optional getMessage() { - return Optional.ofNullable(message); + return message; } @Override @@ -119,7 +117,7 @@ protected final void setState(State state) { } protected final void setMessage(String message) { - this.message = message; + this.message = Optional.ofNullable(message); } protected Set getVolatileCapabilities() { diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatileComposed.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatileComposed.java index a3707f68..5319d1e6 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatileComposed.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/AbstractVolatileComposed.java @@ -21,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings({"PMD.GodClass", "PMD.TooManyMethods"}) public abstract class AbstractVolatileComposed extends AbstractVolatile implements VolatileComposed { @@ -73,7 +74,7 @@ protected void onVolatileStart() { for (Volatile2 v : components.values()) { if (v instanceof AbstractVolatile) { ((AbstractVolatile) v).onVolatileStart(); - v.onStateChange(this::onChange, false); + v.onStateChange((from, to) -> onChange(to), false); } } checkStates(); @@ -117,6 +118,7 @@ protected void onVolatileStarted() { } @Override + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") protected synchronized void onVolatileStop() { super.onVolatileStop(); this.initialized = false; @@ -139,6 +141,7 @@ protected final void addSubcomponent(String localKey, Volatile2 v, String... cap addSubcomponent(localKey, v, false, capabilities); } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") protected final void addSubcomponent( String localKey, Volatile2 v, boolean neededForInit, String... capabilities) { this.components.put(localKey, v); @@ -158,8 +161,7 @@ protected final void addSubcomponent( ((AbstractVolatile) v).onVolatileStart(); } - v.onStateChange(this::onChange, false); - + v.onStateChange((from, to) -> checkStates(), false); // checkStates(); } @@ -226,7 +228,8 @@ protected final Set getComponentCapabilities(String subKey) { return componentCapabilities.getOrDefault(subKey, Set.of()); } - private void onChange(State from, State to) { + @SuppressWarnings("PMD.UnusedFormalParameter") + private void onChange(State to) { /*if (to.isLowerThan(getState())) { setState(to); // TODO: messages @@ -312,13 +315,15 @@ protected State reconcileState(State lowest, State highest, boolean allowLimited } protected State reconcileStateNoComponents(@Nullable String capability) { - if (LOGGER.isDebugEnabled()) { - if (Objects.nonNull(capability)) { + if (Objects.nonNull(capability)) { + if (LOGGER.isWarnEnabled()) { LOGGER.warn( "No components with capability '{}' found for volatile: {}", capability, getUniqueKey()); - } else { + } + } else { + if (LOGGER.isWarnEnabled()) { LOGGER.warn("No components found for volatile: {}", getUniqueKey()); } } @@ -327,7 +332,7 @@ protected State reconcileStateNoComponents(@Nullable String capability) { private boolean hasCapability(String localKey, Volatile2 dep, String capability) { return componentCapabilities.get(localKey).contains(capability) - || (dep instanceof AbstractVolatile - && ((AbstractVolatile) dep).getVolatileCapabilities().contains(capability)); + || dep instanceof AbstractVolatile + && ((AbstractVolatile) dep).getVolatileCapabilities().contains(capability); } } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/DelayedVolatile.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/DelayedVolatile.java index 4fbdca26..9f2e1dfb 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/DelayedVolatile.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/DelayedVolatile.java @@ -49,6 +49,7 @@ public Optional asHealthCheck() { : Optional.empty(); } + @SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") public synchronized void set(T volatile2) { addSubcomponent("delayed", volatile2, false, getVolatileCapabilities().toArray(new String[0])); diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/HealthChecks.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/HealthChecks.java index d5135889..2bf412e8 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/HealthChecks.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/HealthChecks.java @@ -129,7 +129,7 @@ protected Result check() throws Exception { builder.withDetail("capabilities", capabilities); if (vol instanceof AbstractVolatileComposed) { - AbstractVolatileComposed avol = ((AbstractVolatileComposed) vol); + AbstractVolatileComposed avol = (AbstractVolatileComposed) vol; Map components = avol.getComponents().stream() @@ -160,11 +160,11 @@ interface SubResult { State getState(); - @JsonInclude(value = Include.NON_NULL) + @JsonInclude(Include.NON_NULL) @Nullable String getMessage(); - @JsonInclude(value = Include.NON_EMPTY) + @JsonInclude(Include.NON_EMPTY) Set getCapabilities(); } } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/VolatileUnavailableException.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/VolatileUnavailableException.java index ecf47a35..2c43972b 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/VolatileUnavailableException.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/resiliency/VolatileUnavailableException.java @@ -8,6 +8,8 @@ package de.ii.xtraplatform.base.domain.resiliency; public class VolatileUnavailableException extends RuntimeException { + private static final long serialVersionUID = 1L; + public VolatileUnavailableException() { super(); } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/JacksonModules.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/JacksonModules.java index e201c525..a76a9fb5 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/JacksonModules.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/JacksonModules.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings("PMD.CognitiveComplexity") public interface JacksonModules { Logger LOGGER = LoggerFactory.getLogger(JacksonModules.class); @@ -69,7 +70,7 @@ public AnnotatedMethod resolveSetterConflict( } private boolean isImmutableBuilder(Class clazz) { - return clazz.getSimpleName().equals("Builder"); + return "Builder".equals(clazz.getSimpleName()); // TODO: annotations not retained // && Objects.nonNull(clazz.getAnnotation(Generated.class)) // && clazz.getAnnotation(Generated.class).generator().equals("Immutables"); @@ -83,7 +84,7 @@ private boolean isModifiable(Class clazz) { } private boolean isOptional(Class clazz) { - return clazz.getSimpleName().equals("Optional"); + return "Optional".equals(clazz.getSimpleName()); } }; } diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/LambdaWithException.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/LambdaWithException.java index 5991837e..1335ba66 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/LambdaWithException.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/LambdaWithException.java @@ -15,7 +15,9 @@ /** * @author zahnen */ -public class LambdaWithException { +public final class LambdaWithException { + + private LambdaWithException() {} @FunctionalInterface public interface FunctionWithException { @@ -37,18 +39,20 @@ public interface SupplierWithException { T get() throws E; } + @SuppressWarnings({"PMD.AvoidThrowingRawExceptionTypes", "PMD.AvoidRethrowingException"}) public static Function mayThrow(FunctionWithException fe) { return arg -> { try { return fe.apply(arg); - } catch (Error | RuntimeException ex) { - throw ex; + } catch (Error | RuntimeException e) { + throw e; } catch (Throwable throwable) { throw new RuntimeException(throwable); } }; } + @SuppressWarnings("PMD.AvoidThrowingRawExceptionTypes") public static Consumer consumerMayThrow( ConsumerWithException ce) { return arg -> { @@ -60,6 +64,7 @@ public static Consumer consumerMayThrow( }; } + @SuppressWarnings("PMD.AvoidThrowingRawExceptionTypes") public static BiConsumer biConsumerMayThrow( BiConsumerWithException ce) { return (arg, arg2) -> { @@ -71,6 +76,7 @@ public static BiConsumer biConsumerMayThrow( }; } + @SuppressWarnings("PMD.AvoidThrowingRawExceptionTypes") public static Supplier supplierMayThrow( SupplierWithException se) { return () -> { diff --git a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/ZipWalker.java b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/ZipWalker.java index e36b48c3..9ec40687 100644 --- a/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/ZipWalker.java +++ b/xtraplatform-base/src/main/java/de/ii/xtraplatform/base/domain/util/ZipWalker.java @@ -22,39 +22,23 @@ public interface ZipWalker { static void walkEntries(Path zipFile, BiConsumer> entryHandler) throws IOException { - ZipInputStream zip = new ZipInputStream(Files.newInputStream(zipFile)); - /*JarInputStream jarInputStream = new JarInputStream(Files.newInputStream(pkg), true); - Manifest manifest = jarInputStream.getManifest(); - - if (Objects.isNull(manifest)) { - throw new IllegalArgumentException(String.format("package '%s' has no manifest", pkg)); - }*/ - - ZipEntry zipEntry = zip.getNextEntry(); - while (zipEntry != null) { - if (!zipEntry.isDirectory() && !zipEntry.getName().startsWith("META-INF")) { - /*Attributes attributes = manifest.getAttributes(zipEntry.getName()); - if (Objects.isNull(attributes)) { - throw new IllegalArgumentException( - String.format( - "entry '%s' in package '%s' is not contained in manifest", - zipEntry.getName(), pkg)); - } - attributes.forEach((key, value) -> LOGGER.error("ATT {} {}", key, value)); - */ - try { - entryHandler.accept( - Path.of("/", zipEntry.getName()), supplierMayThrow(zip::readAllBytes)); - } catch (RuntimeException e) { - if (Objects.nonNull(e.getCause()) && e.getCause() instanceof IOException) { - throw (IOException) e.getCause(); + try (ZipInputStream zip = new ZipInputStream(Files.newInputStream(zipFile))) { + ZipEntry zipEntry = zip.getNextEntry(); + while (zipEntry != null) { + if (!zipEntry.isDirectory() && !zipEntry.getName().startsWith("META-INF")) { + try { + entryHandler.accept( + Path.of("/", zipEntry.getName()), supplierMayThrow(zip::readAllBytes)); + } catch (RuntimeException e) { + if (Objects.nonNull(e.getCause()) && e.getCause() instanceof IOException) { + throw (IOException) e.getCause(); + } + throw e; } - throw e; } + zip.closeEntry(); + zipEntry = zip.getNextEntry(); } - zip.closeEntry(); - zipEntry = zip.getNextEntry(); } - zip.close(); } }