implement plan status logic (in progress)

This commit is contained in:
CITE\amentis 2024-09-18 16:46:57 +03:00
parent c08af8c4c3
commit a7a223d2c6
8 changed files with 117 additions and 28 deletions

View File

@ -47,6 +47,10 @@ public class PlanEntity extends TenantScopedBaseEntity {
public static final String _status = "status";
@Column(name = "status_id", nullable = true)
private UUID statusId;
public static final String _statusId = "statusId";
@Column(name = "properties", nullable = true)
private String properties;
@ -141,6 +145,14 @@ public class PlanEntity extends TenantScopedBaseEntity {
this.status = status;
}
public UUID getStatusId() {
return statusId;
}
public void setStatusId(UUID statusId) {
this.statusId = statusId;
}
public String getProperties() {
return this.properties;
}

View File

@ -27,10 +27,12 @@ import org.opencdmp.model.builder.*;
import org.opencdmp.model.builder.description.DescriptionBuilder;
import org.opencdmp.model.builder.planblueprint.PlanBlueprintBuilder;
import org.opencdmp.model.builder.planreference.PlanReferenceBuilder;
import org.opencdmp.model.builder.planstatus.PlanStatusBuilder;
import org.opencdmp.model.description.Description;
import org.opencdmp.model.plan.Plan;
import org.opencdmp.model.planblueprint.PlanBlueprint;
import org.opencdmp.model.planreference.PlanReference;
import org.opencdmp.model.planstatus.PlanStatus;
import org.opencdmp.model.user.User;
import org.opencdmp.query.*;
import org.slf4j.LoggerFactory;
@ -85,6 +87,9 @@ public class PlanBuilder extends BaseBuilder<Plan, PlanEntity> {
List<Plan> models = new ArrayList<>();
FieldSet statusFields = fields.extractPrefixed(this.asPrefix(Description._status));
Map<UUID, PlanStatus> statusItemsMap = this.collectPlanStatuses(statusFields, data);
FieldSet entityDoisFields = fields.extractPrefixed(this.asPrefix(Plan._entityDois));
Map<UUID, List<EntityDoi>> entityDoisMap = this.collectEntityDois(entityDoisFields, data);
@ -121,7 +126,7 @@ public class PlanBuilder extends BaseBuilder<Plan, PlanEntity> {
if (fields.hasField(this.asIndexer(Plan._tenantId))) m.setTenantId(d.getTenantId());
if (fields.hasField(this.asIndexer(Plan._label))) m.setLabel(d.getLabel());
if (fields.hasField(this.asIndexer(Plan._version))) m.setVersion(d.getVersion());
if (fields.hasField(this.asIndexer(Plan._status))) m.setStatus(d.getStatus());
if (!statusFields.isEmpty() && statusItemsMap != null && statusItemsMap.containsKey(d.getStatusId())) m.setStatus(statusItemsMap.get(d.getStatusId()));
if (fields.hasField(this.asIndexer(Plan._groupId))) m.setGroupId(d.getGroupId());
if (fields.hasField(this.asIndexer(Plan._description))) m.setDescription(d.getDescription());
if (fields.hasField(this.asIndexer(Plan._createdAt))) m.setCreatedAt(d.getCreatedAt());
@ -157,6 +162,36 @@ public class PlanBuilder extends BaseBuilder<Plan, PlanEntity> {
return models;
}
private Map<UUID, PlanStatus> collectPlanStatuses(FieldSet fields, List<PlanEntity> data) throws MyApplicationException {
if (fields.isEmpty() || data.isEmpty())
return null;
this.logger.debug("checking related - {}", PlanStatus.class.getSimpleName());
Map<UUID, PlanStatus> itemMap;
if (!fields.hasOtherField(this.asIndexer(PlanStatus._id))) {
itemMap = this.asEmpty(
data.stream().map(PlanEntity::getStatusId).distinct().collect(Collectors.toList()),
x -> {
PlanStatus item = new PlanStatus();
item.setId(x);
return item;
},
PlanStatus::getId);
} else {
FieldSet clone = new BaseFieldSet(fields.getFields()).ensure(PlanStatus._id);
PlanStatusQuery q = this.queryFactory.query(PlanStatusQuery.class).disableTracking().authorize(this.authorize).ids(data.stream().map(PlanEntity::getStatusId).distinct().collect(Collectors.toList()));
itemMap = this.builderFactory.builder(PlanStatusBuilder.class).authorize(this.authorize).asForeignKey(q, clone, PlanStatus::getId);
}
if (!fields.hasField(PlanStatus._id)) {
itemMap.forEach((id, item) -> {
if (item != null)
item.setId(null);
});
}
return itemMap;
}
private Map<UUID, List<PlanReference>> collectPlanReferences(FieldSet fields, List<PlanEntity> data) throws MyApplicationException {
if (fields.isEmpty() || data.isEmpty()) return null;
this.logger.debug("checking related - {}", PlanReference.class.getSimpleName());

View File

@ -36,9 +36,9 @@ public class PlanPersist {
public static final String _label = "label";
private PlanStatus status;
private UUID statusId;
public static final String _status = "status";
public static final String _statusId = "statusId";
private PlanPropertiesPersist properties;
@ -84,12 +84,12 @@ public class PlanPersist {
this.label = label;
}
public PlanStatus getStatus() {
return this.status;
public UUID getStatusId() {
return statusId;
}
public void setStatus(PlanStatus status) {
this.status = status;
public void setStatusId(UUID statusId) {
this.statusId = statusId;
}
public PlanPropertiesPersist getProperties() {
@ -186,9 +186,10 @@ public class PlanPersist {
@Override
protected List<Specification> specifications(PlanPersist item) {
PlanBlueprintEntity planBlueprintEntity = null;
PlanStatusEntity statusEntity = null;
try {
planBlueprintEntity = this.isValidGuid(item.getBlueprint()) ? this.entityManager.find(PlanBlueprintEntity.class, item.getBlueprint(), true) : null;
statusEntity = this.isValidGuid(item.getStatusId()) ? this.entityManager.find(PlanStatusEntity.class, item.getStatusId(), true) : null;
} catch (InvalidApplicationException e) {
throw new RuntimeException(e);
}
@ -203,6 +204,7 @@ public class PlanPersist {
accessFieldLabel = this.getSystemFieldLabel(definition, PlanBlueprintSystemFieldType.AccessRights);
}
PlanStatusEntity finalStatusEntity = statusEntity;
return Arrays.asList(
this.spec()
.iff(() -> this.isValidGuid(item.getId()))
@ -220,40 +222,41 @@ public class PlanPersist {
.must(() -> this.lessEqualLength(item.getLabel(), PlanEntity._labelLength))
.failOn(PlanPersist._label).failWith(this.messageSource.getMessage("Validation_MaxLength", new Object[]{PlanPersist._label}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> !this.isEmpty(item.getDescription()))
.failOn(PlanPersist._description).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._description}, LocaleContextHolder.getLocale())),
this.spec()
.must(() -> !this.isNull(item.getStatus()))
.failOn(PlanPersist._status).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._status}, LocaleContextHolder.getLocale())),
.iff(() -> this.isValidGuid(item.getId()))
.must(() -> !this.isNull(item.getStatusId()))
.failOn(PlanPersist._statusId).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._statusId}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> this.isValidGuid(item.getBlueprint()))
.failOn(PlanPersist._blueprint).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._blueprint}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> !this.isNull(item.getProperties()))
.failOn(PlanPersist._properties).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._properties}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> this.isDescriptionTemplateMultiplicityValid(finalPlanBlueprintEntity, item.getId()))
.failOn(PlanPersist._descriptionTemplates).failWith(this.messageSource.getMessage("Validation.InvalidDescriptionTemplateMultiplicityOnPlan", new Object[]{PlanPersist._descriptionTemplates}, LocaleContextHolder.getLocale())),
this.refSpec()
.iff(() -> !this.isNull(item.getProperties()))
.on(PlanPersist._properties)
.over(item.getProperties())
.using(() -> this.validatorFactory.validator(PlanPropertiesPersist.PlanPropertiesPersistValidator.class).setStatus(item.getStatus()).withDefinition(definition)),
.using(() -> this.validatorFactory.validator(PlanPropertiesPersist.PlanPropertiesPersistValidator.class).setStatus(finalStatusEntity.getInternalStatus()).withDefinition(definition)),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> !this.isNull(item.getLanguage()))
.failOn(PlanPersist._language).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{languageFieldLabel != null ? languageFieldLabel : PlanBlueprintSystemFieldType.Language.name()}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> !this.isNull(item.getAccessType()))
.failOn(PlanPersist._accessType).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{accessFieldLabel != null ? accessFieldLabel : PlanBlueprintSystemFieldType.AccessRights.name()}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> item.getStatus() == PlanStatus.Finalized)
.iff(() -> finalStatusEntity != null && finalStatusEntity.getInternalStatus() != null && finalStatusEntity.getInternalStatus() == PlanStatus.Finalized)
.must(() -> !this.isListNullOrEmpty(item.getDescriptionTemplates()))
.failOn(PlanPersist._descriptionTemplates).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{PlanPersist._descriptionTemplates}, LocaleContextHolder.getLocale())),
this.navSpec()

