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