Как мне разобрать зависимые файлы ян? - PullRequest
0 голосов
/ 21 января 2020

Мой вопрос касается разбора ян-файлов. Во-первых, я подтверждаю следующие два вопроса относительно Янга:

Я следовал советам из этих статей SOF, и я могу проанализировать основной файл c yang.

Однако вопрос, который у меня есть, касается парсинг файла ян, который импортирует другие файлы ян. Например, я хочу получить следующие файлы yang из opendaylight :

module opendaylight-action-types {
    namespace "urn:opendaylight:action:types";
    prefix action;

    import ietf-inet-types {prefix inet; revision-date "2013-07-15";}
    import ietf-yang-types {prefix yang; revision-date "2013-07-15";}
    import opendaylight-l2-types {prefix l2t; revision-date "2013-08-27";}
    import opendaylight-match-types {prefix match; revision-date "2013-10-26";}

Посмотрите на все операторы import. Когда я пытаюсь скопировать эти ян-файлы в мою тестовую директорию и принять их, я получаю заякоренную ошибку, связанную с импортом. Ошибки выглядят так (убрали некоторые излишки в трассировке стека):

org.opendaylight.yangtools.yang.model.parser.api.YangParserException: Failed to assemble sources

Caused by: org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException: Some of SOURCE_PRE_LINKAGE modifiers for statements were not resolved.
    ... 
    Suppressed: org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Yang model processing phase SOURCE_PRE_LINKAGE failed [at target\classes\yang\opendaylight-group-types.yang:1:0]
        ... 
        Suppressed: org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Imported module [openflow-protocol] was not found. [at target\classes\yang\opendaylight-group-types.yang:7:4]
            ... 
        Suppressed: org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Imported module [ietf-yang-types] was not found. [at target\classes\yang\opendaylight-group-types.yang:5:4]
            ... 
        Suppressed: org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Imported module [openflow-types] was not found. [at target\classes\yang\opendaylight-group-types.yang:8:4]
            ... 
    Caused by: org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Imported module [opendaylight-action-types] was not found. [at target\classes\yang\opendaylight-group-types.yang:6:4]

Я думаю, что значительная ошибка по существу Импортированный модуль [ietf-yang-types] не найден и тому подобные

Так что мой парсер находит файлы ян, в которые я скопировал, но не может найти никаких зависимостей, таких как ietf-inet-types.yang, et c. Вот мой код, очень базовый c - и снова он работает с основными c ян файлами:

    List<File> yangs = Files.walk(Path.of(Loader.getResource("../classes/yang").toURI())).filter(Files::isRegularFile).map(Path::toFile).collect(Collectors.toList());
    final Iterator<YangParserFactory> it = ServiceLoader.load(YangParserFactory.class).iterator();
    if (!it.hasNext()) {
        throw new IllegalStateException("No YangParserFactory found");
    }
    YangParserFactory PARSER_FACTORY = it.next();
    StatementParserMode parserMode = StatementParserMode.DEFAULT_MODE;
    YangParser parser = PARSER_FACTORY.createParser(parserMode);
    List<YangTextSchemaSource> sources = yangs.stream().map(YangTextSchemaSource::forFile).collect(Collectors.toList());
    parser.addSources(sources);
    SCHEMA_CONTEXT = parser.buildEffectiveModel(); // Exception thrown here.

Я пробовал следующее

  • Неуклюже находя все xyz-abc@yyyy-mm-dd.yang и положить их в мою собственную папку ян. Это, похоже, исправляло некоторые ошибки, но появлялись другие, включая конфликтующие ресурсы.
  • Попытался интегрировать плагин maven-yang-plugin и binding-parent в мой раздел сборки maven. Я не мог заставить либо работать. Похоже, документация устарела
  • Я попытался добавить столько же зависимостей, связанных с моделями, в мой maven pom.
  • Я попытался создать свой собственный файл ян, в который были импортированы все эти 11 файлов янтаря opendaylight, возможно, их нужно импортировать из одного файла. Не сработало.

Я нахожусь в точке, где документация либо недостаточно обновлена, либо я делаю какую-то глупую ошибку в том, что я пробовал. Я понимаю, что сам Opendaylight работает в Apache Karaf - кажется, что Karaf помогает Opendaylight управлять всеми этими моделями и зависимостями. Тем не менее, мой парсер ян не предназначен для жизни в Карафе, поэтому, если Карафу не нужно делать эту работу, я бы предпочел просто Java и Мейвен.

Есть ли кто-нибудь ( обновленный) пример кода о том, как реализовать синтаксический анализатор ян полных файлов ян, которые включают импорт?

...