Мой вопрос касается разбора ян-файлов. Во-первых, я подтверждаю следующие два вопроса относительно Янга:
Я следовал советам из этих статей 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 и Мейвен.
Есть ли кто-нибудь ( обновленный) пример кода о том, как реализовать синтаксический анализатор ян полных файлов ян, которые включают импорт?