Coverage Summary for Class: ExportMets (org.kitodo.export)
Class |
Class, %
|
Method, %
|
Line, %
|
ExportMets |
100%
(1/1)
|
100%
(6/6)
|
69,1%
(38/55)
|
/*
* (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.export;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Objects;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kitodo.api.dataformat.Workpiece;
import org.kitodo.data.database.beans.Process;
import org.kitodo.data.database.beans.User;
import org.kitodo.data.database.exceptions.DAOException;
import org.kitodo.data.exceptions.DataException;
import org.kitodo.production.helper.Helper;
import org.kitodo.production.helper.metadata.legacytypeimplementations.LegacyMetsModsDigitalDocumentHelper;
import org.kitodo.production.helper.metadata.legacytypeimplementations.LegacyPrefsHelper;
import org.kitodo.production.helper.tasks.EmptyTask;
import org.kitodo.production.services.ServiceManager;
import org.kitodo.production.services.file.FileService;
public class ExportMets {
private final FileService fileService = ServiceManager.getFileService();
protected LegacyPrefsHelper myPrefs;
private static final Logger logger = LogManager.getLogger(ExportMets.class);
/**
* The field exportDmsTask holds an optional task instance. Its progress and
* its errors will be passed to the task manager screen (if available) for
* visualization.
*/
protected EmptyTask exportDmsTask = null;
/**
* DMS-Export in das Benutzer-Homeverzeichnis.
*
* @param process
* Process object
*/
public boolean startExport(Process process) throws DAOException, DataException, IOException {
User user = ServiceManager.getUserService().getAuthenticatedUser();
URI userHome = ServiceManager.getUserService().getHomeDirectory(user);
boolean exportSuccessful = startExport(process, userHome);
if (exportSuccessful) {
if (Objects.nonNull(process.getParent())) {
startExport(process.getParent());
}
}
return exportSuccessful;
}
/**
* DMS-Export an eine gewünschte Stelle.
*
* @param process
* Process object
* @param userHome
* String
*/
public boolean startExport(Process process, URI userHome) throws IOException, DAOException {
/*
* Read Document
*/
this.myPrefs = ServiceManager.getRulesetService().getPreferences(process.getRuleset());
String atsPpnBand = Helper.getNormalizedTitle(process.getTitle());
LegacyMetsModsDigitalDocumentHelper gdzfile = ServiceManager.getProcessService().readMetadataFile(process);
if (ServiceManager.getProcessService().handleExceptionsForConfiguration(gdzfile, process)) {
return false;
}
prepareUserDirectory(userHome);
String targetFileName = atsPpnBand + "_mets.xml";
URI metaFile = userHome.resolve(userHome.getRawPath() + "/" + targetFileName);
return writeMetsFile(process, metaFile, gdzfile);
}
/**
* prepare user directory.
*
* @param targetFolder
* the folder to prove and maybe create it
*/
protected void prepareUserDirectory(URI targetFolder) {
User user = ServiceManager.getUserService().getAuthenticatedUser();
try {
fileService.createDirectoryForUser(targetFolder, user.getLogin());
} catch (IOException | RuntimeException e) {
if (Objects.nonNull(exportDmsTask)) {
exportDmsTask.setException(e);
}
Helper.setErrorMessage("Export canceled, could not create destination directory: " + targetFolder, logger,
e);
}
}
/**
* write MetsFile to given Path.
*
* @param process
* the Process to use
* @param metaFile
* the meta file which should be written
* @param gdzfile
* the FileFormat-Object to use for Mets-Writing
* @return true or false
*/
protected boolean writeMetsFile(Process process, URI metaFile, LegacyMetsModsDigitalDocumentHelper gdzfile)
throws IOException, DAOException {
Workpiece workpiece = gdzfile.getWorkpiece();
try {
ServiceManager.getSchemaService().tempConvert(workpiece, process);
} catch (URISyntaxException e) {
if (Objects.nonNull(exportDmsTask)) {
exportDmsTask.setException(e);
}
Helper.setErrorMessage("Writing Mets file failed!", e.getLocalizedMessage(), logger, e);
return false;
}
/*
* We write to the user’s home directory or to the hotfolder here, not
* to a content repository, therefore no use of file service.
*/
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
ServiceManager.getMetsService().save(workpiece, out);
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(out.toByteArray())) {
StreamSource source = new StreamSource(byteArrayInputStream);
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(metaFile)))) {
URI xslFile = XsltHelper.getXsltFileFromConfig(process);
if (!Files.exists(Paths.get(xslFile))) {
String message = Helper.getTranslation("xsltFileNotFound", xslFile.toString());
throw new FileNotFoundException(message);
}
bufferedOutputStream.write(XsltHelper.transformXmlByXslt(source, xslFile).toByteArray());
} catch (FileNotFoundException | TransformerException e) {
if (Objects.nonNull(exportDmsTask)) {
exportDmsTask.setException(e);
}
Helper.setErrorMessage("Writing Mets file failed!", e.getLocalizedMessage(), logger, e);
return false;
}
}
}
Helper.setMessage(process.getTitle() + ": ", "exportFinished");
return true;
}
}