/* * Copyright (C) 2015 Jan Pokorsky * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package cz.cas.lib.proarc.common.object.emods; import cz.cas.lib.proarc.common.config.AppConfiguration; import cz.cas.lib.proarc.common.config.AppConfigurationException; import cz.cas.lib.proarc.common.config.AppConfigurationFactory; import cz.cas.lib.proarc.common.fedora.BinaryEditor; import cz.cas.lib.proarc.common.fedora.DigitalObjectException; import cz.cas.lib.proarc.common.imports.InputUtils; import cz.cas.lib.proarc.common.object.DefaultDisseminationHandler; import cz.cas.lib.proarc.common.object.DigitalObjectHandler; import cz.cas.lib.proarc.common.object.DisseminationHandler; import cz.cas.lib.proarc.common.object.DisseminationInput; import cz.cas.lib.proarc.common.process.GenericExternalProcess; import java.io.File; import java.io.IOException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import org.apache.commons.configuration.Configuration; /** * Processes uploaded contents (PDF), validates, creates thumbnail, preview and others. * * @author Jan Pokorsky */ public class BornDigitalDisseminationHandler implements DisseminationHandler { private final String dsId; private final DigitalObjectHandler objHandler; private final DefaultDisseminationHandler ddh; public BornDigitalDisseminationHandler(DefaultDisseminationHandler ddh) { this.dsId = ddh.getDsId(); this.objHandler = ddh.getHandler(); this.ddh = ddh; } @Override public Response getDissemination(Request httpRequest) throws DigitalObjectException { return ddh.getDissemination(httpRequest); } @Override public void setDissemination(DisseminationInput input, String message) throws DigitalObjectException { // MediaType mime = input.getMime(); // if (!"application".equalsIgnoreCase(mime.getType()) || !"pdf".equalsIgnoreCase(mime.getSubtype())) { // throw new DigitalObjectException(handler.getFedoraObject().getPid(), null, dsId, // "Unsupported MIME " + mime, null); // } File inputFile = input.getFile(); if (!isPdf(inputFile)) { throw new DigitalObjectException(objHandler.getFedoraObject().getPid(), null, dsId, "Not PDF content " + inputFile + ", exists: " + inputFile.exists() + ", size: " + inputFile.length(), null); } MediaType mime = new MediaType("application", "pdf"); if (BinaryEditor.RAW_ID.equals(dsId)) { // XXX use importer ddh.setRawDissemination(inputFile, input.getFilename(), mime, message); ddh.setIconAsDissemination(BinaryEditor.PREVIEW_ID, mime, BinaryEditor.PREVIEW_LABEL, message); createThumbnail(inputFile, message); } else { throw new DigitalObjectException(objHandler.getFedoraObject().getPid(), null, dsId, "Unsupported datastream ID!", null); } } private void createThumbnail(File inputFile, String message) throws DigitalObjectException { Configuration thumbConf = getConfig().getImportConfiguration().getThumbnailProcessor(); if (thumbConf != null && !thumbConf.isEmpty()) { GenericExternalProcess thumbProc = new GenericExternalProcess(thumbConf) .addInputFile(inputFile) .addOutputFile(new File(inputFile.getAbsolutePath() + ".jpg")); thumbProc.run(); if (thumbProc.isOk()) { ddh.setDsDissemination(BinaryEditor.THUMB_ID, thumbProc.getOutputFile(), BinaryEditor.THUMB_LABEL, BinaryEditor.IMAGE_JPEG, message); } } } private AppConfiguration getConfig() throws DigitalObjectException { try { return AppConfigurationFactory.getInstance().defaultInstance(); } catch (AppConfigurationException ex) { throw new DigitalObjectException(objHandler.getFedoraObject().getPid(), null, dsId, "Broken configuration! ", ex); } } private boolean isPdf(File f) throws DigitalObjectException { try { return InputUtils.isPdf(f); } catch (IOException ex) { throw new DigitalObjectException(objHandler.getFedoraObject().getPid(), null, dsId, f.toString(), ex); } } }