Search in sources :

Example 1 with AttachmentPersistenceException

use of pro.taskana.exceptions.AttachmentPersistenceException in project taskana by Taskana.

the class TaskServiceImplTest method testUpdateTaskAddingAttachmentWithSameIdForcedUsingingListMethod.

@Test(expected = AttachmentPersistenceException.class)
public void testUpdateTaskAddingAttachmentWithSameIdForcedUsingingListMethod() throws TaskNotFoundException, SystemException, WorkbasketNotFoundException, ClassificationNotFoundException, InvalidArgumentException, ConcurrencyException, InvalidWorkbasketException, NotAuthorizedException, AttachmentPersistenceException {
    Classification classification = createDummyClassification();
    Workbasket wb = createWorkbasket("WB-ID", "WB-Key");
    Attachment attachment = JunitHelper.createDefaultAttachment();
    ObjectReference objectReference = JunitHelper.createDefaultObjRef();
    TaskImpl taskBeforeAttachment = createUnitTestTask("ID", "taskName", wb.getKey(), classification);
    TaskImpl task = createUnitTestTask("ID", "taskName", wb.getKey(), classification);
    taskBeforeAttachment.setModified(null);
    taskBeforeAttachment.setCreated(Instant.now());
    task.setModified(null);
    task.setCreated(taskBeforeAttachment.getCreated());
    task.setPrimaryObjRef(objectReference);
    task.setAttachments(new ArrayList<>());
    task.getAttachments().add(attachment);
    task.getAttachments().add(attachment);
    TaskServiceImpl cutSpy = Mockito.spy(cut);
    doReturn(taskBeforeAttachment).when(cutSpy).getTask(task.getId());
    doThrow(PersistenceException.class).when(attachmentMapperMock).insert(any());
    try {
        cutSpy.updateTask(task);
    } catch (AttachmentPersistenceException e) {
        verify(taskanaEngineMock, times(1)).openConnection();
        verify(cutSpy, times(1)).getTask(task.getId());
        verify(attachmentMapperMock, times(1)).insert(((AttachmentImpl) attachment));
        verify(taskanaEngineMock, times(1)).returnConnection();
        throw e;
    }
}
Also used : Classification(pro.taskana.Classification) Attachment(pro.taskana.Attachment) Workbasket(pro.taskana.Workbasket) AttachmentPersistenceException(pro.taskana.exceptions.AttachmentPersistenceException) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 2 with AttachmentPersistenceException

use of pro.taskana.exceptions.AttachmentPersistenceException in project taskana by Taskana.

the class TaskServiceImpl method handleAttachmentsOnTaskUpdate.

private PrioDurationHolder handleAttachmentsOnTaskUpdate(TaskImpl oldTaskImpl, TaskImpl newTaskImpl) throws AttachmentPersistenceException {
    Duration minDuration = MAX_DURATION;
    int maxPrio = Integer.MIN_VALUE;
    // Iterator for removing invalid current values directly. OldAttachments can be ignored.
    Iterator<Attachment> i = newTaskImpl.getAttachments().iterator();
    while (i.hasNext()) {
        Attachment attachment = i.next();
        if (attachment != null) {
            boolean wasAlreadyPresent = false;
            if (attachment.getId() != null) {
                for (Attachment oldAttachment : oldTaskImpl.getAttachments()) {
                    if (oldAttachment != null && attachment.getId().equals(oldAttachment.getId())) {
                        wasAlreadyPresent = true;
                        if (!attachment.equals(oldAttachment)) {
                            AttachmentImpl temp = (AttachmentImpl) attachment;
                            ClassificationSummary classification = attachment.getClassificationSummary();
                            if (classification != null) {
                                PrioDurationHolder newPrioDuration = getNewPrioDuration(maxPrio, minDuration, classification.getPriority(), classification.getServiceLevel());
                                maxPrio = newPrioDuration.getPrio();
                                minDuration = newPrioDuration.getDuration();
                            }
                            temp.setModified(Instant.now());
                            attachmentMapper.update(temp);
                            LOGGER.debug("TaskService.updateTask() for TaskId={} UPDATED an Attachment={}.", newTaskImpl.getId(), attachment);
                            break;
                        }
                    }
                }
            }
            // ADD, when ID not set or not found in elements
            if (!wasAlreadyPresent) {
                AttachmentImpl attachmentImpl = (AttachmentImpl) attachment;
                initAttachment(attachmentImpl, newTaskImpl);
                ClassificationSummary classification = attachment.getClassificationSummary();
                if (classification != null) {
                    PrioDurationHolder newPrioDuration = getNewPrioDuration(maxPrio, minDuration, classification.getPriority(), classification.getServiceLevel());
                    maxPrio = newPrioDuration.getPrio();
                    minDuration = newPrioDuration.getDuration();
                }
                try {
                    attachmentMapper.insert(attachmentImpl);
                    LOGGER.debug("TaskService.updateTask() for TaskId={} INSERTED an Attachment={}.", newTaskImpl.getId(), attachmentImpl);
                } catch (PersistenceException e) {
                    LOGGER.error("TaskService.updateTask() for TaskId={} can NOT INSERT the current Attachment, because it was added fored multiple times and wasn´t persisted before. ID={}", newTaskImpl.getId(), attachmentImpl.getId());
                    throw new AttachmentPersistenceException(attachmentImpl.getId());
                }
            }
        } else {
            i.remove();
        }
    }
    // DELETE, when an Attachment was only represented before
    for (Attachment oldAttachment : oldTaskImpl.getAttachments()) {
        if (oldAttachment != null) {
            boolean isRepresented = false;
            for (Attachment newAttachment : newTaskImpl.getAttachments()) {
                if (newAttachment != null && oldAttachment.getId().equals(newAttachment.getId())) {
                    isRepresented = true;
                    break;
                }
            }
            if (!isRepresented) {
                attachmentMapper.deleteAttachment(oldAttachment.getId());
                LOGGER.debug("TaskService.updateTask() for TaskId={} DELETED an Attachment={}.", newTaskImpl.getId(), oldAttachment);
            }
        }
    }
    if (minDuration != null && MAX_DURATION.equals(minDuration)) {
        minDuration = null;
    }
    return new PrioDurationHolder(minDuration, maxPrio);
}
Also used : ClassificationSummary(pro.taskana.ClassificationSummary) PersistenceException(org.apache.ibatis.exceptions.PersistenceException) AttachmentPersistenceException(pro.taskana.exceptions.AttachmentPersistenceException) Duration(java.time.Duration) Attachment(pro.taskana.Attachment) AttachmentPersistenceException(pro.taskana.exceptions.AttachmentPersistenceException)

Aggregations

Attachment (pro.taskana.Attachment)2 AttachmentPersistenceException (pro.taskana.exceptions.AttachmentPersistenceException)2 Duration (java.time.Duration)1 PersistenceException (org.apache.ibatis.exceptions.PersistenceException)1 Test (org.junit.Test)1 PrepareForTest (org.powermock.core.classloader.annotations.PrepareForTest)1 Classification (pro.taskana.Classification)1 ClassificationSummary (pro.taskana.ClassificationSummary)1 Workbasket (pro.taskana.Workbasket)1