org.eclipse.aether.util.graph.transformer

## Class ConflictResolver

- java.lang.Object
- - org.eclipse.aether.util.graph.transformer.ConflictResolver

- All Implemented Interfaces:
    DependencyGraphTransformer

      public final class ConflictResolver
      extends Object
      implements DependencyGraphTransformer

  A dependency graph transformer that resolves version and scope conflicts among dependencies. For a given set of conflicting nodes, one node will be chosen as the winner and the other nodes are removed from the dependency graph. The exact rules by which a winning node and its effective scope are determined are controlled by user-supplied implementations of `ConflictResolver.VersionSelector`, `ConflictResolver.ScopeSelector`, `ConflictResolver.OptionalitySelector` and `ConflictResolver.ScopeDeriver`.

  By default, this graph transformer will turn the dependency graph into a tree without duplicate artifacts. Using the configuration property `CONFIG_PROP_VERBOSE`, a verbose mode can be enabled where the graph is still turned into a tree but all nodes participating in a conflict are retained. The nodes that were rejected during conflict resolution have no children and link back to the winner node via the `NODE_DATA_WINNER` key in their custom data. Additionally, the keys `NODE_DATA_ORIGINAL_SCOPE` and `NODE_DATA_ORIGINAL_OPTIONALITY` are used to store the original scope and optionality of each node. Obviously, the resulting dependency tree is not suitable for artifact resolution unless a filter is employed to exclude the duplicate dependencies.

  This transformer will query the keys `TransformationContextKeys.CONFLICT_IDS`, `TransformationContextKeys.SORTED_CONFLICT_IDS`, `TransformationContextKeys.CYCLIC_CONFLICT_IDS` for existing information about conflict ids. In absence of this information, it will automatically invoke the `ConflictIdSorter` to calculate it.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static class` | `ConflictResolver.ConflictContext` A context used to hold information that is relevant for resolving version and scope conflicts.
    `static class` | `ConflictResolver.ConflictItem` A conflicting dependency.
    `static class` | `ConflictResolver.OptionalitySelector` An extension point of `ConflictResolver` that determines the effective optional flag of a dependency from a potentially conflicting set of derived optionalities.
    `static class` | `ConflictResolver.ScopeContext` A context used to hold information that is relevant for deriving the scope of a child dependency.
    `static class` | `ConflictResolver.ScopeDeriver` An extension point of `ConflictResolver` that determines the scope of a dependency in relation to the scope of its parent.
    `static class` | `ConflictResolver.ScopeSelector` An extension point of `ConflictResolver` that determines the effective scope of a dependency from a potentially conflicting set of `derived scopes`.
    `static class` | `ConflictResolver.VersionSelector` An extension point of `ConflictResolver` that determines the winner among conflicting dependencies.

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `CONFIG_PROP_VERBOSE` The key in the repository session's `configuration properties` used to store a `Boolean` flag controlling the transformer's verbose mode.
    `static String` | `NODE_DATA_ORIGINAL_OPTIONALITY` The key in the dependency node's `custom data` under which the optional flag of the dependency before derivation and conflict resolution is stored.
    `static String` | `NODE_DATA_ORIGINAL_SCOPE` The key in the dependency node's `custom data` under which the scope of the dependency before scope derivation and conflict resolution is stored.
    `static String` | `NODE_DATA_WINNER` The key in the dependency node's `custom data` under which a reference to the `DependencyNode` which has won the conflict is stored.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ConflictResolver(ConflictResolver.VersionSelector versionSelector, ConflictResolver.ScopeSelector scopeSelector, ConflictResolver.OptionalitySelector optionalitySelector, ConflictResolver.ScopeDeriver scopeDeriver)` Creates a new conflict resolver instance with the specified hooks.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `DependencyNode` | `transformGraph(DependencyNode node, DependencyGraphTransformationContext context)` Transforms the dependency graph denoted by the specified root node.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### CONFIG_PROP_VERBOSE

          public static final String CONFIG_PROP_VERBOSE

      The key in the repository session's `configuration properties` used to store a `Boolean` flag controlling the transformer's verbose mode.
      See Also:
        Constant Field Values

    - #### NODE_DATA_WINNER

          public static final String NODE_DATA_WINNER

      The key in the dependency node's `custom data` under which a reference to the `DependencyNode` which has won the conflict is stored.
      See Also:
        Constant Field Values

    - #### NODE_DATA_ORIGINAL_SCOPE

          public static final String NODE_DATA_ORIGINAL_SCOPE

      The key in the dependency node's `custom data` under which the scope of the dependency before scope derivation and conflict resolution is stored.
      See Also:
        Constant Field Values

    - #### NODE_DATA_ORIGINAL_OPTIONALITY

          public static final String NODE_DATA_ORIGINAL_OPTIONALITY

      The key in the dependency node's `custom data` under which the optional flag of the dependency before derivation and conflict resolution is stored.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### ConflictResolver

          public ConflictResolver(ConflictResolver.VersionSelector versionSelector,
                          ConflictResolver.ScopeSelector scopeSelector,
                          ConflictResolver.OptionalitySelector optionalitySelector,
                          ConflictResolver.ScopeDeriver scopeDeriver)

      Creates a new conflict resolver instance with the specified hooks.
      Parameters:
        `versionSelector` - The version selector to use, must not be `null`.
        `scopeSelector` - The scope selector to use, must not be `null`.
        `optionalitySelector` - The optionality selector ot use, must not be `null`.
        `scopeDeriver` - The scope deriver to use, must not be `null`.

  - ### Method Detail

    - #### transformGraph

          public DependencyNode transformGraph(DependencyNode node,
                                      DependencyGraphTransformationContext context)
                                        throws RepositoryException

      Description copied from interface: `DependencyGraphTransformer`
      Transforms the dependency graph denoted by the specified root node. The transformer may directly change the provided input graph or create a new graph, the former is recommended for performance reasons.
      Specified by:
        `transformGraph` in interface `DependencyGraphTransformer`
      Parameters:
        `node` - The root node of the (possibly cyclic!) graph to transform, must not be `null`.
        `context` - The graph transformation context, must not be `null`.
      Returns:
        The result graph of the transformation, never `null`.
      Throws:
        `RepositoryException` - If the transformation failed.

Copyright © 2010-2014 The Eclipse Foundation. All Rights Reserved.