Relax identity statement argument checks 35/69635/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 19 Mar 2018 18:45:48 +0000 (19:45 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Mar 2018 11:42:49 +0000 (12:42 +0100)
This patch relaxes identity statement checking, so that FD.io's
VLAN model continues to work. Emit a stern warning, but do not fail
if an strictly-invalid identity name is encountered.

Change-Id: If3b3ad3f16372b1d856406480606177ba7851336
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/identity/AbstractIdentityStatementSupport.java

index d4499bd610ef0b2aa20c37b566b7c57570b188a9..47677bb0bc4db3476be335db125b153c21429ae0 100644 (file)
@@ -15,17 +15,37 @@ import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 abstract class AbstractIdentityStatementSupport
         extends AbstractQNameStatementSupport<IdentityStatement, EffectiveStatement<QName, IdentityStatement>> {
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractIdentityStatementSupport.class);
 
     AbstractIdentityStatementSupport() {
         super(YangStmtMapping.IDENTITY);
     }
 
     @Override
+    @SuppressWarnings({ "checkstyle:illegalCatch", "checkstyle:avoidHidingCauseException" })
     public final QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return StmtContextUtils.parseIdentifier(ctx, value);
+        try {
+            return StmtContextUtils.parseIdentifier(ctx, value);
+        } catch (SourceException e) {
+            // FIXME: YANGTOOLS-867: remove this workaround
+            final QName ret;
+            try {
+                ret = StmtContextUtils.qnameFromArgument(ctx, value);
+            } catch (RuntimeException re) {
+                // Lenient parsing failed, report the original exception
+                LOG.debug("Lenient identity parsing failed", re);
+                throw e;
+            }
+
+            LOG.warn("Worked around illegal identity argument '{}' using lenient parsing", value, e);
+            return ret;
+        }
     }
 
     @Override