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.connector.basic; 020 021import javax.inject.Inject; 022import javax.inject.Named; 023 024import java.util.Collections; 025import java.util.Map; 026 027import org.eclipse.aether.RepositorySystemSession; 028import org.eclipse.aether.repository.RemoteRepository; 029import org.eclipse.aether.spi.connector.RepositoryConnector; 030import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; 031import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider; 032import org.eclipse.aether.spi.connector.checksum.ProvidedChecksumsSource; 033import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider; 034import org.eclipse.aether.spi.connector.transport.TransporterProvider; 035import org.eclipse.aether.spi.io.FileProcessor; 036import org.eclipse.aether.spi.locator.Service; 037import org.eclipse.aether.spi.locator.ServiceLocator; 038import org.eclipse.aether.transfer.NoRepositoryConnectorException; 039 040import static java.util.Objects.requireNonNull; 041 042/** 043 * A repository connector factory that employs pluggable 044 * {@link org.eclipse.aether.spi.connector.transport.TransporterFactory transporters} and 045 * {@link org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory repository layouts} for the transfers. 046 */ 047@Named("basic") 048public final class BasicRepositoryConnectorFactory implements RepositoryConnectorFactory, Service { 049 private TransporterProvider transporterProvider; 050 051 private RepositoryLayoutProvider layoutProvider; 052 053 private ChecksumPolicyProvider checksumPolicyProvider; 054 055 private FileProcessor fileProcessor; 056 057 private Map<String, ProvidedChecksumsSource> providedChecksumsSources; 058 059 private float priority; 060 061 /** 062 * Creates an (uninitialized) instance of this connector factory. <em>Note:</em> In case of manual instantiation by 063 * clients, the new factory needs to be configured via its various mutators before first use or runtime errors will 064 * occur. 065 */ 066 public BasicRepositoryConnectorFactory() { 067 // enables default constructor 068 } 069 070 @Inject 071 BasicRepositoryConnectorFactory( 072 TransporterProvider transporterProvider, 073 RepositoryLayoutProvider layoutProvider, 074 ChecksumPolicyProvider checksumPolicyProvider, 075 FileProcessor fileProcessor, 076 Map<String, ProvidedChecksumsSource> providedChecksumsSources) { 077 setTransporterProvider(transporterProvider); 078 setRepositoryLayoutProvider(layoutProvider); 079 setChecksumPolicyProvider(checksumPolicyProvider); 080 setFileProcessor(fileProcessor); 081 setProvidedChecksumSources(providedChecksumsSources); 082 } 083 084 public void initService(ServiceLocator locator) { 085 setTransporterProvider(locator.getService(TransporterProvider.class)); 086 setRepositoryLayoutProvider(locator.getService(RepositoryLayoutProvider.class)); 087 setChecksumPolicyProvider(locator.getService(ChecksumPolicyProvider.class)); 088 setFileProcessor(locator.getService(FileProcessor.class)); 089 setProvidedChecksumSources(Collections.emptyMap()); 090 } 091 092 /** 093 * Sets the transporter provider to use for this component. 094 * 095 * @param transporterProvider The transporter provider to use, must not be {@code null}. 096 * @return This component for chaining, never {@code null}. 097 */ 098 public BasicRepositoryConnectorFactory setTransporterProvider(TransporterProvider transporterProvider) { 099 this.transporterProvider = requireNonNull(transporterProvider, "transporter provider cannot be null"); 100 return this; 101 } 102 103 /** 104 * Sets the repository layout provider to use for this component. 105 * 106 * @param layoutProvider The repository layout provider to use, must not be {@code null}. 107 * @return This component for chaining, never {@code null}. 108 */ 109 public BasicRepositoryConnectorFactory setRepositoryLayoutProvider(RepositoryLayoutProvider layoutProvider) { 110 this.layoutProvider = requireNonNull(layoutProvider, "repository layout provider cannot be null"); 111 return this; 112 } 113 114 /** 115 * Sets the checksum policy provider to use for this component. 116 * 117 * @param checksumPolicyProvider The checksum policy provider to use, must not be {@code null}. 118 * @return This component for chaining, never {@code null}. 119 */ 120 public BasicRepositoryConnectorFactory setChecksumPolicyProvider(ChecksumPolicyProvider checksumPolicyProvider) { 121 this.checksumPolicyProvider = requireNonNull(checksumPolicyProvider, "checksum policy provider cannot be null"); 122 return this; 123 } 124 125 /** 126 * Sets the file processor to use for this component. 127 * 128 * @param fileProcessor The file processor to use, must not be {@code null}. 129 * @return This component for chaining, never {@code null}. 130 */ 131 public BasicRepositoryConnectorFactory setFileProcessor(FileProcessor fileProcessor) { 132 this.fileProcessor = requireNonNull(fileProcessor, "file processor cannot be null"); 133 return this; 134 } 135 136 /** 137 * Sets the provided checksum sources to use for this component. 138 * 139 * @param providedChecksumsSources The provided checksum sources to use, must not be {@code null}. 140 * @return This component for chaining, never {@code null}. 141 * @since 1.8.0 142 */ 143 public BasicRepositoryConnectorFactory setProvidedChecksumSources( 144 Map<String, ProvidedChecksumsSource> providedChecksumsSources) { 145 this.providedChecksumsSources = 146 requireNonNull(providedChecksumsSources, "provided checksum sources cannot be null"); 147 return this; 148 } 149 150 public float getPriority() { 151 return priority; 152 } 153 154 /** 155 * Sets the priority of this component. 156 * 157 * @param priority The priority. 158 * @return This component for chaining, never {@code null}. 159 */ 160 public BasicRepositoryConnectorFactory setPriority(float priority) { 161 this.priority = priority; 162 return this; 163 } 164 165 public RepositoryConnector newInstance(RepositorySystemSession session, RemoteRepository repository) 166 throws NoRepositoryConnectorException { 167 requireNonNull(session, "session cannot be null"); 168 requireNonNull(repository, "repository cannot be null"); 169 170 return new BasicRepositoryConnector( 171 session, 172 repository, 173 transporterProvider, 174 layoutProvider, 175 checksumPolicyProvider, 176 fileProcessor, 177 providedChecksumsSources); 178 } 179}