All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opendaylight.yangtools.yang.test.util.YangParserTestUtils Maven / Gradle / Ivy

There is a newer version: 14.0.4
Show newest version
/*
 * Copyright (c) 2016 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.test.util;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.stmt.FeatureSet;
import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
import org.opendaylight.yangtools.yang.parser.api.YangParser;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.api.YangParserException;
import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;

/**
 * Utility class which provides convenience methods for producing effective schema context based on the supplied
 * YANG/YIN sources or paths to these sources.
 */
public final class YangParserTestUtils {
    private static final FileFilter YANG_FILE_FILTER = file -> {
        // Locale keeps SpotBugs happy. It should not matter that much anyway.
        final String name = file.getName().toLowerCase(Locale.ENGLISH);
        return name.endsWith(YangConstants.RFC6020_YANG_FILE_EXTENSION) && file.isFile();
    };

    private static final @NonNull YangParserFactory PARSER_FACTORY;

    static {
        final Iterator<@NonNull YangParserFactory> it = ServiceLoader.load(YangParserFactory.class).iterator();
        if (!it.hasNext()) {
            throw new IllegalStateException("No YangParserFactory found");
        }
        PARSER_FACTORY = it.next();
    }

    private YangParserTestUtils() {
        // Hidden on purpose
    }

