Coverage Summary for Class: CatalogImportDialog (org.kitodo.production.forms.createprocess)

Class Class, % Method, % Line, %
CatalogImportDialog 100% (1/1) 13% (3/23) 7,8% (9/116)


 /*
  * (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.createprocess;
 
 import java.io.IOException;
 import java.io.Serializable;
 import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 
 import javax.faces.context.FacesContext;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.xpath.XPathExpressionException;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.kitodo.api.dataeditor.rulesetmanagement.FunctionalMetadata;
 import org.kitodo.api.externaldatamanagement.SingleHit;
 import org.kitodo.api.schemaconverter.ExemplarRecord;
 import org.kitodo.data.database.beans.ImportConfiguration;
 import org.kitodo.data.database.exceptions.DAOException;
 import org.kitodo.exceptions.CatalogException;
 import org.kitodo.exceptions.ConfigException;
 import org.kitodo.exceptions.InvalidMetadataValueException;
 import org.kitodo.exceptions.NoRecordFoundException;
 import org.kitodo.exceptions.NoSuchMetadataFieldException;
 import org.kitodo.exceptions.ParameterNotFoundException;
 import org.kitodo.exceptions.ProcessGenerationException;
 import org.kitodo.exceptions.UnsupportedFormatException;
 import org.kitodo.production.helper.Helper;
 import org.kitodo.production.helper.TempProcess;
 import org.kitodo.production.model.LazyHitModel;
 import org.kitodo.production.services.ServiceManager;
 import org.kitodo.production.services.data.ImportService;
 import org.omnifaces.util.Ajax;
 import org.primefaces.PrimeFaces;
 import org.primefaces.component.datatable.DataTable;
 import org.primefaces.model.SortOrder;
 import org.xml.sax.SAXException;
 
 public class CatalogImportDialog  extends MetadataImportDialog implements Serializable {
     private static final Logger logger = LogManager.getLogger(CatalogImportDialog.class);
     private final LazyHitModel hitModel = new LazyHitModel();
 
     private static final String ID_PARAMETER_NAME = "ID";
     private static final String HITSTABLE_NAME = "hitlistDialogForm:hitlistDialogTable";
     private static final int NUMBER_OF_CHILDREN_WARNING_THRESHOLD = 5;
 
     private String currentRecordId = "";
     private boolean importChildren = false;
     private int numberOfChildren = 0;
     private String opacErrorMessage = "";
     private boolean additionalImport = false;
 
     /**
      * Standard constructor.
      *
      * @param createProcessForm CreateProcessForm instance to which this ImportTab is assigned.
      */
     CatalogImportDialog(CreateProcessForm createProcessForm) {
         super(createProcessForm);
     }
 
     /**
      * Get the full record with the given ID from the catalog.
      */
     public void getSelectedRecord() {
         getRecordById(Helper.getRequestParameter(ID_PARAMETER_NAME));
     }
 
     /**
      * Get list of search fields.
      *
      * @return list of search fields
      */
     public List<String> getSearchFields() {
         if (Objects.isNull(hitModel.getImportConfiguration())) {
             return new LinkedList<>();
         } else {
             try {
                 return ServiceManager.getImportService().getAvailableSearchFields(hitModel.getImportConfiguration());
             } catch (IllegalArgumentException e) {
                 Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
                 return new LinkedList<>();
             }
         }
     }
 
     /**
      * Call search method of ImportService.
      */
     public void search() {
         try {
             if (skipHitList(hitModel.getImportConfiguration(), hitModel.getSelectedField())) {
                 getRecordById(hitModel.getSearchTerm());
             } else {
                 List<?> hits = hitModel.load(0, 10, null, SortOrder.ASCENDING, Collections.EMPTY_MAP);
                 if (hits.size() == 1) {
                     getRecordById(((SingleHit) hits.get(0)).getIdentifier());
                 } else {
                     try {
                         ((DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent(HITSTABLE_NAME)).reset();
                         PrimeFaces.current().executeScript("PF('hitlistDialog').show()");
                     } catch (IllegalArgumentException e) {
                         Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
                     }
                 }
             }
         } catch (CatalogException e) {
             this.opacErrorMessage = e.getMessage();
             PrimeFaces.current().ajax().update("opacErrorDialog");
             PrimeFaces.current().executeScript("PF('opacErrorDialog').show();");
         }
     }
 
     private boolean skipHitList(ImportConfiguration importConfiguration, String searchField) {
         return ImportService.skipHitlist(importConfiguration, searchField);
     }
 
     /**
      * Get retrieved hits. Returns empty list if LazyHitModel instance is null.
      *
      * @return hits
      */
     public List<SingleHit> getHits() {
         return this.hitModel.getHits();
     }
 
     void showExemplarRecord() {
         Ajax.update(FORM_CLIENTID);
         // if more than one exemplar record was found, display a selection dialog to the user
         LinkedList<ExemplarRecord> exemplarRecords = ServiceManager.getImportService().getExemplarRecords();
         if (exemplarRecords.size() == 1) {
             this.setSelectedExemplarRecord(exemplarRecords.get(0));
         } else if (exemplarRecords.size() > 1) {
             PrimeFaces.current().executeScript("PF('exemplarRecordsDialog').show();");
         }
     }
 
     @Override
     public List<ImportConfiguration> getImportConfigurations() {
         if (Objects.isNull(importConfigurations)) {
             try {
                 importConfigurations = ServiceManager.getImportConfigurationService().getAllOpacSearchConfigurations();
             } catch (IllegalArgumentException | DAOException e) {
                 Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
                 importConfigurations = new LinkedList<>();
             }
         }
         return importConfigurations;
     }
 
     /**
      * Retrieve complete record hierarchy of record from currently selected catalog, including
      * potential child records and ancestor records.
      */
     public void getRecordHierarchy() {
         if (StringUtils.isBlank(this.currentRecordId)) {
             Helper.setErrorMessage("No record selected!");
         } else {
             try {
                 createProcessForm.setChildProcesses(new LinkedList<>());
                 int projectId = this.createProcessForm.getProject().getId();
                 int templateId = this.createProcessForm.getTemplate().getId();
                 ImportConfiguration importConfiguration = this.hitModel.getImportConfiguration();
 
                 // import current and ancestors
                 LinkedList<TempProcess> processes = ServiceManager.getImportService().importProcessHierarchy(
                         currentRecordId, importConfiguration, projectId, templateId, hitModel.getImportDepth(),
                         createProcessForm.getRulesetManagement().getFunctionalKeys(
                                 FunctionalMetadata.HIGHERLEVEL_IDENTIFIER));
                 // import children
                 if (this.importChildren) {
                     importChildren(projectId, templateId, importConfiguration, processes);
                 }
 
                 if (createProcessForm.getProcesses().size() > 0 && additionalImport) {
                     extendsMetadataTableOfMetadataTab(processes);
                 } else {
                     createProcessForm.setProcesses(processes);
                     TempProcess currentTempProcess = processes.getFirst();
                     attachToExistingParentAndGenerateAtstslIfNotExist(currentTempProcess);
                     createProcessForm.fillCreateProcessForm(currentTempProcess);
                     showMessageAndRecord(importConfiguration, processes);
                 }
             } catch (IOException | ProcessGenerationException | XPathExpressionException | URISyntaxException
                     | ParserConfigurationException | UnsupportedFormatException | SAXException | DAOException
                     | ConfigException | TransformerException | NoRecordFoundException | InvalidMetadataValueException
                     | NoSuchMetadataFieldException e) {
                 throw new CatalogException(e.getLocalizedMessage());
             }
         }
     }
 
     private void showMessageAndRecord(ImportConfiguration importConfiguration, LinkedList<TempProcess> processes) {
         String summary = Helper.getTranslation("newProcess.catalogueSearch.importSuccessfulSummary");
         String detail = Helper.getTranslation("newProcess.catalogueSearch.importSuccessfulDetail",
                 String.valueOf(processes.size()), importConfiguration.getTitle());
         showGrowlMessage(summary, detail);
 
         if (this.importChildren) {
             summary = Helper.getTranslation("newProcess.catalogueSearch.loadingChildrenSuccessfulSummary");
             detail = Helper.getTranslation("newProcess.catalogueSearch.loadingChildrenSuccessfulDetail",
                     String.valueOf(this.createProcessForm.getChildProcesses().size()));
             showGrowlMessage(summary, detail);
         }
         showExemplarRecord();
     }
 
     private void importChildren(int projectId, int templateId, ImportConfiguration importConfiguration, List<TempProcess> parentProcesses)
             throws SAXException, UnsupportedFormatException, URISyntaxException, ParserConfigurationException,
             IOException, ProcessGenerationException, TransformerException, InvalidMetadataValueException,
             NoSuchMetadataFieldException {
         try {
             this.createProcessForm.setChildProcesses(ServiceManager.getImportService().getChildProcesses(
                     importConfiguration, this.currentRecordId, projectId, templateId, numberOfChildren, parentProcesses));
         } catch (NoRecordFoundException e) {
             this.createProcessForm.setChildProcesses(new LinkedList<>());
             showGrowlMessage("Import error", e.getLocalizedMessage());
         }
     }
 
     private void getRecordById(String recordId) {
         this.currentRecordId = recordId;
         try {
             if (this.importChildren) {
                 this.numberOfChildren = ServiceManager.getImportService().getNumberOfChildren(
                         this.hitModel.getImportConfiguration(), this.currentRecordId);
             }
             if (this.importChildren && this.numberOfChildren > NUMBER_OF_CHILDREN_WARNING_THRESHOLD) {
                 Ajax.update("manyChildrenWarningDialog");
                 PrimeFaces.current().executeScript("PF('manyChildrenWarningDialog').show();");
             } else {
                 getRecordHierarchy();
             }
         } catch (ConfigException e) {
             Helper.setErrorMessage(e);
         }
     }
 
     /**
      * Get LazyHitModel.
      *
      * @return LazyHitModel of this ImportTab
      */
     public LazyHitModel getHitModel() {
         return this.hitModel;
     }
 
     /**
      * Get import children.
      *
      * @return import children
      */
     public boolean isImportChildren() {
         return importChildren;
     }
 
     /**
      * Set import children.
      *
      * @param childImport import children
      */
     public void setImportChildren(boolean childImport) {
         this.importChildren = childImport;
     }
 
     /**
      * Get exemplarRecords.
      *
      * @return value of exemplarRecords
      */
     public LinkedList<ExemplarRecord> getExemplarRecords() {
         return ServiceManager.getImportService().getExemplarRecords();
     }
 
     /**
      * Set selectedExemplarRecord.
      *
      * @param selectedExemplarRecord as org.kitodo.api.schemaconverter.ExemplarRecord
      */
     public void setSelectedExemplarRecord(ExemplarRecord selectedExemplarRecord) {
         try {
             ImportService.setSelectedExemplarRecord(selectedExemplarRecord, this.hitModel.getImportConfiguration(),
                     this.createProcessForm.getProcessMetadata().getProcessDetailsElements());
             String summary = Helper.getTranslation("newProcess.catalogueSearch.exemplarRecordSelectedSummary");
             String detail = Helper.getTranslation("newProcess.catalogueSearch.exemplarRecordSelectedDetail",
                 selectedExemplarRecord.getOwner(), selectedExemplarRecord.getSignature());
             showGrowlMessage(summary, detail);
             Ajax.update(FORM_CLIENTID);
         } catch (ParameterNotFoundException e) {
             Helper.setErrorMessage("newProcess.catalogueSearch.exemplarRecordParameterNotFoundError",
                     new Object[] {e.getMessage(), this.hitModel.getImportConfiguration().getTitle() });
         }
     }
 
     /**
      * Check and return whether the "parentIdSearchField" is configured in the current ImportConfiguration.
      *
      * @return whether "parentIdSearchField" is configured for current ImportConfiguration
      */
     public boolean isParentIdSearchFieldConfigured() {
         try {
             return Objects.nonNull(this.hitModel.getImportConfiguration()) && ServiceManager.getImportService()
                     .isParentIdSearchFieldConfigured(this.hitModel.getImportConfiguration());
         } catch (ConfigException e) {
             return false;
         }
     }
 
     /**
      * Get OPAC error message.
      *
      * @return OPAC error message
      */
     public String getOpacErrorMessage() {
         return this.opacErrorMessage;
     }
 
     /**
      * Return String containing warning about high number of child processes that are going to be imported.
      *
      * @return warning about high number of child processes to be imported
      */
     public String getNumberOfChildProcessesWarning() {
         return Helper.getTranslation("newProcess.catalogueSearch.manyChildrenWarning",
             String.valueOf(this.numberOfChildren));
     }
 
 
     /**
      * Checks the additional import.
      *
      * @return true if is additional import
      */
     public boolean isAdditionalImport() {
         return additionalImport;
     }
 
     /**
      * Set additional import.
      *
      * @param additionalImport
      *            the value if is additional import
      */
     public void setAdditionalImport(boolean additionalImport) {
         this.additionalImport = additionalImport;
     }
 
 }