diff --git a/Kitodo-API/pom.xml b/Kitodo-API/pom.xml index dd5f4b7984e..ed998295b55 100644 --- a/Kitodo-API/pom.xml +++ b/Kitodo-API/pom.xml @@ -91,8 +91,8 @@ mockito-core - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api org.glassfish.jaxb diff --git a/Kitodo-DataEditor/pom.xml b/Kitodo-DataEditor/pom.xml index 2decf0897c0..614ad8caf21 100644 --- a/Kitodo-DataEditor/pom.xml +++ b/Kitodo-DataEditor/pom.xml @@ -38,8 +38,8 @@ kitodo-data-format - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api org.glassfish.jaxb diff --git a/Kitodo-DataFormat/pom.xml b/Kitodo-DataFormat/pom.xml index 48d793ee5c5..8fdcec1c81d 100644 --- a/Kitodo-DataFormat/pom.xml +++ b/Kitodo-DataFormat/pom.xml @@ -99,9 +99,9 @@ - org.jvnet.jaxb2.maven2 - maven-jaxb2-plugin - 0.15.3 + org.jvnet.jaxb + jaxb-maven-plugin + 2.0.9 process-sources @@ -125,16 +125,15 @@ ${project.build.directory}/generated-sources/xjc - -Xequals - -XhashCode + -Xcommons-lang -extension -Xnamespace-prefix - org.jvnet.jaxb2_commons + org.jvnet.jaxb jaxb2-basics - ${jaxb2-basics-runtime.version} + 2.0.9 diff --git a/Kitodo-DataManagement/pom.xml b/Kitodo-DataManagement/pom.xml index 45a5e429b9e..f8fc427c5e1 100644 --- a/Kitodo-DataManagement/pom.xml +++ b/Kitodo-DataManagement/pom.xml @@ -77,7 +77,11 @@ org.glassfish - javax.json + jakarta.json + + + org.hibernate + hibernate-core org.hibernate diff --git a/Kitodo/src/main/java/org/kitodo/production/forms/ProcessForm.java b/Kitodo/src/main/java/org/kitodo/production/forms/ProcessForm.java index b9d1ce68788..90ec91e57db 100644 --- a/Kitodo/src/main/java/org/kitodo/production/forms/ProcessForm.java +++ b/Kitodo/src/main/java/org/kitodo/production/forms/ProcessForm.java @@ -11,7 +11,6 @@ package org.kitodo.production.forms; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -87,6 +86,7 @@ public class ProcessForm extends TemplateBaseForm { private Property property; private final FilterMenu filterMenu = new FilterMenu(this); private final transient FileService fileService = ServiceManager.getFileService(); + private final transient ProcessService processService = ServiceManager.getProcessService(); private final transient WorkflowControllerService workflowControllerService = new WorkflowControllerService(); private final String processEditPath = MessageFormat.format(REDIRECT_PATH, "processEdit"); @@ -274,73 +274,18 @@ private boolean renameAfterProcessTitleChanged() { Helper.setErrorMessage("processTitleInvalid", new Object[] {validateRegEx }); return false; } else { - renamePropertiesValuesForProcessTitle(this.process.getProperties()); - renamePropertiesValuesForProcessTitle(this.process.getTemplates()); - removePropertiesWithEmptyTitle(this.process.getWorkpieces()); - try { - renameImageDirectories(); - renameOcrDirectories(); - renameDefinedDirectories(); + processService.renameProcess(this.process, this.newProcessTitle); } catch (IOException | RuntimeException e) { Helper.setErrorMessage("errorRenaming", new Object[] {Helper.getTranslation("directory") }, logger, e); } - this.process.setTitle(this.newProcessTitle); - // remove Tiffwriter file ServiceManager.getKitodoScriptService().deleteTiffHeaderFile(List.of(process)); } return true; } - private void renamePropertiesValuesForProcessTitle(List properties) { - for (Property property : properties) { - if (Objects.nonNull(property.getValue()) && property.getValue().contains(this.process.getTitle())) { - property.setValue(property.getValue().replaceAll(this.process.getTitle(), this.newProcessTitle)); - } - } - } - - private void renameImageDirectories() throws IOException { - URI imageDirectory = fileService.getImagesDirectory(process); - renameDirectories(imageDirectory); - } - - private void renameOcrDirectories() throws IOException { - URI ocrDirectory = fileService.getOcrDirectory(process); - renameDirectories(ocrDirectory); - } - - private void renameDirectories(URI directory) throws IOException { - if (fileService.isDirectory(directory)) { - List subDirs = fileService.getSubUris(directory); - for (URI imageDir : subDirs) { - if (fileService.isDirectory(imageDir)) { - fileService.renameFile(imageDir, imageDir.toString().replace(process.getTitle(), newProcessTitle)); - } - } - } - } - - private void renameDefinedDirectories() { - String[] processDirs = ConfigCore.getStringArrayParameter(ParameterCore.PROCESS_DIRS); - for (String processDir : processDirs) { - // TODO: check it out - URI processDirAbsolute = ServiceManager.getProcessService().getProcessDataDirectory(process) - .resolve(processDir.replace("(processtitle)", process.getTitle())); - - File dir = new File(processDirAbsolute); - boolean renamed; - if (dir.isDirectory()) { - renamed = dir.renameTo(new File(dir.getAbsolutePath().replace(process.getTitle(), newProcessTitle))); - if (!renamed) { - Helper.setErrorMessage("errorRenaming", new Object[] {dir.getName() }); - } - } - } - } - /** * Remove template properties. */ @@ -742,7 +687,7 @@ public void deleteProperty() { this.process.getProperties().remove(this.property); List propertiesToFilterTitle = this.process.getProperties(); - removePropertiesWithEmptyTitle(propertiesToFilterTitle); + processService.removePropertiesWithEmptyTitle(propertiesToFilterTitle, this.process); loadProcessProperties(); } @@ -756,16 +701,6 @@ public void duplicateProperty() { loadProcessProperties(); } - // TODO: is it really a case that title is empty? - private void removePropertiesWithEmptyTitle(List properties) { - for (Property processProperty : properties) { - if (Objects.isNull(processProperty.getTitle()) || processProperty.getTitle().isEmpty()) { - processProperty.getProcesses().clear(); - this.process.getProperties().remove(processProperty); - } - } - } - /** * Get dockets for select list. * diff --git a/Kitodo/src/main/java/org/kitodo/production/services/command/KitodoScriptService.java b/Kitodo/src/main/java/org/kitodo/production/services/command/KitodoScriptService.java index 1d7a4e59d61..007b9acb6f5 100644 --- a/Kitodo/src/main/java/org/kitodo/production/services/command/KitodoScriptService.java +++ b/Kitodo/src/main/java/org/kitodo/production/services/command/KitodoScriptService.java @@ -401,13 +401,13 @@ private void generateImages(List processes, GenerationMode generationMo Folder generatorSource = process.getProject().getGeneratorSource(); if (Objects.isNull(generatorSource)) { Helper.setErrorMessage("kitodoScript.generateImages.error.noSourceFolder", - new String[] {process.getTitle(), process.getProject().getTitle() }); + process.getTitle(), process.getProject().getTitle()); continue; } Subfolder sourceFolder = new Subfolder(process, generatorSource); if (sourceFolder.listContents().isEmpty()) { Helper.setErrorMessage("kitodoScript.generateImages.error.noSourceFiles", - new String[] {process.getTitle(), sourceFolder.getRelativeDirectoryPath() }); + process.getTitle(), sourceFolder.getRelativeDirectoryPath()); continue; } boolean all = folders.size() == 1 && folders.get(0).equalsIgnoreCase("all"); @@ -423,7 +423,7 @@ private void generateImages(List processes, GenerationMode generationMo } if (outputFolders.isEmpty()) { Helper.setErrorMessage("kitodoScript.generateImages.error.noDestination", - new String[] {process.getTitle(), String.join(", ", ungeneratableFolders) }); + process.getTitle(), String.join(", ", ungeneratableFolders)); continue; } ImageGenerator imageGenerator = new ImageGenerator(sourceFolder, generationMode, outputFolders); diff --git a/Kitodo/src/main/java/org/kitodo/production/services/data/ProcessService.java b/Kitodo/src/main/java/org/kitodo/production/services/data/ProcessService.java index b813448d4cb..5ecc4467811 100644 --- a/Kitodo/src/main/java/org/kitodo/production/services/data/ProcessService.java +++ b/Kitodo/src/main/java/org/kitodo/production/services/data/ProcessService.java @@ -2586,6 +2586,95 @@ public static void createXML(Process process, User user) throws IOException { xmlExport.exportXmlLog(getDocketData(process), destination); } + /** + * Renames a process. + * + * @param process + * process to be renamed + * @param newProcessTitle + * new process name + * @throws IOException + * if an error occurs while accessing the file system + */ + public void renameProcess(Process process, String newProcessTitle) throws IOException { + renamePropertiesValuesForProcessTitle(process.getProperties(), process.getTitle(), newProcessTitle); + renamePropertiesValuesForProcessTitle(process.getTemplates(), process.getTitle(), newProcessTitle); + removePropertiesWithEmptyTitle(process.getWorkpieces(), process); + + renameImageDirectories(process, newProcessTitle); + renameOcrDirectories(process, newProcessTitle); + renameDefinedDirectories(process, newProcessTitle); + + process.setTitle(newProcessTitle); + } + + private void renamePropertiesValuesForProcessTitle(List properties, String processTitle, String newProcessTitle) { + for (Property property : properties) { + if (Objects.nonNull(property.getValue()) && property.getValue().contains(processTitle)) { + property.setValue(property.getValue().replaceAll(processTitle, newProcessTitle)); + } + } + } + + /** + * Removes properties with empty title. + * + *

+ * TODO: Is it really a case that title is empty? + * + * @param properties + * property list to be checked + * @param process + * process from which the properties are to be deleted + */ + public void removePropertiesWithEmptyTitle(List properties, Process process) { + for (Property processProperty : properties) { + if (Objects.isNull(processProperty.getTitle()) || processProperty.getTitle().isEmpty()) { + processProperty.getProcesses().clear(); + process.getProperties().remove(processProperty); + } + } + } + + private void renameImageDirectories(Process process, String newProcessTitle) throws IOException { + URI imageDirectory = fileService.getImagesDirectory(process); + renameDirectories(imageDirectory, process, newProcessTitle); + } + + private void renameOcrDirectories(Process process, String newProcessTitle) throws IOException { + URI ocrDirectory = fileService.getOcrDirectory(process); + renameDirectories(ocrDirectory, process, newProcessTitle); + } + + private void renameDirectories(URI directory, Process process, String newProcessTitle) throws IOException { + if (fileService.isDirectory(directory)) { + List subDirs = fileService.getSubUris(directory); + for (URI imageDir : subDirs) { + if (fileService.isDirectory(imageDir)) { + fileService.renameFile(imageDir, imageDir.toString().replace(process.getTitle(), newProcessTitle)); + } + } + } + } + + private void renameDefinedDirectories(Process process, String newProcessTitle) { + String[] processDirs = ConfigCore.getStringArrayParameter(ParameterCore.PROCESS_DIRS); + for (String processDir : processDirs) { + // TODO: check it out + URI processDirAbsolute = ServiceManager.getProcessService().getProcessDataDirectory(process) + .resolve(processDir.replace("(processtitle)", process.getTitle())); + + File dir = new File(processDirAbsolute); + boolean renamed; + if (dir.isDirectory()) { + renamed = dir.renameTo(new File(dir.getAbsolutePath().replace(process.getTitle(), newProcessTitle))); + if (!renamed) { + Helper.setErrorMessage("errorRenaming", new Object[] {dir.getName() }); + } + } + } + } + /** * Create and return PieChartModel for given process values. * diff --git a/Kitodo/src/main/resources/messages/errors_es.properties b/Kitodo/src/main/resources/messages/errors_es.properties index 172b4365c5c..f289e0a904b 100644 --- a/Kitodo/src/main/resources/messages/errors_es.properties +++ b/Kitodo/src/main/resources/messages/errors_es.properties @@ -25,7 +25,8 @@ calendar.upload.isEmpty=No se ha transferido ningún archivo. calendar.upload.missingMandatoryElement=No se pudo encontrar un elemento XML requerido. calendar.upload.missingMandatoryValue=No se ha podido encontrar un valor requerido. calendar.upload.overlappingDateRanges=No se ha podido importar el historial de publicaciones porque los intervalos de fechas de los bloques se solapaban\: -catalogError=Error al consultar el catálogo „{0}“ +catalogError=Error al consultar el catálogo "{0}" +configurationError=Error en la configuración copyDataError=Error al copiar datos createProcessForm.createNewProcess.noInsertionPositionSelected=No se ha seleccionado ningún elemento para el enlace del registro del título. createProcessForm.createNewProcess.recordIdentifierMissing.caption=Falta el metadato 'recordIdentifier' @@ -103,6 +104,7 @@ kitodoScript.importProcesses.project.noProjectWithID=¡El proyecto con ese ID no kitodoScript.importProcesses.template.isNull=¡Falta la variable ''template''! kitodoScript.importProcesses.template.isNoTemplateID=¡''template'' no es un entero! kitodoScript.importProcesses.template.noTemplateWithID=No existe la plantilla con este ID +kitodoScript.noStructureOfTypeFound=No se encontró ningún elemento estructurado de tipo "{0}" # L errorLoadingDocTypes=Error de configuración del conjunto de reglas: No se ha encontrado ningún DocType ('division') @@ -116,6 +118,13 @@ loginNotValid=El inicio de sesión ''{0}'' contiene caracteres no válidos o est # M errorMassDownloadProjectCreation=La carpeta del proyecto {0} no puede ser creada. errorMissingClient=El usuario no está asignado a un cliente. +mediaPartialFormNoMedium=Ningún medio ha sido seleccionado. +mediaPartialFormStartEmpty=No se ha específicado el tiempo de inicio. +mediaPartialFormStartExists=Ya existe un medio parcial con el mismo inicio. +mediaPartialFormStartWrongTimeFormat=El inicio tiene un formato de tiempo incorrecto. +mediaPartialFormStartLessThanMediaDuration=El inicio tiene que se menor que la duración del medio. +mediaPartialFormMediaDurationEmpty=No se ha específicado la duración del medio. +mediaPartialFormMediaDurationWrongTimeFormat=La duración del medio tiene un formato de tiempo incorrecto. metadataConfusion=¡Edición de metadatos de la tarea {0} bloqueada, el archivo de metadatos pertenece a la tarea {1}! metadataFileNotFound=El archivo de metadatos no existe\: {0} metadataInvalidData=El valor "{0}" en el campo {1} no es válido. diff --git a/Kitodo/src/main/resources/messages/messages_es.properties b/Kitodo/src/main/resources/messages/messages_es.properties index 956859a77da..12b5013c394 100644 --- a/Kitodo/src/main/resources/messages/messages_es.properties +++ b/Kitodo/src/main/resources/messages/messages_es.properties @@ -25,6 +25,7 @@ activeUsers=Usuarios activos addElement=Añadir elemento addLogicalDivision=Añadir elemento de estructura lógica addPhysicalDivision=Añadir posición de estructura física +addMediaPartial=Añadir medio parcial addMessage=Añadir mensaje addMessageForAll=Añadir mensaje a todos los procesos addNewMetadataGroup=Añadir un nuevo grupo de metadatos @@ -74,6 +75,7 @@ batchStep=Paso de lote batches=Lotes batchesForMigration=Seleccione los lotes para la migración edit=Editar +editMediaPartial=Editar medios parciales releaseTask=Devuelve el procesamiento de esta tarea reallyReleaseTask=¿Realmente quiere enviar el procesamiento de esta tarea y volver a poner el paso en 'abierto'? selectPlease=Por favor, seleccione @@ -192,7 +194,9 @@ columnConfigurationSaved=Configuración de la columna guardada columnCount=Recuento de columnas comment=Comentario comments=Comentarios -commentWrite=Escriba un comentario +commentDelete=Borrar comentario +commentEdit=Editar comentario +commentWrite=Escribir comentario configureColumns=Configurar columnas configurationChanged=Ajustes modificados configurationFile=Archivo de configuración @@ -351,6 +355,7 @@ deleteAfterMove=Borrar después de exportar deleteIndex=Eliminar el índice de ElasticSearch deleteLinkHomeDirectory=Eliminar el enlace del directorio principal deleteMedia=Borrar los medios de comunicación +deleteMediaPartial=Borrar los medios parciales deleteFromProject=Eliminar el usuario del proyecto deleteProcessChildren=Esta operación tiene {0} subordinaciones, ¿también las desea eliminar? desktop=Escritorio @@ -379,6 +384,7 @@ docketPrint=Imprimir la hoja de ruta # docketSaving is used in docketEdit.xhtml - line 45 docketSaving=La hoja de ruta se guarda... docstructs=Elementos estructurales +documentType=Tipo de documento down=Bajar download=Descargar imágenes doYouWantToProceed=¿Quieres continuar? @@ -651,7 +657,15 @@ indexOutOfDate=Hay que actualizar el índice. insert=Insertar insertAsUncounted=Insertar como no numerado insertHere=Insertar aquí -isInUse=está siendo procesado por +isInUse=Está siendo procesado por +jumpBackwardOneSecond=Retroceder 1 segundo +jumpBackwardOneHundredMilliseconds=Retroceder 100 milisegundos +jumpBackwardTenMilliseconds=Retroceder 10 milisegundos +jumpBackwardOneMillisecond=Retroceder 1 milisegundo +jumpForwardOneMillisecond=Adelantar 1 milisegundo +jumpForwardTenMilliseconds=Adelantar 10 milisegundos +jumpForwardOneHundredMilliseconds=Adelantar 100 milisegundos +jumpForwardOneSecond=Adelantar 1 segundo kitodoScript.generateImages.error.noSourceFiles=No se pueden crear imágenes para la operación {0}: La carpeta de origen {1} no tiene contenido. kitodoScript.generateImages.error.noSourceFolder=No se pueden crear imágenes para la actividad {0}: No se ha definido ninguna carpeta de fuentes en el proyecto {1}. kitodoScript.generateImages.error.noDestination=No se pueden crear imágenes para la tarea {0}: La carpeta {1} no puede/no se puede crear. @@ -926,6 +940,7 @@ projectConfiguration=Configuración del proyecto projectIsActive=El proyecto está activo projectIsArchived=El proyecto está inactivo projectList=Lista de proyectos +projectNotAssignedToCurrentUser=¡El proyecto "{0}" no está asignado al usuario actual! projectProgress=Desarrollo de proyectos projects=Proyectos projectsForMigration=Seleccione los proyectos para la migración @@ -937,8 +952,8 @@ property=Propiedad propertySaved=La propiedad ha sido guardada. createProcessForm.titleRecordLinkTab.noInsertionPosition=No puede vincular la operación a este registro de título porque el DocType seleccionado no está permitido como hijo en ningún momento. createProcessForm.titleRecordLinkTab.searchButtonClick.empty=Consulta de búsqueda vacía -createProcessForm.titleRecordLinkTab.searchButtonClick.error=La búsqueda se topó con un error: -createProcessForm.titleRecordLinkTab.searchButtonClick.noHits=La búsqueda se ha completado pero no se ha encontrado nada. Sólo puede encontrar actividades que tengan el mismo proyecto y conjunto de reglas. +createProcessForm.titleRecordLinkTab.searchButtonClick.error=La búsqueda encontró un error: +createProcessForm.titleRecordLinkTab.searchButtonClick.noHits=La búsqueda está completa pero no se ha encontrado nada. Sólo se pueden encontrar operaciones que tengan el mismo conjunto de reglas y que sean operaciones padres potenciales. quarter=Cuarto quarters=Cuartos ready=Hecho @@ -1231,6 +1246,7 @@ addTemplateProperty=Añadir la propiedad de la plantilla addUser=Añadir usuario addWorkflow=Añadir flujo de trabajo addWorkpieceProperty=Añadir propiedad de la pieza de trabajo +assignImportConfigurationToClient=Asignar la configuración de importación al cliente assignTasks=Asignar tareas overrideTasks=Sobrescribir tareas superviseTasks=Supervisar las tareas @@ -1291,6 +1307,7 @@ renameMedia=Cambiar el nombre de los archivos multimedia renameMediaThread=Cambiar el nombre de los archivos multimedia renameMediaForProcessesConfirmMessage=Los archivos multimedia de {0} procesos se renombrarán según su orden en los procesos individuales. Este cambio no se puede revertir. ¿Desea continuar? runKitodoScript=Ejecutar KitodoScript +linkToProcessesOfUnassignedProjects=Enlace a las operaciones no asignadas de los proyectos viewAllAuthorities=Mostrar todos los permisos viewAllBatches=Mostrar todos los lotes diff --git a/Kitodo/src/main/webapp/WEB-INF/templates/includes/userEdit/projectList.xhtml b/Kitodo/src/main/webapp/WEB-INF/templates/includes/userEdit/projectList.xhtml index 2854e9edf21..3dba735d362 100644 --- a/Kitodo/src/main/webapp/WEB-INF/templates/includes/userEdit/projectList.xhtml +++ b/Kitodo/src/main/webapp/WEB-INF/templates/includes/userEdit/projectList.xhtml @@ -25,7 +25,7 @@ - + diff --git a/pom.xml b/pom.xml index d1f029894c2..fab4354720d 100644 --- a/pom.xml +++ b/pom.xml @@ -53,8 +53,8 @@ 4.3.1 2.2-rc1 5.6.10.Final - 2.3.1 - 2.3.6 + 2.3.3 + 2.3.9 1.11.1 1.2.0 1.20.1 @@ -226,8 +226,8 @@ - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api ${jaxb.api.version} @@ -485,8 +485,8 @@ from system library in Java 11+ --> org.glassfish - javax.json - 1.1.4 + jakarta.json + 1.1.6 org.glassfish.jaxb @@ -499,6 +499,18 @@ from system library in Java 11+ --> ${hamcrest.version} test + + org.hibernate + hibernate-core + ${hibernate.version} + + + + javax.xml.bind + jaxb-api + + + org.hibernate hibernate-c3p0