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

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

package org.epos.handler.dbapi.dbapiimplementation;


import org.epos.eposdatamodel.CategoryScheme;
import org.epos.eposdatamodel.Distribution;
import org.epos.eposdatamodel.Group;
import org.epos.eposdatamodel.LinkedEntity;
import org.epos.eposdatamodel.State;
import org.epos.handler.dbapi.model.*;
import org.epos.handler.dbapi.util.EDMUtil;

import javax.persistence.EntityManager;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
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 class DistributionDBAPI extends AbstractDBAPI {

    public DistributionDBAPI() {
        super("distribution", EDMDistribution.class);
    }

    @Override
    public LinkedEntity save(Distribution eposDataModelObject, EntityManager em, String edmInstanceId) {
        if (eposDataModelObject.getState().equals(State.PUBLISHED)
                && isAlreadyPublished(EDMDistribution.class, "distribution.findByUidAndState", em, eposDataModelObject))
            return new LinkedEntity();

        //search for a existing instance placeholder to be populated
        EDMDistribution edmObject = getOneFromDB(em, EDMDistribution.class,
                "distribution.findByUidAndState",
                "UID", eposDataModelObject.getUid(),
                "STATE", State.PLACEHOLDER.toString());
        
        if(edmObject==null) {
			edmObject = getOneFromDB(em, EDMDistribution.class,
					"distribution.findByInstanceId",
					"INSTANCEID", eposDataModelObject.getInstanceId());
		}

        //if there's a placeholder for the entity check if is passed a specific metaid
        //only if the metaid is the same of the placeholder merge the two (the placeholder and the passed entity)
        EDMEdmEntityId edmMetaId;

        boolean merged = false;

        if (edmObject != null &&
                (eposDataModelObject.getMetaId() == null || (eposDataModelObject.getMetaId() != null && eposDataModelObject.getMetaId().equals(edmObject.getMetaId())))) {
            //em.merge(edmObject);
            merged = true;

        } else {
            edmObject = new EDMDistribution();
            edmObject.setInstanceId(edmInstanceId);
            //em.persist(edmObject);

            if (eposDataModelObject.getMetaId() == null) {
                edmMetaId = new EDMEdmEntityId();
                edmMetaId.setMetaId(UUID.randomUUID().toString());
                em.persist(edmMetaId);
            } else {
                edmMetaId = getOneFromDB(em, EDMEdmEntityId.class,
                        "edmentityid.findByMetaId",
                        "METAID", eposDataModelObject.getMetaId());
                if (edmMetaId == null) {
                    edmMetaId = new EDMEdmEntityId();
                    edmMetaId.setMetaId(eposDataModelObject.getMetaId());
                    em.persist(edmMetaId);
                }
            }

            edmObject.setEdmEntityIdByMetaId(edmMetaId);

        }

        edmObject.setUid(eposDataModelObject.getUid() != null ? eposDataModelObject.getUid().replace("file:///app/", "") : null);

        if (eposDataModelObject.getInstanceChangedId() != null) {
            EDMDistribution changedInstance = getOneFromDB(em, EDMDistribution.class, "distribution.findByInstanceId",
                    "INSTANCEID", eposDataModelObject.getInstanceChangedId());
            if (changedInstance == null) {
                em.getTransaction().rollback();
                throw new IllegalArgumentException("Entity [" + eposDataModelObject.getClass().getSimpleName() + "] with uid: " + edmObject.getUid() + ", state: " + edmObject.getState()
                        + " and instanceId: " + edmObject.getInstanceId() + ", have an invalid 'InstanceChangedId'.");
            }
            edmObject.setDistributionByInstanceChangedId(changedInstance);
        }

        if (eposDataModelObject.getEditorId() == null) {
            em.getTransaction().rollback();
            throw new IllegalArgumentException("Entity [" + eposDataModelObject.getClass().getSimpleName() + "] with uid: " + edmObject.getUid() + ", state: " + edmObject.getState()
                    + " and instanceId: " + edmObject.getInstanceId() + ", doesn't have the editorid.");
        }
        EDMEdmEntityId edmMetaIdEditor = getOneFromDB(em, EDMEdmEntityId.class,
                "edmentityid.findByMetaId",
                "METAID", eposDataModelObject.getEditorId());

        if (edmMetaIdEditor == null) {
            em.getTransaction().rollback();
            throw new IllegalArgumentException("Entity [" + eposDataModelObject.getClass().getSimpleName() + "] with uid: " + edmObject.getUid() + ", state: " + eposDataModelObject.getState()
                    + " and instanceId: " + edmObject.getInstanceId() + ", the editor doesn't exist.");
        } else {
            edmObject.setEdmEntityIdByEditorMetaId(edmMetaIdEditor);
        }

        edmObject.setFileprovenance(eposDataModelObject.getFileProvenance());
        edmObject.setChangeTimestamp(new Timestamp(System.currentTimeMillis()));
        edmObject.setOperation(eposDataModelObject.getOperation());
        edmObject.setChangeComment(eposDataModelObject.getChangeComment());
        edmObject.setVersion(eposDataModelObject.getVersion());
        edmObject.setState(eposDataModelObject.getState().toString());
        edmObject.setToBeDeleted(Boolean.valueOf(eposDataModelObject.getToBeDelete()));
        if (!merged)
            em.persist(edmObject);


        if (eposDataModelObject.getAccessService() != null) {
			
            EDMWebservice instance = null;

            LinkedEntity linkedEntity = eposDataModelObject.getAccessService();

            if (linkedEntity.getInstanceId() != null) {
                instance = getOneFromDB(em, EDMWebservice.class,
                        "webservice.findByInstanceId", "INSTANCEID", linkedEntity.getInstanceId());
            }
            if (linkedEntity.getInstanceId() == null || instance == null) {
                List instanceList = getFromDB(em, EDMWebservice.class,
                        "webservice.findByUid", "UID", linkedEntity.getUid());

                instanceList.sort(EDMUtil::compareEntityVersion);

                instance = !instanceList.isEmpty() ? instanceList.get(0) : null;
            }


            if (instance == null) {
                EDMEdmEntityId edmInstanceMetaId = new EDMEdmEntityId();
                edmInstanceMetaId.setMetaId(UUID.randomUUID().toString());
                em.persist(edmInstanceMetaId);

                instance = new EDMWebservice();
                instance.setUid(eposDataModelObject.getAccessService().getUid());
                instance.setState(State.PLACEHOLDER.toString());
                instance.setInstanceId(UUID.randomUUID().toString());
                em.persist(instance);

                instance.setEdmEntityIdByMetaId(edmInstanceMetaId);
            }

            if (instance.getDistributionByInstanceId() == null)
                instance.setDistributionByInstanceId(new LinkedList<>());
            instance.getDistributionByInstanceId().add(edmObject);

            edmObject.setWebserviceByAccessService(instance);
        }

        if (eposDataModelObject.getAccessURL() != null) {

        	for(EDMDistributionAccessURL obj : edmObject.getAccessURLByInstanceId()) {
				em.remove(obj);
			}
            edmObject.setAccessURLByInstanceId(new ArrayList<>());
            for (LinkedEntity linkedEntity : eposDataModelObject.getAccessURL()) {
                EDMOperation instance = null;

                if (linkedEntity.getInstanceId() != null) {
                    instance = getOneFromDB(em, EDMOperation.class,
                            "operation.findByInstanceId", "INSTANCEID", linkedEntity.getInstanceId());
                }
                if (linkedEntity.getInstanceId() == null || instance == null) {
                    List instanceList = getFromDB(em, EDMOperation.class,
                            "operation.findByUid", "UID", linkedEntity.getUid());

                    instanceList.sort(EDMUtil::compareEntityVersion);

                    instance = !instanceList.isEmpty() ? instanceList.get(0) : null;
                }

                if (instance == null) {
                    EDMEdmEntityId edmOpMetaId = new EDMEdmEntityId();
                    edmOpMetaId.setMetaId(UUID.randomUUID().toString());
                    em.persist(edmOpMetaId);

                    instance = new EDMOperation();
                    instance.setUid(linkedEntity.getUid());
                    instance.setState(State.PLACEHOLDER.toString());
                    instance.setInstanceId(UUID.randomUUID().toString());
                    instance.setEdmEntityIdByMetaId(edmOpMetaId);
                    em.persist(instance);

                }

                EDMDistributionAccessURL edmSupportedOperation = getOneFromDB(em, EDMDistributionAccessURL.class,
                        "accessurl.findByinstanceId",
                        "DISTINST", edmObject.getInstanceId(),
                        "OPINST", instance.getInstanceId());

                if (Objects.nonNull(edmSupportedOperation)) continue;

                EDMDistributionAccessURL edmLink = new EDMDistributionAccessURL();
                edmLink.setDistributionByInstanceDistributionId(edmObject);
                edmLink.setOperationByInstanceOperationId(instance);

                em.persist(edmLink);

                edmObject.getAccessURLByInstanceId().add(edmLink);
            }
        }

        if (eposDataModelObject.getDescription() != null) {
        	for(EDMDistributionDescription obj : edmObject.getDistributionDescriptionsByInstanceId()) {
				em.remove(obj);
			}
            edmObject.setDistributionDescriptionsByInstanceId(new ArrayList<>());
            for (String description : eposDataModelObject.getDescription()) {
                EDMDistributionDescription edmDistributionDescription = new EDMDistributionDescription();

                edmDistributionDescription.setId(UUID.randomUUID().toString());
                edmDistributionDescription.setDescription(description);
                edmDistributionDescription.setDistributionByInstanceDistributionId(edmObject);

                edmObject.getDistributionDescriptionsByInstanceId().add(edmDistributionDescription);
            }
        }

        if (eposDataModelObject.getDownloadURL() != null) {
        	for(EDMDistributionDownloadurl obj : edmObject.getDistributionDownloadurlsByInstanceId()) {
				em.remove(obj);
			}
            edmObject.setDistributionDownloadurlsByInstanceId(new ArrayList<>());
            for (String downloadUrl : eposDataModelObject.getDownloadURL()) {
                EDMDistributionDownloadurl edmDistributionDownloadURL = new EDMDistributionDownloadurl();

                edmDistributionDownloadURL.setId(UUID.randomUUID().toString());
                edmDistributionDownloadURL.setDownloadurl(downloadUrl);
                edmDistributionDownloadURL.setDistributionByInstanceDistributionId(edmObject);

                edmObject.getDistributionDownloadurlsByInstanceId().add(edmDistributionDownloadURL);
            }
        }

        edmObject.setFormat(eposDataModelObject.getFormat());

        if (eposDataModelObject.getModified() != null)
            edmObject.setModified(Timestamp.valueOf(eposDataModelObject.getModified()));
        if (eposDataModelObject.getIssued() != null)
            edmObject.setIssued(Timestamp.valueOf(eposDataModelObject.getIssued()));

        edmObject.setLicense(eposDataModelObject.getLicence());

        if (eposDataModelObject.getTitle() != null) {
        	for(EDMDistributionTitle obj : edmObject.getDistributionTitlesByInstanceId()) {
				em.remove(obj);
			}
            edmObject.setDistributionTitlesByInstanceId(new ArrayList<>());
            for (String description : eposDataModelObject.getTitle()) {
                EDMDistributionTitle edmDistributionTitle = new EDMDistributionTitle();

                edmDistributionTitle.setId(UUID.randomUUID().toString());
                edmDistributionTitle.setTitle(description);
                edmDistributionTitle.setDistributionByInstanceDistributionId(edmObject);

                edmObject.getDistributionTitlesByInstanceId().add(edmDistributionTitle);
            }
        }

        edmObject.setType(eposDataModelObject.getType());
        edmObject.setDatapolicy(eposDataModelObject.getDataPolicy());
        edmObject.setConformsto(eposDataModelObject.getConformsTo());

        return new LinkedEntity().entityType(entityString)
                .instanceId(edmInstanceId)
                .metaId(edmObject.getEdmEntityIdByMetaId().getMetaId())
                .uid(eposDataModelObject.getUid());

    }

    @Override
    protected Distribution mapFromDB(Object edmObject) {
        Distribution o = new Distribution();

        EDMDistribution edm = (EDMDistribution) edmObject;
        if (!metadataMode) {
            o.setInstanceId(edm.getInstanceId());
            o.setMetaId(edm.getMetaId());
            o.setState(State.valueOf(edm.getState()));
            o.setOperation(edm.getOperation());
            if (edm.getEdmEntityIdByEditorMetaId() != null ) {
                o.setEditorId(edm.getEdmEntityIdByEditorMetaId().getMetaId());
            }
            o.setChangeComment(edm.getChangeComment());
            o.setVersion(edm.getVersion());
            o.setChangeTimestamp(
                    edm.getChangeTimestamp() != null ? edm.getChangeTimestamp().toLocalDateTime() : null
            );
            o.setToBeDelete(edm.getToBeDeleted() != null ? edm.getToBeDeleted().toString() : "false");
            o.setInstanceChangedId(edm.getInstanceChangedId());
            o.setFileProvenance(edm.getFileprovenance());

            o.setGroups(
                    edm.getEdmEntityIdByMetaId() != null && edm.getEdmEntityIdByMetaId().getAuthorizationsByMetaId() != null ?
                            edm.getEdmEntityIdByMetaId().getAuthorizationsByMetaId().stream()
                                    .map(EDMAuthorization::getGroupByGroupId)
                                    .map(e -> {
                                        Group group = new Group();
                                        group.setName(e.getName());
                                        group.setDescription(e.getDescription());
                                        group.setId(e.getId());
                                        return group;
                                    })
                                    .collect(Collectors.toList())
                            : null
            );


            o.setDataProduct(
                    edm.getIsDistributionsByInstanceId() != null ?
                            edm.getIsDistributionsByInstanceId().stream()
                                    .map(EDMIsDistribution::getDataproductByInstanceDataproductId)
                                    .map(d -> new LinkedEntity()
                                            .uid(d.getUid())
                                            .instanceId(d.getInstanceId())
                                            .entityType("dataproduct")
                                            .metaId(d.getMetaId()))
                                    .collect(Collectors.toList()) : null
            );

        }

        o.setUid(edm.getUid());
        if (edm.getWebserviceByAccessService() != null) {
            o.setAccessService(
                    new LinkedEntity()
                            .metaId(edm.getWebserviceByAccessService().getMetaId())
                            .uid(edm.getWebserviceByAccessService().getUid())
                            .instanceId(edm.getWebserviceByAccessService().getInstanceId())
                            .entityType("webservice")
            );
        }
        if (edm.getAccessURLByInstanceId() != null) {
            o.setAccessURL(new LinkedList<>());
            edm.getAccessURLByInstanceId().stream()
                    .map(EDMDistributionAccessURL::getOperationByInstanceOperationId)
                    .forEach(e -> o.getAccessURL().add(
                            new LinkedEntity()
                                    .metaId(e.getMetaId())
                                    .instanceId(e.getInstanceId())
                                    .uid(e.getUid())
                                    .entityType("operation")));
        }
        o.setDescription(
                edm.getDistributionDescriptionsByInstanceId() != null ?
                        edm.getDistributionDescriptionsByInstanceId().stream()
                                .map(EDMDistributionDescription::getDescription)
                                .collect(Collectors.toList())
                        : null
        );
        o.setDownloadURL(
                edm.getDistributionDownloadurlsByInstanceId() != null ?
                        edm.getDistributionDownloadurlsByInstanceId().stream()
                                .map(EDMDistributionDownloadurl::getDownloadurl).collect(Collectors.toList()) :
                        null
        );
        o.setFormat(edm.getFormat());
        o.setIssued(
                edm.getIssued() != null ? edm.getIssued().toLocalDateTime() : null
        );
        o.setModified(
                edm.getModified() != null ? edm.getModified().toLocalDateTime() : null
        );
        o.setTitle(
                edm.getDistributionTitlesByInstanceId() != null ?
                        edm.getDistributionTitlesByInstanceId().stream()
                                .map(EDMDistributionTitle::getTitle)
                                .collect(Collectors.toList())
                        : null
        );
        o.setType(edm.getType());
        o.setLicence(edm.getLicense());
        o.setDataPolicy(edm.getDatapolicy());
        o.setConformsTo(edm.getConformsto());
        return o;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy