package fi.otavanopisto.muikku.plugins.transcriptofrecords;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Paths;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
import javax.inject.Inject;
import org.apache.commons.io.FileUtils;
import fi.otavanopisto.muikku.controller.PluginSettingsController;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.TranscriptOfRecordsFileUploadServlet.NoUploadBasePathSetException;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.dao.TranscriptOfRecordsFileDAO;
import fi.otavanopisto.muikku.plugins.transcriptofrecords.model.TranscriptOfRecordsFile;
public class TranscriptOfRecordsFileController {
private static final Pattern UUID_PATTERN = Pattern.compile(
"^" +
"[0-9a-f]{8}-" +
"[0-9a-f]{4}-" +
"[0-9a-f]{4}-" +
"[0-9a-f]{4}-" +
"[0-9a-f]{12}" +
"$");
@Inject
private TranscriptOfRecordsFileDAO transcriptOfRecordsFileDAO;
@Inject
private PluginSettingsController pluginSettingsController;
private String getFileUploadBasePath() {
String basePath = pluginSettingsController.getPluginSetting("transcriptofrecords", "fileUploadBasePath");
if (basePath == null) {
throw new NoUploadBasePathSetException();
}
return basePath;
}
public TranscriptOfRecordsFile attachFile(
UserEntity student,
InputStream content,
String contentType,
String title,
String description
) throws IOException {
String fileUuid = UUID.randomUUID().toString();
File file = Paths.get(getFileUploadBasePath(), fileUuid).toFile();
try {
FileUtils.copyInputStreamToFile(content, file);
} catch (IOException ex) {
file.delete();
throw new RuntimeException("Couldn't save file", ex);
}
return transcriptOfRecordsFileDAO.create(
student,
fileUuid,
contentType,
title,
description
);
}
public List<TranscriptOfRecordsFile> listFiles(UserEntity student) {
return transcriptOfRecordsFileDAO.listByUserEntity(student);
}
public TranscriptOfRecordsFile findFileById(Long id) {
return transcriptOfRecordsFileDAO.findById(id);
}
public void outputFileToStream(TranscriptOfRecordsFile torFile, OutputStream stream) {
String fileUuid = torFile.getFileName();
if (!UUID_PATTERN.matcher(fileUuid).matches()) {
throw new RuntimeException("File name is not a valid UUID");
}
File file = Paths.get(getFileUploadBasePath(), fileUuid).toFile();
try {
FileUtils.copyFile(file, stream);
} catch (IOException e) {
// Wrap with unchecked exception to adhere to StreamingOutput interface
throw new RuntimeException(e);
}
}
public void delete(TranscriptOfRecordsFile file) {
transcriptOfRecordsFileDAO.archive(file);
}
}