public String doSign()

in signature/src/main/java/com/chemistry/enotebook/signature/SignatureUtil.java [43:97]


    public String doSign(String id, String username, String comment, byte[] keyStorage, String password) throws Exception {

        Document document = database.getDocument(id);
        if(document == null) {
            throw new MissingDocumentException("Error. Can't find document " + id + " in database.");
        }

        document.setContent(database.getDocumentContent(id));
        if(document.getContent() == null || document.getContent().length == 0) {
            throw new MissingDocumentException("Error. Content of document " + id + " is empty.");
        }

        User user = database.getUserByUsername(username);

        try {
            SignatureApplier signatureApplier = new SignatureFactory().getSignatureApplier(signatureProperties.getSigningMethod());
            DocumentSignatureBlock signatureBlock = document.getDocumentSignatureBlockForUser(user);
            if(signatureBlock != null) {
                signatureBlock.setComment(comment);
                byte[] signedDocument = signatureApplier.signDocument(document.getContent(), signatureBlock, keyStorage, password);
                if(signedDocument != null && signedDocument.length > 0) {
                    signatureBlock.setStatus(Status.SIGNED);
                    signatureBlock.setActionDate(System.currentTimeMillis());

                    for(DocumentSignatureBlock anySignatureBlock : document.getDocumentSignatureBlocks()) {
                        if(anySignatureBlock.getIndex() == signatureBlock.getIndex() + 1) {
                            anySignatureBlock.setStatus(Status.SIGNING);
                        }
                    }

                    document.setContent(signedDocument);
                    document.updateStatusAccordingToSignatureBlocks();
                    document.setLastUpdateDate(System.currentTimeMillis());

                    if(document.getStatus().equals(Status.SIGNED) && Status.ARCHIVED.toString().equalsIgnoreCase(signatureProperties.getFinalStatus())) {
                        archiver.updateDocumentStatusAndArchive(document);
                    }
                    database.updateDocument(document, true);

                    emailSender.sendEmailToNextSignerInSeparateThread(document, signatureProperties.getIndigoElnAddress());
                }
            } else {
                throw new SignatureException("User " + user.getUsername() + " is not able to sign document " + id + ".");
            }
        } catch (DocumentIntegrityException e) {
            removeDocument(document);
            return Util.generateErrorJsonString(Util.getMessageAboutDocumentRemove(document.getDocumentName()));
        } catch (Exception e) {
            throw new SignatureException("Failed to sign document " + document.getDocumentName() + ". " + e.getMessage());
        }

        document.updateActionRequiredFlagAndAddToDeliveryFlagAndInspectedFlagForCurrentUser(user.getUsername());

        return document.asJson().toString();
    }