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;
020
021import java.io.Closeable;
022import java.nio.file.Path;
023import java.util.Collection;
024import java.util.Map;
025import java.util.function.Supplier;
026
027import org.eclipse.aether.artifact.ArtifactTypeRegistry;
028import org.eclipse.aether.collection.DependencyGraphTransformer;
029import org.eclipse.aether.collection.DependencyManager;
030import org.eclipse.aether.collection.DependencySelector;
031import org.eclipse.aether.collection.DependencyTraverser;
032import org.eclipse.aether.collection.VersionFilter;
033import org.eclipse.aether.repository.AuthenticationSelector;
034import org.eclipse.aether.repository.LocalRepository;
035import org.eclipse.aether.repository.LocalRepositoryManager;
036import org.eclipse.aether.repository.MirrorSelector;
037import org.eclipse.aether.repository.ProxySelector;
038import org.eclipse.aether.repository.RemoteRepository;
039import org.eclipse.aether.repository.RepositoryPolicy;
040import org.eclipse.aether.repository.WorkspaceReader;
041import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
042import org.eclipse.aether.resolution.ResolutionErrorPolicy;
043import org.eclipse.aether.scope.ScopeManager;
044import org.eclipse.aether.scope.SystemDependencyScope;
045import org.eclipse.aether.transfer.TransferListener;
046
047/**
048 * Defines settings and components that control the repository system. Once initialized, the session object itself is
049 * supposed to be immutable and hence can safely be shared across an entire application and any concurrent threads
050 * reading it. Components that wish to tweak some aspects of an existing session should use the copy constructor of
051 * {@link DefaultRepositorySystemSession} and its mutators to derive a custom session.
052 *
053 * @noimplement This interface is not intended to be implemented by clients.
054 * @noextend This interface is not intended to be extended by clients.
055 */
056public interface RepositorySystemSession {
057
058    /**
059     * Immutable session that is closeable, should be handled as a resource. These session instances can be
060     * created with {@link SessionBuilder}.
061     *
062     * @noimplement This interface is not intended to be implemented by clients.
063     * @noextend This interface is not intended to be extended by clients.
064     *
065     * @since 2.0.0
066     */
067    interface CloseableSession extends RepositorySystemSession, Closeable {
068        /**
069         * Returns the ID of this closeable session instance. Each closeable session has different ID, unique within
070         * repository system they were created with.
071         *
072         * @return The session ID that is never {@code null}.
073         */
074        String sessionId();
075
076        /**
077         * Closes the session. The session should be closed by its creator. A closed session should not be used anymore.
078         * This method may be invoked multiple times, but close will act only once (first time).
079         */
080        @Override
081        void close();
082    }
083
084    /**
085     * Builder for building {@link CloseableSession} instances. Builder instances can be created with
086     * {@link RepositorySystem#createSessionBuilder()} method. Instances are not thread-safe nor immutable.
087     * <p>
088     * Important: if you set a stateful member on builder (for example {@link SessionData} or {@link RepositoryCache}),
089     * the builder will create session instances using same provided stateful members, that may lead to unexpected side
090     * effects. Solution for these cases is to not reuse builder instances, or, keep reconfiguring it, or ultimately
091     * provide suppliers that create new instance per each call.
092     *
093     * @noimplement This interface is not intended to be implemented by clients.
094     * @noextend This interface is not intended to be extended by clients.
095     *
096     * @since 2.0.0
097     */
098    interface SessionBuilder {
099        /**
100         * Controls whether the repository system operates in offline mode and avoids/refuses any access to remote
101         * repositories.
102         *
103         * @param offline {@code true} if the repository system is in offline mode, {@code false} otherwise.
104         * @return This session for chaining, never {@code null}.
105         */
106        SessionBuilder setOffline(boolean offline);
107
108        /**
109         * Controls whether repositories declared in artifact descriptors should be ignored during transitive dependency
110         * collection. If enabled, only the repositories originally provided with the collect request will be considered.
111         *
112         * @param ignoreArtifactDescriptorRepositories {@code true} to ignore additional repositories from artifact
113         *                                             descriptors, {@code false} to merge those with the originally
114         *                                             specified repositories.
115         * @return This session for chaining, never {@code null}.
116         */
117        SessionBuilder setIgnoreArtifactDescriptorRepositories(boolean ignoreArtifactDescriptorRepositories);
118
119        /**
120         * Sets the policy which controls whether resolutions errors from remote repositories should be cached.
121         *
122         * @param resolutionErrorPolicy The resolution error policy for this session, may be {@code null} if resolution
123         *                              errors should generally not be cached.
124         * @return This session for chaining, never {@code null}.
125         */
126        SessionBuilder setResolutionErrorPolicy(ResolutionErrorPolicy resolutionErrorPolicy);
127
128        /**
129         * Sets the policy which controls how errors related to reading artifact descriptors should be handled.
130         *
131         * @param artifactDescriptorPolicy The descriptor error policy for this session, may be {@code null} if descriptor
132         *                                 errors should generally not be tolerated.
133         * @return This session for chaining, never {@code null}.
134         */
135        SessionBuilder setArtifactDescriptorPolicy(ArtifactDescriptorPolicy artifactDescriptorPolicy);
136
137        /**
138         * Sets the global checksum policy. If set, the global checksum policy overrides the checksum policies of the remote
139         * repositories being used for resolution.
140         *
141         * @param checksumPolicy The global checksum policy, may be {@code null}/empty to apply the per-repository policies.
142         * @return This session for chaining, never {@code null}.
143         * @see RepositoryPolicy#CHECKSUM_POLICY_FAIL
144         * @see RepositoryPolicy#CHECKSUM_POLICY_IGNORE
145         * @see RepositoryPolicy#CHECKSUM_POLICY_WARN
146         */
147        SessionBuilder setChecksumPolicy(String checksumPolicy);
148
149        /**
150         * Sets the global update policy. If set, the global update policy overrides the update policies of the remote
151         * repositories being used for resolution.
152         * <p>
153         * This method is meant for code that does not want to distinguish between artifact and metadata policies.
154         * Note: applications should either use get/set updatePolicy (this method and
155         * {@link RepositorySystemSession#getUpdatePolicy()}) or also distinguish between artifact and
156         * metadata update policies (and use other methods), but <em>should not mix the two!</em>
157         *
158         * @param updatePolicy The global update policy, may be {@code null}/empty to apply the per-repository policies.
159         * @return This session for chaining, never {@code null}.
160         * @see RepositoryPolicy#UPDATE_POLICY_ALWAYS
161         * @see RepositoryPolicy#UPDATE_POLICY_DAILY
162         * @see RepositoryPolicy#UPDATE_POLICY_NEVER
163         * @see #setArtifactUpdatePolicy(String)
164         * @see #setMetadataUpdatePolicy(String)
165         */
166        SessionBuilder setUpdatePolicy(String updatePolicy);
167
168        /**
169         * Sets the global artifact update policy. If set, the global update policy overrides the artifact update policies
170         * of the remote repositories being used for resolution.
171         *
172         * @param artifactUpdatePolicy The global update policy, may be {@code null}/empty to apply the per-repository policies.
173         * @return This session for chaining, never {@code null}.
174         * @see RepositoryPolicy#UPDATE_POLICY_ALWAYS
175         * @see RepositoryPolicy#UPDATE_POLICY_DAILY
176         * @see RepositoryPolicy#UPDATE_POLICY_NEVER
177         * @since 2.0.0
178         */
179        SessionBuilder setArtifactUpdatePolicy(String artifactUpdatePolicy);
180
181        /**
182         * Sets the global metadata update policy. If set, the global update policy overrides the metadata update policies
183         * of the remote repositories being used for resolution.
184         *
185         * @param metadataUpdatePolicy The global update policy, may be {@code null}/empty to apply the per-repository policies.
186         * @return This session for chaining, never {@code null}.
187         * @see RepositoryPolicy#UPDATE_POLICY_ALWAYS
188         * @see RepositoryPolicy#UPDATE_POLICY_DAILY
189         * @see RepositoryPolicy#UPDATE_POLICY_NEVER
190         * @since 2.0.0
191         */
192        SessionBuilder setMetadataUpdatePolicy(String metadataUpdatePolicy);
193
194        /**
195         * Sets the local repository manager used during this session. <em>Note:</em> Eventually, a valid session must have
196         * a local repository manager set.
197         * <p>
198         * The provisioning of {@link org.eclipse.aether.repository.LocalRepositoryManager} for use with this
199         * method introduces chicken and egg situation. Integrators MUST NOT use this method, but instead, hook into
200         * Local Repository Manager Provider by any means they can (ie by using Provider or Sisu Components) and use
201         * custom string and/or priorities instead. This method existence is not meant for "everyday use" (normal
202         * session creation), but for some more advanced use cases. Do not use it, unless you know what are you doing.
203         *
204         * @param localRepositoryManager The local repository manager used during this session, may be {@code null}.
205         * @return This session for chaining, never {@code null}.
206         */
207        SessionBuilder setLocalRepositoryManager(LocalRepositoryManager localRepositoryManager);
208
209        /**
210         * Sets the workspace reader used during this session. If set, the workspace reader will usually be consulted first
211         * to resolve artifacts.
212         *
213         * @param workspaceReader The workspace reader for this session, may be {@code null} if none.
214         * @return This session for chaining, never {@code null}.
215         */
216        SessionBuilder setWorkspaceReader(WorkspaceReader workspaceReader);
217
218        /**
219         * Sets the listener being notified of actions in the repository system.
220         *
221         * @param repositoryListener The repository listener, may be {@code null} if none.
222         * @return This session for chaining, never {@code null}.
223         */
224        SessionBuilder setRepositoryListener(RepositoryListener repositoryListener);
225
226        /**
227         * Sets the listener being notified of uploads/downloads by the repository system.
228         *
229         * @param transferListener The transfer listener, may be {@code null} if none.
230         * @return This session for chaining, never {@code null}.
231         */
232        SessionBuilder setTransferListener(TransferListener transferListener);
233
234        /**
235         * Sets the system properties to use, e.g. for processing of artifact descriptors. System properties are usually
236         * collected from the runtime environment like {@link System#getProperties()} and environment variables.
237         * <p>
238         * <em>Note:</em> System properties are of type {@code Map<String, String>} and any key-value pair in the input map
239         * that doesn't match this type will be silently ignored.
240         *
241         * @param systemProperties The system properties, may be {@code null} or empty if none.
242         * @return This session for chaining, never {@code null}.
243         */
244        SessionBuilder setSystemProperties(Map<?, ?> systemProperties);
245
246        /**
247         * Sets the specified system property.
248         *
249         * @param key   The property key, must not be {@code null}.
250         * @param value The property value, may be {@code null} to remove/unset the property.
251         * @return This session for chaining, never {@code null}.
252         */
253        SessionBuilder setSystemProperty(String key, String value);
254
255        /**
256         * Sets the user properties to use, e.g. for processing of artifact descriptors. User properties are similar to
257         * system properties but are set on the discretion of the user and hence are considered of higher priority than
258         * system properties in case of conflicts.
259         * <p>
260         * <em>Note:</em> User properties are of type {@code Map<String, String>} and any key-value pair in the input map
261         * that doesn't match this type will be silently ignored.
262         *
263         * @param userProperties The user properties, may be {@code null} or empty if none.
264         * @return This session for chaining, never {@code null}.
265         */
266        SessionBuilder setUserProperties(Map<?, ?> userProperties);
267
268        /**
269         * Sets the specified user property.
270         *
271         * @param key   The property key, must not be {@code null}.
272         * @param value The property value, may be {@code null} to remove/unset the property.
273         * @return This session for chaining, never {@code null}.
274         */
275        SessionBuilder setUserProperty(String key, String value);
276
277        /**
278         * Sets the configuration properties used to tweak internal aspects of the repository system (e.g. thread pooling,
279         * connector-specific behavior, etc.).
280         * <p>
281         * <em>Note:</em> Configuration properties are of type {@code Map<String, Object>} and any key-value pair in the
282         * input map that doesn't match this type will be silently ignored.
283         *
284         * @param configProperties The configuration properties, may be {@code null} or empty if none.
285         * @return This session for chaining, never {@code null}.
286         */
287        SessionBuilder setConfigProperties(Map<?, ?> configProperties);
288
289        /**
290         * Sets the specified configuration property.
291         *
292         * @param key   The property key, must not be {@code null}.
293         * @param value The property value, may be {@code null} to remove/unset the property.
294         * @return This session for chaining, never {@code null}.
295         */
296        SessionBuilder setConfigProperty(String key, Object value);
297
298        /**
299         * Sets the mirror selector to use for repositories discovered in artifact descriptors. Note that this selector is
300         * not used for remote repositories which are passed as request parameters to the repository system, those
301         * repositories are supposed to denote the effective repositories.
302         *
303         * @param mirrorSelector The mirror selector to use, may be {@code null}.
304         * @return This session for chaining, never {@code null}.
305         */
306        SessionBuilder setMirrorSelector(MirrorSelector mirrorSelector);
307
308        /**
309         * Sets the proxy selector to use for repositories discovered in artifact descriptors. Note that this selector is
310         * not used for remote repositories which are passed as request parameters to the repository system, those
311         * repositories are supposed to have their proxy (if any) already set.
312         *
313         * @param proxySelector The proxy selector to use, may be {@code null}.
314         * @return This session for chaining, never {@code null}.
315         * @see RemoteRepository#getProxy()
316         */
317        SessionBuilder setProxySelector(ProxySelector proxySelector);
318
319        /**
320         * Sets the authentication selector to use for repositories discovered in artifact descriptors. Note that this
321         * selector is not used for remote repositories which are passed as request parameters to the repository system,
322         * those repositories are supposed to have their authentication (if any) already set.
323         *
324         * @param authenticationSelector The authentication selector to use, may be {@code null}.
325         * @return This session for chaining, never {@code null}.
326         * @see RemoteRepository#getAuthentication()
327         */
328        SessionBuilder setAuthenticationSelector(AuthenticationSelector authenticationSelector);
329
330        /**
331         * Sets the registry of artifact types recognized by this session.
332         *
333         * @param artifactTypeRegistry The artifact type registry, may be {@code null}.
334         * @return This session for chaining, never {@code null}.
335         */
336        SessionBuilder setArtifactTypeRegistry(ArtifactTypeRegistry artifactTypeRegistry);
337
338        /**
339         * Sets the dependency traverser to use for building dependency graphs.
340         *
341         * @param dependencyTraverser The dependency traverser to use for building dependency graphs, may be {@code null}.
342         * @return This session for chaining, never {@code null}.
343         */
344        SessionBuilder setDependencyTraverser(DependencyTraverser dependencyTraverser);
345
346        /**
347         * Sets the dependency manager to use for building dependency graphs.
348         *
349         * @param dependencyManager The dependency manager to use for building dependency graphs, may be {@code null}.
350         * @return This session for chaining, never {@code null}.
351         */
352        SessionBuilder setDependencyManager(DependencyManager dependencyManager);
353
354        /**
355         * Sets the dependency selector to use for building dependency graphs.
356         *
357         * @param dependencySelector The dependency selector to use for building dependency graphs, may be {@code null}.
358         * @return This session for chaining, never {@code null}.
359         */
360        SessionBuilder setDependencySelector(DependencySelector dependencySelector);
361
362        /**
363         * Sets the version filter to use for building dependency graphs.
364         *
365         * @param versionFilter The version filter to use for building dependency graphs, may be {@code null} to not filter
366         *                      versions.
367         * @return This session for chaining, never {@code null}.
368         */
369        SessionBuilder setVersionFilter(VersionFilter versionFilter);
370
371        /**
372         * Sets the dependency graph transformer to use for building dependency graphs.
373         *
374         * @param dependencyGraphTransformer The dependency graph transformer to use for building dependency graphs, may be
375         *                                   {@code null}.
376         * @return This session for chaining, never {@code null}.
377         */
378        SessionBuilder setDependencyGraphTransformer(DependencyGraphTransformer dependencyGraphTransformer);
379
380        /**
381         * Sets the custom data associated with this session.
382         * Note: When this method used to set instance, same passed instance will be used for every built session out
383         * of this builder instance, hence the built sessions will share these instances as well!
384         *
385         * @param data The session data, may be {@code null}.
386         * @return This session for chaining, never {@code null}.
387         */
388        SessionBuilder setData(SessionData data);
389
390        /**
391         * Sets the cache the repository system may use to save data for future reuse during the session.
392         * Note: When this method used to set instance, same passed instance will be used for every built session out
393         * of this builder instance, hence the built sessions will share these instances as well!
394         *
395         * @param cache The repository cache, may be {@code null} if none.
396         * @return This session for chaining, never {@code null}.
397         */
398        SessionBuilder setCache(RepositoryCache cache);
399
400        /**
401         * Sets the scope manager for session, may be {@code null}.
402         *
403         * @param scopeManager The scope manager, may be {@code null}.
404         * @return The session for chaining, never {@code null}.
405         */
406        SessionBuilder setScopeManager(ScopeManager scopeManager);
407
408        /**
409         * Adds on session ended handler to be immediately registered when this builder creates session.
410         *
411         * @param handler The on session ended handler, may not be {@code null}.
412         * @return The session for chaining, never {@code null}.
413         */
414        SessionBuilder addOnSessionEndedHandler(Runnable handler);
415
416        /**
417         * Sets the custom session data supplier associated with this session.
418         * Note: The supplier will be used for every built session out of this builder instance, so if supplier supplies
419         * <em>same instance</em> the built sessions will share these instances as well!
420         *
421         * @param dataSupplier The session data supplier, may not be {@code null}.
422         * @return This session for chaining, never {@code null}.
423         */
424        SessionBuilder setSessionDataSupplier(Supplier<SessionData> dataSupplier);
425
426        /**
427         * Sets the cache supplier for the repository system may use to save data for future reuse during the session.
428         * Note: The supplier will be used for every built session out of this builder instance, so if supplier supplies
429         * <em>same instance</em> the built sessions will share these instances as well!
430         *
431         * @param cacheSupplier The repository cache supplier, may not be {@code null}.
432         * @return This session for chaining, never {@code null}.
433         */
434        SessionBuilder setRepositoryCacheSupplier(Supplier<RepositoryCache> cacheSupplier);
435
436        /**
437         * Shortcut method to set up local repository manager directly onto builder. There must be at least one non-null
438         * {@link Path} passed in this method. In case multiple files, session builder will use chained local repository
439         * manager.
440         *
441         * @param baseDirectories The local repository base directories.
442         * @return This session for chaining, never {@code null}.
443         * @see #withLocalRepositories(LocalRepository...)
444         */
445        SessionBuilder withLocalRepositoryBaseDirectories(Path... baseDirectories);
446
447        /**
448         * Shortcut method to set up local repository manager directly onto builder. There must be at least one non-null
449         * {@link Path} present in passed in list. In case multiple files, session builder will use chained local
450         * repository manager.
451         *
452         * @param baseDirectories The local repository base directories.
453         * @return This session for chaining, never {@code null}.
454         * @see #withLocalRepositories(Collection)
455         */
456        SessionBuilder withLocalRepositoryBaseDirectories(Collection<Path> baseDirectories);
457
458        /**
459         * Shortcut method to set up local repository manager directly onto builder. There must be at least one non-null
460         * {@link LocalRepository} passed in this method. In case multiple local repositories, session builder will
461         * use chained local repository manager.
462         *
463         * @param localRepositories The local repositories.
464         * @return This session for chaining, never {@code null}.
465         */
466        SessionBuilder withLocalRepositories(LocalRepository... localRepositories);
467
468        /**
469         * Shortcut method to set up local repository manager directly onto builder. There must be at least one non-null
470         * {@link LocalRepository} present in passed in list. In case multiple local repositories, session builder will
471         * use chained local repository manager.
472         *
473         * @param localRepositories The local repositories.
474         * @return This session for chaining, never {@code null}.
475         */
476        SessionBuilder withLocalRepositories(Collection<LocalRepository> localRepositories);
477
478        /**
479         * Adds the listeners to be notified of actions in the repository system.
480         *
481         * @param repositoryListeners The repository listeners, never {@code null}.
482         * @return This session for chaining, never {@code null}.
483         */
484        SessionBuilder withRepositoryListener(RepositoryListener... repositoryListeners);
485
486        /**
487         * Adds the listeners to be notified of actions in the repository system.
488         *
489         * @param repositoryListeners The repository listeners, never {@code null}.
490         * @return This session for chaining, never {@code null}.
491         */
492        SessionBuilder withRepositoryListener(Collection<RepositoryListener> repositoryListeners);
493
494        /**
495         * Adds the listener to be notified of uploads/downloads by the repository system.
496         *
497         * @param transferListeners The transfer listeners, never {@code null}.
498         * @return This session for chaining, never {@code null}.
499         */
500        SessionBuilder withTransferListener(TransferListener... transferListeners);
501
502        /**
503         * Adds the listener to be notified of uploads/downloads by the repository system.
504         *
505         * @param transferListeners The transfer listeners, never {@code null}.
506         * @return This session for chaining, never {@code null}.
507         */
508        SessionBuilder withTransferListener(Collection<TransferListener> transferListeners);
509
510        /**
511         * Shortcut method to shallow-copy passed in session into current builder.
512         *
513         * @param session The session to shallow-copy from.
514         * @return This session for chaining, never {@code null}.
515         */
516        SessionBuilder withRepositorySystemSession(RepositorySystemSession session);
517
518        /**
519         * Creates immutable closeable session out this builder instance.
520         *
521         * @return Immutable closeable session, never {@code null}.
522         */
523        CloseableSession build();
524    }
525
526    /**
527     * Indicates whether the repository system operates in offline mode and avoids/refuses any access to remote
528     * repositories.
529     *
530     * @return {@code true} if the repository system is in offline mode, {@code false} otherwise.
531     */
532    boolean isOffline();
533
534    /**
535     * Indicates whether repositories declared in artifact descriptors should be ignored during transitive dependency
536     * collection. If enabled, only the repositories originally provided with the collect request will be considered.
537     *
538     * @return {@code true} if additional repositories from artifact descriptors are ignored, {@code false} to merge
539     *         those with the originally specified repositories.
540     */
541    boolean isIgnoreArtifactDescriptorRepositories();
542
543    /**
544     * Gets the policy which controls whether resolutions errors from remote repositories should be cached.
545     *
546     * @return The resolution error policy for this session or {@code null} if resolution errors should generally not be
547     *         cached.
548     */
549    ResolutionErrorPolicy getResolutionErrorPolicy();
550
551    /**
552     * Gets the policy which controls how errors related to reading artifact descriptors should be handled.
553     *
554     * @return The descriptor error policy for this session or {@code null} if descriptor errors should generally not be
555     *         tolerated.
556     */
557    ArtifactDescriptorPolicy getArtifactDescriptorPolicy();
558
559    /**
560     * Gets the global checksum policy. If set, the global checksum policy overrides the checksum policies of the remote
561     * repositories being used for resolution.
562     *
563     * @return The global checksum policy or {@code null}/empty if not set and the per-repository policies apply.
564     * @see RepositoryPolicy#CHECKSUM_POLICY_FAIL
565     * @see RepositoryPolicy#CHECKSUM_POLICY_IGNORE
566     * @see RepositoryPolicy#CHECKSUM_POLICY_WARN
567     */
568    String getChecksumPolicy();
569
570    /**
571     * Gets the global update policy, or {@code null} if not set.
572     * <p>
573     * This method is meant for code that does not want to distinguish between artifact and metadata policies.
574     * Note: applications should either use get/set updatePolicy (this method and
575     * {@link DefaultRepositorySystemSession#setUpdatePolicy(String)}) or also distinguish between artifact and
576     * metadata update policies (and use other methods), but <em>should not mix the two!</em>
577     *
578     * @see #getArtifactUpdatePolicy()
579     * @see #getMetadataUpdatePolicy()
580     */
581    String getUpdatePolicy();
582
583    /**
584     * Gets the global artifact update policy. If set, the global update policy overrides the update policies of the
585     * remote repositories being used for resolution.
586     *
587     * @return The global update policy or {@code null}/empty if not set and the per-repository policies apply.
588     * @see RepositoryPolicy#UPDATE_POLICY_ALWAYS
589     * @see RepositoryPolicy#UPDATE_POLICY_DAILY
590     * @see RepositoryPolicy#UPDATE_POLICY_NEVER
591     * @since 2.0.0
592     */
593    String getArtifactUpdatePolicy();
594
595    /**
596     * Gets the global metadata update policy. If set, the global update policy overrides the update policies of the remote
597     * repositories being used for resolution.
598     *
599     * @return The global update policy or {@code null}/empty if not set and the per-repository policies apply.
600     * @see RepositoryPolicy#UPDATE_POLICY_ALWAYS
601     * @see RepositoryPolicy#UPDATE_POLICY_DAILY
602     * @see RepositoryPolicy#UPDATE_POLICY_NEVER
603     * @since 2.0.0
604     */
605    String getMetadataUpdatePolicy();
606
607    /**
608     * Gets the local repository used during this session. This is a convenience method for
609     * {@link LocalRepositoryManager#getRepository()}.
610     *
611     * @return The local repository being during this session, never {@code null}.
612     */
613    LocalRepository getLocalRepository();
614
615    /**
616     * Gets the local repository manager used during this session.
617     *
618     * @return The local repository manager used during this session, never {@code null}.
619     */
620    LocalRepositoryManager getLocalRepositoryManager();
621
622    /**
623     * Gets the workspace reader used during this session. If set, the workspace reader will usually be consulted first
624     * to resolve artifacts.
625     *
626     * @return The workspace reader for this session or {@code null} if none.
627     */
628    WorkspaceReader getWorkspaceReader();
629
630    /**
631     * Gets the listener being notified of actions in the repository system.
632     *
633     * @return The repository listener or {@code null} if none.
634     */
635    RepositoryListener getRepositoryListener();
636
637    /**
638     * Gets the listener being notified of uploads/downloads by the repository system.
639     *
640     * @return The transfer listener or {@code null} if none.
641     */
642    TransferListener getTransferListener();
643
644    /**
645     * Gets the system properties to use, e.g. for processing of artifact descriptors. System properties are usually
646     * collected from the runtime environment like {@link System#getProperties()} and environment variables.
647     *
648     * @return The (read-only) system properties, never {@code null}.
649     */
650    Map<String, String> getSystemProperties();
651
652    /**
653     * Gets the user properties to use, e.g. for processing of artifact descriptors. User properties are similar to
654     * system properties but are set on the discretion of the user and hence are considered of higher priority than
655     * system properties.
656     *
657     * @return The (read-only) user properties, never {@code null}.
658     */
659    Map<String, String> getUserProperties();
660
661    /**
662     * Gets the configuration properties used to tweak internal aspects of the repository system (e.g. thread pooling,
663     * connector-specific behavior, etc.)
664     *
665     * @return The (read-only) configuration properties, never {@code null}.
666     * @see ConfigurationProperties
667     */
668    Map<String, Object> getConfigProperties();
669
670    /**
671     * Gets the mirror selector to use for repositories discovered in artifact descriptors. Note that this selector is
672     * not used for remote repositories which are passed as request parameters to the repository system, those
673     * repositories are supposed to denote the effective repositories.
674     *
675     * @return The mirror selector to use, never {@code null}.
676     * @see RepositorySystem#newResolutionRepositories(RepositorySystemSession, java.util.List)
677     */
678    MirrorSelector getMirrorSelector();
679
680    /**
681     * Gets the proxy selector to use for repositories discovered in artifact descriptors. Note that this selector is
682     * not used for remote repositories which are passed as request parameters to the repository system, those
683     * repositories are supposed to have their proxy (if any) already set.
684     *
685     * @return The proxy selector to use, never {@code null}.
686     * @see org.eclipse.aether.repository.RemoteRepository#getProxy()
687     * @see RepositorySystem#newResolutionRepositories(RepositorySystemSession, java.util.List)
688     */
689    ProxySelector getProxySelector();
690
691    /**
692     * Gets the authentication selector to use for repositories discovered in artifact descriptors. Note that this
693     * selector is not used for remote repositories which are passed as request parameters to the repository system,
694     * those repositories are supposed to have their authentication (if any) already set.
695     *
696     * @return The authentication selector to use, never {@code null}.
697     * @see org.eclipse.aether.repository.RemoteRepository#getAuthentication()
698     * @see RepositorySystem#newResolutionRepositories(RepositorySystemSession, java.util.List)
699     */
700    AuthenticationSelector getAuthenticationSelector();
701
702    /**
703     * Gets the registry of artifact types recognized by this session, for instance when processing artifact
704     * descriptors.
705     *
706     * @return The artifact type registry, never {@code null}.
707     */
708    ArtifactTypeRegistry getArtifactTypeRegistry();
709
710    /**
711     * Gets the dependency traverser to use for building dependency graphs.
712     *
713     * @return The dependency traverser to use for building dependency graphs or {@code null} if dependencies are
714     *         unconditionally traversed.
715     */
716    DependencyTraverser getDependencyTraverser();
717
718    /**
719     * Gets the dependency manager to use for building dependency graphs.
720     *
721     * @return The dependency manager to use for building dependency graphs or {@code null} if dependency management is
722     *         not performed.
723     */
724    DependencyManager getDependencyManager();
725
726    /**
727     * Gets the dependency selector to use for building dependency graphs.
728     *
729     * @return The dependency selector to use for building dependency graphs or {@code null} if dependencies are
730     *         unconditionally included.
731     */
732    DependencySelector getDependencySelector();
733
734    /**
735     * Gets the version filter to use for building dependency graphs.
736     *
737     * @return The version filter to use for building dependency graphs or {@code null} if versions aren't filtered.
738     */
739    VersionFilter getVersionFilter();
740
741    /**
742     * Gets the dependency graph transformer to use for building dependency graphs.
743     *
744     * @return The dependency graph transformer to use for building dependency graphs or {@code null} if none.
745     */
746    DependencyGraphTransformer getDependencyGraphTransformer();
747
748    /**
749     * Gets the custom data associated with this session.
750     *
751     * @return The session data, never {@code null}.
752     */
753    SessionData getData();
754
755    /**
756     * Gets the cache the repository system may use to save data for future reuse during the session.
757     *
758     * @return The repository cache or {@code null} if none.
759     */
760    RepositoryCache getCache();
761
762    /**
763     * Returns the scope manager to be used in this session, may be {@code null} if not set.
764     *
765     * @return The scope manager or {@code null} if not set.
766     * @since 2.0.0
767     */
768    ScopeManager getScopeManager();
769
770    /**
771     * Returns the system dependency scope.
772     * <p>
773     * Shorthand method for {@link ScopeManager#getSystemDependencyScope()}.
774     * <p>
775     * If {@link ScopeManager} is set, {@link #getScopeManager()} returns non-null value, the result of
776     * {@link ScopeManager#getSystemDependencyScope()} is returned (that may be {@code null}). If no {@link ScopeManager}
777     * if set, then {@link SystemDependencyScope#LEGACY} instance is returned, as lack of scope manager means that
778     * resolver operates in "legacy" mode (Maven3 compatible mode).
779     *
780     * @return The system dependency scope or {@code null} if no such scope.
781     * @since 2.0.0
782     */
783    SystemDependencyScope getSystemDependencyScope();
784
785    /**
786     * Registers a handler to execute when this session closed.
787     * <p>
788     * Note: Resolver 1.x sessions will not be able to register handlers. Migrate to Resolver 2.x way of handling
789     * sessions to make full use of new features. New features (like HTTP/2 transport) depend on this functionality.
790     * While they will function with Resolver 1.x sessions, they may produce resource leaks.
791     *
792     * @param handler the handler, never {@code null}.
793     * @return {@code true} if handler successfully registered, {@code false} otherwise.
794     * @since 2.0.0
795     */
796    boolean addOnSessionEndedHandler(Runnable handler);
797}