X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2Feffective%2FEffectiveStatementBase.java;h=2a621b2c9fd838e390142b9ad26ed7c051dc3f88;hb=07a461a735316f15f9a78455e1c1c3caf91b2a3e;hp=d3b190ce4a7a5e3c1c2b49427b300a041f2e22a0;hpb=69dcbda23d8cf16be62233558d98b9d43ee618dd;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java index d3b190ce4a..2a621b2c9f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -8,97 +8,86 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; import com.google.common.base.Optional; +import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; -import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; - +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; +import java.util.List; import java.util.Map; -import java.util.NoSuchElementException; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; -import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.RecursiveObjectLeaker; -abstract public class EffectiveStatementBase> implements EffectiveStatement { - - private final ImmutableList> substatements; - private final StatementSource statementSource; - private final StatementDefinition statementDefinition; - private final A argument; - private final D declaredInstance; +public abstract class EffectiveStatementBase> implements EffectiveStatement { - public EffectiveStatementBase(final StmtContext ctx) { - this.statementDefinition = ctx.getPublicDefinition(); - this.argument = ctx.getStatementArgument(); - this.statementSource = ctx.getStatementSource(); - - Collection> declaredSubstatements = ctx.declaredSubstatements(); - Collection> effectiveSubstatements = ctx.effectiveSubstatements(); - - Collection> substatementsInit = new LinkedList<>(); + private static final Predicate> IS_SUPPORTED_TO_BUILD_EFFECTIVE = + new Predicate>() { + @Override + public boolean apply(final StmtContext input) { + return input.isSupportedToBuildEffective(); + } + }; - for(StatementContextBase declaredSubstatement : declaredSubstatements) { - if(declaredSubstatement.getPublicDefinition() == Rfc6020Mapping.USES) { + private static final Predicate> IS_UNKNOWN_STATEMENT_CONTEXT = + new Predicate>() { + @Override + public boolean apply(final StmtContext input) { + return StmtContextUtils.isUnknownStatement(input); + } + }; + + private final List> substatements; + + /** + * Constructor. + * + * @param ctx + * context of statement. + */ + protected EffectiveStatementBase(final StmtContext ctx) { + final Collection> effectiveSubstatements = ctx.effectiveSubstatements(); + final Collection> substatementsInit = new ArrayList<>(); + + for(StatementContextBase declaredSubstatement : ctx.declaredSubstatements()) { + if (declaredSubstatement.getPublicDefinition().equals(Rfc6020Mapping.USES)) { substatementsInit.add(declaredSubstatement); substatementsInit.addAll(declaredSubstatement.getEffectOfStatement()); - ((StatementContextBase)ctx).removeStatementsFromEffectiveSubstatements(declaredSubstatement + ((StatementContextBase) ctx).removeStatementsFromEffectiveSubstatements(declaredSubstatement .getEffectOfStatement()); } else { substatementsInit.add(declaredSubstatement); } } - substatementsInit.addAll(effectiveSubstatements); - this.substatements = FluentIterable.from(substatementsInit).filter(StmtContextUtils.IS_SUPPORTED_TO_BUILD_EFFECTIVE) - .transform(StmtContextUtils.buildEffective()).toList(); - declaredInstance = ctx.buildDeclared(); - } + // WARNING: this leaks an incompletely-initialized pbject + RecursiveObjectLeaker.inConstructor(this); - @Override - public StatementDefinition statementDefinition() { - return statementDefinition; + this.substatements = ImmutableList.copyOf(Collections2.transform(Collections2.filter(substatementsInit, + IS_SUPPORTED_TO_BUILD_EFFECTIVE), StmtContextUtils.buildEffective())); } @Override - public A argument() { - return argument; - } - - @Override - public StatementSource getStatementSource() { - return statementSource; - } - - @Override - public D getDeclared() { - return declaredInstance; - } - - @Override - public > V get(final Class namespace, final K identifier) { + public final > V get(final Class namespace, final K identifier) { throw new UnsupportedOperationException("Not implemented yet."); } @Override - public > Map getAll(final Class namespace) { + public final > Map getAll(final Class namespace) { throw new UnsupportedOperationException("Not implemented yet."); } @Override - public Collection> effectiveSubstatements() { + public final Collection> effectiveSubstatements() { return substatements; } @@ -116,14 +105,7 @@ abstract public class EffectiveStatementBase> @SuppressWarnings("unchecked") protected final Collection allSubstatementsOfType(final Class type) { - Collection result = null; - - try { - result = Collection.class.cast(Collections2.filter(substatements, Predicates.instanceOf(type))); - } catch (NoSuchElementException e) { - result = Collections.emptyList(); - } - return result; + return Collection.class.cast(Collections2.filter(substatements, Predicates.instanceOf(type))); } protected final T firstSubstatementOfType(final Class type) { @@ -137,4 +119,8 @@ abstract public class EffectiveStatementBase> Predicates.and(Predicates.instanceOf(type), Predicates.instanceOf(returnType))); return possible.isPresent() ? returnType.cast(possible.get()) : null; } + + protected final EffectiveStatement firstEffectiveSubstatementOfType(final Class type) { + return Iterables.tryFind(substatements, Predicates.instanceOf(type)).orNull(); + } }