yangtools-8.0.0 and 8.0.1 released

Robert Varga

Hello everyone,

yangtools-8.0.0 has been released.

This is a major releases, breaking both API and ABI compatibility. There
is a slew of changes, as detailed in

Overall 63 issues addressed in this release:

[YANGTOOLS-1066] - SchemaPath identification of SchemaNodes is costly and useless
[YANGTOOLS-1239] - Deprecate yang.model.api.SchemaPath for removal
[YANGTOOLS-556] - yang-data-api: use yang.common.Decimal64 for decimal64 leaves
[YANGTOOLS-1067] - Use flyweight EffectiveStatement implementations
[YANGTOOLS-1298] - Fix QName.compareTo() logic
[YANGTOOLS-1316] - Re-examine argument storage in effective statements
[YANGTOOLS-1317] - Remove UnknownStatement.getExtensionDefinition()
[YANGTOOLS-1320] - Promote UnknownEffectiveStatementBase
[YANGTOOLS-1329] - Add yang.common.UnresolvedQName
[YANGTOOLS-1336] - Improve SchemaInferenceStack diagnostics
[YANGTOOLS-1338] - Generate ietf-restconf operations leaf statements
[YANGTOOLS-1339] - Enforce YANG 1/1.1 interoperability constraints
[YANGTOOLS-1342] - Carry java.nio.file.Path in {Yang,Yin}TextFileSchemaSource
[YANGTOOLS-1359] - Allow bridging from UnqualifiedQName to QualifiedQName
[YANGTOOLS-1368] - Do not build FeatureEffectiveStatement for unsupported features
[YANGTOOLS-1371] - Expose available StatementSupports from StmtContext
[YANGTOOLS-1374] - Intern yang.model.api.PatternExpression
[YANGTOOLS-1375] - Implement TypedefNamespace as a linear search
[YANGTOOLS-1376] - Do not retain singleton RangeSets
[YANGTOOLS-1378] - Codify AbstractModelStatement's hashCode/equals/toString
[YANGTOOLS-1379] - Remove AugmentationSchemaNode.getOriginalDefinition()
[YANGTOOLS-1391] - Add a custom SoftSchemaSourceCache
[YANGTOOLS-1399] - Add OrderedByAwareEffectiveStatement
[YANGTOOLS-1400] - AugmentEffectiveStatement should be SchemaTreeAwareEffectiveStatement
[YANGTOOLS-1405] - Add Decimal64.valueOf() methods which specify expected precision
[YANGTOOLS-1092] - Reformulate LeafRefContext without SchemaPath
[YANGTOOLS-1144] - Resolve yang-parser-api naming
[YANGTOOLS-1258] - Split out yang-data-tree-ri
[YANGTOOLS-1324] - Remove ClassBasedPropertyBuilder
[YANGTOOLS-1326] - Remove ProductAwareBuilder
[YANGTOOLS-1327] - Deprecate CheckedBuilder and Builder
[YANGTOOLS-1328] - Deprecate CheckedBuilder and Builder for removal
[YANGTOOLS-1331] - Remove util.Immutables
[YANGTOOLS-1333] - Flatten IllegalArgumentCodec hierarchy
[YANGTOOLS-1334] - Deprecate IllegalArgumentCodec for removal
[YANGTOOLS-1343] - Rename concepts.Path to concepts.HierarchicalIdentifier
[YANGTOOLS-1364] - Remove yang.common.Empty.getInstance()
[YANGTOOLS-1377] - Remove DerivableSchemaNode
[YANGTOOLS-1380] - Remove model.util.SchemaNodeUtils
[YANGTOOLS-1382] - Hide StatementContextBase
[YANGTOOLS-1390] - Remove overloaded ImmutableNodes.fromInstanceId()
[YANGTOOLS-1395] - Fold yang-{parser,xpath}-antlr
New Feature
[YANGTOOLS-1262] - Index TypedefNamespace
[YANGTOOLS-1372] - Add support for purely-effective substatements
[YANGTOOLS-1392] - Reformulate ImmutableNodes.fromInstanceId() in terms of NormalizedNodeStreamWriter
[YANGTOOLS-1167] - maven-plugin-it does not contribute to SonarCloud
[YANGTOOLS-1276] - MandatoryLeafEnforcer fails when faced with augmentations
[YANGTOOLS-1313] - Error when module is imported with different prefixes
[YANGTOOLS-1321] - Decimal64.valueOf(String) does not handle full length
[YANGTOOLS-1346] - IAE in StatementContextBase.childCopyOf()
[YANGTOOLS-1370] - NPE in parser reactor with if-feature inference
[YANGTOOLS-1381] - Parser reactor does not support chained prerequisites
[YANGTOOLS-1385] - Unique statement reference is not validated
[YANGTOOLS-1386] - Statement replicas do not trigger onStatementAdded()
[YANGTOOLS-1387] - XPath: XPath keyword not accepted as valid XPath expression
[YANGTOOLS-1393] - InferenceException thrown when uses/augment is conditional on unsupported feature
[YANGTOOLS-1404] - Deviation of augmented node causes NPE
[YANGTOOLS-1214] - Reuse effective substatements along entire copy axis
[YANGTOOLS-1278] - Remove org.opendaylight.yang.model.parser.api
[YANGTOOLS-1318] - Remove RecursiveObjectLeaker
[YANGTOOLS-1344] - Introduce concepts.HierarchicalIdentifier and deprecate concepts.Path
[YANGTOOLS-1383] - Do not emit UndeclaredCaseStatements
[YANGTOOLS-1384] - Remove ModelStatement.statementSource()
There was a last-minute typo, detected by MD-SAL unit tests, which necessitated an 8.0.1:

[YANGTOOLS-1406] - BaseDecimalType is missing boundaries for fraction-digits=18

The poster child of a feature for this release is YANG parser memory footprint improvements, which have been in development for the past 18 months. This amounts in ~5x reduction, depending on model complexity. As an example: retained heap memory for Junos 19.3 is around 87MiB, where yangtools-7.0.0 used 481MiB -- which is a factor 5.3 improvement.

YANG parser now validates whether the components of 'unique' statement argument are valid references and rejects models which have these in disarray.

We also validate import-by-revision compliance as per RFC7950, which specifically forbids:
- mismatch of yang-version between a module and its submodules
- import-by-revision of a YANG 1.1 into a YANG 1 module (or submodule)

Finally, in yang-data-api we are now using dedicated yang.common.Decimal64 type (instead of java.math.BigDecimal). This improves storage of leaves carrying this type (which are few and far between) and, more importantly, enforces correct values with respect to declared 'fraction-digits' statement.