Make sure we mark phase modification 06/74806/4
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Aug 2018 18:23:46 +0000 (20:23 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Aug 2018 18:43:09 +0000 (20:43 +0200)
Once we resolve the target we need to paint it, so it does not
complete before our modification has had a chance to run.

JIRA: YANGTOOLS-859
Change-Id: I8b29a8eef4d01f8c02d13d759061e93c379029e5
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java

index 838db6aadebfa44f7502879085c06eaf2ccf860f..3ff877f6817337646f0910b7a7b7803251f151b1 100644 (file)
@@ -249,18 +249,17 @@ final class ModifierImpl implements ModelActionBuilder {
 
     @Nonnull
     @Override
-    @SuppressWarnings({ "rawtypes", "unchecked" })
     public <K, E extends EffectiveStatement<?, ?>, N extends IdentifierNamespace<K, ? extends StmtContext<?, ?, ?>>>
             AbstractPrerequisite<Mutable<?, ?, E>> mutatesEffectiveCtxPath(final StmtContext<?, ?, ?> context,
                     final Class<N> namespace, final Iterable<K> keys) {
         checkNotRegistered();
 
         final PhaseModificationInNamespacePath<Mutable<?, ?, E>, K, N> ret = new PhaseModificationInNamespacePath<>(
-                EFFECTIVE_MODEL, namespace, keys);
+                EFFECTIVE_MODEL, keys);
         addReq(ret);
         addMutation(ret);
 
-        contextImpl(context).onNamespaceItemAddedAction((Class) namespace, ret.nextKey(), ret);
+        ret.hookOnto(context, namespace);
         return ret;
     }
 
@@ -396,16 +395,10 @@ final class ModifierImpl implements ModelActionBuilder {
         private final Iterable<K> keys;
         private final Iterator<K> it;
 
-        PhaseModificationInNamespacePath(final ModelProcessingPhase phase, final Class<N> namespace,
-            final Iterable<K> keys) {
+        PhaseModificationInNamespacePath(final ModelProcessingPhase phase, final Iterable<K> keys) {
             this.modPhase = requireNonNull(phase);
             this.keys = requireNonNull(keys);
             it = keys.iterator();
-            checkArgument(it.hasNext(), "Namespace %s keys may not be empty", namespace);
-        }
-
-        K nextKey() {
-            return it.next();
         }
 
         @Override
@@ -417,13 +410,25 @@ final class ModifierImpl implements ModelActionBuilder {
         public void namespaceItemAdded(final StatementContextBase<?, ?, ?> context, final Class<?> namespace,
                 final Object key, final Object value) {
             LOG.debug("Action for {} got key {}", keys, key);
+
+            final StatementContextBase<?, ?, ?> target = contextImpl(value);
             if (!it.hasNext()) {
+                target.addMutation(modPhase, this);
                 resolvePrereq((C) value);
                 return;
             }
 
-            final K next = nextKey();
-            contextImpl(value).onNamespaceItemAddedAction((Class) namespace, next, this);
+            hookOnto(target, namespace, it.next());
+        }
+
+        void hookOnto(final StmtContext<?, ?, ?> context, final Class<?> namespace) {
+            checkArgument(it.hasNext(), "Namespace %s keys may not be empty", namespace);
+            hookOnto(contextImpl(context), namespace, it.next());
+        }
+
+        @SuppressWarnings("unchecked")
+        private void hookOnto(final StatementContextBase<?, ?, ?> context, final Class<?> namespace, final K key) {
+            context.onNamespaceItemAddedAction((Class) namespace, requireNonNull(key), this);
         }
     }
 }