    /**
     * Creates a new effective schema context containing the specified YANG source. Statement parser mode is set to
     * default mode and all YANG features are supported.
     *
     * @param resource relative path to the YANG file to be parsed
     *
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResource(final String resource) {
        return parseYangResource(resource, YangParserConfiguration.DEFAULT);
    }

    /**
     * Creates a new effective schema context containing the specified YANG source. All YANG features are supported.
     *
     * @param resource relative path to the YANG file to be parsed
     * @param config parser configuration
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResource(final String resource, final YangParserConfiguration config) {
        return parseYangResource(resource, config, null);
    }

    /**
     * Creates a new effective schema context containing the specified YANG source. Statement parser mode is set to
     * default mode.
     *
     * @param resource relative path to the YANG file to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          model are resolved
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResource(final String resource, final Set supportedFeatures) {
        return parseYangResource(resource, YangParserConfiguration.DEFAULT, supportedFeatures);
    }

    /**
     * Creates a new effective schema context containing the specified YANG source.
     *
     * @param resource relative path to the YANG file to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          model are resolved
     * @param config parser configuration
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResource(final String resource, final YangParserConfiguration config,
            final Set supportedFeatures) {
        final YangTextSchemaSource source = YangTextSchemaSource.forResource(YangParserTestUtils.class, resource);
        return parseYangSources(config, supportedFeatures, source);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode and all YANG features are supported.
     *
     * @param files YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final File... files) {
        return parseYangFiles(Arrays.asList(files));
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode and all YANG features are supported.
     *
     * @param files collection of YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final Collection files) {
        return parseYangFiles(YangParserConfiguration.DEFAULT, files);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode.
     *
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @param files YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final Set supportedFeatures, final File... files) {
        return parseYangFiles(supportedFeatures, Arrays.asList(files));
    }

    public static EffectiveModelContext parseYangFiles(final Set supportedFeatures,
            final Collection files) {
        return parseYangFiles(supportedFeatures, YangParserConfiguration.DEFAULT, files);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. All YANG features are supported.
     *
     * @param config parser configuration
     * @param files YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final YangParserConfiguration config, final File... files) {
        return parseYangFiles(config, Arrays.asList(files));
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. All YANG features are supported.
     *
     * @param config parser configuration
     * @param files collection of YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final YangParserConfiguration config,
            final Collection files) {
        return parseYangFiles(null, config, files);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources.
     *
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @param config parser configuration
     * @param files YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangFiles(final Set supportedFeatures,
            final YangParserConfiguration config, final File... files) {
        return parseYangFiles(supportedFeatures, config, Arrays.asList(files));
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources.
     *
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @param config parser configuration
     * @param files YANG files to be parsed
     * @return effective schema context
     */
    //  FIXME: use Java.nio.file.Path
    public static EffectiveModelContext parseYangFiles(final Set supportedFeatures,
            final YangParserConfiguration config, final Collection files) {
        return parseSources(config, supportedFeatures,
            files.stream().map(file -> YangTextSchemaSource.forPath(file.toPath())).collect(Collectors.toList()));
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode and all YANG features are supported.
     *
     * @param resourcePath relative path to the directory with YANG files to be parsed
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResourceDirectory(final String resourcePath) {
        return parseYangResourceDirectory(resourcePath, YangParserConfiguration.DEFAULT);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. All YANG features are supported.
     *
     * @param resourcePath relative path to the directory with YANG files to be parsed
     * @param config parser configuration
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResourceDirectory(final String resourcePath,
            final YangParserConfiguration config) {
        return parseYangResourceDirectory(resourcePath, null, config);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode.
     *
     * @param resourcePath relative path to the directory with YANG files to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResourceDirectory(final String resourcePath,
            final Set supportedFeatures) {
        return parseYangResourceDirectory(resourcePath, supportedFeatures, YangParserConfiguration.DEFAULT);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources.
     *
     * @param resourcePath relative path to the directory with YANG files to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @param config parser configuration
     * @return effective schema context
     */
    @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", justification = "Wrong inferent on listFiles")
    public static EffectiveModelContext parseYangResourceDirectory(final String resourcePath,
            final Set supportedFeatures, final YangParserConfiguration config) {
        final URI directoryPath;
        try {
            directoryPath = YangParserTestUtils.class.getResource(resourcePath).toURI();
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException("Failed to open resource " + resourcePath, e);
        }
        return parseYangFiles(supportedFeatures, config, new File(directoryPath).listFiles(YANG_FILE_FILTER));
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode and all YANG features are supported.
     *
     * @param clazz Resource lookup base
     * @param resources Resource names to be looked up
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResources(final Class clazz, final String... resources) {
        return parseYangResources(clazz, Arrays.asList(resources));
    }

    public static EffectiveModelContext parseYangResources(final Class clazz, final Collection resources) {
        final List sources = new ArrayList<>(resources.size());
        for (final String r : resources) {
            sources.add(YangTextSchemaSource.forResource(clazz, r));
        }
        return parseSources(YangParserConfiguration.DEFAULT, null, sources);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. Statement parser mode is set to
     * default mode.
     *
     * @param yangDirs relative paths to the directories containing YANG files to be parsed
     * @param yangFiles relative paths to the YANG files to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResources(final List yangDirs, final List yangFiles,
            final Set supportedFeatures) {
        return parseYangResources(yangDirs, yangFiles, supportedFeatures, YangParserConfiguration.DEFAULT);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources. All YANG features are supported.
     *
     * @param yangResourceDirs relative paths to the directories containing YANG files to be parsed
     * @param yangResources relative paths to the YANG files to be parsed
     * @param config parser configuration
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResources(final List yangResourceDirs,
            final List yangResources, final YangParserConfiguration config) {
        return parseYangResources(yangResourceDirs, yangResources, null, config);
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources.
     *
     * @param yangResourceDirs relative paths to the directories containing YANG files to be parsed
     * @param yangResources relative paths to the YANG files to be parsed
     * @param supportedFeatures set of supported features based on which all if-feature statements in the parsed YANG
     *                          models are resolved
     * @param config parser configuration
     * @return effective schema context
     */
    public static EffectiveModelContext parseYangResources(final List yangResourceDirs,
            final List yangResources, final Set supportedFeatures,
            final YangParserConfiguration config) {
        final List allYangFiles = new ArrayList<>();
        for (final String yangDir : yangResourceDirs) {
            allYangFiles.addAll(getYangFiles(yangDir));
        }

        for (final String yangFile : yangResources) {
            try {
                allYangFiles.add(new File(YangParserTestUtils.class.getResource(yangFile).toURI()));
            } catch (URISyntaxException e) {
                throw new IllegalArgumentException("Invalid resource " + yangFile, e);
            }
        }

        return parseYangFiles(supportedFeatures, config, allYangFiles);
    }

    public static EffectiveModelContext parseYangSources(final YangParserConfiguration config,
            final Set supportedFeatures, final YangTextSchemaSource... sources) {
        return parseSources(config, supportedFeatures, Arrays.asList(sources));
    }

    public static EffectiveModelContext parseSources(final YangParserConfiguration config,
            final Set supportedFeatures, final Collection sources) {
        final YangParser parser = PARSER_FACTORY.createParser(config);
        if (supportedFeatures != null) {
            parser.setSupportedFeatures(FeatureSet.of(supportedFeatures));
        }

        try {
            parser.addSources(sources);
        } catch (YangSyntaxErrorException e) {
            throw new IllegalArgumentException("Malformed source", e);
        } catch (IOException e) {
            throw new IllegalArgumentException("Failed to read a source", e);
        }

        try {
            return parser.buildEffectiveModel();
        } catch (YangParserException e) {
            throw new IllegalStateException("Failed to assemble SchemaContext", e);
        }
    }

    /**
     * Creates a new effective schema context containing the specified YANG sources.
     *
     * @param sources list of yang sources in plain string
     * @return effective schema context
     */
    public static EffectiveModelContext parseYang(final String... sources) {
        return parseSources(YangParserConfiguration.DEFAULT, null,
            Arrays.stream(sources).map(LiteralYangTextSchemaSource::ofLiteral).toList());
    }

    @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", justification = "Wrong inferent on listFiles")
    private static Collection getYangFiles(final String resourcePath) {
        final URI directoryPath;
        try {
            directoryPath = YangParserTestUtils.class.getResource(resourcePath).toURI();
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException("Failed to open resource directory " + resourcePath, e);
        }
        return Arrays.asList(new File(directoryPath).listFiles(YANG_FILE_FILTER));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy