/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.parser.spi.meta; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; 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.stmt.KeyStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.UnknownStatementImpl; public final class StmtContextUtils { public static final Splitter LIST_KEY_SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults(); private static final Function, DeclaredStatement> BUILD_DECLARED = new Function, DeclaredStatement>() { @Override public DeclaredStatement apply(final StmtContext input) { return input.buildDeclared(); } }; private static final Function, EffectiveStatement> BUILD_EFFECTIVE = new Function, EffectiveStatement>() { @Override public EffectiveStatement apply(final StmtContext input) { return input.buildEffective(); } }; public static final Predicate> IS_SUPPORTED_TO_BUILD_EFFECTIVE = new Predicate>() { @Override public boolean apply(final StmtContext input) { return input.isSupportedToBuildEffective(); } }; private StmtContextUtils() { throw new UnsupportedOperationException("Utility class"); } @SuppressWarnings("unchecked") public static > Function, D> buildDeclared() { return Function.class.cast(BUILD_DECLARED); } @SuppressWarnings("unchecked") public static > Function, E> buildEffective() { return Function.class.cast(BUILD_EFFECTIVE); } @SuppressWarnings("unchecked") public static > AT firstAttributeOf( final Iterable> contexts, final Class
declaredType) { for (StmtContext ctx : contexts) { if (producesDeclared(ctx, declaredType)) { return (AT) ctx.getStatementArgument(); } } return null; } @SuppressWarnings("unchecked") public static > AT firstAttributeOf(final StmtContext ctx, final Class
declaredType) { return producesDeclared(ctx, declaredType) ? (AT) ctx.getStatementArgument() : null; } @SuppressWarnings("unchecked") public static > StmtContext findFirstDeclaredSubstatement( final StmtContext stmtContext, final Class
declaredType) { for (StmtContext subStmtContext : stmtContext.declaredSubstatements()) { if (producesDeclared(subStmtContext,declaredType)) { return (StmtContext) subStmtContext; } } return null; } @SafeVarargs public static StmtContext findFirstDeclaredSubstatement(final StmtContext stmtContext, int startIndex, final Class>... types) { if (startIndex >= types.length) { return null; } for (StmtContext subStmtContext : stmtContext.declaredSubstatements()) { if (producesDeclared(subStmtContext,types[startIndex])) { return startIndex + 1 == types.length ? subStmtContext : findFirstDeclaredSubstatement(subStmtContext, ++startIndex, types); } } return null; } public static
> StmtContext findFirstDeclaredSubstatementOnSublevel( final StmtContext stmtContext, final Class
declaredType, int sublevel) { for (StmtContext subStmtContext : stmtContext.declaredSubstatements()) { if (sublevel == 1 && producesDeclared(subStmtContext, declaredType)) { return subStmtContext; } if (sublevel > 1) { final StmtContext result = findFirstDeclaredSubstatementOnSublevel( subStmtContext, declaredType, --sublevel); if (result != null) { return result; } } } return null; } public static
> StmtContext findDeepFirstDeclaredSubstatement( final StmtContext stmtContext, final Class
declaredType) { for (StmtContext subStmtContext : stmtContext.declaredSubstatements()) { if (producesDeclared(subStmtContext, declaredType)) { return subStmtContext; } final StmtContext result = findDeepFirstDeclaredSubstatement(subStmtContext, declaredType); if (result != null) { return result; } } return null; } public static boolean producesDeclared(final StmtContext ctx, final Class> type) { return type.isAssignableFrom(ctx.getPublicDefinition().getDeclaredRepresentationClass()); } public static boolean isInExtensionBody(final StmtContext stmtCtx) { StmtContext current = stmtCtx; while (!current.getParentContext().isRootContext()) { current = current.getParentContext(); if (producesDeclared(current, UnknownStatementImpl.class)) { return true; } } return false; } public static boolean isUnknownStatement(final StmtContext stmtCtx) { return producesDeclared(stmtCtx, UnknownStatementImpl.class); } public static Collection replaceModuleQNameForKey( final StmtContext, KeyStatement, ?> keyStmtCtx, final QNameModule newQNameModule) { Set newKeys = new LinkedHashSet<>(); for (String keyToken : LIST_KEY_SPLITTER.split(keyStmtCtx.rawStatementArgument())) { final QName keyQName = QName.create(newQNameModule, keyToken); newKeys.add(SchemaNodeIdentifier.create(false, keyQName)); } return newKeys; } }