public final class ConflictResolver extends java.lang.Object implements DependencyGraphTransformer
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.
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.
|
(package private) static class |
ConflictResolver.NodeInfo |
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 . |
(package private) class |
ConflictResolver.State |
static class |
ConflictResolver.VersionSelector
An extension point of
ConflictResolver that determines the winner among conflicting dependencies. |
Modifier and Type | Field and Description |
---|---|
static java.lang.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 java.lang.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 java.lang.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 java.lang.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. |
private ConflictResolver.OptionalitySelector |
optionalitySelector |
private ConflictResolver.ScopeDeriver |
scopeDeriver |
private ConflictResolver.ScopeSelector |
scopeSelector |
private ConflictResolver.VersionSelector |
versionSelector |
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.
|
Modifier and Type | Method and Description |
---|---|
private boolean |
gatherConflictItems(DependencyNode node,
ConflictResolver.State state) |
private void |
removeLosers(ConflictResolver.State state) |
DependencyNode |
transformGraph(DependencyNode node,
DependencyGraphTransformationContext context)
Transforms the dependency graph denoted by the specified root node.
|
public static final java.lang.String CONFIG_PROP_VERBOSE
configuration properties
used to store a Boolean
flag controlling the transformer's verbose mode.public static final java.lang.String NODE_DATA_WINNER
custom data
under which a reference to the
DependencyNode
which has won the conflict is stored.public static final java.lang.String NODE_DATA_ORIGINAL_SCOPE
custom data
under which the scope of the
dependency before scope derivation and conflict resolution is stored.public static final java.lang.String NODE_DATA_ORIGINAL_OPTIONALITY
custom data
under which the optional flag of
the dependency before derivation and conflict resolution is stored.private final ConflictResolver.VersionSelector versionSelector
private final ConflictResolver.ScopeSelector scopeSelector
private final ConflictResolver.ScopeDeriver scopeDeriver
private final ConflictResolver.OptionalitySelector optionalitySelector
public ConflictResolver(ConflictResolver.VersionSelector versionSelector, ConflictResolver.ScopeSelector scopeSelector, ConflictResolver.OptionalitySelector optionalitySelector, ConflictResolver.ScopeDeriver scopeDeriver)
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
.public DependencyNode transformGraph(DependencyNode node, DependencyGraphTransformationContext context) throws RepositoryException
DependencyGraphTransformer
transformGraph
in interface DependencyGraphTransformer
node
- The root node of the (possibly cyclic!) graph to transform, must not be null
.context
- The graph transformation context, must not be null
.null
.RepositoryException
- If the transformation failed.private boolean gatherConflictItems(DependencyNode node, ConflictResolver.State state) throws RepositoryException
RepositoryException
private void removeLosers(ConflictResolver.State state)