001package media;
002
003
004import java.io.*;
005import java.nio.file.Files;
006import java.nio.file.Path;
007import java.util.UUID;
008
009/**
010 * Classe che incapsula la logica per il ritrovo di media (immagini) dal filesystem
011 */
012public class MediaRepository implements Serializable{
013
014    private Path uploadRoot = Path.of(System.getProperty("openejb.home"), "uploads");
015    private final long sizeLimit = 5*1024*1024; //todo: parametrizza nel metodo insert
016
017    /**
018     *  Costruttore vuoto
019     * @return nuova istanza di MediaRepository
020     */
021    public MediaRepository(){}
022
023    /**
024     *  Costruttore con parametro per settare uploadRoot
025     * @param uploadRoot oggetto Path per settare uploadRoot
026     * @return nuova istanza di MediaRepository
027     */
028    public MediaRepository(Path uploadRoot){
029        this.uploadRoot = uploadRoot;
030    }
031
032    /**
033     *  Salva un file nel filesystem e ne restituisce il nome
034     * @param stream stream di dati
035     * @param filename nome del file da salvare
036     * @throws ReadLimitExceededException se il file supera i 5MB
037     * @throws IOException
038     * @return nuova istanza di MediaRepository
039     */
040    public String insert(InputStream stream, String filename) throws IOException {
041        Files.createDirectories(uploadRoot);
042        File file = new File(uploadRoot.toFile(), filename);
043        Files.copy(new LimitedInputStream(stream,sizeLimit), file.toPath());
044        return filename;
045    }
046
047    /**
048     *  Salva un file nel filesystem e ne restituisce un nome univoco generato in maniera casuale
049     * @param stream stream di dati
050     * @throws IOException
051     * @return nuova istanza di MediaRepository
052     */
053    public String insert(InputStream stream) throws IOException {
054        return insert(stream, UUID.randomUUID().toString());
055    }
056
057    /**
058     *  Rimuove un file dal filesystem dato un nome se esiste
059     * @param filename nome del file
060     * @throws IOException
061     */
062    public void remove(String filename) throws IOException {
063        boolean successful = Files.deleteIfExists(uploadRoot.resolve(filename));
064        // if (!successful) { ???? }
065    }
066
067    /**
068     *  Restituisce un file dal filesystem dato un nome se esiste altrimenti restituisce null
069     * @param filename nome del file
070     * @return stream di dati del file o null
071     */
072    public InputStream get(String filename){
073        File file = new File(uploadRoot.toFile(), filename);
074        if (!file.exists() || !file.isFile())
075            return null;
076        try {
077            return new FileInputStream(file);
078        } catch (FileNotFoundException e) {
079            return null;
080        }
081    }
082
083}