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.checksum;
020
021import javax.inject.Inject;
022import javax.inject.Named;
023import javax.inject.Singleton;
024
025import java.util.List;
026import java.util.Map;
027
028import org.eclipse.aether.RepositorySystemSession;
029import org.eclipse.aether.artifact.Artifact;
030import org.eclipse.aether.metadata.Metadata;
031import org.eclipse.aether.repository.RemoteRepository;
032import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
033import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
034import org.eclipse.aether.spi.connector.ArtifactDownload;
035import org.eclipse.aether.spi.connector.MetadataDownload;
036import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
037
038import static java.util.Objects.requireNonNull;
039
040/**
041 * Adapter that adapts {@link TrustedChecksumsSource} to {@link ProvidedChecksumsSource} used by connector. Hence, any
042 * "trusted" source exist that is enabled, automatically becomes "provided" source as well.
043 *
044 * @since 1.9.0
045 */
046@Singleton
047@Named(TrustedToProvidedChecksumsSourceAdapter.NAME)
048public final class TrustedToProvidedChecksumsSourceAdapter implements ProvidedChecksumsSource {
049    public static final String NAME = "trusted2provided";
050
051    private final Map<String, TrustedChecksumsSource> trustedChecksumsSources;
052
053    @Inject
054    public TrustedToProvidedChecksumsSourceAdapter(Map<String, TrustedChecksumsSource> trustedChecksumsSources) {
055        this.trustedChecksumsSources = requireNonNull(trustedChecksumsSources);
056    }
057
058    @Override
059    public Map<String, String> getProvidedArtifactChecksums(
060            RepositorySystemSession session,
061            ArtifactDownload transfer,
062            RemoteRepository repository,
063            List<ChecksumAlgorithmFactory> checksumAlgorithmFactories) {
064        Artifact artifact = transfer.getArtifact();
065        Map<String, String> trustedChecksums;
066        // check for connector repository
067        for (TrustedChecksumsSource trustedChecksumsSource : trustedChecksumsSources.values()) {
068            trustedChecksums = trustedChecksumsSource.getTrustedArtifactChecksums(
069                    session, artifact, repository, checksumAlgorithmFactories);
070            if (trustedChecksums != null && !trustedChecksums.isEmpty()) {
071                return trustedChecksums;
072            }
073        }
074        // if repo above is "mirrorOf", this one kicks in
075        if (!transfer.getRepositories().isEmpty()) {
076            for (RemoteRepository remoteRepository : transfer.getRepositories()) {
077                for (TrustedChecksumsSource trustedChecksumsSource : trustedChecksumsSources.values()) {
078                    trustedChecksums = trustedChecksumsSource.getTrustedArtifactChecksums(
079                            session, artifact, remoteRepository, checksumAlgorithmFactories);
080                    if (trustedChecksums != null && !trustedChecksums.isEmpty()) {
081                        return trustedChecksums;
082                    }
083                }
084            }
085        }
086        return null;
087    }
088
089    @Override
090    public Map<String, String> getProvidedMetadataChecksums(
091            RepositorySystemSession session,
092            MetadataDownload transfer,
093            RemoteRepository repository,
094            List<ChecksumAlgorithmFactory> checksumAlgorithmFactories) {
095        Metadata metadata = transfer.getMetadata();
096        Map<String, String> trustedChecksums;
097        // check for connector repository
098        for (TrustedChecksumsSource trustedChecksumsSource : trustedChecksumsSources.values()) {
099            trustedChecksums = trustedChecksumsSource.getTrustedMetadataChecksums(
100                    session, metadata, repository, checksumAlgorithmFactories);
101            if (trustedChecksums != null && !trustedChecksums.isEmpty()) {
102                return trustedChecksums;
103            }
104        }
105        // if repo above is "mirrorOf", this one kicks in
106        for (RemoteRepository remoteRepository : transfer.getRepositories()) {
107            for (TrustedChecksumsSource trustedChecksumsSource : trustedChecksumsSources.values()) {
108                trustedChecksums = trustedChecksumsSource.getTrustedMetadataChecksums(
109                        session, metadata, remoteRepository, checksumAlgorithmFactories);
110                if (trustedChecksums != null && !trustedChecksums.isEmpty()) {
111                    return trustedChecksums;
112                }
113            }
114        }
115        return null;
116    }
117}