All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cloudfoundry.multiapps.controller.persistence.services.PersistenceService Maven / Gradle / Ivy

package org.cloudfoundry.multiapps.controller.persistence.services;

import java.text.MessageFormat;
import java.util.function.Function;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.RollbackException;

import org.cloudfoundry.multiapps.controller.persistence.Messages;
import org.cloudfoundry.multiapps.controller.persistence.TransactionalExecutor;
import org.cloudfoundry.multiapps.controller.persistence.dto.DtoWithPrimaryKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class PersistenceService, P> {

    private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceService.class);

    private final EntityManagerFactory entityManagerFactory;

    protected PersistenceService(EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    public T add(T object) {
        D dto = getPersistenceObjectMapper().toDto(object);
        try {
            D newDto = executeInTransaction(manager -> {
                manager.persist(dto);
                return dto;
            });
            return getPersistenceObjectMapper().fromDto(newDto);
        } catch (RollbackException e) {
            LOGGER.error(MessageFormat.format(Messages.ERROR_WHILE_EXECUTING_TRANSACTION, e.getMessage()));
            onEntityConflict(dto, e);
        }
        return null;
    }

    public T update(T oldObject, T newObject) {
        D oldDto = getPersistenceObjectMapper().toDto(oldObject);
        D newDto = getPersistenceObjectMapper().toDto(newObject);
        try {
            return executeInTransaction(manager -> update(oldDto.getPrimaryKey(), newDto, manager));
        } catch (RollbackException e) {
            LOGGER.error(MessageFormat.format(Messages.ERROR_WHILE_EXECUTING_TRANSACTION, e.getMessage()));
            onEntityConflict(newDto, e);
        }
        return null;
    }

    private  R executeInTransaction(Function function) {
        return new TransactionalExecutor(createEntityManager()).execute(function);
    }

    protected EntityManager createEntityManager() {
        return entityManagerFactory.createEntityManager();
    }

    private T update(P primaryKey, D newDto, EntityManager manager) {
        @SuppressWarnings("unchecked")
        D existingDto = manager.find((Class) newDto.getClass(), primaryKey);
        if (existingDto == null) {
            onEntityNotFound(primaryKey);
        }
        D dto = merge(existingDto, newDto);
        manager.merge(dto);
        return getPersistenceObjectMapper().fromDto(dto);
    }

    protected D merge(D existingPersistenceObject, D newPersistenceObject) {
        newPersistenceObject.setPrimaryKey(existingPersistenceObject.getPrimaryKey());
        return newPersistenceObject;
    }

    protected abstract PersistenceObjectMapper getPersistenceObjectMapper();

    protected abstract void onEntityConflict(D dto, Throwable t);

    protected abstract void onEntityNotFound(P primaryKey);

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy