From 6c0c0a258d5b68da51bcd80d803cfa8d96a2d292 Mon Sep 17 00:00:00 2001 From: "p.zahnen" Date: Thu, 8 Jan 2026 17:22:46 +0100 Subject: [PATCH 1/2] refactor store migration and blob store logic --- .../xtraplatform/blobs/app/BlobStoreImpl.java | 88 +-- .../blobs/domain/ResourceStore.java | 9 +- .../blobs/domain/StoreMigration.java | 612 ++++++++++-------- .../blobs/infra/BlobSourceFs.java | 4 +- 4 files changed, 377 insertions(+), 336 deletions(-) diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java index b896a7cf..a02ca20e 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java @@ -90,50 +90,54 @@ public void start() { List sources = findSources(); - Lists.reverse(sources) - .forEach( - source -> { - Optional blobStoreDriver = findDriver(source, true); - - blobStoreDriver.ifPresent( - driver -> { - try { - addSubComponent(driver, source); - - BlobSource blobSource = driver.init(source, contentType); - - blobReaders.add(blobSource); - - boolean writable = false; - if (source.isWritable() && blobSource.canWrite()) { - blobWriters.add(blobSource); - writable = true; - } - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug( - "{}{} for {} ready{}", - contentType.getLabel(), - source.getPrefix().isPresent() - ? " of type " + source.getPrefix().get() - : "", - source.getLabel(), - writable ? " and writable" : ""); - } - } catch (Throwable e) { - LogContext.error( - LOGGER, - e, - "{} for {} could not be loaded", - contentType.getLabel(), - source.getLabel()); - } - }); - }); + Lists.reverse(sources).forEach(this::initializeSource); onVolatileStarted(); } + private void initializeSource(StoreSource source) { + Optional blobStoreDriver = findDriver(source, true); + + blobStoreDriver.ifPresent(driver -> processDriver(driver, source)); + } + + private void processDriver(BlobStoreDriver driver, StoreSource source) { + try { + addSubComponent(driver, source); + + BlobSource blobSource = driver.init(source, contentType); + + blobReaders.add(blobSource); + + boolean writable = addWriterIfPossible(source, blobSource); + + logSourceReady(source, writable); + } catch (Throwable e) { + LogContext.error( + LOGGER, e, "{} for {} could not be loaded", contentType.getLabel(), source.getLabel()); + } + } + + private boolean addWriterIfPossible(StoreSource source, BlobSource blobSource) { + boolean writable = false; + if (source.isWritable() && blobSource.canWrite()) { + blobWriters.add(blobSource); + writable = true; + } + return writable; + } + + private void logSourceReady(StoreSource source, boolean writable) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug( + "{}{} for {} ready{}", + contentType.getLabel(), + source.getPrefix().isPresent() ? " of type " + source.getPrefix().get() : "", + source.getLabel(), + writable ? " and writable" : ""); + } + } + private void addSubComponent(BlobStoreDriver driver, StoreSource source) { addSubcomponent( new AbstractVolatilePolling(volatileRegistry) { @@ -182,7 +186,7 @@ private Optional findDriver(StoreSource storeSource, boolean wa .filter( d -> { if (!d.isAvailable(storeSource)) { - if (warn) { + if (warn && LOGGER.isWarnEnabled()) { LOGGER.warn( "{} for {} are not available.", contentType.getLabel(), @@ -195,7 +199,7 @@ private Optional findDriver(StoreSource storeSource, boolean wa }) .findFirst(); - if (driver.isEmpty() && !foundUnavailable[0]) { + if (driver.isEmpty() && !foundUnavailable[0] && LOGGER.isErrorEnabled()) { LOGGER.error("No blob driver found for source {}.", storeSource.getLabel()); } diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java index 7fa840d5..d8cf089a 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java @@ -35,15 +35,14 @@ default ResourceStore writableWith(String type, String... path) { } default ResourceStore writableWith(boolean writable, String type, String... path) { - ResourceStore delegate = this; - Path prefix = Path.of(type, path); - - if (!(delegate instanceof BlobWriterReader)) { + if (!(this instanceof BlobWriterReader)) { throw new IllegalStateException(); } + + Path prefix = Path.of(type, path); BlobWriterReader delegateWriter = (BlobWriterReader) this; - return new PrefixedResourceStore(delegate, prefix, delegateWriter, writable); + return new PrefixedResourceStore(this, prefix, delegateWriter, writable); } class PrefixedResourceStore implements ResourceStore, BlobWriterReader { diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java index 854e000a..41861744 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -89,294 +88,333 @@ static String filters(StoreSourceFs source, String replace) { } default List> getPreview() { - return getMoves().stream() - .flatMap( - moves -> { - Content content = moves.first().getContent(); - Path from = Path.of(moves.first().getSrc()); - Optional prefix = moves.first().getPrefix(); - - if (content == Content.ENTITIES) { - Path to = Path.of(content.getPrefix()); - List> inter = new ArrayList<>(); - - try { - if (getContext().reader().has(from.resolve(Content.DEFAULTS.getPrefix()))) { - inter.add( - Map.entry( - from.resolve(Content.DEFAULTS.getPrefix()).normalize().toString(), - to.resolve(Content.DEFAULTS.getPrefix()).normalize().toString())); - } - } catch (Throwable e) { - } - try { - if (getContext().reader().has(from.resolve(Content.INSTANCES_OLD.getPrefix()))) { - inter.add( - Map.entry( - from.resolve(Content.INSTANCES_OLD.getPrefix()).normalize().toString() - + filters(moves.first(), Content.INSTANCES_OLD.getPrefix()), - to.resolve(Content.INSTANCES.getPrefix()).normalize().toString())); - } - } catch (Throwable e) { - } - try { - if (getContext().reader().has(from.resolve(Content.OVERRIDES.getPrefix()))) { - inter.add( - Map.entry( - from.resolve(Content.OVERRIDES.getPrefix()).normalize().toString(), - to.resolve(Content.OVERRIDES.getPrefix()).normalize().toString())); - } - } catch (Throwable e) { - } - - return inter.stream(); - } - if (content == Content.RESOURCES || content == Content.VALUES) { - try { - if (!getContext().reader().has(from)) { - return Stream.>empty(); - } - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - return Stream.>empty(); - } - - String from2 = - moves.first().getAbsolutePath(Path.of("")).normalize().toString() - + filters(moves.first()); - String to = - moves - .second() - .getAbsolutePath(Path.of(content.getPrefix())) - .resolve(Path.of(prefix.orElse(""))) - .normalize() - .toString(); - - return Stream.of(Map.entry(from2, to)); - } - return Stream.>empty(); - }) - .collect(Collectors.toList()); + return getMoves().stream().flatMap(this::getPreviewForMove).collect(Collectors.toList()); + } + + default Stream> getPreviewForMove( + Tuple moves) { + Content content = moves.first().getContent(); + + if (content == Content.ENTITIES) { + Path from = Path.of(moves.first().getSrc()); + return getPreviewForEntities(from, content); + } + if (content == Content.RESOURCES || content == Content.VALUES) { + Path from = Path.of(moves.first().getSrc()); + Optional prefix = moves.first().getPrefix(); + return getPreviewForResourcesOrValues(moves, from, content, prefix); + } + return Stream.>empty(); + } + + default Stream> getPreviewForEntities(Path from, Content content) { + Path to = Path.of(content.getPrefix()); + List> entries = new ArrayList<>(); + + addPreviewEntryIfExists(entries, from, to, Content.DEFAULTS); + addPreviewEntryIfExists(entries, from, to, Content.INSTANCES_OLD, Content.INSTANCES); + addPreviewEntryIfExists(entries, from, to, Content.OVERRIDES); + + return entries.stream(); + } + + default void addPreviewEntryIfExists( + List> entries, Path from, Path to, Content sourceContent) { + addPreviewEntryIfExists(entries, from, to, sourceContent, sourceContent); + } + + default void addPreviewEntryIfExists( + List> entries, + Path from, + Path to, + Content sourceContent, + Content targetContent) { + try { + if (getContext().reader().has(from.resolve(sourceContent.getPrefix()))) { + String fromPath = from.resolve(sourceContent.getPrefix()).normalize().toString(); + String toPath = to.resolve(targetContent.getPrefix()).normalize().toString(); + + if (sourceContent == Content.INSTANCES_OLD) { + fromPath += filters(getMoves().get(0).first(), Content.INSTANCES_OLD.getPrefix()); + } + + entries.add(Map.entry(fromPath, toPath)); + } + } catch (Throwable e) { + // Ignore I/O exceptions during preview - migration will handle missing sources gracefully + } + } + + default Stream> getPreviewForResourcesOrValues( + Tuple moves, + Path from, + Content content, + Optional prefix) { + try { + if (!getContext().reader().has(from)) { + return Stream.>empty(); + } + } catch (Throwable e) { + // Ignore I/O exceptions - source may not exist during preview + return Stream.>empty(); + } + + String fromPath = + moves.first().getAbsolutePath(Path.of("")).normalize().toString() + filters(moves.first()); + String toPath = + moves + .second() + .getAbsolutePath(Path.of(content.getPrefix())) + .resolve(Path.of(prefix.orElse(""))) + .normalize() + .toString(); + + return Stream.of(Map.entry(fromPath, toPath)); } default List> migrate() { - return getMoves().stream() - .flatMap( - moves -> { - Content content = moves.first().getContent(); - Path from = Path.of(moves.first().getSrc()); - Optional prefix = moves.first().getPrefix(); - - if (content == Content.ENTITIES) { - Path to = Path.of(content.getPrefix()); - List> inter = new ArrayList<>(); - - try { - if (getContext().reader().has(from.resolve(Content.DEFAULTS.getPrefix()))) { - inter.add( - Map.entry( - from.resolve(Content.DEFAULTS.getPrefix()).normalize(), - to.resolve(Content.DEFAULTS.getPrefix()).normalize())); - } - } catch (Throwable e) { - } - try { - if (getContext().reader().has(from.resolve(Content.INSTANCES_OLD.getPrefix()))) { - if (!moves.first().getIncludes().isEmpty() - || !moves.first().getExcludes().isEmpty()) { - Path from2 = from.resolve(Content.INSTANCES_OLD.getPrefix()); - Path to2 = to.resolve(Content.INSTANCES.getPrefix()); - List includes = - StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); - List excludes = - StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); - - try (Stream paths = - getContext() - .reader() - .walk( - from2, - 8, - (p, a) -> - a.isValue() - && (includes.isEmpty() - || includes.stream() - .anyMatch( - include -> include.matches(from2.resolve(p)))) - && excludes.stream() - .noneMatch( - exclude -> exclude.matches(from2.resolve(p))))) { - paths.forEach( - path -> - inter.add( - Map.entry( - from2.resolve(path).normalize(), - to2.resolve(path).normalize()))); - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - } - } else { - inter.add( - Map.entry( - from.resolve(Content.INSTANCES_OLD.getPrefix()).normalize(), - to.resolve(Content.INSTANCES.getPrefix()).normalize())); - } - } - } catch (Throwable e) { - } - try { - if (getContext().reader().has(from.resolve(Content.OVERRIDES.getPrefix()))) { - inter.add( - Map.entry( - from.resolve(Content.OVERRIDES.getPrefix()).normalize(), - to.resolve(Content.OVERRIDES.getPrefix()).normalize())); - } - } catch (Throwable e) { - } - - return inter.stream(); - } - if (content == Content.VALUES) { - try { - if (!getContext().reader().has(from)) { - return Stream.>empty(); - } - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - return Stream.>empty(); - } - - Path to = Path.of(content.getPrefix()).resolve(Path.of(prefix.orElse(""))); - List includes = - StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); - List excludes = - StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); - - List> inter = new ArrayList<>(); - try (Stream paths = - getContext() - .reader() - .walk( - from, - 8, - (p, a) -> - a.isValue() - && (includes.isEmpty() - || includes.stream() - .anyMatch(include -> include.matches(from.resolve(p)))) - && excludes.stream() - .noneMatch(exclude -> exclude.matches(from.resolve(p))))) { - paths.forEach( - path -> - inter.add( - Map.entry( - from.resolve(path).normalize(), - to.resolve( - Objects.equals(prefix.orElse(""), "codelists") - ? path.getFileName() - : path) - .normalize()))); - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - } - return inter.stream(); - } - if (content == Content.RESOURCES) { - try { - if (!getContext().reader().has(from)) { - return Stream.>empty(); - } - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - return Stream.>empty(); - } - - if (prefix.isEmpty() || prefix.get().startsWith("tiles")) { - Path to = Path.of(content.getPrefix()).resolve(Path.of(prefix.orElse(""))); - List includes = - StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); - List excludes = - StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); - - List> inter = new ArrayList<>(); - try (Stream paths = - getContext().reader().walk(from, 1, (p, a) -> !a.isValue())) { - paths - .skip(1) - .filter( - path -> - (includes.isEmpty() - || includes.stream() - .anyMatch( - include -> include.matches(from.resolve(path)))) - && excludes.stream() - .noneMatch(exclude -> exclude.matches(from.resolve(path))) - && !path.endsWith("__tmp__")) - // .sorted(Comparator.reverseOrder()) - .forEach( - path -> - inter.add( - Map.entry( - from.resolve(path).normalize(), - to.resolve(path).normalize()))); - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - } - return inter.stream(); - } else if (!moves.first().getIncludes().isEmpty() - || !moves.first().getExcludes().isEmpty()) { - Path to = Path.of(content.getPrefix()).resolve(Path.of(prefix.orElse(""))); - List includes = - StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); - List excludes = - StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); - - List> inter = new ArrayList<>(); - try (Stream paths = - getContext() - .reader() - .walk( - from, - 8, - (p, a) -> - a.isValue() - && (includes.isEmpty() - || includes.stream() - .anyMatch( - include -> include.matches(from.resolve(p)))) - && excludes.stream() - .noneMatch( - exclude -> exclude.matches(from.resolve(p))))) { - paths.forEach( - path -> - inter.add( - Map.entry( - from.resolve(path).normalize(), to.resolve(path).normalize()))); - } catch (Throwable e) { - // ignore - System.out.println("E " + e.getMessage()); - } - return inter.stream(); - } - - Path from2 = moves.first().getAbsolutePath(Path.of("")).normalize(); - Path to = - moves - .second() - .getAbsolutePath(Path.of(content.getPrefix())) - .resolve(Path.of(prefix.orElse(""))) - .normalize(); - - return Stream.of(Map.entry(from2, to)); - } - return Stream.>empty(); - }) - .collect(Collectors.toList()); + return getMoves().stream().flatMap(this::migrateMove).collect(Collectors.toList()); + } + + default Stream> migrateMove(Tuple moves) { + Content content = moves.first().getContent(); + + if (content == Content.ENTITIES) { + Path from = Path.of(moves.first().getSrc()); + return migrateEntities(moves, from); + } + if (content == Content.VALUES) { + Path from = Path.of(moves.first().getSrc()); + Optional prefix = moves.first().getPrefix(); + return migrateValues(moves, from, prefix); + } + if (content == Content.RESOURCES) { + Path from = Path.of(moves.first().getSrc()); + Optional prefix = moves.first().getPrefix(); + return migrateResources(moves, from, prefix); + } + return Stream.>empty(); + } + + default Stream> migrateEntities( + Tuple moves, Path from) { + Content content = moves.first().getContent(); + Path to = Path.of(content.getPrefix()); + List> entries = new ArrayList<>(); + + addMigrationEntryIfExists(entries, from, to, Content.DEFAULTS); + addInstancesMigration(entries, moves, from, to); + addMigrationEntryIfExists(entries, from, to, Content.OVERRIDES); + + return entries.stream(); + } + + default void addMigrationEntryIfExists( + List> entries, Path from, Path to, Content content) { + try { + if (getContext().reader().has(from.resolve(content.getPrefix()))) { + entries.add( + Map.entry( + from.resolve(content.getPrefix()).normalize(), + to.resolve(content.getPrefix()).normalize())); + } + } catch (Throwable e) { + // Ignore I/O exceptions during migration + } + } + + default void addInstancesMigration( + List> entries, + Tuple moves, + Path from, + Path to) { + try { + if (getContext().reader().has(from.resolve(Content.INSTANCES_OLD.getPrefix()))) { + if (moves.first().getIncludes().isEmpty() && moves.first().getExcludes().isEmpty()) { + entries.add( + Map.entry( + from.resolve(Content.INSTANCES_OLD.getPrefix()).normalize(), + to.resolve(Content.INSTANCES.getPrefix()).normalize())); + } else { + addFilteredInstancesMigration(entries, moves, from, to); + } + } + } catch (Throwable e) { + // Ignore I/O exceptions during migration + } + } + + default void addFilteredInstancesMigration( + List> entries, + Tuple moves, + Path from, + Path to) { + Path from2 = from.resolve(Content.INSTANCES_OLD.getPrefix()); + Path to2 = to.resolve(Content.INSTANCES.getPrefix()); + List includes = + StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); + List excludes = + StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); + + try (Stream paths = + getContext() + .reader() + .walk( + from2, + 8, + (p, a) -> + a.isValue() + && (includes.isEmpty() + || includes.stream() + .anyMatch(include -> include.matches(from2.resolve(p)))) + && excludes.stream() + .noneMatch(exclude -> exclude.matches(from2.resolve(p))))) { + paths.forEach( + path -> + entries.add( + Map.entry(from2.resolve(path).normalize(), to2.resolve(path).normalize()))); + } catch (Throwable e) { + // Ignore I/O exceptions during filtered migration + } + } + + default Stream> migrateValues( + Tuple moves, Path from, Optional prefix) { + try { + if (!getContext().reader().has(from)) { + return Stream.>empty(); + } + } catch (Throwable e) { + // Ignore I/O exceptions - source may not exist + return Stream.>empty(); + } + + Path to = Path.of(Content.VALUES.getPrefix()).resolve(Path.of(prefix.orElse(""))); + List includes = + StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); + List excludes = + StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); + + List> entries = new ArrayList<>(); + try (Stream paths = + getContext() + .reader() + .walk( + from, + 8, + (p, a) -> + a.isValue() + && (includes.isEmpty() + || includes.stream() + .anyMatch(include -> include.matches(from.resolve(p)))) + && excludes.stream() + .noneMatch(exclude -> exclude.matches(from.resolve(p))))) { + paths.forEach( + path -> + entries.add( + Map.entry( + from.resolve(path).normalize(), + to.resolve( + Objects.equals(prefix.orElse(""), "codelists") + ? path.getFileName() + : path) + .normalize()))); + } catch (Throwable e) { + // Ignore I/O exceptions during values migration + } + return entries.stream(); + } + + default Stream> migrateResources( + Tuple moves, Path from, Optional prefix) { + try { + if (!getContext().reader().has(from)) { + return Stream.>empty(); + } + } catch (Throwable e) { + // Ignore I/O exceptions - source may not exist + return Stream.>empty(); + } + + if (prefix.isEmpty() || prefix.get().startsWith("tiles")) { + return migrateResourcesTiles(moves, from, prefix); + } else if (moves.first().getIncludes().isEmpty() && moves.first().getExcludes().isEmpty()) { + return migrateResourcesSimple(moves, from, prefix); + } else { + return migrateResourcesFiltered(moves, from, prefix); + } + } + + default Stream> migrateResourcesTiles( + Tuple moves, Path from, Optional prefix) { + Path to = Path.of(Content.RESOURCES.getPrefix()).resolve(Path.of(prefix.orElse(""))); + List includes = + StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); + List excludes = + StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); + + List> entries = new ArrayList<>(); + try (Stream paths = getContext().reader().walk(from, 1, (p, a) -> !a.isValue())) { + paths + .skip(1) + .filter( + path -> + (includes.isEmpty() + || includes.stream() + .anyMatch(include -> include.matches(from.resolve(path)))) + && excludes.stream().noneMatch(exclude -> exclude.matches(from.resolve(path))) + && !path.endsWith("__tmp__")) + .forEach( + path -> + entries.add( + Map.entry(from.resolve(path).normalize(), to.resolve(path).normalize()))); + } catch (Throwable e) { + // Ignore I/O exceptions during tiles migration + } + return entries.stream(); + } + + default Stream> migrateResourcesFiltered( + Tuple moves, Path from, Optional prefix) { + Path to = Path.of(Content.RESOURCES.getPrefix()).resolve(Path.of(prefix.orElse(""))); + List includes = + StoreDriver.asMatchers(moves.first().getIncludes(), from.toString()); + List excludes = + StoreDriver.asMatchers(moves.first().getExcludes(), from.toString()); + + List> entries = new ArrayList<>(); + try (Stream paths = + getContext() + .reader() + .walk( + from, + 8, + (p, a) -> + a.isValue() + && (includes.isEmpty() + || includes.stream() + .anyMatch(include -> include.matches(from.resolve(p)))) + && excludes.stream() + .noneMatch(exclude -> exclude.matches(from.resolve(p))))) { + paths.forEach( + path -> + entries.add(Map.entry(from.resolve(path).normalize(), to.resolve(path).normalize()))); + } catch (Throwable e) { + // Ignore I/O exceptions during filtered resources migration + } + return entries.stream(); + } + + default Stream> migrateResourcesSimple( + Tuple moves, Path from, Optional prefix) { + Path from2 = moves.first().getAbsolutePath(Path.of("")).normalize(); + Path to = + moves + .second() + .getAbsolutePath(Path.of(Content.RESOURCES.getPrefix())) + .resolve(Path.of(prefix.orElse(""))) + .normalize(); + + return Stream.of(Map.entry(from2, to)); } } diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java index 9826a583..31011349 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java @@ -136,7 +136,7 @@ public Stream walk(Path path, int maxDepth, BiPredicate + (path1, basicFileAttributes) -> (includes.isEmpty() || includes.stream().anyMatch(include -> include.matches(path1))) && excludes.stream().noneMatch(exclude -> exclude.matches(path1)) @@ -152,7 +152,7 @@ public boolean isValue() { public boolean isHidden() { return path1.getFileName().toString().startsWith("."); } - }))) + })) .map(dir::relativize); } From 8f4b884ae7a10213de9cfb408ecd4fe725796962 Mon Sep 17 00:00:00 2001 From: "p.zahnen" Date: Fri, 9 Jan 2026 11:38:12 +0100 Subject: [PATCH 2/2] suppress warnings --- .../java/de/ii/xtraplatform/blobs/app/BlobCacheImpl.java | 2 +- .../java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java | 1 + .../src/main/java/de/ii/xtraplatform/blobs/domain/Blob.java | 2 +- .../java/de/ii/xtraplatform/blobs/domain/ResourceStore.java | 1 + .../de/ii/xtraplatform/blobs/domain/StoreMigration.java | 1 + .../de/ii/xtraplatform/blobs/infra/BlobExtractorZip.java | 6 +++--- .../java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java | 3 ++- .../de/ii/xtraplatform/blobs/infra/BlobStoreDriverHttp.java | 4 +--- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobCacheImpl.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobCacheImpl.java index e3ad63f6..71a23f13 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobCacheImpl.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobCacheImpl.java @@ -48,7 +48,7 @@ public Path put(Path path, String eTag, InputStream content) throws IOException Files.createDirectories(cachePath.getParent()); Files.copy(content, cachePath, StandardCopyOption.REPLACE_EXISTING); - // TODO: cleanup older/other entries? + // NOPMD - TODO: cleanup older/other entries? return cachePath; } diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java index a02ca20e..1971f419 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/app/BlobStoreImpl.java @@ -40,6 +40,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings({"PMD.TooManyMethods", "PMD.GodClass"}) public class BlobStoreImpl extends AbstractVolatileComposedPolling implements BlobStore, BlobWriterReader { diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/Blob.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/Blob.java index 881a1978..7dbb5e80 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/Blob.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/Blob.java @@ -57,7 +57,7 @@ public String contentType() { return precomputedContentType() .orElseGet( () -> { - // TODO: URLConnection content-type guessing doesn't seem to work well, maybe try + // NOTE: URLConnection content-type guessing doesn't seem to work well, maybe try // Apache Tika String contentType = URLConnection.guessContentTypeFromName(path().getFileName().toString()); diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java index d8cf089a..13d6aaec 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/ResourceStore.java @@ -19,6 +19,7 @@ import java.util.function.BiPredicate; import java.util.stream.Stream; +@SuppressWarnings("PMD.TooManyMethods") public interface ResourceStore extends BlobReader, BlobWriter, BlobLocals, Volatile2, VolatileRegistered { diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java index 41861744..1774940a 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/domain/StoreMigration.java @@ -24,6 +24,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +@SuppressWarnings("PMD.TooManyMethods") public interface StoreMigration extends Migration { enum Type { BLOB, diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobExtractorZip.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobExtractorZip.java index 8fc9fc35..aefd6690 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobExtractorZip.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobExtractorZip.java @@ -29,9 +29,9 @@ public void extract( Path targetRoot, boolean overwrite) throws IOException { - if (overwrite) { - // TODO: delete target directory - } + // if (overwrite) { + // NOPMD - TODO: delete target directory + // } ZipWalker.walkEntries( archiveFile, diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java index 31011349..4e640965 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobSourceFs.java @@ -27,6 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings("PMD.TooManyMethods") public class BlobSourceFs implements BlobSource, BlobWriter, BlobLocals { private static final Logger LOGGER = LoggerFactory.getLogger(BlobSourceFs.class); @@ -193,7 +194,7 @@ public void delete(Path path) throws IOException { Files.deleteIfExists(filePath); } - // TODO: remote sources might provide readable locals, but never writable ones + // NOTE: remote sources might provide readable locals, but never writable ones @Override public Optional asLocalPath(Path path, boolean writable) throws IOException { if (!canHandle(path)) { diff --git a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobStoreDriverHttp.java b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobStoreDriverHttp.java index fb2eba83..0ec18f8f 100644 --- a/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobStoreDriverHttp.java +++ b/xtraplatform-blobs/src/main/java/de/ii/xtraplatform/blobs/infra/BlobStoreDriverHttp.java @@ -71,8 +71,7 @@ public BlobSource init(StoreSource storeSource, Content contentType) throws IOEx Path root = getDirectory(archivePath.get()); Path extractRoot = storeSource.isSingleContent() ? root.resolve(storeSource.getPrefix().orElse("")) : root; - // TODO - // LOGGER.debug("EXTRACT {}", storeSource.getLabel()); + // NOPMD - TODO // if (!storeSource.getArchiveCache() || !Files.exists(root)) { blobExtractor.extract( archivePath.get(), @@ -81,7 +80,6 @@ public BlobSource init(StoreSource storeSource, Content contentType) throws IOEx extractRoot, !storeSource.getArchiveCache()); // } - // LOGGER.debug("EXTRACTED {}", storeSource.getLabel()); if (!storeSource.isSingleContent()) { root = root.resolve(contentType.getPrefix()); }