001package org.nuxeo.ecm.platform.signature.core.sign;
002
003import java.text.SimpleDateFormat;
004import java.util.Date;
005
006import org.apache.commons.io.FilenameUtils;
007import org.apache.commons.logging.Log;
008import org.apache.commons.logging.LogFactory;
009import org.nuxeo.ecm.platform.signature.api.sign.SignatureService.SigningDisposition;
010import org.nuxeo.runtime.api.Framework;
011
012public class SignatureHelper {
013
014    private static final Log log = LogFactory.getLog(SignatureHelper.class);
015
016    /**
017     * If this system property is set to "true", then signature will use PDF/A.
018     */
019    public static final String SIGNATURE_USE_PDFA_PROP = "org.nuxeo.ecm.signature.pdfa";
020
021    /**
022     * Signature disposition for PDF files. Can be "replace", "archive" or "attach".
023     */
024    public static final String SIGNATURE_DISPOSITION_PDF = "org.nuxeo.ecm.signature.disposition.pdf";
025
026    /**
027     * Signature disposition for non-PDF files. Can be "replace", "archive" or "attach".
028     */
029    public static final String SIGNATURE_DISPOSITION_NOTPDF = "org.nuxeo.ecm.signature.disposition.notpdf";
030
031    public static final String SIGNATURE_ARCHIVE_FILENAME_FORMAT_PROP = "org.nuxeo.ecm.signature.archive.filename.format";
032
033    /** Used with {@link SimpleDateFormat}. */
034    public static final String DEFAULT_ARCHIVE_FORMAT = " ('archive' yyyy-MM-dd HH:mm:ss)";
035
036    private SignatureHelper() {}
037
038    public static boolean getPDFA() {
039        return Framework.isBooleanPropertyTrue(SIGNATURE_USE_PDFA_PROP);
040    }
041
042    public static SigningDisposition getDisposition(boolean originalIsPdf) {
043        String disp;
044        if (originalIsPdf) {
045            disp = Framework.getProperty(SIGNATURE_DISPOSITION_PDF, SigningDisposition.ARCHIVE.name());
046        } else {
047            disp = Framework.getProperty(SIGNATURE_DISPOSITION_NOTPDF, SigningDisposition.ATTACH.name());
048        }
049        try {
050            return Enum.valueOf(SigningDisposition.class, disp.toUpperCase());
051        } catch (RuntimeException e) {
052            log.warn("Invalid signing disposition: " + disp);
053            return SigningDisposition.ATTACH;
054        }
055    }
056
057    public static String getArchiveFilename(String filename) {
058        String format = Framework.getProperty(SIGNATURE_ARCHIVE_FILENAME_FORMAT_PROP, DEFAULT_ARCHIVE_FORMAT);
059        return FilenameUtils.getBaseName(filename) + new SimpleDateFormat(format).format(new Date()) + "."
060                + FilenameUtils.getExtension(filename);
061    }
062}