+ final String originalFileName = multipartFile.getOriginalFilename();
+ if (resourceNameEndsWithExtension(originalFileName, YANG_FILE_EXTENSION)) {
+ return ImmutableMap.of(originalFileName, extractYangResourceContent(multipartFile));
+ }
+ if (resourceNameEndsWithExtension(originalFileName, ZIP_FILE_EXTENSION)) {
+ return extractYangResourcesMapFromZipArchive(multipartFile);
+ }
+ throw new ModelValidationException("Unsupported file type.",
+ String.format("Filename %s matches none of expected extensions: %s", originalFileName,
+ Arrays.asList(YANG_FILE_EXTENSION, ZIP_FILE_EXTENSION)));
+ }
+
+ private static Map<String, String> extractYangResourcesMapFromZipArchive(final MultipartFile multipartFile) {
+ final ImmutableMap.Builder<String, String> yangResourceMapBuilder = ImmutableMap.builder();
+
+ try (
+ final InputStream inputStream = multipartFile.getInputStream();
+ final ZipInputStream zipInputStream = new ZipInputStream(inputStream);
+ ) {
+ ZipEntry zipEntry;
+ while ((zipEntry = zipInputStream.getNextEntry()) != null) {
+ extractZipEntryToMapIfApplicable(yangResourceMapBuilder, zipEntry, zipInputStream);
+ }
+ zipInputStream.closeEntry();
+
+ } catch (final IOException e) {
+ throw new CpsException("Cannot extract resources from zip archive.", e.getMessage(), e);
+ }
+
+ try {
+ final Map<String, String> yangResourceMap = yangResourceMapBuilder.build();
+ if (yangResourceMap.isEmpty()) {
+ throw new ModelValidationException("Archive contains no YANG resources.",
+ String.format("Archive contains no files having %s extension.", YANG_FILE_EXTENSION));
+ }
+ return yangResourceMap;
+
+ } catch (final IllegalArgumentException e) {
+ throw new ModelValidationException("Invalid ZIP archive content.",
+ "Multiple resources with same name detected.", e);
+ }