View File

@ -1,13 +1,13 @@
package org.opencdmp.model.plan;
import org.opencdmp.commons.enums.PlanAccessType;
import org.opencdmp.commons.enums.PlanStatus;
import org.opencdmp.commons.enums.PlanVersionStatus;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.model.*;
import org.opencdmp.model.description.Description;
import org.opencdmp.model.planblueprint.PlanBlueprint;
import org.opencdmp.model.planreference.PlanReference;
import org.opencdmp.model.planstatus.PlanStatus;
import org.opencdmp.model.user.User;
import java.time.Instant;

View File

@ -88,9 +88,9 @@ public class DashboardServiceImpl implements DashboardService {
planLookup.getPage().setOffset(0);
planLookup.getPage().setSize(model.getPage().getSize()+model.getPage().getOffset());
QueryResult<Plan> plans = this.elasticQueryHelperService.collect(planLookup, AuthorizationFlags.AllExceptPublic, new BaseFieldSet().ensure(Plan._id).ensure(Plan._updatedAt).ensure(Plan._label).ensure(Plan._status));
QueryResult<Plan> plans = this.elasticQueryHelperService.collect(planLookup, AuthorizationFlags.AllExceptPublic, new BaseFieldSet().ensure(Plan._id).ensure(Plan._updatedAt).ensure(Plan._label).ensure(String.join(".",Plan._status, org.opencdmp.model.planstatus.PlanStatus._internalStatus)));
if (!this.conventionService.isListNullOrEmpty(plans.getItems())) {
for (Plan plan : plans.getItems()) recentActivityItemEntities.add(new RecentActivityItemEntity(RecentActivityItemType.Plan, plan.getId(), plan.getUpdatedAt(), plan.getLabel(), plan.getStatus().getValue()));
for (Plan plan : plans.getItems()) recentActivityItemEntities.add(new RecentActivityItemEntity(RecentActivityItemType.Plan, plan.getId(), plan.getUpdatedAt(), plan.getLabel(), plan.getStatus().getInternalStatus().getValue()));
}
}

