Cleanup use of Guava library
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / EffectiveStatementBase.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.yangtools.yang.parser.stmt.rfc6020.effective;
9
10 import com.google.common.collect.Collections2;
11 import com.google.common.collect.ImmutableList;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.function.Predicate;
17 import javax.annotation.Nonnull;
18 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
20 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
21 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
24 import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
25
26 public abstract class EffectiveStatementBase<A, D extends DeclaredStatement<A>> implements EffectiveStatement<A, D> {
27     private final List<? extends EffectiveStatement<?, ?>> substatements;
28
29     /**
30      * Constructor.
31      *
32      * @param ctx
33      *            context of statement.
34      */
35     protected EffectiveStatementBase(final StmtContext<A, D, ?> ctx) {
36         final Collection<? extends StmtContext<?, ?, ?>> effectiveSubstatements = ctx.effectiveSubstatements();
37         final Collection<StmtContext<?, ?, ?>> substatementsInit = new ArrayList<>();
38
39         final Collection<? extends StmtContext<?, ?, ?>> supportedDeclaredSubStmts = Collections2.filter(
40                 ctx.declaredSubstatements(), StmtContext::isSupportedByFeatures);
41         for (final StmtContext<?, ?, ?> declaredSubstatement : supportedDeclaredSubStmts) {
42             if (YangStmtMapping.USES == declaredSubstatement.getPublicDefinition()) {
43                 substatementsInit.add(declaredSubstatement);
44                 substatementsInit.addAll(declaredSubstatement.getEffectOfStatement());
45                 ((StatementContextBase<?, ?, ?>) ctx).removeStatementsFromEffectiveSubstatements(declaredSubstatement
46                         .getEffectOfStatement());
47             } else {
48                 substatementsInit.add(declaredSubstatement);
49             }
50         }
51         substatementsInit.addAll(effectiveSubstatements);
52
53         this.substatements = ImmutableList.copyOf(initSubstatements(substatementsInit));
54     }
55
56     /**
57      * Create a set of substatements. This method is split out so it can be overridden in
58      * {@link ExtensionEffectiveStatementImpl} to leak a not-fully-initialized instance.
59      *
60      * @param substatementsInit proposed substatements
61      * @return Filtered substatements
62      */
63     Collection<? extends EffectiveStatement<?, ?>> initSubstatements(
64             final Collection<? extends StmtContext<?, ?, ?>> substatementsInit) {
65         return Collections2.transform(Collections2.filter(substatementsInit,
66             StmtContext::isSupportedToBuildEffective), StmtContext::buildEffective);
67     }
68
69     @Override
70     public final <K, V, N extends IdentifierNamespace<K, V>> V get(@Nonnull final Class<N> namespace,
71             @Nonnull final K identifier) {
72         throw new UnsupportedOperationException("Not implemented yet.");
73     }
74
75     @Override
76     public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(@Nonnull final Class<N> namespace) {
77         throw new UnsupportedOperationException("Not implemented yet.");
78     }
79
80     @Nonnull
81     @Override
82     public final Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
83         return substatements;
84     }
85
86     protected final <S extends EffectiveStatement<?, ?>> S firstEffective(final Class<S> type) {
87         return substatements.stream().filter(type::isInstance).findFirst().map(type::cast).orElse(null);
88     }
89
90     protected final <S extends SchemaNode> S firstSchemaNode(final Class<S> type) {
91         return substatements.stream().filter(type::isInstance).findFirst().map(type::cast).orElse(null);
92     }
93
94     @SuppressWarnings("unchecked")
95     protected final <T> Collection<T> allSubstatementsOfType(final Class<T> type) {
96         return Collection.class.cast(Collections2.filter(substatements, type::isInstance));
97     }
98
99     protected final <T> T firstSubstatementOfType(final Class<T> type) {
100         return substatements.stream().filter(type::isInstance).findFirst().map(type::cast).orElse(null);
101     }
102
103     protected final <R> R firstSubstatementOfType(final Class<?> type, final Class<R> returnType) {
104         return substatements.stream()
105                 .filter(((Predicate<Object>)type::isInstance).and(returnType::isInstance))
106                 .findFirst().map(returnType::cast).orElse(null);
107     }
108
109     protected final EffectiveStatement<?, ?> firstEffectiveSubstatementOfType(final Class<?> type) {
110         return substatements.stream().filter(type::isInstance).findFirst().orElse(null);
111     }
112 }