[YANGTOOLS-1085] Fully validate XPath expressions Created: 21/Feb/20  Updated: 03/May/22  Resolved: 25/Mar/20

Status: Resolved
Project: yangtools
Component/s: parser
Affects Version/s: None
Fix Version/s: 5.0.0

Type: New Feature Priority: Medium
Reporter: Robert Varga Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to YANGTOOLS-1428 Missing failedSource in SchemaResolut... Resolved

 Description   

Our YANG parser can operate (and will fall back) accepting invalid XPath expressions. This means users dealing with resulting EffectiveModelContext cannot rely on expression being normalized into the model and have had to resort to parsing the expression themselves – with a ton of bugs.

Disable this capability and require XPaths to be always parsed and validated, so that users are presented with a proper yang-xpath-api representation.



 Comments   
Comment by Robert Varga [ 22/Feb/20 ]
2020-02-22T08:20:31,386 | INFO  | features-3-thread-1 | YangTextSchemaContextResolver    | 141 - org.opendaylight.yangtools.yang-parser-impl - 5.0.0.SNAPSHOT | Failed to fully assemble schema context for [RevisionSourceIdentifier [name=ietf-inet-types@2013-07-15], RevisionSourceIdentifier [name=ietf-yang-types@2013-07-15], RevisionSourceIdentifier [name=ietf-yang-library@2016-06-21], RevisionSourceIdentifier [name=yang-ext@2013-07-09]]
java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError: No YangXPathParserFactory found
        at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552) ~[?:?]
        at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:513) ~[?:?]
        at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:90) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaContextResolver.getEffectiveModelContext(YangTextSchemaContextResolver.java:242) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaContextResolver.getEffectiveModelContext(YangTextSchemaContextResolver.java:205) ~[?:?]
        at org.opendaylight.binding.runtime.spi.ModuleInfoBackedContext.tryToCreateModelContext(ModuleInfoBackedContext.java:231) ~[?:?]
        at org.opendaylight.binding.runtime.spi.ModuleInfoBackedContext.getEffectiveModelContext(ModuleInfoBackedContext.java:177) ~[?:?]
        at org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider.getSchemaContext(EffectiveModelContextProvider.java:30) ~[?:?]
        at org.opendaylight.mdsal.binding.dom.codec.osgi.impl.OsgiModuleInfoRegistry.updateService(OsgiModuleInfoRegistry.java:54) ~[?:?]
        at org.opendaylight.mdsal.binding.dom.codec.osgi.impl.ModuleInfoBundleTracker.open(ModuleInfoBundleTracker.java:58) ~[?:?]
        at org.opendaylight.mdsal.binding.dom.codec.osgi.impl.Activator.start(Activator.java:45) ~[?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:779) ~[?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) ~[?:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:772) ~[?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:729) ~[?:?]
        at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:933) ~[?:?]
        at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) ~[?:?]
        at org.eclipse.osgi.container.Module.doStart(Module.java:581) ~[?:?]
        at org.eclipse.osgi.container.Module.start(Module.java:449) ~[?:?]
        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:383) ~[?:?]
        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:402) ~[?:?]
        at org.apache.karaf.features.internal.service.BundleInstallSupportImpl.startBundle(BundleInstallSupportImpl.java:165) ~[?:?]
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1153) ~[?:?]
        at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:1036) ~[?:?]
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1062) ~[?:?]
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:998) ~[?:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
        at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.ExceptionInInitializerError: No YangXPathParserFactory found
        at org.opendaylight.yangtools.yang.parser.rfc7950.reactor.ServiceLoaderState$XPath.lambda$static$0(ServiceLoaderState.java:32) ~[?:?]
        at java.util.Optional.orElseThrow(Optional.java:408) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.rfc7950.reactor.ServiceLoaderState$XPath.<clinit>(ServiceLoaderState.java:32) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors.vanillaReactorBuilder(RFC7950Reactors.java:324) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors.defaultReactorBuilder(RFC7950Reactors.java:287) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.impl.DefaultReactors.defaultReactorBuilder(DefaultReactors.java:70) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.impl.DefaultReactors$DefaultReactor.<clinit>(DefaultReactors.java:39) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.impl.DefaultReactors.defaultReactor(DefaultReactors.java:60) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.SharedSchemaContextFactory$AssembleSources.apply(SharedSchemaContextFactory.java:224) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.SharedSchemaContextFactory$AssembleSources.apply(SharedSchemaContextFactory.java:190) ~[?:?]
        at com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:213) ~[?:?]
        at com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:202) ~[?:?]
        at com.google.common.util.concurrent.AbstractTransformFuture.run(AbstractTransformFuture.java:118) ~[?:?]
        at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[?:?]
        at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1138) ~[?:?]
        at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:707) ~[?:?]
        at com.google.common.util.concurrent.FluentFuture$TrustedFuture.addListener(FluentFuture.java:104) ~[?:?]
        at com.google.common.util.concurrent.AbstractTransformFuture.create(AbstractTransformFuture.java:39) ~[?:?]
        at com.google.common.util.concurrent.Futures.transformAsync(Futures.java:471) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.SharedSchemaContextFactory.createSchemaContext(SharedSchemaContextFactory.java:104) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.SharedSchemaContextFactory.createEffectiveModelContext(SharedSchemaContextFactory.java:75) ~[?:?]
        at org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaContextResolver.getEffectiveModelContext(YangTextSchemaContextResolver.java:240) ~[?:?]
        ... 27 more

points towards static loading which needs to be eliminated, too.

Generated at Wed Feb 07 20:55:09 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.