/*
* ============LICENSE_START=======================================================
* Copyright (C) 2020 Pantheon.tech
+ * Modifications Copyright (C) 2022 Nordix Foundation.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import lombok.NoArgsConstructor;
import org.onap.cps.spi.exceptions.CpsException;
import org.onap.cps.spi.exceptions.ModelValidationException;
import org.onap.cps.spi.model.ModuleReference;
import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.common.YangNames;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
@NoArgsConstructor
public final class YangTextSchemaSourceSetBuilder {
+ private static final Pattern RFC6020_RECOMMENDED_FILENAME_PATTERN =
+ Pattern.compile("([\\w-]+)@(\\d{4}-\\d{2}-\\d{2})(?:\\.yang)?", Pattern.CASE_INSENSITIVE);
+
private final ImmutableMap.Builder<String, String> yangModelMap = new ImmutableMap.Builder<>();
public YangTextSchemaSourceSetBuilder putAll(final Map<String, String> yangResourceNameToContent) {
}
public YangTextSchemaSourceSet build() {
- final SchemaContext schemaContext = generateSchemaContext(yangModelMap.build());
+ final var schemaContext = generateSchemaContext(yangModelMap.build());
return new YangTextSchemaSourceSetImpl(schemaContext);
}
private static ModuleReference toModuleReference(final Module module) {
return ModuleReference.builder()
- .name(module.getName())
- .namespace(module.getNamespace().toString())
+ .moduleName(module.getName())
+ .namespace(module.getQNameModule().getNamespace().toString())
.revision(module.getRevision().map(Revision::toString).orElse(null))
.build();
}
String.format("Exception occurred on reading resource %s.", resourceName), e);
} catch (final YangSyntaxErrorException e) {
throw new ModelValidationException("Yang resource is invalid.",
- String.format("Yang syntax validation failed for resource %s.", resourceName), e);
+ String.format(
+ "Yang syntax validation failed for resource %s:%n%s", resourceName, e.getMessage()), e);
}
}
try {
.collect(Collectors.toList());
}
- private static YangTextSchemaSource toYangTextSchemaSource(final String sourceName,
- final String source) {
- final Map.Entry<String, String> sourceNameParsed = checkNotNull(YangNames.parseFilename(sourceName));
- final RevisionSourceIdentifier revisionSourceIdentifier = RevisionSourceIdentifier
- .create(sourceNameParsed.getKey(), Revision.ofNullable(sourceNameParsed.getValue()));
+ private static YangTextSchemaSource toYangTextSchemaSource(final String sourceName, final String source) {
+ final var revisionSourceIdentifier =
+ createIdentifierFromSourceName(checkNotNull(sourceName));
return new YangTextSchemaSource(revisionSourceIdentifier) {
@Override
}
};
}
+
+ private static RevisionSourceIdentifier createIdentifierFromSourceName(final String sourceName) {
+ final var matcher = RFC6020_RECOMMENDED_FILENAME_PATTERN.matcher(sourceName);
+ if (matcher.matches()) {
+ return RevisionSourceIdentifier.create(matcher.group(1), Revision.of(matcher.group(2)));
+ }
+ return RevisionSourceIdentifier.create(sourceName);
+ }
}