Coverage Summary for Class: MassImportForm (org.kitodo.production.forms.massimport)

Class Class, % Method, % Line, %
MassImportForm 0% (0/1) 0% (0/37) 0% (0/109)


 /*
  * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
  *
  * This file is part of the Kitodo project.
  *
  * It is licensed under GNU General Public License version 3 or later.
  *
  * For the full copyright and license information, please read the
  * GPL3-License.txt file that was distributed with this source code.
  */
 
 package org.kitodo.production.forms.massimport;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
 import javax.faces.view.ViewScoped;
 import javax.inject.Named;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.kitodo.api.dataeditor.rulesetmanagement.RulesetManagementInterface;
 import org.kitodo.data.database.beans.ImportConfiguration;
 import org.kitodo.data.database.beans.Template;
 import org.kitodo.data.database.exceptions.DAOException;
 import org.kitodo.exceptions.ImportException;
 import org.kitodo.production.forms.BaseForm;
 import org.kitodo.production.forms.CsvRecord;
 import org.kitodo.production.helper.Helper;
 import org.kitodo.production.services.ServiceManager;
 import org.kitodo.production.services.data.ImportService;
 import org.kitodo.production.services.data.MassImportService;
 import org.primefaces.PrimeFaces;
 import org.primefaces.event.FileUploadEvent;
 import org.primefaces.model.file.UploadedFile;
 
 @Named("MassImportForm")
 @ViewScoped
 public class MassImportForm extends BaseForm {
 
     private static final Logger logger = LogManager.getLogger(MassImportForm.class);
 
     private int projectId;
     private int templateId;
     private String templateTitle;
     private ImportConfiguration importConfiguration;
     private UploadedFile file;
     private String csvSeparator = ";";
     private String previousCsvSeparator = null;
     private List<String> metadataKeys = new LinkedList<>(Collections.singletonList("ID"));
     private List<CsvRecord> records = new LinkedList<>();
     private final List<Character> csvSeparatorCharacters = Arrays.asList(',', ';');
     private final MassImportService massImportService = ServiceManager.getMassImportService();
     private final AddMetadataDialog addMetadataDialog = new AddMetadataDialog(this);
     private HashMap<String, String> importSuccessMap = new HashMap<>();
     private Integer progress = 0;
     private Boolean rulesetConfigurationForOpacImportComplete = null;
 
     /**
      * Prepare mass import.
      *
      * @param templateId ID of template used to create processes during mass import
      * @param projectId ID of project for which processes are created
      */
     public void prepareMassImport(int templateId, int projectId) {
         this.projectId = projectId;
         this.templateId = templateId;
         try {
             Template template = ServiceManager.getTemplateService().getById(templateId);
             templateTitle = template.getTitle();
             RulesetManagementInterface ruleset = ServiceManager.getRulesetService().openRuleset(template.getRuleset());
             addMetadataDialog.setRulesetManagement(ruleset);
             checkRecordIdentifierConfigured(ruleset);
         } catch (DAOException | IOException e) {
             Helper.setErrorMessage(e);
         }
     }
 
     private void checkRecordIdentifierConfigured(RulesetManagementInterface ruleset) {
         if (Objects.isNull(rulesetConfigurationForOpacImportComplete)) {
             rulesetConfigurationForOpacImportComplete = ServiceManager.getImportService()
                     .isRecordIdentifierMetadataConfigured(ruleset);
         }
         if (!rulesetConfigurationForOpacImportComplete) {
             PrimeFaces.current().executeScript("PF('recordIdentifierMissingDialog').show();");
         }
     }
 
     /**
      * Handle file upload.
      *
      * @param event FileUploadEvent to handle
      */
     public void handleFileUpload(FileUploadEvent event) {
         file = event.getFile();
         try {
             List<String> csvLines = massImportService.getLines(file);
             resetValues();
             if (!csvLines.isEmpty()) {
                 metadataKeys = new LinkedList<>(Arrays.asList(csvLines.get(0).split(csvSeparator, -1)));
                 if (csvLines.size() > 1) {
                     records = massImportService.parseLines(csvLines.subList(1, csvLines.size()), csvSeparator);
                 }
             }
         } catch (IOException e) {
             Helper.setErrorMessage(e);
         }
     }
 
     private void resetValues() {
         metadataKeys = new LinkedList<>();
         records = new LinkedList<>();
         importSuccessMap = new HashMap<>();
     }
 
     /**
      * Event listender function called when user switches CSV separator character used to split text lines into cells.
      */
     public void changeSeparator() {
         metadataKeys = List.of(String.join(previousCsvSeparator, metadataKeys).split(csvSeparator));
         records = massImportService.updateSeparator(records, previousCsvSeparator, csvSeparator);
     }
 
     /**
      * Add new CSV lines.
      */
     public void addRecord() {
         records.add(new CsvRecord(metadataKeys.size()));
     }
 
     /**
      * Remove CSV record.
      *
      * @param csvRecord CSV record to remove
      */
     public void removeLine(CsvRecord csvRecord) {
         records.remove(csvRecord);
     }
 
     /**
      * Import all records from list.
      */
     public void startMassImport() {
         importSuccessMap = new HashMap<>();
         PrimeFaces.current().ajax().update("massImportResultDialog");
         try {
             Map<String, Map<String, String>> presetMetadata = massImportService.prepareMetadata(metadataKeys, records);
             importRecords(presetMetadata);
             PrimeFaces.current().executeScript("PF('massImportResultDialog').show();");
             PrimeFaces.current().ajax().update("massImportResultDialog");
         } catch (ImportException e) {
             Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
         }
     }
 
     /**
      * Prepare massimport by resetting progress and import success map.
      */
     public void prepare() {
         progress = 0;
         importSuccessMap = new HashMap<>();
         PrimeFaces.current().ajax().update("massImportProgressForm:massImportProgress");
     }
 
     /**
      * Import records by ID and add preset metadata.
      *
      * @param processMetadata Map containing record IDs as keys and preset metadata lists as values
      */
     private void importRecords(Map<String, Map<String, String>> processMetadata) {
         ImportService importService = ServiceManager.getImportService();
         PrimeFaces.current().ajax().update("massImportProgressDialog");
         for (Map.Entry<String, Map<String, String>> entry : processMetadata.entrySet()) {
             try {
                 importService.importProcess(entry.getKey(), projectId, templateId, importConfiguration,
                         entry.getValue());
                 importSuccessMap.put(entry.getKey(), null);
             } catch (ImportException e) {
                 importSuccessMap.put(entry.getKey(), e.getLocalizedMessage());
             }
             PrimeFaces.current().ajax().update("massImportProgressDialog");
         }
     }
 
     /**
      * Get column header for column with index "columnIndex".
      *
      * @param columnIndex index of column for which column header is returned
      * @return column header
      */
     public String getColumnHeader(Integer columnIndex) {
         if (columnIndex < metadataKeys.size()) {
             return metadataKeys.get(columnIndex);
         }
         return "";
     }
 
     /**
      * Get projectId.
      *
      * @return value of projectId
      */
     public int getProjectId() {
         return projectId;
     }
 
     /**
      * Set projectId.
      *
      * @param projectId
      *            as int
      */
     public void setProjectId(int projectId) {
         this.projectId = projectId;
     }
 
     /**
      * Get templateId.
      *
      * @return value of templateId
      */
     public int getTemplateId() {
         return templateId;
     }
 
     /**
      * Set templateId.
      *
      * @param templateId
      *            as int
      */
     public void setTemplateId(int templateId) {
         this.templateId = templateId;
     }
 
     /**
      * Get importConfiguration.
      *
      * @return value of importConfiguration
      */
     public ImportConfiguration getImportConfigurationId() {
         return importConfiguration;
     }
 
     /**
      * Set importConfiguration.
      *
      * @param importConfiguration
      *            as ImportConfiguration
      */
     public void setImportConfigurationId(ImportConfiguration importConfiguration) {
         this.importConfiguration = importConfiguration;
     }
 
     /**
      * Get file.
      *
      * @return value of file
      */
     public UploadedFile getFile() {
         return file;
     }
 
     /**
      * Set file.
      *
      * @param file
      *            as org.primefaces.model.UploadedFile
      */
     public void setFile(UploadedFile file) {
         this.file = file;
     }
 
     /**
      * Get csvSeparator.
      *
      * @return value of csvSeparator
      */
     public String getCsvSeparator() {
         return csvSeparator;
     }
 
     /**
      * Set csvSeparator.
      *
      * @param csvSeparator as java.lang.String
      */
     public void setCsvSeparator(String csvSeparator) {
         this.previousCsvSeparator = this.csvSeparator;
         this.csvSeparator = csvSeparator;
     }
 
     /**
      * Get metadataKeys.
      *
      * @return value of metadataKeys
      */
     public List<String> getMetadataKeys() {
         return metadataKeys;
     }
 
     /**
      * Set metadataKeys.
      *
      * @param metadataKeys as List of String
      */
     public void setMetadataKeys(List<String> metadataKeys) {
         this.metadataKeys = metadataKeys;
     }
 
     /**
      * Get records.
      *
      * @return value of records
      */
     public List<CsvRecord> getRecords() {
         return records;
     }
 
     /**
      * Set records.
      *
      * @param records as List of CsvRecord
      */
     public void setRecords(List<CsvRecord> records) {
         this.records = records;
     }
 
     /**
      * Get csvSeparatorCharacters.
      *
      * @return value of csvSeparatorCharacters
      */
     public List<Character> getCsvSeparatorCharacters() {
         return csvSeparatorCharacters;
     }
 
     /**
      * Get templateTitle.
      *
      * @return value of templateTitle
      */
     public String getTemplateTitle() {
         return templateTitle;
     }
 
     /**
      * Gets addMetadataDialog.
      *
      * @return value of addMetadataDialog
      */
     public AddMetadataDialog getAddMetadataDialog() {
         return addMetadataDialog;
     }
 
     /**
      * Get list IDs of successfully imported processes.
      *
      * @return list of IDs of successfully import processes
      */
     public List<String> getSuccessfulImports() {
         if (Objects.nonNull(importSuccessMap)) {
             return importSuccessMap.entrySet().stream().filter(entry -> Objects.isNull(entry.getValue()))
                     .map(Map.Entry::getKey).collect(Collectors.toList());
         }
         return Collections.emptyList();
     }
 
     /**
      * Get list of IDs failed imports.
      *
      * @return list of IDs of failed imports
      */
     public List<String> getFailedImports() {
         if (Objects.nonNull(importSuccessMap)) {
             return importSuccessMap.entrySet().stream().filter(entry -> Objects.nonNull(entry.getValue()))
                     .map(Map.Entry::getKey).collect(Collectors.toList());
         }
         return Collections.emptyList();
     }
 
     /**
      * Get error message of import with ID 'recordId'. Return 'null' if record was imported without error.
      *
      * @param recordId ID of record for which error message is returned
      * @return error message of import for ID 'recordId'; returns 'null' if no error occurred
      */
     public String getImportErrorMessage(String recordId) {
         return importSuccessMap.get(recordId);
     }
 
 
     /**
      * Remove metadata key and CsvCells with given index from list of metadata keys and all current CsvRecords.
      *
      * @param index index of metadata key and CsvCells to remove
      */
     public void removeMetadata(int index) {
         if (index < metadataKeys.size()) {
             metadataKeys.remove(index);
             for (CsvRecord csvRecord : records) {
                 csvRecord.getCsvCells().remove(index);
             }
         }
     }
 
     /**
      * Get mass import progress.
      *
      * @return mass import progress
      */
     public int getProgress() {
         if (records.isEmpty()) {
             progress = 0;
         } else {
             progress = (importSuccessMap.size() * 100) / records.size();
         }
         PrimeFaces.current().ajax().update("massImportProgressForm:massImportProgress");
         return progress;
     }
 
     /**
      * Get number of already imported records.
      *
      * @return number of imported records
      */
     public int getNumberOfProcessesRecords() {
         return importSuccessMap.size();
     }
 
     /**
      * Get rulesetConfigurationForOpacImportComplete.
      *
      * @return value of rulesetConfigurationForOpacImportComplete
      */
     public Boolean getRulesetConfigurationForOpacImportComplete() {
         return rulesetConfigurationForOpacImportComplete;
     }
 }