
org.epos.handler.dbapi.dbapiimplementation.WebServiceDBAPI Maven / Gradle / Ivy
package org.epos.handler.dbapi.dbapiimplementation;
import org.epos.eposdatamodel.*;
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.*;
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 WebServiceDBAPI extends AbstractDBAPI {
public WebServiceDBAPI() {
super("webservice", EDMWebservice.class);
}
@Override
public LinkedEntity save(WebService eposDataModelObject, EntityManager em, String edmInstanceId) {
if (eposDataModelObject.getState().equals(State.PUBLISHED)
&& isAlreadyPublished(EDMWebservice.class, "webservice.findByUidAndState", em, eposDataModelObject))
return new LinkedEntity();
//search for a existing instance placeholder to be populated
EDMWebservice edmObject = getOneFromDB(em, EDMWebservice.class,
"webservice.findByUidAndState",
"UID", eposDataModelObject.getUid(),
"STATE", State.PLACEHOLDER.toString());
if(edmObject==null) {
edmObject = getOneFromDB(em, EDMWebservice.class,
"webservice.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 EDMWebservice();
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) {
EDMWebservice changedInstance = getOneFromDB(em, EDMWebservice.class, "webservice.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.setWebserviceByInstanceChangedId(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.getCategory() != null) {
for(EDMWebserviceCategory obj : edmObject.getWebserviceCategoriesByInstanceId()) {
em.remove(obj);
}
for (String categoryName : eposDataModelObject.getCategory()) {
EDMCategory edmCategory = getOneFromDB(em, EDMCategory.class, "EDMCategory.findByUid",
"UID", categoryName);
if (edmCategory == null) {
edmCategory = new EDMCategory();
edmCategory.setUid(categoryName);
edmCategory.setId(UUID.randomUUID().toString());
em.persist(edmCategory);
}
EDMWebserviceCategory edmWebserviceCategory = new EDMWebserviceCategory();
edmWebserviceCategory.setCategoryByCategoryId(edmCategory);
edmWebserviceCategory.setWebserviceByInstanceWebserviceId(edmObject);
em.persist(edmWebserviceCategory);
if (edmCategory.getWebserviceCategoriesById() == null)
edmCategory.setWebserviceCategoriesById(new ArrayList<>());
edmCategory.getWebserviceCategoriesById().add(edmWebserviceCategory);
edmObject.getWebserviceCategoriesByInstanceId().add(edmWebserviceCategory);
}
}
if (eposDataModelObject.getContactPoint() != null) {
for(EDMContactpointWebservice obj : edmObject.getContactpointWebservicesByInstanceId()) {
em.remove(obj);
}
edmObject.setContactpointWebservicesByInstanceId(new ArrayList<>());
for (LinkedEntity contactpointLinked : eposDataModelObject.getContactPoint()) {
EDMContactpoint edmContactPoint = null;
// First check if a instanceId is passed, in that case link the connected contactpoint,
// Otherwise just use the uid and take an already existing contactpoint (preferably a PUBLISHED one)
if (contactpointLinked.getInstanceId() != null) {
edmContactPoint = getOneFromDB(em, EDMContactpoint.class,
"contactpoint.findByInstanceId", "INSTANCEID", contactpointLinked.getInstanceId());
}
if (contactpointLinked.getInstanceId() == null || edmContactPoint == null) {
List edmContactPoints = getFromDB(em, EDMContactpoint.class,
"contactpoint.findByUid", "UID", contactpointLinked.getUid());
edmContactPoints.sort(EDMUtil::compareEntityVersion);
edmContactPoint = !edmContactPoints.isEmpty() ? edmContactPoints.get(0) : null;
}
if (edmContactPoint == null) {
EDMEdmEntityId edmContactPointMetaId = new EDMEdmEntityId();
edmContactPointMetaId.setMetaId(UUID.randomUUID().toString());
em.persist(edmContactPointMetaId);
edmContactPoint = new EDMContactpoint();
edmContactPoint.setUid(contactpointLinked.getUid());
edmContactPoint.setState(State.PLACEHOLDER.toString());
edmContactPoint.setInstanceId(UUID.randomUUID().toString());
edmContactPoint.setEdmEntityIdByMetaId(edmContactPointMetaId);
em.persist(edmContactPoint);
}
EDMContactpointWebservice edmContactpointDataproduct = new EDMContactpointWebservice();
edmContactpointDataproduct.setWebserviceByInstanceWebserviceId(edmObject);
edmContactpointDataproduct.setContactpointByInstanceContactpointId(edmContactPoint);
em.persist(edmContactpointDataproduct);
edmObject.getContactpointWebservicesByInstanceId().add(edmContactpointDataproduct);
}
}
if (eposDataModelObject.getDatePublished() != null)
edmObject.setDatapublished(Timestamp.valueOf(eposDataModelObject.getDatePublished()));
if (eposDataModelObject.getDateModified() != null)
edmObject.setDatamodified(Timestamp.valueOf(eposDataModelObject.getDateModified()));
edmObject.setName(eposDataModelObject.getName());
edmObject.setDescription(eposDataModelObject.getDescription());
if (eposDataModelObject.getDocumentation() != null) {
for(EDMWebserviceDocumentation obj : edmObject.getWebserviceDocumentationsByInstanceId()) {
em.remove(obj);
}
edmObject.setWebserviceDocumentationsByInstanceId(new ArrayList<>());
for (Documentation documentation : eposDataModelObject.getDocumentation()) {
EDMWebserviceDocumentation edmWebserviceDocumentation = new EDMWebserviceDocumentation();
edmWebserviceDocumentation.setId(UUID.randomUUID().toString());
edmWebserviceDocumentation.setDocumentation(documentation.getUri());
edmWebserviceDocumentation.setWebserviceByInstanceWebserviceId(edmObject);
edmObject.getWebserviceDocumentationsByInstanceId().add(edmWebserviceDocumentation);
}
}
edmObject.setEntrypoint(eposDataModelObject.getEntryPoint());
edmObject.setKeywords(eposDataModelObject.getKeywords());
edmObject.setLicense(eposDataModelObject.getLicense());
if (eposDataModelObject.getProvider() != null) {
List edmOrganizations = getFromDB(em, EDMOrganization.class,
"organization.findByUid", "UID", eposDataModelObject.getProvider().getUid());
edmOrganizations.sort(EDMUtil::compareEntityVersion);
EDMOrganization edmOrganization = !edmOrganizations.isEmpty() ?
edmOrganizations.get(0) : null;
EDMEdmEntityId edmPersonMetaId;
if (edmOrganization == null) {
edmPersonMetaId = new EDMEdmEntityId();
edmPersonMetaId.setMetaId(UUID.randomUUID().toString());
em.persist(edmPersonMetaId);
edmOrganization = new EDMOrganization();
edmOrganization.setUid(eposDataModelObject.getProvider().getUid());
edmOrganization.setState(State.PLACEHOLDER.toString());
edmOrganization.setInstanceId(UUID.randomUUID().toString());
em.persist(edmOrganization);
edmOrganization.setEdmEntityIdByMetaId(edmPersonMetaId);
} else {
edmPersonMetaId = edmOrganization.getEdmEntityIdByMetaId();
}
edmObject.setEdmEntityIdByProvider(edmPersonMetaId);
}
if (eposDataModelObject.getSpatialExtent() != null) {
for(EDMWebserviceSpatial obj : edmObject.getWebserviceSpatialsByInstanceId()) {
em.remove(obj);
}
edmObject.setWebserviceSpatialsByInstanceId(new ArrayList<>());
for (Location location : eposDataModelObject.getSpatialExtent()) {
if (location.getLocation() == null)
continue;
EDMWebserviceSpatial edmWebserviceSpatial = new EDMWebserviceSpatial();
edmWebserviceSpatial.setId(UUID.randomUUID().toString());
edmWebserviceSpatial.setWebserviceByInstanceWebserviceId(edmObject);
edmWebserviceSpatial.setLocation(location.getLocation());
edmObject.getWebserviceSpatialsByInstanceId().add(edmWebserviceSpatial);
}
}
if (eposDataModelObject.getTemporalExtent() != null) {
for(EDMWebserviceTemporal obj : edmObject.getWebserviceTemporalsByInstanceId()) {
em.remove(obj);
}
edmObject.setWebserviceTemporalsByInstanceId(new ArrayList<>());
for (PeriodOfTime temporal : eposDataModelObject.getTemporalExtent()) {
EDMWebserviceTemporal edmWebserviceTemporal = new EDMWebserviceTemporal();
edmWebserviceTemporal.setId(UUID.randomUUID().toString());
edmWebserviceTemporal.setStartdate(
temporal.getStartDate() != null ?
Timestamp.valueOf(temporal.getStartDate())
: null
);
edmWebserviceTemporal.setEnddate(
temporal.getEndDate() != null ?
Timestamp.valueOf(temporal.getEndDate())
: null
);
edmWebserviceTemporal.setWebserviceByInstanceWebserviceId(edmObject);
edmObject.getWebserviceTemporalsByInstanceId().add(edmWebserviceTemporal);
}
}
if (eposDataModelObject.getSupportedOperation() != null) {
for(EDMSupportedOperation obj : edmObject.getSupportedOperationByInstanceId()) {
em.remove(obj);
}
edmObject.setSupportedOperationByInstanceId(new ArrayList<>());
for (LinkedEntity linkedEntity : eposDataModelObject.getSupportedOperation()) {
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);
}
EDMSupportedOperation edmSupportedOperation = getOneFromDB(em, EDMSupportedOperation.class,
"supportedOperation.findByinstanceId",
"WSINST", edmObject.getInstanceId(),
"OPINST", instance.getInstanceId());
if (Objects.nonNull(edmSupportedOperation)) continue;
EDMSupportedOperation edmLink = new EDMSupportedOperation();
edmLink.setWebserviceByInstanceWebserviceId(edmObject);
edmLink.setOperationByInstanceOperationId(instance);
em.persist(edmLink);
edmObject.getSupportedOperationByInstanceId().add(edmLink);
}
}
if (eposDataModelObject.getRelation() != null) {
for(EDMWebserviceRelation obj : edmObject.getWebserviceRelationByInstanceId()) {
em.remove(obj);
}
edmObject.setWebserviceRelationByInstanceId(new ArrayList<>());
for (LinkedEntity linkedEntity : eposDataModelObject.getRelation()) {
EDMWebservice instance = null;
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 edmOpMetaId = new EDMEdmEntityId();
edmOpMetaId.setMetaId(UUID.randomUUID().toString());
em.persist(edmOpMetaId);
instance = new EDMWebservice();
instance.setUid(linkedEntity.getUid());
instance.setState(State.PLACEHOLDER.toString());
instance.setInstanceId(UUID.randomUUID().toString());
instance.setEdmEntityIdByMetaId(edmOpMetaId);
em.persist(instance);
}
EDMWebserviceRelation edmWebserviceRelation = new EDMWebserviceRelation();
edmWebserviceRelation.setWebserviceByInstanceWebserviceId(edmObject);
edmWebserviceRelation.setWebserviceByInstanceWebserviceId_0(instance);
edmObject.getWebserviceRelationByInstanceId().add(edmWebserviceRelation);
}
}
edmObject.setAaaitypes(eposDataModelObject.getAaaiTypes());
return new LinkedEntity().entityType(entityString)
.instanceId(edmInstanceId)
.metaId(edmObject.getEdmEntityIdByMetaId().getMetaId())
.uid(eposDataModelObject.getUid());
}
@Override
protected WebService mapFromDB(Object edmObject) {
EDMWebservice edm = (EDMWebservice) edmObject;
WebService o = new WebService().keywords(edm.getKeywords());
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.setDistribution(
edm.getDistributionByInstanceId() != null ?
edm.getDistributionByInstanceId().stream()
.map(d -> new LinkedEntity()
.uid(d.getUid())
.instanceId(d.getInstanceId())
.entityType("Distribution")
.metaId(d.getMetaId()))
.collect(Collectors.toList()) : null
);
}
o.setUid(edm.getUid());
o.setCategory(
edm.getWebserviceCategoriesByInstanceId() != null ?
edm.getWebserviceCategoriesByInstanceId().stream()
.map(EDMWebserviceCategory::getCategoryByCategoryId)
.map(EDMCategory::getName)
.collect(Collectors.toList())
: null
);
if (edm.getContactpointWebservicesByInstanceId() != null) {
o.setContactPoint(new LinkedList<>());
edm.getContactpointWebservicesByInstanceId().stream()
.map(EDMContactpointWebservice::getContactpointByInstanceContactpointId)
.forEach(e -> o.getContactPoint().add(
new LinkedEntity()
.metaId(e.getMetaId())
.instanceId(e.getInstanceId())
.uid(e.getUid())
.entityType("ContactPoint")));
}
o.setDateModified(
edm.getDatamodified() != null ? edm.getDatamodified().toLocalDateTime() : null
);
o.setDatePublished(
edm.getDatapublished() != null ? edm.getDatapublished().toLocalDateTime() : null
);
o.setDescription(edm.getDescription());
if (edm.getWebserviceDocumentationsByInstanceId() != null) {
o.setDocumentation(edm.getWebserviceDocumentationsByInstanceId().stream()
.map(EDMWebserviceDocumentation::getDocumentation)
.map(x -> new Documentation().uri(x)).collect(Collectors.toCollection(ArrayList::new)));
} else o.setDocumentation(
null
);
o.setEntryPoint(edm.getEntrypoint());
o.setLicense(edm.getLicense());
o.setName(edm.getName());
if (edm.getEdmEntityIdByProvider() != null && edm.getEdmEntityIdByProvider().getOrganizationsByMetaId() != null
&& !edm.getEdmEntityIdByProvider().getOrganizationsByMetaId().isEmpty()) {
List so = new ArrayList<>(edm.getEdmEntityIdByProvider().getOrganizationsByMetaId());
so.sort(EDMUtil::compareEntityVersion);
o.setProvider(new LinkedEntity().uid(so.get(0).getUid()).entityType("Organization").instanceId(so.get(0).getInstanceId()).metaId(so.get(0).getMetaId()));
}
o.setSpatialExtent(
edm.getWebserviceSpatialsByInstanceId() != null ?
new ArrayList<>(edm.getWebserviceSpatialsByInstanceId().stream()
.map(s -> {
Location l = new Location();
l.setLocation(s.getLocation());
return l;
}).collect(Collectors.toList()))
: null
);
o.setTemporalExtent(
edm.getWebserviceTemporalsByInstanceId() != null ?
edm.getWebserviceTemporalsByInstanceId().stream()
.map(elem -> {
PeriodOfTime periodOfTime = new PeriodOfTime();
periodOfTime.setStartDate(
elem.getStartdate() != null ?
elem.getStartdate().toLocalDateTime() : null
);
periodOfTime.setEndDate(
elem.getEnddate() != null ?
elem.getEnddate().toLocalDateTime() : null
);
return periodOfTime;
}).collect(Collectors.toList())
: new ArrayList<>()
);
o.setAaaiTypes(edm.getAaaitypes());
if (edm.getSupportedOperationByInstanceId() != null) {
o.setSupportedOperation(new LinkedList<>());
edm.getSupportedOperationByInstanceId().stream()
.map(EDMSupportedOperation::getOperationByInstanceOperationId)
.forEach(e -> o.getSupportedOperation().add(
new LinkedEntity()
.metaId(e.getMetaId())
.instanceId(e.getInstanceId())
.uid(e.getUid())
.entityType("Operation")));
}
if(edm.getWebserviceRelationByInstanceId()!=null) {
o.setRelation(new LinkedList<>());
edm.getWebserviceRelationByInstanceId().stream()
.map(EDMWebserviceRelation::getWebserviceByInstanceWebserviceId_0)
.forEach(e -> o.getRelation().add(
new LinkedEntity()
.metaId(e.getMetaId())
.instanceId(e.getInstanceId())
.uid(e.getUid())
.entityType("Webservice")));
}
return o;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy