Bug 4459 - Parser fails when enum contains illegal characters for QName.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / type / EnumEffectiveStatementImpl.java
index 66847b6c542f7a7dfc78ec90af200ad0e5bd9149..2522f2874944ba53376d57b344283bdbc1a705c2 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type;
 import java.util.Collections;
 import java.util.List;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -17,25 +18,43 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeclaredEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DescriptionEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ReferenceEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.StatusEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ValueEffectiveStatementImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class EnumEffectiveStatementImpl extends DeclaredEffectiveStatementBase<String, EnumStatement> implements EnumPair {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EnumEffectiveStatementImpl.class);
+
     private final SchemaPath path;
     private String description;
     private String reference;
     private Status status = Status.CURRENT;
     private Integer value;
+    private final QName maybeQNameArgument;
 
     public EnumEffectiveStatementImpl(final StmtContext<String, EnumStatement, ?> ctx) {
         super(ctx);
 
-        path = ctx.getSchemaPath().get();
+        SchemaPath parentPath = ctx.getParentContext().getSchemaPath().get();
+        QNameModule moduleQName = parentPath.getLastComponent().getModule();
+        QName maybeQNameArgumentInit = null;
+        try {
+            maybeQNameArgumentInit = QName.create(moduleQName, argument());
+        } catch (IllegalArgumentException e) {
+            String localName = Utils.replaceIllegalCharsForQName(argument());
+            LOG.warn("{}. Enum argument '{}' has been replaced by '{}'.", e.getMessage(), argument(), localName, e);
+            maybeQNameArgumentInit = QName.create(moduleQName, localName);
+        }
+        this.maybeQNameArgument = maybeQNameArgumentInit;
+        this.path = parentPath.createChild(this.maybeQNameArgument);
 
-        for (final EffectiveStatement<?,?> effectiveStatement : effectiveSubstatements()) {
+        for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
             if (effectiveStatement instanceof DescriptionEffectiveStatementImpl) {
                 description = ((DescriptionEffectiveStatementImpl) effectiveStatement).argument();
             }
@@ -63,7 +82,7 @@ public class EnumEffectiveStatementImpl extends DeclaredEffectiveStatementBase<S
 
     @Override
     public QName getQName() {
-        return getPath().getLastComponent();
+        return maybeQNameArgument;
     }
 
     @Override