Support mixing old style and class based rulesThe recently addition of class based component metadata rules came witha limitation in the way old style and class based rules could be mixed.This commit removes the limitation by allowing mixed addition of eachtype of rules, while preserving the execution order based on additionorder.Fixes #6568
Add pom support feature to cache key for metadata rulesThe IMPROVED_POM_SUPPORT feature preview has a direct impact on metadata resolution. As such, changing that value must invalidate the component metadata rule cache.
Add support for backlinks in dependency graphA module may declare the platform(s) it belongs to. If it does so, then we implicitly add an outgoing edgeto the platform, allowing us to resolve all dependencies belonging to the same platform consistently. Thisallow us to implement _module alignment_, by telling that 2 modules belong to the same platform. In practice,there are 2 possible cases:1. the "platform" a module belongs to exists, in which case, an outgoing edge is added to a "published module",and this module is expected to have constraints onto the other modules of the same platform.2. the "platform" a module belongs to doesn't exist, for example because the publisher didn't definesuch a thing. In that case, a platform can be constructed "adhoc", and we will try to use modules of the sameversion as the platform whenever possible.The second case is significantly more expensive as it forces us to create "virtual" dependencies, and for eachof them we need to check if the target modules exist.
Normalize `ModuleIdentifier`This commit reworks the `ComponentModuleIdentifier`/`ComponentModuleSelector`/`ModuleVersionSelector`classes to use `ModuleIdentifier` under the hood, instead of storing denormalized strings. This hasthe advantage that we can reduce the use of the module identifier factory, which is called veryoften during dependency resolution. Sharing instances reduces the need for conversions, and makescomparisons faster.