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

org.epos.handler.dbapi.dbapiimplementation.AbstractDBAPI Maven / Gradle / Ivy

package org.epos.handler.dbapi.dbapiimplementation;

import org.epos.eposdatamodel.ContactPoint;
import org.epos.eposdatamodel.EPOSDataModelEntity;
import org.epos.eposdatamodel.LinkedEntity;
import org.epos.eposdatamodel.State;
import org.epos.handler.dbapi.EPOSDataModel;
import org.epos.handler.dbapi.service.DBService;

import javax.persistence.EntityManager;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import static org.epos.handler.dbapi.util.DBUtil.getFromDB;
import static org.epos.handler.dbapi.util.DBUtil.getOneFromDB;

public abstract class AbstractDBAPI implements EPOSDataModel {

    protected String entityString;
    protected String namedQuery_getByUid;
    protected String namedQuery_getByMetaId;
    protected String namedQuery_getAllByState;
    protected String namedQuery_getAll;
    protected String namedQuery_getByUidAndState;
    protected String namedQuery_getByInstanceId;
    protected String namedQuery_getByFileProvenance;
    protected Class edmClass;

    protected boolean metadataMode = true;

    public AbstractDBAPI(String entityString, Class edmClass) {
        this.entityString = entityString;
        this.namedQuery_getByUid = entityString + ".findByUid";
        this.namedQuery_getAll = entityString + ".findAll";
        this.namedQuery_getByUidAndState = entityString + ".findByUidAndState";
        this.namedQuery_getByMetaId = entityString + ".findAllByMetaId";
        this.namedQuery_getAllByState = entityString + ".findAllByState";
        this.namedQuery_getByFileProvenance = entityString + ".findByFileProvenance";
        this.namedQuery_getByInstanceId = entityString + ".findByInstanceId";

        this.edmClass = edmClass;
    }

    public boolean isMetadataMode() {
        return metadataMode;
    }

    public void setMetadataMode(boolean metadataMode) {
        this.metadataMode = metadataMode;
    }

    public AbstractDBAPI metadataMode(boolean metadataMode) {
        this.metadataMode = metadataMode;
        return this;
    }

    @Override
    public List getAllByFileProvenance(String fileProvenance, EntityManager em) {
        return getList(namedQuery_getByFileProvenance, edmClass, "FPROV", fileProvenance, em);
    }

    @Override
    public List getByMetaId(String metaId, EntityManager em) {
        return getList(namedQuery_getByMetaId, edmClass, "METAID", metaId, em);
    }


    @Override
    public List getAllByState(State state, EntityManager em) {
        return getList(namedQuery_getAllByState, edmClass, "STATE", state.toString(), em);
    }

    @Override
    public List getByUid(String uid, EntityManager em) {
        return getByUidHelper(edmClass, namedQuery_getByUid, em, uid);
    }

    @Override
    public void save(T eposDataModelObject) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();

        save(eposDataModelObject, em);

