import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.regex.Matcher;
+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) {
.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 RevisionSourceIdentifier revisionSourceIdentifier =
+ createIdentifierFromSourceName(checkNotNull(sourceName));
return new YangTextSchemaSource(revisionSourceIdentifier) {
@Override
}
};
}
+
+ private static RevisionSourceIdentifier createIdentifierFromSourceName(final String sourceName) {
+ final Matcher 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);
+ }
}
import org.onap.cps.spi.exceptions.ModelValidationException
import org.onap.cps.yang.YangTextSchemaSourceSetBuilder
import org.opendaylight.yangtools.yang.common.Revision
-import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException
import spock.lang.Specification
import spock.lang.Unroll
class YangTextSchemaSourceSetSpec extends Specification {
- def 'Generating a valid YangTextSchemaSource Set '() {
+ @Unroll
+ def 'Building a valid YangTextSchemaSourceSet using #filenameCase filename.'() {
given: 'a yang model (file)'
- def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
+ def yangResourceNameToContent = [filename: TestUtils.getResourceFileContent('bookstore.yang')]
when: 'the content is parsed'
def result = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext();
then: 'the result contains 1 module of the correct name and revision'
result.modules.size() == 1
def optionalModule = result.findModule('stores', Revision.of('2020-09-15'))
optionalModule.isPresent()
+ where:
+ filenameCase | filename
+ 'generic' | 'bookstore'
+ 'RFC-6020 recommended' | 'bookstore-test@2020-09-15.YANG'
}
@Unroll
- def 'Generating invalid YangTextSchemaSource Set (#description).'() {
+ def 'Building YangTextSchemaSourceSet error case: #description.'() {
given: 'a file with #description'
def yangResourceNameToContent = TestUtils.getYangResourcesAsMap(filename)
when: 'the content is parsed'