View File

@ -102,6 +102,7 @@ import org.opencdmp.service.descriptionworkflow.DescriptionWorkflowService;
import org.opencdmp.service.elastic.ElasticService;
import org.opencdmp.service.filetransformer.FileTransformerService;
import org.opencdmp.service.planblueprint.PlanBlueprintService;
import org.opencdmp.service.planworkflow.PlanWorkflowServiceImpl;
import org.opencdmp.service.responseutils.ResponseUtilsService;
import org.opencdmp.service.usagelimit.UsageLimitService;
import org.slf4j.LoggerFactory;
@ -185,6 +186,7 @@ public class PlanServiceImpl implements PlanService {
private final UsageLimitService usageLimitService;
private final AccountingService accountingService;
private final DescriptionWorkflowService descriptionWorkflowService;
private final PlanWorkflowServiceImpl planWorkflowService;
@Autowired
public PlanServiceImpl(
@ -207,7 +209,7 @@ public class PlanServiceImpl implements PlanService {
FileTransformerService fileTransformerService,
ValidatorFactory validatorFactory,
ElasticService elasticService, DescriptionTemplateService descriptionTemplateService,
AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, AuthorizationContentResolver authorizationContentResolver, TenantScope tenantScope, ResponseUtilsService responseUtilsService, PlanBlueprintService planBlueprintService, UsageLimitService usageLimitService, AccountingService accountingService, DescriptionWorkflowService descriptionWorkflowService) {
AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, AuthorizationContentResolver authorizationContentResolver, TenantScope tenantScope, ResponseUtilsService responseUtilsService, PlanBlueprintService planBlueprintService, UsageLimitService usageLimitService, AccountingService accountingService, DescriptionWorkflowService descriptionWorkflowService, PlanWorkflowServiceImpl planWorkflowService) {
this.entityManager = entityManager;
this.authorizationService = authorizationService;
this.deleterFactory = deleterFactory;
@ -237,6 +239,7 @@ public class PlanServiceImpl implements PlanService {
this.usageLimitService = usageLimitService;
this.accountingService = accountingService;
this.descriptionWorkflowService = descriptionWorkflowService;
this.planWorkflowService = planWorkflowService;
}
public Plan persist(PlanPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, IOException {
@ -1314,9 +1317,13 @@ public class PlanServiceImpl implements PlanService {
data = this.entityManager.find(PlanEntity.class, model.getId());
if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Plan.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage());
if (model.getStatus() != null && model.getStatus() == PlanStatus.Finalized && data.getStatus() != PlanStatus.Finalized) {
PlanStatusEntity oldPlanStatusEntity = this.entityManager.find(PlanStatusEntity.class, data.getStatusId(), true);
if (oldPlanStatusEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getStatusId(), PlanStatusEntity.class.getSimpleName()}, LocaleContextHolder.getLocale()));
PlanStatusEntity newPlanStatusEntity = this.entityManager.find(PlanStatusEntity.class, model.getStatusId(), true);
if (newPlanStatusEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getStatusId(), PlanStatusEntity.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (newPlanStatusEntity.getInternalStatus() != null && newPlanStatusEntity.getInternalStatus().equals(PlanStatus.Finalized) && oldPlanStatusEntity.getInternalStatus() != null && oldPlanStatusEntity.getInternalStatus().equals(PlanStatus.Finalized)) {
this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.planAffiliation(model.getId())), Permission.FinalizePlan);
data.setStatus(model.getStatus());
data.setStatusId(model.getStatusId());
data.setFinalizedAt(Instant.now());
}
} else {
@ -1325,6 +1332,7 @@ public class PlanServiceImpl implements PlanService {
data.setGroupId(UUID.randomUUID());
data.setVersion((short) 1);
data.setStatus(PlanStatus.Draft);
data.setStatusId(this.planWorkflowService.getWorkFlowDefinition().getStartingStatusId());
data.setVersionStatus(PlanVersionStatus.NotFinalized);
data.setCreatorId(this.userScope.getUserId());
data.setBlueprintId(model.getBlueprint());
@ -1713,7 +1721,8 @@ public class PlanServiceImpl implements PlanService {
persist.setId(data.getId());
persist.setHash(data.getId().toString());
persist.setLabel(data.getLabel());
persist.setStatus(PlanStatus.Finalized);
//TODO status PlanStatusEntity statusEntity = this.queryFactory.query(DescriptionStatusQuery.class).disableTracking().internalStatuses(DescriptionStatus.Finalized).isActive(IsActive.Active).firstAs(new BaseFieldSet().ensure(org.opencdmp.model.descriptionstatus.DescriptionStatus._id));
// persist.setStatus(PlanStatus.Finalized);
persist.setDescription(data.getDescription());
persist.setBlueprint(data.getBlueprintId());
persist.setAccessType(data.getAccessType());
@ -2307,7 +2316,7 @@ public class PlanServiceImpl implements PlanService {
PlanPersist persist = new PlanPersist();
persist.setLabel(label);
persist.setStatus(PlanStatus.Draft);
//TODO status persist.setStatus(PlanStatus.Draft);
persist.setDescription(planXml.getDescription());
persist.setAccessType(planXml.getAccess());
persist.setLanguage(planXml.getLanguage());
@ -2609,7 +2618,7 @@ public class PlanServiceImpl implements PlanService {
PlanPersist persist = new PlanPersist();
persist.setLabel(planCommonModelConfig.getLabel());
persist.setStatus(PlanStatus.Draft);
// TODO status persist.setStatus(PlanStatus.Draft);
persist.setDescription(model.getDescription());
switch (model.getAccessType()) {
case Public -> persist.setAccessType(PlanAccessType.Public);

View File

@ -6,6 +6,7 @@ import gr.cite.tools.exception.MyNotFoundException;
import gr.cite.tools.exception.MyValidationException;
import gr.cite.tools.fieldset.FieldSet;
import jakarta.xml.bind.JAXBException;
import org.opencdmp.commons.types.planworkflow.PlanWorkflowDefinitionEntity;
import org.opencdmp.model.persist.planworkflow.PlanWorkflowPersist;
import org.opencdmp.model.planworkflow.PlanWorkflow;
@ -16,4 +17,6 @@ public interface PlanWorkflowService {
PlanWorkflow persist(PlanWorkflowPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException;
void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException;
PlanWorkflowDefinitionEntity getWorkFlowDefinition() throws InvalidApplicationException;
}

View File

@ -3,6 +3,7 @@ package org.opencdmp.service.planworkflow;
import gr.cite.commons.web.authz.service.AuthorizationService;
import gr.cite.tools.data.builder.BuilderFactory;
import gr.cite.tools.data.deleter.DeleterFactory;
import gr.cite.tools.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.exception.MyForbiddenException;
import gr.cite.tools.exception.MyNotFoundException;
@ -12,9 +13,11 @@ import gr.cite.tools.fieldset.FieldSet;
import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry;
import jakarta.xml.bind.JAXBException;
import org.opencdmp.authorization.AuthorizationFlags;
import org.opencdmp.authorization.Permission;
import org.opencdmp.commons.XmlHandlingService;
import org.opencdmp.commons.enums.IsActive;
import org.opencdmp.commons.scope.tenant.TenantScope;
import org.opencdmp.commons.types.planworkflow.PlanWorkflowDefinitionEntity;
import org.opencdmp.commons.types.planworkflow.PlanWorkflowDefinitionTransitionEntity;
import org.opencdmp.convention.ConventionService;
@ -27,6 +30,7 @@ import org.opencdmp.model.persist.planworkflow.PlanWorkflowDefinitionPersist;
import org.opencdmp.model.persist.planworkflow.PlanWorkflowDefinitionTransitionPersist;
import org.opencdmp.model.persist.planworkflow.PlanWorkflowPersist;
import org.opencdmp.model.planworkflow.PlanWorkflow;
import org.opencdmp.query.PlanWorkflowQuery;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
@ -51,7 +55,10 @@ public class PlanWorkflowServiceImpl implements PlanWorkflowService {
private final DeleterFactory deleterFactory;
private final MessageSource messageSource;
private final ErrorThesaurusProperties errors;
public PlanWorkflowServiceImpl(AuthorizationService authorizationService, ConventionService conventionService, XmlHandlingService xmlHandlingService, TenantEntityManager entityManager, BuilderFactory builderFactory, DeleterFactory deleterFactory, MessageSource messageSource, ErrorThesaurusProperties errors) {
private final TenantScope tenantScope;
private final QueryFactory queryFactory;
public PlanWorkflowServiceImpl(AuthorizationService authorizationService, ConventionService conventionService, XmlHandlingService xmlHandlingService, TenantEntityManager entityManager, BuilderFactory builderFactory, DeleterFactory deleterFactory, MessageSource messageSource, ErrorThesaurusProperties errors, TenantScope tenantScope, QueryFactory queryFactory) {
this.authorizationService = authorizationService;
this.conventionService = conventionService;
this.xmlHandlingService = xmlHandlingService;
@ -60,6 +67,8 @@ public class PlanWorkflowServiceImpl implements PlanWorkflowService {
this.deleterFactory = deleterFactory;
this.messageSource = messageSource;
this.errors = errors;
this.tenantScope = tenantScope;
this.queryFactory = queryFactory;
}
@Override
@ -136,4 +145,22 @@ public class PlanWorkflowServiceImpl implements PlanWorkflowService {
return data;
}
@Override
public PlanWorkflowDefinitionEntity getWorkFlowDefinition() throws InvalidApplicationException {
PlanWorkflowQuery query = this.queryFactory.query(PlanWorkflowQuery.class).authorize(AuthorizationFlags.AllExceptPublic).isActives(IsActive.Active);
if (this.tenantScope.isDefaultTenant())
query = query.defaultTenant(true);
else
query = query.tenantIds(this.tenantScope.getTenant());
PlanWorkflowEntity entity = query.first();
if (entity == null) throw new MyApplicationException("Plan workflow not found!");
PlanWorkflowDefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(PlanWorkflowDefinitionEntity.class, entity.getDefinition());
if (definition == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{entity.getId(), PlanWorkflowDefinitionEntity.class.getSimpleName()}, LocaleContextHolder.getLocale()));
return definition;
}
}