Track schema tree generator linkage
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / SchemaTreePlaceholder.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
9
10 import static com.google.common.base.Verify.verify;
11 import static com.google.common.base.Verify.verifyNotNull;
12 import static java.util.Objects.requireNonNull;
13
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.mdsal.binding.generator.impl.tree.SchemaTreeChild;
17 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
18
19 /**
20  * A placeholder {@link SchemaTreeChild}.
21  *
22  */
23 final class SchemaTreePlaceholder<S extends SchemaTreeEffectiveStatement<?>,
24         G extends AbstractExplicitGenerator<S> & SchemaTreeChild<S, G>> implements SchemaTreeChild<S, G> {
25     private final @NonNull Class<G> generatorType;
26     private final @NonNull S statement;
27
28     private @Nullable G generator;
29
30     SchemaTreePlaceholder(final S statement, final Class<G> generatorType) {
31         this.statement = requireNonNull(statement);
32         this.generatorType = requireNonNull(generatorType);
33     }
34
35     @Override
36     public S statement() {
37         return statement;
38     }
39
40     @Override
41     public G generator() {
42         final var local = generator;
43         if (local == null) {
44             throw new IllegalStateException("Unresolved generator in " + this);
45         }
46         return local;
47     }
48
49     void setGenerator(final AbstractCompositeGenerator<?> parent) {
50         verify(generator == null, "Attempted to set generator for %s", this);
51         final var qname = getIdentifier();
52         generator = generatorType.cast(verifyNotNull(parent.findSchemaTreeGenerator(qname),
53             "Failed to find generator for child %s in %s", qname, parent));
54     }
55 }