Skip to content

Commit

Permalink
Make the composite TransferRelatedObjects accessible to other proje…
Browse files Browse the repository at this point in the history
…cts (#9689)

no functional change
  • Loading branch information
snazy authored Oct 7, 2024
1 parent 11a7438 commit 17d590d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<TransferRelatedObjects> transferRelatedObjectsImpls;
private final Predicate<ObjId> 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<ObjId> seen = new ObjectHashSet<>();
public static TransferRelatedObjects createCompositeTransferRelatedObjects() {
return createCompositeTransferRelatedObjects(List.of(), x -> true);
}

public static TransferRelatedObjects createCompositeTransferRelatedObjects(List<URL> jarUrls) {
return createCompositeTransferRelatedObjects(jarUrls, x -> true);
}

public static TransferRelatedObjects createCompositeTransferRelatedObjects(
List<URL> jarUrls, Predicate<ObjId> filter) {
return new CompositeTransferRelatedObjects(jarUrls, filter);
}

public CompositeTransferRelatedObjects(List<URL> jarUrls) {
private CompositeTransferRelatedObjects(List<URL> jarUrls, Predicate<ObjId> 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
Expand All @@ -54,35 +59,36 @@ public CompositeTransferRelatedObjects(List<URL> jarUrls) {
ServiceLoader.load(TransferRelatedObjects.class, cl).stream()
.map(ServiceLoader.Provider::get)
.collect(Collectors.toList());
this.filter = filter;
}

private Set<ObjId> filterSeen(Stream<ObjId> src) {
return src.filter(seen::add).collect(Collectors.toSet());
private Set<ObjId> filter(Stream<ObjId> src) {
return src.filter(filter).collect(Collectors.toSet());
}

@Override
public Set<ObjId> repositoryRelatedObjects() {
return filterSeen(
return filter(
transferRelatedObjectsImpls.stream().flatMap(i -> i.repositoryRelatedObjects().stream()));
}

@Override
public Set<ObjId> commitRelatedObjects(CommitObj commitObj) {
return filterSeen(
return filter(
transferRelatedObjectsImpls.stream()
.flatMap(i -> i.commitRelatedObjects(commitObj).stream()));
}

@Override
public Set<ObjId> contentRelatedObjects(Content content) {
return filterSeen(
return filter(
transferRelatedObjectsImpls.stream()
.flatMap(i -> i.contentRelatedObjects(content).stream()));
}

@Override
public Set<ObjId> referenceRelatedObjects(Reference reference) {
return filterSeen(
return filter(
transferRelatedObjectsImpls.stream()
.flatMap(i -> i.referenceRelatedObjects(reference).stream()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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<ObjId> seen = new ObjectHashSet<>();
this.transferRelatedObjects =
new CompositeTransferRelatedObjects(exporter.genericObjectResolvers());
CompositeTransferRelatedObjects.createCompositeTransferRelatedObjects(
exporter.genericObjectResolvers(), seen::add);
}

private static ExportVersion verifyExportVersion(ExportVersion exportVersion) {
Expand Down

0 comments on commit 17d590d

Please sign in to comment.