View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.internal.impl.session;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.Collections;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.concurrent.atomic.AtomicBoolean;
27  
28  import org.eclipse.aether.RepositoryCache;
29  import org.eclipse.aether.RepositoryListener;
30  import org.eclipse.aether.RepositorySystem;
31  import org.eclipse.aether.RepositorySystemSession.CloseableSession;
32  import org.eclipse.aether.SessionData;
33  import org.eclipse.aether.artifact.ArtifactTypeRegistry;
34  import org.eclipse.aether.collection.DependencyCollectionChecker;
35  import org.eclipse.aether.collection.DependencyGraphTransformer;
36  import org.eclipse.aether.collection.DependencyManager;
37  import org.eclipse.aether.collection.DependencySelector;
38  import org.eclipse.aether.collection.DependencyTraverser;
39  import org.eclipse.aether.collection.VersionFilter;
40  import org.eclipse.aether.impl.RepositorySystemLifecycle;
41  import org.eclipse.aether.repository.AuthenticationSelector;
42  import org.eclipse.aether.repository.LocalRepository;
43  import org.eclipse.aether.repository.LocalRepositoryManager;
44  import org.eclipse.aether.repository.MirrorSelector;
45  import org.eclipse.aether.repository.ProxySelector;
46  import org.eclipse.aether.repository.WorkspaceReader;
47  import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
48  import org.eclipse.aether.resolution.ResolutionErrorPolicy;
49  import org.eclipse.aether.scope.ScopeManager;
50  import org.eclipse.aether.scope.SystemDependencyScope;
51  import org.eclipse.aether.transfer.TransferListener;
52  import org.eclipse.aether.util.listener.ChainedRepositoryListener;
53  import org.eclipse.aether.util.listener.ChainedTransferListener;
54  
55  import static java.util.Objects.requireNonNull;
56  
57  /**
58   * A default implementation of repository system session that is immutable and thread-safe.
59   */
60  public final class DefaultCloseableSession implements CloseableSession {
61      private final String sessionId;
62  
63      private final AtomicBoolean closed;
64  
65      private final boolean offline;
66  
67      private final boolean ignoreArtifactDescriptorRepositories;
68  
69      private final ResolutionErrorPolicy resolutionErrorPolicy;
70  
71      private final ArtifactDescriptorPolicy artifactDescriptorPolicy;
72  
73      private final String checksumPolicy;
74  
75      private final String artifactUpdatePolicy;
76  
77      private final String metadataUpdatePolicy;
78  
79      private final LocalRepositoryManager localRepositoryManager;
80  
81      private final WorkspaceReader workspaceReader;
82  
83      private final RepositoryListener repositoryListener;
84  
85      private final TransferListener transferListener;
86  
87      private final Map<String, String> systemProperties;
88  
89      private final Map<String, String> userProperties;
90  
91      private final Map<String, Object> configProperties;
92  
93      private final MirrorSelector mirrorSelector;
94  
95      private final ProxySelector proxySelector;
96  
97      private final AuthenticationSelector authenticationSelector;
98  
99      private final ArtifactTypeRegistry artifactTypeRegistry;
100 
101     private final DependencyTraverser dependencyTraverser;
102 
103     private final DependencyManager dependencyManager;
104 
105     private final DependencySelector dependencySelector;
106 
107     private final VersionFilter versionFilter;
108 
109     private final DependencyGraphTransformer dependencyGraphTransformer;
110 
111     private final SessionData data;
112 
113     private final RepositoryCache cache;
114 
115     private final ScopeManager scopeManager;
116 
117     private final DependencyCollectionChecker dependencyCollectionChecker;
118 
119     private final RepositorySystem repositorySystem;
120 
121     private final RepositorySystemLifecycle repositorySystemLifecycle;
122 
123     @SuppressWarnings("checkstyle:parameternumber")
124     public DefaultCloseableSession(
125             String sessionId,
126             boolean offline,
127             boolean ignoreArtifactDescriptorRepositories,
128             ResolutionErrorPolicy resolutionErrorPolicy,
129             ArtifactDescriptorPolicy artifactDescriptorPolicy,
130             String checksumPolicy,
131             String artifactUpdatePolicy,
132             String metadataUpdatePolicy,
133             LocalRepositoryManager localRepositoryManager,
134             Collection<LocalRepository> localRepositories,
135             WorkspaceReader workspaceReader,
136             Collection<RepositoryListener> repositoryListener,
137             Collection<TransferListener> transferListener,
138             Map<String, String> systemProperties,
139             Map<String, String> userProperties,
140             Map<String, Object> configProperties,
141             MirrorSelector mirrorSelector,
142             ProxySelector proxySelector,
143             AuthenticationSelector authenticationSelector,
144             ArtifactTypeRegistry artifactTypeRegistry,
145             DependencyTraverser dependencyTraverser,
146             DependencyManager dependencyManager,
147             DependencySelector dependencySelector,
148             VersionFilter versionFilter,
149             DependencyGraphTransformer dependencyGraphTransformer,
150             SessionData data,
151             RepositoryCache cache,
152             ScopeManager scopeManager,
153             DependencyCollectionChecker dependencyCollectionChecker,
154             List<Runnable> onSessionEndedHandlers,
155             RepositorySystem repositorySystem,
156             RepositorySystemLifecycle repositorySystemLifecycle) {
157         this.sessionId = requireNonNull(sessionId);
158         this.closed = new AtomicBoolean(false);
159         this.offline = offline;
160         this.ignoreArtifactDescriptorRepositories = ignoreArtifactDescriptorRepositories;
161         this.resolutionErrorPolicy = resolutionErrorPolicy;
162         this.artifactDescriptorPolicy = artifactDescriptorPolicy;
163         this.checksumPolicy = checksumPolicy;
164         this.artifactUpdatePolicy = artifactUpdatePolicy;
165         this.metadataUpdatePolicy = metadataUpdatePolicy;
166         this.workspaceReader = workspaceReader;
167         this.repositoryListener = new ChainedRepositoryListener(repositoryListener);
168         this.transferListener = new ChainedTransferListener(transferListener);
169         this.systemProperties = Collections.unmodifiableMap(systemProperties);
170         this.userProperties = Collections.unmodifiableMap(userProperties);
171         this.configProperties = Collections.unmodifiableMap(configProperties);
172         this.mirrorSelector = requireNonNull(mirrorSelector);
173         this.proxySelector = requireNonNull(proxySelector);
174         this.authenticationSelector = requireNonNull(authenticationSelector);
175         this.artifactTypeRegistry = requireNonNull(artifactTypeRegistry);
176         this.dependencyTraverser = dependencyTraverser;
177         this.dependencyManager = dependencyManager;
178         this.dependencySelector = dependencySelector;
179         this.versionFilter = versionFilter;
180         this.dependencyGraphTransformer = dependencyGraphTransformer;
181         this.data = requireNonNull(data);
182         this.cache = cache;
183         this.scopeManager = scopeManager;
184         this.dependencyCollectionChecker = dependencyCollectionChecker;
185 
186         this.repositorySystem = requireNonNull(repositorySystem);
187         this.repositorySystemLifecycle = requireNonNull(repositorySystemLifecycle);
188 
189         this.localRepositoryManager = getOrCreateLocalRepositoryManager(localRepositoryManager, localRepositories);
190 
191         repositorySystemLifecycle.sessionStarted(this);
192         onSessionEndedHandlers.forEach(this::addOnSessionEndedHandler);
193     }
194 
195     private LocalRepositoryManager getOrCreateLocalRepositoryManager(
196             LocalRepositoryManager localRepositoryManager, Collection<LocalRepository> localRepositories) {
197         if (localRepositoryManager != null) {
198             return localRepositoryManager;
199         } else if (localRepositories != null) {
200             return repositorySystem.newLocalRepositoryManager(this, new ArrayList<>(localRepositories));
201         } else {
202             throw new IllegalStateException("No local repository manager or local repositories set on session");
203         }
204     }
205 
206     @Override
207     public String sessionId() {
208         return sessionId;
209     }
210 
211     @Override
212     public boolean isOffline() {
213         return offline;
214     }
215 
216     @Override
217     public boolean isIgnoreArtifactDescriptorRepositories() {
218         return ignoreArtifactDescriptorRepositories;
219     }
220 
221     @Override
222     public ResolutionErrorPolicy getResolutionErrorPolicy() {
223         return resolutionErrorPolicy;
224     }
225 
226     @Override
227     public ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
228         return artifactDescriptorPolicy;
229     }
230 
231     @Override
232     public String getChecksumPolicy() {
233         return checksumPolicy;
234     }
235 
236     @Override
237     public String getUpdatePolicy() {
238         return getArtifactUpdatePolicy();
239     }
240 
241     @Override
242     public String getArtifactUpdatePolicy() {
243         return artifactUpdatePolicy;
244     }
245 
246     @Override
247     public String getMetadataUpdatePolicy() {
248         return metadataUpdatePolicy;
249     }
250 
251     @Override
252     public LocalRepository getLocalRepository() {
253         return getLocalRepositoryManager().getRepository();
254     }
255 
256     @Override
257     public LocalRepositoryManager getLocalRepositoryManager() {
258         return localRepositoryManager;
259     }
260 
261     @Override
262     public WorkspaceReader getWorkspaceReader() {
263         return workspaceReader;
264     }
265 
266     @Override
267     public RepositoryListener getRepositoryListener() {
268         return repositoryListener;
269     }
270 
271     @Override
272     public TransferListener getTransferListener() {
273         return transferListener;
274     }
275 
276     @Override
277     public Map<String, String> getSystemProperties() {
278         return systemProperties;
279     }
280 
281     @Override
282     public Map<String, String> getUserProperties() {
283         return userProperties;
284     }
285 
286     @Override
287     public Map<String, Object> getConfigProperties() {
288         return configProperties;
289     }
290 
291     @Override
292     public MirrorSelector getMirrorSelector() {
293         return mirrorSelector;
294     }
295 
296     @Override
297     public ProxySelector getProxySelector() {
298         return proxySelector;
299     }
300 
301     @Override
302     public AuthenticationSelector getAuthenticationSelector() {
303         return authenticationSelector;
304     }
305 
306     @Override
307     public ArtifactTypeRegistry getArtifactTypeRegistry() {
308         return artifactTypeRegistry;
309     }
310 
311     @Override
312     public DependencyTraverser getDependencyTraverser() {
313         return dependencyTraverser;
314     }
315 
316     @Override
317     public DependencyManager getDependencyManager() {
318         return dependencyManager;
319     }
320 
321     @Override
322     public DependencySelector getDependencySelector() {
323         return dependencySelector;
324     }
325 
326     @Override
327     public VersionFilter getVersionFilter() {
328         return versionFilter;
329     }
330 
331     @Override
332     public DependencyGraphTransformer getDependencyGraphTransformer() {
333         return dependencyGraphTransformer;
334     }
335 
336     @Override
337     public SessionData getData() {
338         return data;
339     }
340 
341     @Override
342     public RepositoryCache getCache() {
343         return cache;
344     }
345 
346     @Override
347     public ScopeManager getScopeManager() {
348         return scopeManager;
349     }
350 
351     @Override
352     public DependencyCollectionChecker getDependencyCollectionChecker() {
353         return dependencyCollectionChecker;
354     }
355 
356     @Override
357     public SystemDependencyScope getSystemDependencyScope() {
358         if (scopeManager != null) {
359             return scopeManager.getSystemDependencyScope().orElse(null);
360         } else {
361             return SystemDependencyScope.LEGACY;
362         }
363     }
364 
365     @Override
366     public boolean addOnSessionEndedHandler(Runnable handler) {
367         throwIfClosed();
368         repositorySystemLifecycle.addOnSessionEndedHandle(this, handler);
369         return true;
370     }
371 
372     @Override
373     public void close() {
374         if (closed.compareAndSet(false, true)) {
375             repositorySystemLifecycle.sessionEnded(this);
376         }
377     }
378 
379     private void throwIfClosed() {
380         if (closed.get()) {
381             throw new IllegalStateException("Session " + sessionId + " already closed");
382         }
383     }
384 }