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
021/**
022 * The keys and defaults for common configuration properties.
023 *
024 * @see RepositorySystemSession#getConfigProperties()
025 */
026public final class ConfigurationProperties {
027
028    /**
029     * Prefix for all configurations. <em>For internal use only.</em>
030     *
031     * @since 2.0.0
032     */
033    public static final String PREFIX_AETHER = "aether.";
034
035    /**
036     * Prefix for repository system related configurations. <em>For internal use only.</em>
037     *
038     * @since 2.0.0
039     */
040    public static final String PREFIX_SYSTEM = PREFIX_AETHER + "system.";
041
042    /**
043     * Prefix for sync context related configurations. <em>For internal use only.</em>
044     *
045     * @since 2.0.0
046     */
047    public static final String PREFIX_SYNC_CONTEXT = PREFIX_AETHER + "syncContext.";
048
049    /**
050     * Prefix for connector related configurations. <em>For internal use only.</em>
051     *
052     * @since 2.0.0
053     */
054    public static final String PREFIX_CONNECTOR = PREFIX_AETHER + "connector.";
055
056    /**
057     * Prefix for layout related configurations. <em>For internal use only.</em>
058     *
059     * @since 2.0.0
060     */
061    public static final String PREFIX_LAYOUT = PREFIX_AETHER + "layout.";
062
063    /**
064     * Prefix for checksum related configurations. <em>For internal use only.</em>
065     *
066     * @since 2.0.0
067     */
068    public static final String PREFIX_CHECKSUMS = PREFIX_AETHER + "checksums.";
069
070    /**
071     * Prefix for local repository manager related configurations. <em>For internal use only.</em>
072     *
073     * @since 2.0.0
074     */
075    public static final String PREFIX_LRM = PREFIX_AETHER + "lrm.";
076
077    /**
078     * Prefix for generator related configurations. <em>For internal use only.</em>
079     *
080     * @since 2.0.0
081     */
082    public static final String PREFIX_GENERATOR = PREFIX_AETHER + "generator.";
083
084    /**
085     * Prefix for transport related configurations. <em>For internal use only.</em>
086     *
087     * @since 2.0.0
088     */
089    public static final String PREFIX_TRANSPORT = PREFIX_AETHER + "transport.";
090
091    /**
092     * Prefix for HTTP protocol related configurations. <em>For internal use only.</em>
093     *
094     * @since 2.0.0
095     */
096    public static final String PREFIX_TRANSPORT_HTTP = PREFIX_TRANSPORT + "http.";
097
098    /**
099     * Prefix for HTTPS protocol related configurations. <em>For internal use only.</em>
100     *
101     * @since 2.0.0
102     */
103    public static final String PREFIX_TRANSPORT_HTTPS = PREFIX_TRANSPORT + "https.";
104
105    /**
106     * The prefix for properties that control the priority of pluggable extensions like transporters. For example, for
107     * an extension with the fully qualified class name "org.eclipse.MyExtensionFactory", the configuration properties
108     * "aether.priority.org.eclipse.MyExtensionFactory", "aether.priority.MyExtensionFactory" and
109     * "aether.priority.MyExtension" will be consulted for the priority, in that order (obviously, the last key is only
110     * tried if the class name ends with "Factory"). The corresponding value is a float and the special value
111     * {@link Float#NaN} or "NaN" (case-sensitive) can be used to disable the extension.
112     */
113    public static final String PREFIX_PRIORITY = PREFIX_AETHER + "priority.";
114
115    /**
116     * A flag indicating whether the priorities of pluggable extensions are implicitly given by their iteration order
117     * such that the first extension has the highest priority. If set, an extension's built-in priority as well as any
118     * corresponding {@code aether.priority.*} configuration properties are ignored when searching for a suitable
119     * implementation among the available extensions. This priority mode is meant for cases where the application will
120     * present/inject extensions in the desired search order.
121     *
122     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
123     * @configurationType {@link java.lang.Boolean}
124     * @configurationDefaultValue {@link #DEFAULT_IMPLICIT_PRIORITIES}
125     * @configurationRepoIdSuffix No
126     */
127    public static final String IMPLICIT_PRIORITIES = PREFIX_PRIORITY + "implicit";
128
129    /**
130     * The default extension priority mode if {@link #IMPLICIT_PRIORITIES} isn't set.
131     */
132    public static final boolean DEFAULT_IMPLICIT_PRIORITIES = false;
133
134    /**
135     * A flag indicating whether the created ordered components should be cached in session.
136     *
137     * @since 2.0.0
138     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
139     * @configurationType {@link java.lang.Boolean}
140     * @configurationDefaultValue {@link #DEFAULT_CACHED_PRIORITIES}
141     * @configurationRepoIdSuffix No
142     */
143    public static final String CACHED_PRIORITIES = PREFIX_PRIORITY + "cached";
144
145    /**
146     * The priority to use for a certain extension class. {@code &lt;class&gt;} can either be the fully qualified
147     * name or the simple name of a class. If the class name ends with Factory that suffix could optionally be left out.
148     * This configuration is used by {@code org.eclipse.aether.internal.impl.PrioritizedComponents} internal utility
149     * to sort classes by priority. This is reusable utility (so an extension can make use of it), but by default
150     * in "vanilla" Resolver following classes are sorted:
151     * <ul>
152     *     <li>{@code org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory}</li>
153     *     <li>{@code org.eclipse.aether.spi.connector.RepositoryConnectorFactory}</li>
154     *     <li>{@code org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory}</li>
155     *     <li>{@code org.eclipse.aether.spi.connector.transport.TransporterFactory}</li>
156     *     <li>{@code org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory}</li>
157     *     <li>{@code org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory}</li>
158     *     <li>{@code org.eclipse.aether.impl.MetadataGeneratorFactory}</li>
159     * </ul>
160     *
161     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
162     * @configurationType {@link java.lang.Float}
163     * @configurationRepoIdSuffix No
164     */
165    public static final String CLASS_PRIORITIES = PREFIX_PRIORITY + "<class>";
166
167    /**
168     * The default caching of priority components if {@link #CACHED_PRIORITIES} isn't set. Default value is {@code true}.
169     *
170     * @since 2.0.0
171     */
172    public static final boolean DEFAULT_CACHED_PRIORITIES = true;
173
174    /**
175     * A flag indicating whether interaction with the user is allowed.
176     *
177     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
178     * @configurationType {@link java.lang.Boolean}
179     * @configurationDefaultValue {@link #DEFAULT_INTERACTIVE}
180     * @configurationRepoIdSuffix No
181     */
182    public static final String INTERACTIVE = PREFIX_AETHER + "interactive";
183
184    /**
185     * The default interactive mode if {@link #INTERACTIVE} isn't set.
186     */
187    public static final boolean DEFAULT_INTERACTIVE = false;
188
189    /**
190     * The user agent that repository connectors should report to servers.
191     *
192     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
193     * @configurationType {@link java.lang.String}
194     * @configurationDefaultValue {@link #DEFAULT_USER_AGENT}
195     * @configurationRepoIdSuffix No
196     */
197    public static final String USER_AGENT = PREFIX_TRANSPORT_HTTP + "userAgent";
198
199    /**
200     * The default user agent to use if {@link #USER_AGENT} isn't set.
201     */
202    public static final String DEFAULT_USER_AGENT = "Aether";
203
204    /**
205     * The maximum amount of time (in milliseconds) to wait for a successful connection to a remote server. Non-positive
206     * values indicate no timeout.
207     *
208     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
209     * @configurationType {@link java.lang.Integer}
210     * @configurationDefaultValue {@link #DEFAULT_CONNECT_TIMEOUT}
211     * @configurationRepoIdSuffix Yes
212     */
213    public static final String CONNECT_TIMEOUT = PREFIX_TRANSPORT_HTTP + "connectTimeout";
214
215    /**
216     * The default connect timeout to use if {@link #CONNECT_TIMEOUT} isn't set.
217     */
218    public static final int DEFAULT_CONNECT_TIMEOUT = 30 * 1000;
219
220    /**
221     * The maximum amount of time (in milliseconds) to wait for remaining data to arrive from a remote server. Note that
222     * this timeout does not restrict the overall duration of a request, it only restricts the duration of inactivity
223     * between consecutive data packets. Non-positive values indicate no timeout.
224     *
225     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
226     * @configurationType {@link java.lang.Integer}
227     * @configurationDefaultValue {@link #DEFAULT_REQUEST_TIMEOUT}
228     * @configurationRepoIdSuffix Yes
229     */
230    public static final String REQUEST_TIMEOUT = PREFIX_TRANSPORT_HTTP + "requestTimeout";
231
232    /**
233     * The default request timeout to use if {@link #REQUEST_TIMEOUT} isn't set.
234     */
235    public static final int DEFAULT_REQUEST_TIMEOUT = 1800 * 1000;
236
237    /**
238     * The request headers to use for HTTP-based repository connectors. The headers are specified using a
239     * {@code Map<String, String>}, mapping a header name to its value. Besides this general key, clients may also
240     * specify headers for a specific remote repository by appending the suffix {@code .&lt;repoId&gt;} to this key when
241     * storing the headers map. The repository-specific headers map is supposed to be complete, i.e. is not merged with
242     * the general headers map.
243     *
244     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
245     * @configurationType {@link java.util.Map}
246     * @configurationRepoIdSuffix Yes
247     */
248    public static final String HTTP_HEADERS = PREFIX_TRANSPORT_HTTP + "headers";
249
250    /**
251     * The encoding/charset to use when exchanging credentials with HTTP servers. Besides this general key, clients may
252     * also specify the encoding for a specific remote repository by appending the suffix {@code .&lt;repoId&gt;} to this key
253     * when storing the charset name.
254     *
255     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
256     * @configurationType {@link java.lang.String}
257     * @configurationDefaultValue {@link #DEFAULT_HTTP_CREDENTIAL_ENCODING}
258     * @configurationRepoIdSuffix Yes
259     */
260    public static final String HTTP_CREDENTIAL_ENCODING = PREFIX_TRANSPORT_HTTP + "credentialEncoding";
261
262    /**
263     * The default encoding/charset to use if {@link #HTTP_CREDENTIAL_ENCODING} isn't set.
264     */
265    public static final String DEFAULT_HTTP_CREDENTIAL_ENCODING = "ISO-8859-1";
266
267    /**
268     * The maximum number of times a request to a remote server should be retried in case of an error.
269     *
270     * @since 1.9.6
271     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
272     * @configurationType {@link java.lang.Integer}
273     * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_COUNT}
274     * @configurationRepoIdSuffix Yes
275     */
276    public static final String HTTP_RETRY_HANDLER_COUNT = PREFIX_TRANSPORT_HTTP + "retryHandler.count";
277
278    /**
279     * The default number of retries to use if {@link #HTTP_RETRY_HANDLER_COUNT} isn't set.
280     *
281     * @since 1.9.6
282     */
283    public static final int DEFAULT_HTTP_RETRY_HANDLER_COUNT = 3;
284
285    /**
286     * The initial retry interval in millis of request to a remote server should be waited in case of
287     * "too many requests" (HTTP codes 429 and 503). Accepts long as milliseconds. This value is used if remote server
288     * does not use {@code Retry-After} header, in which case Server value is obeyed.
289     *
290     * @since 1.9.16
291     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
292     * @configurationType {@link java.lang.Long}
293     * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_INTERVAL}
294     * @configurationRepoIdSuffix Yes
295     */
296    public static final String HTTP_RETRY_HANDLER_INTERVAL = PREFIX_TRANSPORT_HTTP + "retryHandler.interval";
297
298    /**
299     * The default initial retry interval to use if {@link #HTTP_RETRY_HANDLER_INTERVAL} isn't set.
300     * Default value 5000ms.
301     *
302     * @since 1.9.16
303     */
304    public static final long DEFAULT_HTTP_RETRY_HANDLER_INTERVAL = 5000L;
305
306    /**
307     * The maximum retry interval in millis of request to a remote server above which the request should be aborted
308     * instead. In theory, a malicious server could tell Maven "come back after 100 years" that would stall the build
309     * for some. Using this parameter Maven will fail the request instead, if interval is above this value.
310     *
311     * @since 1.9.16
312     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
313     * @configurationType {@link java.lang.Long}
314     * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_INTERVAL_MAX}
315     * @configurationRepoIdSuffix Yes
316     */
317    public static final String HTTP_RETRY_HANDLER_INTERVAL_MAX = PREFIX_TRANSPORT_HTTP + "retryHandler.intervalMax";
318
319    /**
320     * The default retry interval maximum to use if {@link #HTTP_RETRY_HANDLER_INTERVAL_MAX} isn't set.
321     * Default value 5 minutes.
322     *
323     * @since 1.9.16
324     */
325    public static final long DEFAULT_HTTP_RETRY_HANDLER_INTERVAL_MAX = 300_000L;
326
327    /**
328     * The HTTP codes of remote server responses that should be handled as "too many requests"
329     * (examples: HTTP codes 429 and 503). Accepts comma separated list of HTTP response codes.
330     *
331     * @since 1.9.16
332     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
333     * @configurationType {@link java.lang.String}
334     * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE}
335     * @configurationRepoIdSuffix Yes
336     */
337    public static final String HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE =
338            PREFIX_TRANSPORT_HTTP + "retryHandler.serviceUnavailable";
339
340    /**
341     * The default HTTP codes of remote server responses that should be handled as "too many requests".
342     * Default value: "429,503".
343     *
344     * @since 1.9.16
345     */
346    public static final String DEFAULT_HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE = "429,503";
347
348    /**
349     * Should HTTP client use preemptive-authentication for all HTTP verbs (works only w/ BASIC). By default, is
350     * disabled, as it is considered less secure.
351     *
352     * @since 1.9.6
353     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
354     * @configurationType {@link java.lang.Boolean}
355     * @configurationDefaultValue {@link #DEFAULT_HTTP_PREEMPTIVE_AUTH}
356     * @configurationRepoIdSuffix Yes
357     */
358    public static final String HTTP_PREEMPTIVE_AUTH = PREFIX_TRANSPORT_HTTP + "preemptiveAuth";
359
360    /**
361     * The default value to use if {@link #HTTP_PREEMPTIVE_AUTH} isn't set (false).
362     *
363     * @since 1.9.6
364     */
365    public static final boolean DEFAULT_HTTP_PREEMPTIVE_AUTH = false;
366
367    /**
368     * Should HTTP client reuse connections (in other words, pool connections) or not?
369     *
370     * @since 1.9.8
371     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
372     * @configurationType {@link java.lang.Boolean}
373     * @configurationDefaultValue {@link #DEFAULT_HTTP_REUSE_CONNECTIONS}
374     * @configurationRepoIdSuffix Yes
375     */
376    public static final String HTTP_REUSE_CONNECTIONS = PREFIX_TRANSPORT_HTTP + "reuseConnections";
377
378    /**
379     * The default value to use if {@link #HTTP_REUSE_CONNECTIONS} isn't set (true).
380     *
381     * @since 1.9.8
382     */
383    public static final boolean DEFAULT_HTTP_REUSE_CONNECTIONS = true;
384
385    /**
386     * Total time to live in seconds for an HTTP connection, after that time, the connection will be dropped
387     * (no matter for how long it was idle).
388     *
389     * @since 1.9.8
390     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
391     * @configurationType {@link java.lang.Integer}
392     * @configurationDefaultValue {@link #DEFAULT_HTTP_CONNECTION_MAX_TTL}
393     * @configurationRepoIdSuffix Yes
394     */
395    public static final String HTTP_CONNECTION_MAX_TTL = PREFIX_TRANSPORT_HTTP + "connectionMaxTtl";
396
397    /**
398     * The default value to use if {@link #HTTP_CONNECTION_MAX_TTL} isn't set (300 seconds).
399     *
400     * @since 1.9.8
401     */
402    public static final int DEFAULT_HTTP_CONNECTION_MAX_TTL = 300;
403
404    /**
405     * The maximum concurrent connections per route HTTP client is allowed to use.
406     *
407     * @since 1.9.8
408     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
409     * @configurationType {@link java.lang.Integer}
410     * @configurationDefaultValue {@link #DEFAULT_HTTP_MAX_CONNECTIONS_PER_ROUTE}
411     * @configurationRepoIdSuffix Yes
412     */
413    public static final String HTTP_MAX_CONNECTIONS_PER_ROUTE = PREFIX_TRANSPORT_HTTP + "maxConnectionsPerRoute";
414
415    /**
416     * The default value to use if {@link #HTTP_MAX_CONNECTIONS_PER_ROUTE} isn't set (50 connections).
417     *
418     * @since 1.9.8
419     */
420    public static final int DEFAULT_HTTP_MAX_CONNECTIONS_PER_ROUTE = 50;
421
422    /**
423     * The local address (interface) to use with HTTP transport. Not all transport supports this option.
424     *
425     * @since 2.0.0
426     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
427     * @configurationType {@link java.lang.String}
428     * @configurationRepoIdSuffix Yes
429     */
430    public static final String HTTP_LOCAL_ADDRESS = PREFIX_TRANSPORT_HTTP + "localAddress";
431
432    /**
433     * Boolean flag should the HTTP transport support WebDAV remote. Not all transport support this option.
434     *
435     * @since 2.0.0 (moved out from maven-resolver-transport-http).
436     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
437     * @configurationType {@link java.lang.Boolean}
438     * @configurationDefaultValue {@link #DEFAULT_HTTP_SUPPORT_WEBDAV}
439     * @configurationRepoIdSuffix Yes
440     */
441    public static final String HTTP_SUPPORT_WEBDAV = PREFIX_TRANSPORT_HTTP + "supportWebDav";
442
443    /**
444     * Default value to use if {@link #HTTP_SUPPORT_WEBDAV} is not set: {@code false}.
445     *
446     * @since 2.0.0
447     */
448    public static final boolean DEFAULT_HTTP_SUPPORT_WEBDAV = false;
449
450    /**
451     * Boolean flag should the HTTP transport use preemptive-auth for PUT requests. Not all transport support this
452     * option.
453     *
454     * @since 2.0.0 (moved out from maven-resolver-transport-http).
455     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
456     * @configurationType {@link java.lang.Boolean}
457     * @configurationDefaultValue {@link #DEFAULT_HTTP_PREEMPTIVE_PUT_AUTH}
458     * @configurationRepoIdSuffix Yes
459     */
460    public static final String HTTP_PREEMPTIVE_PUT_AUTH = PREFIX_TRANSPORT_HTTP + "preemptivePutAuth";
461
462    /**
463     * Default value if {@link #HTTP_PREEMPTIVE_PUT_AUTH} is not set: {@code true}.
464     *
465     * @since 2.0.0
466     */
467    public static final boolean DEFAULT_HTTP_PREEMPTIVE_PUT_AUTH = true;
468
469    /**
470     * Boolean flag should the HTTP transport use expect-continue handshake for PUT requests. Not all transport support
471     * this option. This option may be needed for some broken HTTP servers. Default value corresponds to given
472     * transport default one (resolver does not override those), but if configuration IS given, it will replace
473     * given transport own default value.
474     *
475     * @since 1.9.17
476     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
477     * @configurationType {@link java.lang.Boolean}
478     * @configurationRepoIdSuffix Yes
479     */
480    public static final String HTTP_EXPECT_CONTINUE = PREFIX_TRANSPORT_HTTP + "expectContinue";
481
482    /**
483     * The mode that sets HTTPS transport "security mode": to ignore any SSL errors (certificate validity checks,
484     * hostname verification). The default value is {@link #HTTPS_SECURITY_MODE_DEFAULT}.
485     *
486     * @see #HTTPS_SECURITY_MODE_DEFAULT
487     * @see #HTTPS_SECURITY_MODE_INSECURE
488     * @since 1.9.6
489     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
490     * @configurationType {@link java.lang.String}
491     * @configurationDefaultValue {@link #HTTPS_SECURITY_MODE_DEFAULT}
492     * @configurationRepoIdSuffix Yes
493     */
494    public static final String HTTPS_SECURITY_MODE = PREFIX_TRANSPORT_HTTPS + "securityMode";
495
496    /**
497     * The default HTTPS security mode.
498     *
499     * @since 1.9.6
500     */
501    public static final String HTTPS_SECURITY_MODE_DEFAULT = "default";
502
503    /**
504     * The insecure HTTPS security mode (certificate validation, hostname verification are all ignored).
505     *
506     * @since 1.9.6
507     */
508    public static final String HTTPS_SECURITY_MODE_INSECURE = "insecure";
509
510    /**
511     * A flag indicating which visitor should be used to "flatten" the dependency graph into list. Default is
512     * same as in older resolver versions "preOrder", while it can accept values like "postOrder" and "levelOrder".
513     *
514     * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_PREORDER
515     * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_POSTORDER
516     * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_LEVELORDER
517     * @since 2.0.0
518     * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
519     * @configurationType {@link java.lang.String}
520     * @configurationDefaultValue {@link #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_PREORDER}
521     * @configurationRepoIdSuffix No
522     */
523    public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR = PREFIX_SYSTEM + "dependencyVisitor";
524
525    /**
526     * The visitor strategy "preOrder".
527     *
528     * @since 2.0.0
529     */
530    public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_PREORDER = "preOrder";
531
532    /**
533     * The visitor strategy "postOrder". This was the only one supported in Resolver 1.x and is hence the
534     * default as well.
535     *
536     * @since 2.0.0
537     */
538    public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_POSTORDER = "postOrder";
539
540    /**
541     * The visitor strategy "levelOrder".
542     *
543     * @since 2.0.0
544     */
545    public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_LEVELORDER = "levelOrder";
546
547    private ConfigurationProperties() {
548        // hide constructor
549    }
550}