        if (em.getTransaction().isActive()) {
            em.getTransaction().commit();
            em.getEntityManagerFactory().getCache().evictAll();
        }
        em.close();

    }

    @Override
    public LinkedEntity save(T eposDataModelObject, EntityManager em) {
        String instanceId = UUID.randomUUID().toString();
        return save(eposDataModelObject, em, instanceId);
    }

    @Override
    public void hardUpdate(String instanceId, T eposDataModelObject) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();
        hardUpdate(instanceId, eposDataModelObject, em);
        em.getTransaction().commit();
        em.close();
    }

    @Override
    public void hardUpdate(String instanceId, T eposDataModelObject, EntityManager em) {
        delete(instanceId, em);
        em.flush();
        //System.out.println(getByInstanceId(instanceId, em));
        System.out.println(save(eposDataModelObject, em, instanceId));
    }
    
	@Override
    public LinkedEntity hardUpdateWithLink(String instanceId, T eposDataModelObject, EntityManager em) {
        delete(instanceId, em);
        em.flush();
        //System.out.println(getByInstanceId(instanceId, em));
        return save(eposDataModelObject, em, instanceId);
    }
	
	@Override
	public LinkedEntity transparentUpdate(String instanceId, T eposDataModelObject, EntityManager em) {

		if(!em.getTransaction().isActive())
			em.getTransaction().begin();
        em.merge(eposDataModelObject);
        em.getTransaction().commit();
		em.close();
		LinkedEntity returnEntity = new LinkedEntity();
		returnEntity.setEntityType(eposDataModelObject.getClass().getSimpleName().toLowerCase());
		returnEntity.setUid(eposDataModelObject.getUid());
		returnEntity.setInstanceId(eposDataModelObject.getInstanceId());
		returnEntity.setMetaId(eposDataModelObject.getMetaId());
        //System.out.println(getByInstanceId(instanceId, em));
        return returnEntity;
    }


    @Override
    public void delete(String instanceId) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();

        delete(instanceId, em);

        em.getTransaction().commit();
        em.close();
    }

    public T getByUidPublished(String uid, EntityManager em) {

        List list = getList(namedQuery_getByUidAndState, edmClass, "UID", uid, "STATE", State.PUBLISHED.toString(), em);
        return list.isEmpty() ? null : list.get(0);
    }

    @Override
    public T getByUidPublished(String uid) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();

        T byUidPublished = getByUidPublished(uid, em);

        em.getTransaction().commit();
        em.close();

        return byUidPublished;
    }

    public List getAllByGroup(List id) {
        return null;
    }

    @Override
    public void updateStatus(String instanceId, State state) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();

        updateStatus(instanceId, state, em);

        em.getTransaction().commit();
        em.close();
    }

    @Override
    public T getByInstanceId(String instanceId) {
        EntityManager em = new DBService().getEntityManager();
        em.getTransaction().begin();

        T instance = getByInstanceId(instanceId, em);

        em.getTransaction().commit();
        em.close();

        return instance;
    }

    protected List getList(String namedQueryName, Class jpaClass, EntityManager em) {
        return getFromDB(em, jpaClass, namedQueryName).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());
    }

    protected List getList(String namedQueryName, Class jpaClass, String paramName, String param, EntityManager em) {
        return getFromDB(em, jpaClass, namedQueryName, paramName, param).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());
    }

    protected List getList(String namedQueryName, Class jpaClass, String paramName, String param, String paramName1, String param1, EntityManager em) {
        return getFromDB(em, jpaClass, namedQueryName, paramName, param, paramName1, param1).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());
    }

    protected List getList(String namedQueryName, Class jpaClass) {
        EntityManager em = new DBService().getEntityManager();

        List list = getFromDB(em, jpaClass, namedQueryName).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());

        em.close();
        return list;
    }

    protected List getList(String namedQueryName, Class jpaClass, String paramName, String param) {
        EntityManager em = new DBService().getEntityManager();

        List list = getFromDB(em, jpaClass, namedQueryName, paramName, param).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());

        em.close();
        return list;
    }

    protected abstract T mapFromDB(Object edmObject);

    protected  List getByUidHelper(Class clazz, String namedQuery, EntityManager em, String uid) {
        List publishedList = getFromDB(em, clazz, namedQuery,
                "UID", uid);
        return publishedList.stream().map(this::mapFromDB).collect(Collectors.toList());
    }

    protected  boolean isAlreadyPublished(Class clazz, String namedQuery, EntityManager em, T eposDataModelObject) {
        //if the instace need to be public check if is correct (duplicate)
        D published = getOneFromDB(em, clazz, namedQuery,
                "UID", eposDataModelObject.getUid(),
                "STATE", State.PUBLISHED.toString());

        if (published != null) {
            try {

                String methodFileProvenanceName = "getFileprovenance";
                Method methodFileProvenance = published.getClass().getMethod(methodFileProvenanceName);
                String fileProvenance = (String) methodFileProvenance.invoke(published);

                String methodMetaIdName = "getMetaId";
                Method methodMetaId = published.getClass().getMethod(methodMetaIdName);
                String metaId = (String) methodMetaId.invoke(published);

                System.err.println("Entity [" + eposDataModelObject.getClass().getSimpleName() + "] with uid: "
                        + eposDataModelObject.getUid() + " and metaid: " + metaId + ", is already published" +
                        (fileProvenance != null ? " (found in file: " + fileProvenance + ")." : "."));
                return true;
            } catch (NoSuchMethodException | NullPointerException | IllegalAccessException | InvocationTargetException ignored) {
            }
            em.getTransaction().rollback();
            return true;
        }
        return false;
    }

    @Override
    public void updateStatus(String instanceId, State state, EntityManager em) {
        Object fromDB = getOneFromDB(em, edmClass, namedQuery_getByInstanceId, "INSTANCEID", instanceId);

        if (fromDB == null) return;
        try {
            Method method = fromDB.getClass().getMethod("setState", String.class);
            method.invoke(fromDB, state.toString());
        } catch (NoSuchMethodException | NullPointerException | IllegalAccessException | InvocationTargetException ignored) {
            em.getTransaction().rollback();

        }
        em.merge(fromDB);
    }

    @Override
    public void delete(String instanceId, EntityManager em) {
        Object fromDB = getOneFromDB(em, edmClass, namedQuery_getByInstanceId, "INSTANCEID", instanceId);
        if (fromDB != null) {
            em.remove(fromDB);
        }
    }


    @Override
    public List getByMetaId(String metaId) {
        return getList(namedQuery_getByMetaId, edmClass, "METAID", metaId);
    }

    @Override
    public List getByUid(String uid) {
        EntityManager em = new DBService().getEntityManager();
        List list = getByUidHelper(edmClass, namedQuery_getByUid, em, uid);
        em.close();
        return list;
    }

    @Override
    public T getByInstanceId(String instanceId, EntityManager em) {
        Object fromDB = getOneFromDB(em, edmClass, namedQuery_getByInstanceId, "INSTANCEID", instanceId);
        if (fromDB != null) return mapFromDB(fromDB);
        return null;
    }

    @Override
    public List getAll() {
        EntityManager em = new DBService().getEntityManager();

        List list = getAll(em);

        em.close();
        return list;
    }

    @Override
    public List getAll(EntityManager em) {
        return getFromDB(em, edmClass, namedQuery_getAll).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());
    }


    @Override
    public List getAllByState(State state) {
        EntityManager em = new DBService().getEntityManager();

        List list = getFromDB(em, edmClass, namedQuery_getAllByState, "STATE", state.toString()).stream()
                .map(this::mapFromDB)
                .collect(Collectors.toList());

        em.close();
        return list;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy