ProcessServiceBaseCdiBean.java
package io.vanillabp.integration.runtime.processservice;
import java.util.List;
import io.vanillabp.integration.adapter.migration.config.MigrationAdapterProperties;
import io.vanillabp.integration.adapter.migration.processervice.MigrationProcessService;
import io.vanillabp.integration.spi.AggregatePersistenceAware;
import io.vanillabp.spi.process.ProcessService;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.inject.Any;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;
import jakarta.transaction.TransactionSynchronizationRegistry;
import jakarta.transaction.Transactional;
import lombok.Getter;
public abstract class ProcessServiceBaseCdiBean<A> implements ProcessService<A> {
@Inject
MigrationAdapterProperties properties;
/**
* The persistences available at runtime. This is injected using {@link Instance} because the services
* annotated by {@link io.vanillabp.spi.service.WorkflowService} may implement {@link AggregatePersistenceAware}
* what causes cycle dependencies since this bean is typically also injected into the service.
*/
@Inject
@Any
Instance<AggregatePersistenceAware<?>> persistences;
@Inject
TransactionSynchronizationRegistry txRegistry;
@Getter
MigrationProcessService<A> migrationProcessService;
public abstract Class<AggregatePersistenceAware<A>> getAggregatePersistenceClass();
public abstract Class<A> getWorkflowAggregateClass();
public abstract String getBpmnProcessId();
@PostConstruct
public void initialize() {
this.migrationProcessService = new MigrationProcessService<>(
getWorkflowModuleId(), getBpmnProcessId(), getWorkflowAggregateClass(), properties, getAggregatePersistence(), List
.of(), null);
}
public A startWorkflow(
A workflowAggregate) {
if (migrationProcessService.needsTransactionForStartingWorkflows() && noTransactionIsActive()) {
throw new RuntimeException(
"No transaction active available! Add run 'startWorkflow' only having a local transaction active.");
}
return migrationProcessService.startWorkflow(workflowAggregate);
}
@Transactional
public void startWorkflowPhaseTwo(
final String adapterId,
final Object workflowAggregateId) {
migrationProcessService.startWorkflowPhaseTwo(adapterId, workflowAggregateId);
}
@SuppressWarnings("unchecked")
private io.vanillabp.intergration.adapter.spi.AggregatePersistenceAware<A> getAggregatePersistence() {
for (AggregatePersistenceAware<?> persistence : persistences) {
if (getAggregatePersistenceClass().isAssignableFrom(persistence.getClass())) {
return new AggregatePersistenceAwareWrapper<A>((AggregatePersistenceAware<A>) persistence);
}
}
throw new IllegalStateException(
"No persistence for "
+ getAggregatePersistenceClass()
+ " found at runtime. Maybe the class is not defined as a CDI bean?");
}
public boolean transactionIsActive() {
return !noTransactionIsActive();
}
public boolean noTransactionIsActive() {
return txRegistry.getTransactionKey() == null;
}
}