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

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

package org.epos.handler.dbapi.dbapiimplementation;

import org.epos.eposdatamodel.CategoryScheme;
import org.epos.eposdatamodel.ContactPoint;
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 org.epos.handler.dbapi.util.LoggerFormat;

import javax.persistence.EntityManager;
import java.sql.Timestamp;
import java.util.ArrayList;
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 ContactPointDBAPI extends AbstractDBAPI {

	public ContactPointDBAPI() {
		super("contactpoint", EDMContactpoint.class);
	}

	@Override
	public LinkedEntity save(ContactPoint eposDataModelObject, EntityManager em, String edmInstanceId) {

		if (eposDataModelObject.getState().equals(State.PUBLISHED)
				&& isAlreadyPublished(EDMContactpoint.class, "contactpoint.findByUidAndState", em, eposDataModelObject))
			return new LinkedEntity();

		//search for a existing instance placeholder to be populated
		EDMContactpoint edmObject = getOneFromDB(em, EDMContactpoint.class,
				"contactpoint.findByUidAndState",
				"UID", eposDataModelObject.getUid(),
				"STATE", State.PLACEHOLDER.toString());

		if(edmObject==null) {
			edmObject = getOneFromDB(em, EDMContactpoint.class,
					"contactpoint.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 EDMContactpoint();
			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());

		if (Objects.nonNull(eposDataModelObject.getGroups())){
			for (Group group : eposDataModelObject.getGroups()){

				EDMGroup edmGroup =  getOneFromDB(em, EDMGroup.class, "group.findById",
						"ID", group.getId());

				if (Objects.isNull(edmGroup)){
					em.getTransaction().rollback();
					throw new IllegalArgumentException(LoggerFormat.log(eposDataModelObject, "is involved in a non existing group"));
				}

				EDMAuthorization edmAuthorization = getOneFromDB(em, EDMAuthorization.class, "authorization.findByMetaIdAndGroupId",
						"GROUPID", group.getId(),
						"METAID", edmObject.getEdmEntityIdByMetaId().getMetaId());

				if (Objects.isNull(edmAuthorization)){
					edmAuthorization = new EDMAuthorization();
					edmAuthorization.setEdmEntityIdByMetaId(edmObject.getEdmEntityIdByMetaId());
					edmAuthorization.setGroupByGroupId(edmGroup);
					em.persist(edmAuthorization);
				}
			}
		}


		if (eposDataModelObject.getInstanceChangedId() != null) {
			EDMContactpoint changedInstance = getOneFromDB(em, EDMContactpoint.class, "contactpoint.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.setContactpointByInstanceChangedId(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.getEmail() != null) {
			for(EDMContactpointEmail obj : edmObject.getContactpointEmailsByInstanceId()) {
				em.remove(obj);
			}
			edmObject.setContactpointEmailsByInstanceId(new ArrayList<>());
			for (String email : eposDataModelObject.getEmail()) {
				EDMContactpointEmail edmEmail = new EDMContactpointEmail();
				edmEmail.setId(UUID.randomUUID().toString());
				edmEmail.setEmail(email);
				edmEmail.setContactpointByInstanceContactpointId(edmObject);
				edmObject.getContactpointEmailsByInstanceId().add(edmEmail);
			}
		}
		for(EDMContactpointEmail obj : edmObject.getContactpointEmailsByInstanceId()) {
			em.remove(obj);
		}
		if (eposDataModelObject.getLanguage() != null) {
			for(EDMContactpointLanguage obj : edmObject.getContactpointLanguageByInstanceId()) {
				em.remove(obj);
			}
			edmObject.setContactpointLanguageByInstanceId(new ArrayList<>());
			for (String ln : eposDataModelObject.getLanguage()) {
				EDMContactpointLanguage edmContactpointLanguage = new EDMContactpointLanguage();
				edmContactpointLanguage.setId(UUID.randomUUID().toString());
				edmContactpointLanguage.setLanguage(ln);
				edmContactpointLanguage.setContactpointByInstanceContactpointId(edmObject);
				edmObject.getContactpointLanguageByInstanceId().add(edmContactpointLanguage);
			}
		}

		edmObject.setRole(eposDataModelObject.getRole());

		
		if (eposDataModelObject.getTelephone() != null) {
			for(EDMContactpointTelephone obj : edmObject.getContactpointTelephonesByInstanceId()) {
				em.remove(obj);
			}
			edmObject.setContactpointTelephonesByInstanceId(new ArrayList<>());
			for (String telephone : eposDataModelObject.getTelephone()) {
				EDMContactpointTelephone edmTelephone = new EDMContactpointTelephone();
				edmTelephone.setId(UUID.randomUUID().toString());
				edmTelephone.setTelnumber(telephone);
				edmTelephone.setContactpointByInstanceContactpointId(edmObject);
				edmObject.getContactpointTelephonesByInstanceId().add(edmTelephone);
			}
		}

		if (eposDataModelObject.getPerson() != null) {
			List edmPeoples = getFromDB(em, EDMPerson.class,
					"person.findByUid", "UID", eposDataModelObject.getPerson().getUid());

			edmPeoples.sort(EDMUtil::compareEntityVersion);

			EDMPerson edmPerson = !edmPeoples.isEmpty() ?
					edmPeoples.get(0) : null;

			EDMEdmEntityId edmPersonMetaId;

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

				edmPerson = new EDMPerson();
				edmPerson.setUid(eposDataModelObject.getPerson().getUid());
				edmPerson.setState(State.PLACEHOLDER.toString());
				edmPerson.setInstanceId(UUID.randomUUID().toString());
				em.persist(edmPerson);


				edmPerson.setEdmEntityIdByMetaId(edmPersonMetaId);
			} else {
				edmPersonMetaId = edmPerson.getEdmEntityIdByMetaId();
			}

			edmObject.setEdmEntityIdByMetaPersonId(edmPersonMetaId);
		}

		if (eposDataModelObject.getOrganization() != null) {
			List edmOrganizations = getFromDB(em, EDMOrganization.class,
					"organization.findByUid", "UID", eposDataModelObject.getOrganization().getUid());

			edmOrganizations.sort(EDMUtil::compareEntityVersion);

			EDMOrganization edmOrganization = !edmOrganizations.isEmpty() ?
					edmOrganizations.get(0) : null;

			EDMEdmEntityId edmMetaOrganization;

			if (edmOrganization == null) {
				edmOrganization = new EDMOrganization();
				edmOrganization.setUid(eposDataModelObject.getOrganization().getUid());
				edmOrganization.setState(State.PLACEHOLDER.toString());
				edmOrganization.setInstanceId(UUID.randomUUID().toString());
				em.persist(edmOrganization);

				edmMetaOrganization = new EDMEdmEntityId();
				edmMetaOrganization.setMetaId(UUID.randomUUID().toString());
				em.persist(edmMetaOrganization);

				edmOrganization.setEdmEntityIdByMetaId(edmMetaOrganization);
			} else {
				edmMetaOrganization = edmOrganization.getEdmEntityIdByMetaId();
			}

			edmObject.setEdmEntityIdByMetaOrganizationId(edmMetaOrganization);
		}


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


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

		EDMContactpoint edm = (EDMContactpoint) 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.setVersion(edm.getVersion());
			o.setChangeTimestamp(
					edm.getChangeTimestamp() != null ? edm.getChangeTimestamp().toLocalDateTime() : null
					);
			o.setChangeComment(edm.getChangeComment());
			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.setUid(edm.getUid());
		o.setEmail(
				edm.getContactpointEmailsByInstanceId() != null ?
						edm.getContactpointEmailsByInstanceId().stream()
						.map(EDMContactpointEmail::getEmail).collect(Collectors.toList()) :
							null
				);
		o.setLanguage(
				edm.getContactpointLanguageByInstanceId() != null ?
						edm.getContactpointLanguageByInstanceId().stream()
						.map(EDMContactpointLanguage::getLanguage).collect(Collectors.toList()) :
							null
				);
		o.setRole(edm.getRole());
		o.setTelephone(
				edm.getContactpointTelephonesByInstanceId() != null ?
						edm.getContactpointTelephonesByInstanceId().stream()
						.map(EDMContactpointTelephone::getTelnumber).collect(Collectors.toList()) :
							null
				);
		if (edm.getEdmEntityIdByMetaOrganizationId() != null && edm.getEdmEntityIdByMetaOrganizationId().getOrganizationsByMetaId() != null
				&& !edm.getEdmEntityIdByMetaOrganizationId().getOrganizationsByMetaId().isEmpty()) {
			List so = new ArrayList<>(edm.getEdmEntityIdByMetaOrganizationId().getOrganizationsByMetaId());
			so.sort(EDMUtil::compareEntityVersion);
			o.setOrganization(new LinkedEntity().metaId(so.get(0).getMetaId()).entityType("Organization").instanceId(so.get(0).getInstanceId()).uid(so.get(0).getUid()));
		}
		if (edm.getEdmEntityIdByMetaPersonId() != null && edm.getEdmEntityIdByMetaPersonId().getPeopleByMetaId() != null
				&& !edm.getEdmEntityIdByMetaPersonId().getPeopleByMetaId().isEmpty()) {
			List so = new ArrayList<>(edm.getEdmEntityIdByMetaPersonId().getPeopleByMetaId());
			so.sort(EDMUtil::compareEntityVersion);
			o.setPerson(new LinkedEntity().metaId(so.get(0).getMetaId()).entityType("Person").instanceId(so.get(0).getInstanceId()).uid(so.get(0).getUid()));
		}

		return o;
	}


}

















© 2015 - 2025 Weber Informatics LLC | Privacy Policy