001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.eclipse.aether.internal.impl.filter;
020
021import java.util.ArrayList;
022import java.util.Collection;
023import java.util.List;
024
025import org.eclipse.aether.repository.RemoteRepository;
026import org.eclipse.aether.spi.connector.ArtifactDownload;
027import org.eclipse.aether.spi.connector.ArtifactUpload;
028import org.eclipse.aether.spi.connector.MetadataDownload;
029import org.eclipse.aether.spi.connector.MetadataUpload;
030import org.eclipse.aether.spi.connector.RepositoryConnector;
031import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
032import org.eclipse.aether.transfer.ArtifactNotFoundException;
033import org.eclipse.aether.transfer.MetadataNotFoundException;
034
035import static java.util.Objects.requireNonNull;
036
037/**
038 * A filtering connector that filter transfers using remote repository filter and delegates to another connector.
039 *
040 * @since 1.9.0
041 */
042public final class FilteringRepositoryConnector implements RepositoryConnector {
043    private final RemoteRepository remoteRepository;
044
045    private final RepositoryConnector delegate;
046
047    private final RemoteRepositoryFilter remoteRepositoryFilter;
048
049    public FilteringRepositoryConnector(
050            RemoteRepository remoteRepository,
051            RepositoryConnector delegate,
052            RemoteRepositoryFilter remoteRepositoryFilter) {
053        this.remoteRepository = requireNonNull(remoteRepository);
054        this.delegate = requireNonNull(delegate);
055        this.remoteRepositoryFilter = requireNonNull(remoteRepositoryFilter);
056    }
057
058    @Override
059    public void close() {
060        delegate.close();
061    }
062
063    @Override
064    public void get(
065            Collection<? extends ArtifactDownload> artifactDownloads,
066            Collection<? extends MetadataDownload> metadataDownloads) {
067        List<ArtifactDownload> filteredArtifactDownloads = null;
068        if (artifactDownloads != null && !artifactDownloads.isEmpty()) {
069            filteredArtifactDownloads = new ArrayList<>(artifactDownloads.size());
070            for (ArtifactDownload artifactDownload : artifactDownloads) {
071                RemoteRepositoryFilter.Result result =
072                        remoteRepositoryFilter.acceptArtifact(remoteRepository, artifactDownload.getArtifact());
073                if (result.isAccepted()) {
074                    filteredArtifactDownloads.add(artifactDownload);
075                } else {
076                    artifactDownload.setException(new ArtifactNotFoundException(
077                            artifactDownload.getArtifact(), remoteRepository, result.reasoning()));
078                }
079            }
080        }
081        List<MetadataDownload> filteredMetadataDownloads = null;
082        if (metadataDownloads != null && !metadataDownloads.isEmpty()) {
083            filteredMetadataDownloads = new ArrayList<>(metadataDownloads.size());
084            for (MetadataDownload metadataDownload : metadataDownloads) {
085                RemoteRepositoryFilter.Result result =
086                        remoteRepositoryFilter.acceptMetadata(remoteRepository, metadataDownload.getMetadata());
087                if (result.isAccepted()) {
088                    filteredMetadataDownloads.add(metadataDownload);
089                } else {
090                    metadataDownload.setException(new MetadataNotFoundException(
091                            metadataDownload.getMetadata(), remoteRepository, result.reasoning()));
092                }
093            }
094        }
095        delegate.get(filteredArtifactDownloads, filteredMetadataDownloads);
096    }
097
098    @Override
099    public void put(
100            Collection<? extends ArtifactUpload> artifactUploads,
101            Collection<? extends MetadataUpload> metadataUploads) {
102        delegate.put(artifactUploads, metadataUploads);
103    }
104
105    @Override
106    public String toString() {
107        return "filtered(" + delegate.toString() + ")";
108    }
109}