diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java index b13a576..f9c99db 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java @@ -20,6 +20,7 @@ import ru.mlokoin.gates.model.building.Building; import ru.mlokoin.gates.model.course.Course; import ru.mlokoin.gates.model.education.EducationEntryWraper; import ru.mlokoin.gates.model.education.EducatonEntry; +import ru.mlokoin.gates.model.fs.Post; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocumentReestr; import ru.mlokoin.gates.model.monitor.AbsentReview; @@ -30,6 +31,8 @@ import ru.mlokoin.gates.model.program.Program; import ru.mlokoin.gates.model.student.Student; import ru.mlokoin.gates.model.teacher.Teacher; import ru.mlokoin.gates.repository.Storage; +import org.springframework.web.bind.annotation.RequestParam; + @Controller @RequestMapping(path = "/document/educations") @@ -40,6 +43,43 @@ public class EducationsController { @Autowired private Storage storage; + /** + * Предоставление пользователю формы "educations-xlsx-info" + * - сведения о файле (file-info) + * - список ошибок в случае несоответствия форме "Реестра обученных" + * - статистика по содержимому реестра обучнных + * - инструменты для просмотра содержимого реестра + * - инструменты для публикации содержимого реестра в базе данных + * + * @param model + * @param id + * @return + */ + @GetMapping("/info/{PostID}") + public String info(Model model, @PathVariable String PostID) { + // создание списка ошибок + List errors = new ArrayList<>(); + + System.out.println("PostID: " + PostID); + + Long DocumentID = storage.getPostById(PostID).getDocument().getId(); + // List posts = storage.getPostList(); + // for (Post post : posts) { + // if (post.getId() == Integer.parseInt(PostID)) { + // DocumentID = post.getDocument().getId(); + // } + // } + + + System.out.println("DocumentID: " + DocumentID); + model.addAttribute("post", storage.getPostById(PostID)); + model.addAttribute("baseReview", new BaseReview(storage)); + // model.addAttribute("xlsxReview", new XlsxReview(reestr)); + // model.addAttribute("absentReview", new AbsentReview(reestr, storage)); + return "educations-xlsx-info"; + } + + /** * Предоставление пользователю формы "view-as-educations" * - просмотр xlsx-файла @@ -53,6 +93,7 @@ public class EducationsController { @GetMapping("/view/{id}") public String viewAsEducations(Model model, @PathVariable String id) { + // создание списка ошибок List errors = new ArrayList<>(); diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/InfoXlsxController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/InfoXlsxController.java new file mode 100644 index 0000000..245947b --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/InfoXlsxController.java @@ -0,0 +1,20 @@ +package ru.mlokoin.gates.controller.v1; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.reactive.function.client.WebClient; + +import ru.mlokoin.gates.repository.Storage; + +@Controller +@RequestMapping(path = "/document/educations/info") +public class InfoXlsxController { + @Autowired + private WebClient client; + + @Autowired + private Storage storage; + + +} diff --git a/gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java b/gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java index 4039f53..4e654ec 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java @@ -19,5 +19,4 @@ public class Post implements Serializable { this.type = type; this.document = document; } - } diff --git a/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java b/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java index 55a3099..a22747a 100644 --- a/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java +++ b/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java @@ -38,7 +38,7 @@ import ru.mlokoin.gates.teh.strings.Stringer; public class Storage { private String storageLink = "http://storage-rs:8282/api/document/content/"; private String storageListLink = "http://resource-service-api:8181/storage-entry/list"; - private String postLink = "http://resource-service-api:8181/post/list"; + private String postListLink = "http://resource-service-api:8181/post/list"; private String programsLink = "http://resource-service-api:8181/program/list"; private String buildingsLink = "http://resource-service-api:8181/building/list"; private String coursesLink = "http://resource-service-api:8181/course/list"; @@ -65,6 +65,22 @@ public class Storage { .block(); } + public Document getDocumentById(String id) { + // TODO: добавить линк в storage-rs, для получения документа по id + List documents = client.method(HttpMethod.GET) + .uri(storageListLink) + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + Document result = new Document(); + for (Document document : documents) { + if (document.getId() == Integer.parseInt(id)) { + result = document; + } + } + return result; + } + /** * Получение списка постов, размещенных в ресурсном сервисе * @param id @@ -73,10 +89,36 @@ public class Storage { public List getPostList() { System.out.println("Получение списка постов, размещенных в ресурсном сервисе ..."); return client.method(HttpMethod.GET) - .uri(postLink) + .uri(postListLink) + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + } + + /** + * Получение поста по id + * @param postID + * @return + */ + public Post getPostById(String postID) { + // TODO: добавить линк в storage-rs, для получения поста по id + List posts = client.method(HttpMethod.GET) + .uri(postListLink) .retrieve() .bodyToMono(new ParameterizedTypeReference >(){}) .block(); + Post result = new Post(); + for (Post post : posts) { + if (post.getId() == Integer.parseInt(postID)) { + result = post; + } + } + return result; + } + + public int getPostCount(){ + // TODO: добавить линк в storage-rs, для получения количества постов + return getPostList().size(); } /** @@ -518,4 +560,6 @@ public class Storage { + + } diff --git a/gates/src/main/resources/templates/documents.html b/gates/src/main/resources/templates/documents.html index 30fcc17..188509b 100644 --- a/gates/src/main/resources/templates/documents.html +++ b/gates/src/main/resources/templates/documents.html @@ -21,16 +21,15 @@ xmlns:th="http://www.thymeleaf.org">
- - +

Добавление пакетов:

@@ -38,6 +37,7 @@ xmlns:th="http://www.thymeleaf.org">
+

Перечень файлов:

@@ -83,6 +83,11 @@ xmlns:th="http://www.thymeleaf.org"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
В базе данных:
+ Критерии: +
+ Программы: +
+ Преподаватели: +
+ Объекты строительства: +
+ Организации: +
+ Курсы: +
+ Студенты: +
+ Обучения: +
+
+
+
+

Ошибки:

+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/gates/src/main/resources/templates/storage.html b/gates/src/main/resources/templates/storage.html index b7bff22..a8ab756 100644 --- a/gates/src/main/resources/templates/storage.html +++ b/gates/src/main/resources/templates/storage.html @@ -26,9 +26,8 @@ xmlns:th="http://www.thymeleaf.org"> -

Добавление пакетов:

\ - -

Перечень файлов:

+

Добавление пакетов:

+
@@ -36,6 +35,8 @@ xmlns:th="http://www.thymeleaf.org">
+
+

Перечень файлов:

diff --git a/storage-rs/pom.xml b/storage-rs/pom.xml index 0cc9254..9c4360e 100644 --- a/storage-rs/pom.xml +++ b/storage-rs/pom.xml @@ -17,11 +17,11 @@ 17 - + org.apache.poi poi diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java b/storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java index c92f7aa..6b4bb14 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java @@ -1,9 +1,13 @@ package ru.molokoin.storagers.controller; +import java.io.IOException; + import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import ru.molokoin.storagers.model.DocumentModel; +import ru.molokoin.storagers.model.Document; +import ru.molokoin.storagers.model.XlsxCell; +import ru.molokoin.storagers.model.XlsxMultipartDocument; import ru.molokoin.storagers.service.StorageServiceFace; /** @@ -35,8 +39,14 @@ public class HelloController { System.out.println("Загружено документов: " + storage.list().size()); System.out.println("Перечень загруженных документов:"); int i = 1; - for (DocumentModel doc : storage.list()) { - System.out.println("Document#" + i + ": " + doc.getPath() + "(size#" + doc.getSize() + ")"); + for (Document doc : storage.list()) { + XlsxMultipartDocument parts = new XlsxMultipartDocument(doc); + System.out.println("Document#" + i + ": " + doc.getPath() + "(size#" + doc.getSize() + ")" + " ### lines: " + parts.getLineCount()); + for (XlsxCell c: parts.line(i-1)) { + System.out.println(c.getContent()); + } + parts.close(); + System.out.println("---------------------"); i++; } return "hello"; diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java b/storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java index 344e59c..a089f85 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; -import ru.molokoin.storagers.model.DocumentModel; +import ru.molokoin.storagers.model.Document; import ru.molokoin.storagers.model.XlsxDocument; import ru.molokoin.storagers.service.StorageServiceFace; @@ -109,7 +109,7 @@ public class StorageController { */ @GetMapping("/view/{name}") public String view(Model model, @PathVariable String name) { - DocumentModel doc = storage.find(name); + Document doc = storage.find(name); XlsxDocument xlsx = new XlsxDocument(doc); model.addAttribute("filename", xlsx.getDocument().getName()); model.addAttribute("xlsx", xlsx.getData()); @@ -139,7 +139,7 @@ public class StorageController { * @return */ @GetMapping("/api/list-uploads") - public ResponseEntity> getUploads(){ + public ResponseEntity> getUploads(){ return new ResponseEntity<>(storage.list(), HttpStatus.OK); } @@ -160,7 +160,7 @@ public class StorageController { */ @GetMapping("/api/document/content/{filename}") public ResponseEntity getDocumentContentByName(@PathVariable String filename){ - DocumentModel doc = storage.find(filename); + Document doc = storage.find(filename); XlsxDocument xlsx = new XlsxDocument(doc); return new ResponseEntity<>(xlsx, HttpStatus.OK); } diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/model/DocumentModel.java b/storage-rs/src/main/java/ru/molokoin/storagers/model/Document.java similarity index 88% rename from storage-rs/src/main/java/ru/molokoin/storagers/model/DocumentModel.java rename to storage-rs/src/main/java/ru/molokoin/storagers/model/Document.java index f9c338c..ebbbd90 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/model/DocumentModel.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/model/Document.java @@ -13,12 +13,12 @@ package ru.molokoin.storagers.model; /** * Данные о файле в файловой системе */ -public class DocumentModel { +public class Document { private Long id; private String name;//наименование файла в файловой системе ({id}.{extension}) private String path;//путь в файловой системе (root/{id}.{extension}) private String extension;//расширение файла - private Long size;//размер файла + private Long size;//размер файла в байтах /** * @return the name */ @@ -70,7 +70,7 @@ public class DocumentModel { /** * */ - public DocumentModel() { + public Document() { } /** * @param name @@ -78,7 +78,7 @@ public class DocumentModel { * @param extension * @param size */ - public DocumentModel(String name, String path, String extension, Long size) { + public Document(String name, String path, String extension, Long size) { this.name = name; this.path = path; this.extension = extension; @@ -102,7 +102,7 @@ public class DocumentModel { return false; if (getClass() != obj.getClass()) return false; - DocumentModel other = (DocumentModel) obj; + Document other = (Document) obj; if (name == null) { if (other.name != null) return false; @@ -145,7 +145,7 @@ public class DocumentModel { * @param extension * @param size */ - public DocumentModel(Long id, String name, String path, String extension, Long size) { + public Document(Long id, String name, String path, String extension, Long size) { this.id = id; this.name = name; this.path = path; diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java index 7201c8e..54e4558 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java @@ -1,12 +1,12 @@ package ru.molokoin.storagers.model; -// import lombok.AllArgsConstructor; -// import lombok.Data; -// import lombok.NoArgsConstructor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DateUtil; -// @Data -// @AllArgsConstructor -// @NoArgsConstructor +/** + * Класс для хранения содержимого ячейки + * TODO: убрать не нужные поля + */ public class XlsxCell { private String content; //содержимое ячейки private String textColor; //цвет шрифта @@ -183,4 +183,59 @@ public class XlsxCell { this.textWeight = textWeight; this.type = type; } + + /** + * перенос данных из ячейки файла в объект java + * TODO: прогнать контент ячейки через Stringer.Clear() + * @param cell + */ + public XlsxCell(Cell cell) { + //обработка null + if (cell == null) { + this.setContent(""); + this.type = "NULL"; + return; + } + + // обработка ячейки + switch (cell.getCellType()) { + case STRING: + this.setContent(cell.getStringCellValue()); + this.setType("STRING"); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + this.setContent(String.valueOf(cell.getDateCellValue().getTime() + "" )); + this.setType("DATE"); + } else { + this.setContent(String.valueOf(cell.getNumericCellValue() + "")); + this.setType("NUMERIC"); + } + break; + case FORMULA: + this.setContent(String.valueOf(cell.getCellFormula() + "")); + this.setType("FORMULA"); + break; + case BOOLEAN: + this.setContent(String.valueOf(cell.getBooleanCellValue())); + this.setType("BOOLEAN"); + break; + case BLANK: + this.setContent(""); + this.setType("BLANK"); + break; + case ERROR: + this.setContent(""); + this.setType("ERROR"); + break; + case _NONE: + this.setContent(""); + this.setType("_NONE"); + break; + default: + this.setContent(""); + this.setType("_NONE"); + break; + } + } } diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java index 7d4b372..a84d1e0 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java @@ -26,16 +26,16 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; // @NoArgsConstructor public class XlsxDocument implements Serializable{ private Map> data; - private DocumentModel document; + private Document document; private List headers;//верхняя строка формы - public XlsxDocument(DocumentModel document){ + public XlsxDocument(Document document){ this.document = document; this.data = init(document); this.headers = data.get(0); } - private Map> init(DocumentModel document) { + private Map> init(Document document) { // IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE); FileInputStream file; Workbook workbook; @@ -130,14 +130,14 @@ public class XlsxDocument implements Serializable{ /** * @return the document */ - public DocumentModel getDocument() { + public Document getDocument() { return document; } /** * @param document the document to set */ - public void setDocument(DocumentModel document) { + public void setDocument(Document document) { this.document = document; } @@ -202,7 +202,7 @@ public class XlsxDocument implements Serializable{ * @param document * @param headers */ - public XlsxDocument(Map> data, DocumentModel document, List headers) { + public XlsxDocument(Map> data, Document document, List headers) { this.data = data; this.document = document; this.headers = headers; diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java new file mode 100644 index 0000000..2d089f2 --- /dev/null +++ b/storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java @@ -0,0 +1,80 @@ +package ru.molokoin.storagers.model; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.sql.DataSourceDefinition; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Данные извлекаемые из файла порциями заданного размера + */ + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Data +public class XlsxMultipartDocument { + private Document document; + private FileInputStream fis; + private Workbook workbook; + private Sheet sheet; + + public XlsxMultipartDocument(Document document){ + this.document = document; + try { + this.fis = new FileInputStream(new File(document.getPath())); + this.workbook = new XSSFWorkbook(fis); + this.sheet = workbook.getSheetAt(0); + } catch (IOException e) { + System.out.println("Не читается файл: " + e.getMessage()); + } + } + + /** + * Получение физического количества строк в документе, + * что бы это не значило + * @return + */ + public int getLineCount() { + return sheet.getPhysicalNumberOfRows(); + } + + public List line(int n) { + Row row = sheet.getRow(n); + List cells = new ArrayList<>(); + if (row == null) return cells; //пустая строка + + //перебор ячейек в строке + for (Cell cell : row) { + cells.add(new XlsxCell(cell)); + } + return cells; + } + + public void close() { + try { + workbook.close(); + fis.close(); + } catch (IOException e) { + System.out.println("Не удалось закрыть потоки: " + e.getMessage()); + } + + } +} diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java b/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java index 809a87d..82bc49e 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java @@ -18,7 +18,8 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.annotation.PostConstruct; import ru.molokoin.storagers.config.StorageConfiguration; -import ru.molokoin.storagers.model.DocumentModel; +import ru.molokoin.storagers.model.Document; +import ru.molokoin.storagers.model.XlsxMultipartDocument; @Service @@ -50,45 +51,35 @@ public class StorageService implements StorageServiceFace{ } - + /** + * Получаем корневую директорию хранения файлов + */ @Override public Path root(){ return storageLocation; } @Override - public List list() { - List docs = new ArrayList<>(); - /** - * Получаем список файлов в директории root - */ + public List list() { + List docs = new ArrayList<>(); + + // Получаем список файлов в директории root String[] files = root().toFile().list(); - /** - * извлекаем сведения о каждом файле для формирвоания сущности document - */ + // извлекаем сведения о каждом файле для формирвоания сущности document for (String file : new ArrayList<>(Arrays.asList(files))) { - DocumentModel doc = new DocumentModel(); + Document doc = new Document(); doc.setPath(root() + "/" + file); - /** - * Извлекаем имя файла - */ + // Извлекаем имя файла doc.setName(new File(file).getName()); - /** - * Получаем размер файла - * Важно! когда у пользователя контейнера нет прав на файл - вызывается ошибка - * файлы, загруженные приложением ошибок вызывать не будут, - * только файлы перемещенные в том из операционной системы. - */ + // Получаем размер файла long size = new File(doc.getPath()).length(); doc.setSize(size); - /** - * Получаем расширение файла - */ + // Получаем расширение файла try { Optional ext = Optional.ofNullable(file) .filter(f -> f.contains(".")) @@ -108,22 +99,14 @@ public class StorageService implements StorageServiceFace{ /** * Найти документ по имени */ - public DocumentModel find(String name){ + public Document find(String name){ return list().stream().filter(doc -> name.equals(doc.getName())) .findAny() .orElse(null); } - @Override - public void clear() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'clear'"); - } - - @Override - public Resource load(long id) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'load'"); + public XlsxMultipartDocument findXlsxMultipartDocument(String name){ + return new XlsxMultipartDocument(find(name)); } /** @@ -146,6 +129,9 @@ public class StorageService implements StorageServiceFace{ return true; } + /** + * Загрузка файла в хранилище + */ @Override public Boolean store(MultipartFile file, String name_new) { try { @@ -159,9 +145,13 @@ public class StorageService implements StorageServiceFace{ } } - @Override - public boolean store(List resources) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'store'"); - } + /** + * Методы для работы с реестром обученных + * предоставляют детальные данные о содержимом реестра обученных, + * чтобы избежать излишней пересылки информации + * - + */ + + + } diff --git a/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java b/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java index 140fc42..328f4ed 100644 --- a/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java +++ b/storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java @@ -7,7 +7,7 @@ import java.util.List; import org.springframework.core.io.Resource; import org.springframework.web.multipart.MultipartFile; -import ru.molokoin.storagers.model.DocumentModel; +import ru.molokoin.storagers.model.Document; public interface StorageServiceFace { /** @@ -31,26 +31,14 @@ public interface StorageServiceFace { * получить список размещенных на хосте и не зарегистрированных в базе файлов * @return */ - public List list(); + public List list(); /** * Поиск документа из списка по имени * @param name * @return */ - public DocumentModel find(String name); - - /** - * Удаление всех файлов, очистка хранилища - */ - public void clear(); - - /** - * Получение ресурса из хранилища - * @param id - * @return - */ - public Resource load(long id); + public Document find(String name); /** * Удаление файла из хранилища @@ -65,11 +53,4 @@ public interface StorageServiceFace { * @return */ public Boolean store(MultipartFile file, String name_new); - - /** - * Сохранение группы ресурсов в хранилище - * @param resources - * @return - */ - public boolean store(List resources); }