From 17d590d1e02cf2ea3e9961182fd371e796853ce9 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 7 Oct 2024 08:27:28 +0200 Subject: [PATCH] Make the composite `TransferRelatedObjects` accessible to other projects (#9689) no functional change --- .../CompositeTransferRelatedObjects.java | 42 +++++++++++-------- .../versioned/transfer/ExportCommon.java | 11 ++++- 2 files changed, 34 insertions(+), 19 deletions(-) rename versioned/{transfer/src/main/java/org/projectnessie/versioned/transfer => transfer-related/src/main/java/org/projectnessie/versioned/transfer/related}/CompositeTransferRelatedObjects.java (71%) diff --git a/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/CompositeTransferRelatedObjects.java b/versioned/transfer-related/src/main/java/org/projectnessie/versioned/transfer/related/CompositeTransferRelatedObjects.java similarity index 71% rename from versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/CompositeTransferRelatedObjects.java rename to versioned/transfer-related/src/main/java/org/projectnessie/versioned/transfer/related/CompositeTransferRelatedObjects.java index 1c956f3653..0ff4e1b318 100644 --- a/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/CompositeTransferRelatedObjects.java +++ b/versioned/transfer-related/src/main/java/org/projectnessie/versioned/transfer/related/CompositeTransferRelatedObjects.java @@ -13,35 +13,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.projectnessie.versioned.transfer; +package org.projectnessie.versioned.transfer.related; import java.net.URL; import java.net.URLClassLoader; import java.util.List; import java.util.ServiceLoader; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.agrona.collections.ObjectHashSet; import org.projectnessie.model.Content; -import org.projectnessie.versioned.storage.common.logic.IdentifyHeadsAndForkPoints; import org.projectnessie.versioned.storage.common.objtypes.CommitObj; import org.projectnessie.versioned.storage.common.persist.ObjId; import org.projectnessie.versioned.storage.common.persist.Reference; -import org.projectnessie.versioned.transfer.related.TransferRelatedObjects; -final class CompositeTransferRelatedObjects implements TransferRelatedObjects { +public final class CompositeTransferRelatedObjects implements TransferRelatedObjects { private final List transferRelatedObjectsImpls; + private final Predicate filter; - /** - * One "related" object might be referenced by multiple content objects or commits or references. - * This implementation avoid exporting the same "related" object more than once. This set of - * {@link ObjId}s is unbounded, like the collections in {@link IdentifyHeadsAndForkPoints}. - */ - private final ObjectHashSet seen = new ObjectHashSet<>(); + public static TransferRelatedObjects createCompositeTransferRelatedObjects() { + return createCompositeTransferRelatedObjects(List.of(), x -> true); + } + + public static TransferRelatedObjects createCompositeTransferRelatedObjects(List jarUrls) { + return createCompositeTransferRelatedObjects(jarUrls, x -> true); + } + + public static TransferRelatedObjects createCompositeTransferRelatedObjects( + List jarUrls, Predicate filter) { + return new CompositeTransferRelatedObjects(jarUrls, filter); + } - public CompositeTransferRelatedObjects(List jarUrls) { + private CompositeTransferRelatedObjects(List jarUrls, Predicate filter) { // Exporter runs as a Quarkus CLI application, so "just adding additional jars via `java // -classpath`" doesn't work here. The artifacts that implement TransferRelatedObjects are // rather lightweight and only depend on code that's present in Nessie's server-admin-tool (in @@ -54,35 +59,36 @@ public CompositeTransferRelatedObjects(List jarUrls) { ServiceLoader.load(TransferRelatedObjects.class, cl).stream() .map(ServiceLoader.Provider::get) .collect(Collectors.toList()); + this.filter = filter; } - private Set filterSeen(Stream src) { - return src.filter(seen::add).collect(Collectors.toSet()); + private Set filter(Stream src) { + return src.filter(filter).collect(Collectors.toSet()); } @Override public Set repositoryRelatedObjects() { - return filterSeen( + return filter( transferRelatedObjectsImpls.stream().flatMap(i -> i.repositoryRelatedObjects().stream())); } @Override public Set commitRelatedObjects(CommitObj commitObj) { - return filterSeen( + return filter( transferRelatedObjectsImpls.stream() .flatMap(i -> i.commitRelatedObjects(commitObj).stream())); } @Override public Set contentRelatedObjects(Content content) { - return filterSeen( + return filter( transferRelatedObjectsImpls.stream() .flatMap(i -> i.contentRelatedObjects(content).stream())); } @Override public Set referenceRelatedObjects(Reference reference) { - return filterSeen( + return filter( transferRelatedObjectsImpls.stream() .flatMap(i -> i.referenceRelatedObjects(reference).stream())); } diff --git a/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/ExportCommon.java b/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/ExportCommon.java index 7dcb106056..d9c8a76631 100644 --- a/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/ExportCommon.java +++ b/versioned/transfer/src/main/java/org/projectnessie/versioned/transfer/ExportCommon.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import org.agrona.collections.ObjectHashSet; import org.projectnessie.api.NessieVersion; import org.projectnessie.nessie.relocated.protobuf.UnsafeByteOperations; import org.projectnessie.versioned.storage.common.logic.RepositoryDescription; @@ -37,6 +38,7 @@ import org.projectnessie.versioned.storage.common.persist.ObjType; import org.projectnessie.versioned.storage.serialize.SmileSerialization; import org.projectnessie.versioned.transfer.files.ExportFileSupplier; +import org.projectnessie.versioned.transfer.related.CompositeTransferRelatedObjects; import org.projectnessie.versioned.transfer.related.TransferRelatedObjects; import org.projectnessie.versioned.transfer.serialize.TransferTypes; import org.projectnessie.versioned.transfer.serialize.TransferTypes.ExportMeta; @@ -60,8 +62,15 @@ abstract class ExportCommon { this.exportVersion = verifyExportVersion(exportVersion); + /* + * One "related" object might be referenced by multiple content objects or commits or references. + * This implementation avoid exporting the same "related" object more than once. This set of + * {@link ObjId}s is unbounded, like the collections in {@link IdentifyHeadsAndForkPoints}. + */ + ObjectHashSet seen = new ObjectHashSet<>(); this.transferRelatedObjects = - new CompositeTransferRelatedObjects(exporter.genericObjectResolvers()); + CompositeTransferRelatedObjects.createCompositeTransferRelatedObjects( + exporter.genericObjectResolvers(), seen::add); } private static ExportVersion verifyExportVersion(ExportVersion exportVersion) {