Skip to content

Commit 9510f6b

Browse files
committed
Merge remote-tracking branch
'origin/issue/346_347_ProcessPluginDefinition_Access_-_BPMN_Activity_Beans' into develop_2
2 parents 73c9979 + fd9bca1 commit 9510f6b

File tree

15 files changed

+251
-34
lines changed

15 files changed

+251
-34
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.dsf.bpe.v2;
2+
3+
import java.util.Objects;
4+
import java.util.function.Supplier;
5+
6+
import org.springframework.context.ApplicationContext;
7+
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
10+
import ca.uhn.fhir.context.FhirContext;
11+
import dev.dsf.bpe.v2.config.ProxyConfig;
12+
import dev.dsf.bpe.v2.service.CryptoService;
13+
import dev.dsf.bpe.v2.service.DataLogger;
14+
import dev.dsf.bpe.v2.service.DsfClientProvider;
15+
import dev.dsf.bpe.v2.service.EndpointProvider;
16+
import dev.dsf.bpe.v2.service.FhirClientConfigProvider;
17+
import dev.dsf.bpe.v2.service.FhirClientProvider;
18+
import dev.dsf.bpe.v2.service.MailService;
19+
import dev.dsf.bpe.v2.service.MimeTypeService;
20+
import dev.dsf.bpe.v2.service.OidcClientProvider;
21+
import dev.dsf.bpe.v2.service.OrganizationProvider;
22+
import dev.dsf.bpe.v2.service.QuestionnaireResponseHelper;
23+
import dev.dsf.bpe.v2.service.ReadAccessHelper;
24+
import dev.dsf.bpe.v2.service.TargetProvider;
25+
import dev.dsf.bpe.v2.service.TaskHelper;
26+
import dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper;
27+
28+
public class ProcessPluginApiFactory implements Supplier<ProcessPluginApi>
29+
{
30+
private final ApplicationContext parentContext;
31+
private final ProcessPluginDefinition processPluginDefinition;
32+
33+
public ProcessPluginApiFactory(ProcessPluginDefinition processPluginDefinition, ApplicationContext parentContext)
34+
{
35+
this.processPluginDefinition = Objects.requireNonNull(processPluginDefinition, "processPluginDefinition");
36+
this.parentContext = Objects.requireNonNull(parentContext, "parentContext");
37+
}
38+
39+
private <T> T fromParent(Class<T> t)
40+
{
41+
return parentContext.getBean(t);
42+
}
43+
44+
@Override
45+
public ProcessPluginApi get()
46+
{
47+
return new ProcessPluginApiImpl(processPluginDefinition, fromParent(ProxyConfig.class),
48+
fromParent(EndpointProvider.class), fromParent(FhirContext.class), fromParent(DsfClientProvider.class),
49+
fromParent(FhirClientProvider.class), fromParent(FhirClientConfigProvider.class),
50+
fromParent(OidcClientProvider.class), fromParent(MailService.class), fromParent(MimeTypeService.class),
51+
fromParent(ObjectMapper.class), fromParent(OrganizationProvider.class),
52+
fromParent(ProcessAuthorizationHelper.class), fromParent(QuestionnaireResponseHelper.class),
53+
fromParent(ReadAccessHelper.class), fromParent(TaskHelper.class), fromParent(CryptoService.class),
54+
fromParent(TargetProvider.class), fromParent(DataLogger.class));
55+
}
56+
}

dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/ProcessPluginApiImpl.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
public class ProcessPluginApiImpl implements ProcessPluginApi, InitializingBean
2828
{
29+
private final ProcessPluginDefinition processPluginDefinition;
2930
private final ProxyConfig proxyConfig;
3031
private final EndpointProvider endpointProvider;
3132
private final FhirContext fhirContext;
@@ -45,14 +46,16 @@ public class ProcessPluginApiImpl implements ProcessPluginApi, InitializingBean
4546
private final TargetProvider targetProvider;
4647
private final DataLogger dataLogger;
4748

48-
public ProcessPluginApiImpl(ProxyConfig proxyConfig, EndpointProvider endpointProvider, FhirContext fhirContext,
49-
DsfClientProvider dsfClientProvider, FhirClientProvider fhirClientProvider,
50-
FhirClientConfigProvider fhirClientConfigProvider, OidcClientProvider oidcClientProvider,
51-
MailService mailService, MimeTypeService mimeTypeService, ObjectMapper objectMapper,
52-
OrganizationProvider organizationProvider, ProcessAuthorizationHelper processAuthorizationHelper,
49+
public ProcessPluginApiImpl(ProcessPluginDefinition processPluginDefinition, ProxyConfig proxyConfig,
50+
EndpointProvider endpointProvider, FhirContext fhirContext, DsfClientProvider dsfClientProvider,
51+
FhirClientProvider fhirClientProvider, FhirClientConfigProvider fhirClientConfigProvider,
52+
OidcClientProvider oidcClientProvider, MailService mailService, MimeTypeService mimeTypeService,
53+
ObjectMapper objectMapper, OrganizationProvider organizationProvider,
54+
ProcessAuthorizationHelper processAuthorizationHelper,
5355
QuestionnaireResponseHelper questionnaireResponseHelper, ReadAccessHelper readAccessHelper,
5456
TaskHelper taskHelper, CryptoService cryptoService, TargetProvider targetProvider, DataLogger dataLogger)
5557
{
58+
this.processPluginDefinition = processPluginDefinition;
5659
this.proxyConfig = proxyConfig;
5760
this.endpointProvider = endpointProvider;
5861
this.fhirContext = fhirContext;
@@ -76,6 +79,7 @@ public ProcessPluginApiImpl(ProxyConfig proxyConfig, EndpointProvider endpointPr
7679
@Override
7780
public void afterPropertiesSet() throws Exception
7881
{
82+
Objects.requireNonNull(processPluginDefinition, "processPluginDefinition");
7983
Objects.requireNonNull(proxyConfig, "proxyConfig");
8084
Objects.requireNonNull(endpointProvider, "endpointProvider");
8185
Objects.requireNonNull(fhirContext, "fhirContext");
@@ -96,6 +100,12 @@ public void afterPropertiesSet() throws Exception
96100
Objects.requireNonNull(dataLogger, "dataLogger");
97101
}
98102

103+
@Override
104+
public ProcessPluginDefinition getProcessPluginDefinition()
105+
{
106+
return processPluginDefinition;
107+
}
108+
99109
@Override
100110
public ProxyConfig getProxyConfig()
101111
{

dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/plugin/ProcessPluginImpl.java

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.slf4j.LoggerFactory;
4848
import org.springframework.beans.BeansException;
4949
import org.springframework.context.ApplicationContext;
50+
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
5051
import org.springframework.core.env.ConfigurableEnvironment;
5152

5253
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -61,6 +62,7 @@
6162
import dev.dsf.bpe.api.plugin.ProcessPlugin;
6263
import dev.dsf.bpe.api.plugin.ProcessPluginFhirConfig;
6364
import dev.dsf.bpe.v2.ProcessPluginApi;
65+
import dev.dsf.bpe.v2.ProcessPluginApiFactory;
6466
import dev.dsf.bpe.v2.ProcessPluginDefinition;
6567
import dev.dsf.bpe.v2.ProcessPluginDeploymentListener;
6668
import dev.dsf.bpe.v2.activity.Activity;
@@ -92,11 +94,12 @@ public class ProcessPluginImpl extends AbstractProcessPlugin<UserTaskListener> i
9294
private static final Logger logger = LoggerFactory.getLogger(ProcessPluginImpl.class);
9395

9496
private final ProcessPluginDefinition processPluginDefinition;
95-
private final ProcessPluginApi processPluginApi;
9697

9798
private final Function<DelegateExecution, Variables> variablesFactory;
9899
private final PluginMdc pluginMdc;
99100

101+
private final AtomicReference<ProcessPluginApi> processPluginApi = new AtomicReference<>();
102+
private final AtomicReference<FhirContext> fhirContext = new AtomicReference<>();
100103
private final AtomicReference<ObjectMapper> objectMapper = new AtomicReference<>();
101104

102105
public ProcessPluginImpl(ProcessPluginDefinition processPluginDefinition, int processPluginApiVersion,
@@ -109,13 +112,61 @@ public ProcessPluginImpl(ProcessPluginDefinition processPluginDefinition, int pr
109112
MessageEndEvent.class, DefaultUserTaskListener.class);
110113

111114
this.processPluginDefinition = processPluginDefinition;
112-
processPluginApi = apiApplicationContext.getBean(ProcessPluginApi.class);
113115

114116
variablesFactory = delegateExecution -> new VariablesImpl(delegateExecution, getObjectMapper());
115117
pluginMdc = new PluginMdcImpl(processPluginApiVersion, processPluginDefinition.getName(),
116118
processPluginDefinition.getVersion(), jarFile.toString(), serverBaseUrl, variablesFactory);
117119
}
118120

121+
@Override
122+
protected void customizeApplicationContext(AnnotationConfigApplicationContext context,
123+
ApplicationContext parentContext)
124+
{
125+
context.registerBean("processPluginDefinition", ProcessPluginDefinition.class, () -> processPluginDefinition);
126+
context.registerBean("api", ProcessPluginApi.class,
127+
new ProcessPluginApiFactory(processPluginDefinition, parentContext));
128+
}
129+
130+
private ProcessPluginApi getProcessPluginApi()
131+
{
132+
ProcessPluginApi entry = processPluginApi.get();
133+
if (entry == null)
134+
{
135+
ProcessPluginApi o = doGetProcessPluginApi();
136+
if (processPluginApi.compareAndSet(entry, o))
137+
return o;
138+
else
139+
return processPluginApi.get();
140+
}
141+
else
142+
return entry;
143+
}
144+
145+
private ProcessPluginApi doGetProcessPluginApi()
146+
{
147+
return getApplicationContext().getBean(ProcessPluginApi.class);
148+
}
149+
150+
private FhirContext getFhirContext()
151+
{
152+
FhirContext entry = fhirContext.get();
153+
if (entry == null)
154+
{
155+
FhirContext o = doGetFhirContext();
156+
if (fhirContext.compareAndSet(entry, o))
157+
return o;
158+
else
159+
return fhirContext.get();
160+
}
161+
else
162+
return entry;
163+
}
164+
165+
private FhirContext doGetFhirContext()
166+
{
167+
return getApplicationContext().getBean(FhirContext.class);
168+
}
169+
119170
private ObjectMapper getObjectMapper()
120171
{
121172
ObjectMapper entry = objectMapper.get();
@@ -264,7 +315,7 @@ private IParser newJsonParser()
264315

265316
private IParser newParser(Function<FhirContext, IParser> parserFactor)
266317
{
267-
IParser p = parserFactor.apply(processPluginApi.getFhirContext());
318+
IParser p = parserFactor.apply(getFhirContext());
268319
p.setStripVersionsFromReferences(false);
269320
p.setOverrideResourceIdWithBundleEntryFullUrl(false);
270321

@@ -383,7 +434,7 @@ public JavaDelegate getMessageSendTask(String className, List<FieldDeclaration>
383434
SendTaskValues sendTaskValues = getSendTaskValues(fieldDeclarations, variableScope)
384435
.orElseThrow(noOrIncompleteFhirTaskFields("MessageSendTask", className));
385436

386-
return new MessageSendTaskDelegate(processPluginApi, variablesFactory, target, sendTaskValues);
437+
return new MessageSendTaskDelegate(getProcessPluginApi(), variablesFactory, target, sendTaskValues);
387438
}
388439

389440
@Override
@@ -393,7 +444,7 @@ public JavaDelegate getServiceTask(String className, List<FieldDeclaration> fiel
393444
ServiceTask target = get(ServiceTask.class, className);
394445
injectFields(target, fieldDeclarations, variableScope);
395446

396-
return new ServiceTaskDelegate(processPluginApi, variablesFactory, target);
447+
return new ServiceTaskDelegate(getProcessPluginApi(), variablesFactory, target);
397448
}
398449

399450
@Override
@@ -406,7 +457,7 @@ public JavaDelegate getMessageEndEvent(String className, List<FieldDeclaration>
406457
SendTaskValues sendTaskValues = getSendTaskValues(fieldDeclarations, variableScope)
407458
.orElseThrow(noOrIncompleteFhirTaskFields("MessageEndEvent", className));
408459

409-
return new MessageEndEventDelegate(processPluginApi, variablesFactory, target, sendTaskValues);
460+
return new MessageEndEventDelegate(getProcessPluginApi(), variablesFactory, target, sendTaskValues);
410461
}
411462

412463
@Override
@@ -419,7 +470,8 @@ public JavaDelegate getMessageIntermediateThrowEvent(String className, List<Fiel
419470
SendTaskValues sendTaskValues = getSendTaskValues(fieldDeclarations, variableScope)
420471
.orElseThrow(noOrIncompleteFhirTaskFields("MessageIntermediateThrowEvent", className));
421472

422-
return new MessageIntermediateThrowEventDelegate(processPluginApi, variablesFactory, target, sendTaskValues);
473+
return new MessageIntermediateThrowEventDelegate(getProcessPluginApi(), variablesFactory, target,
474+
sendTaskValues);
423475
}
424476

425477
@Override
@@ -429,7 +481,7 @@ public org.camunda.bpm.engine.delegate.ExecutionListener getExecutionListener(St
429481
ExecutionListener target = get(ExecutionListener.class, className);
430482
injectFields(target, fieldDeclarations, variableScope);
431483

432-
return new ExecutionListenerDelegate(processPluginApi, variablesFactory, target);
484+
return new ExecutionListenerDelegate(getProcessPluginApi(), variablesFactory, target);
433485
}
434486

435487
@Override
@@ -439,7 +491,7 @@ public TaskListener getTaskListener(String className, List<FieldDeclaration> fie
439491
UserTaskListener target = get(UserTaskListener.class, className);
440492
ClassDelegateUtil.applyFieldDeclaration(fieldDeclarations, target);
441493

442-
return new UserTaskListenerDelegate(processPluginApi, variablesFactory, target);
494+
return new UserTaskListenerDelegate(getProcessPluginApi(), variablesFactory, target);
443495
}
444496

445497
private List<FieldDeclaration> filterFhirTaskValues(List<FieldDeclaration> fieldDeclarations)

dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/spring/ApiServiceConfig.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import dev.dsf.bpe.api.service.BpeMailService;
2323
import dev.dsf.bpe.api.service.BpeOidcClientProvider;
2424
import dev.dsf.bpe.api.service.BuildInfoProvider;
25-
import dev.dsf.bpe.v2.ProcessPluginApi;
26-
import dev.dsf.bpe.v2.ProcessPluginApiImpl;
2725
import dev.dsf.bpe.v2.client.dsf.ReferenceCleaner;
2826
import dev.dsf.bpe.v2.client.dsf.ReferenceCleanerImpl;
2927
import dev.dsf.bpe.v2.client.dsf.ReferenceExtractor;
@@ -99,16 +97,6 @@ public class ApiServiceConfig
9997
@Autowired
10098
private BpeOidcClientProvider bpeOidcClientProvider;
10199

102-
@Bean
103-
public ProcessPluginApi processPluginApiV2()
104-
{
105-
return new ProcessPluginApiImpl(proxyConfigDelegate(), endpointProvider(), fhirContext(), dsfClientProvider(),
106-
fhirClientProvider(), fhirClientConfigProvider(), oidcClientProvider(), mailService(),
107-
mimeTypeService(), objectMapper(), organizationProvider(), processAuthorizationHelper(),
108-
questionnaireResponseHelper(), readAccessHelper(), taskHelper(), cryptoService(), targetProvider(),
109-
dataLogger());
110-
}
111-
112100
@Bean
113101
public ProxyConfig proxyConfigDelegate()
114102
{

dsf-bpe/dsf-bpe-process-api-v2/src/main/java/dev/dsf/bpe/v2/ProcessPluginApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
*/
3333
public interface ProcessPluginApi
3434
{
35+
ProcessPluginDefinition getProcessPluginDefinition();
36+
3537
ProxyConfig getProxyConfig();
3638

3739
EndpointProvider getEndpointProvider();

dsf-bpe/dsf-bpe-process-api-v2/src/main/java/dev/dsf/bpe/v2/spring/ActivityPrototypeBeanCreator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
/**
1919
* Helper class to register {@link Activity}s as prototype beans. Must be configured as a <code>static</code>
20-
* {@link Bean} inside a {@link Configuration} class.
20+
* {@link Bean} inside a {@link Configuration} class. Autowiring via constructor arguments is enabled.
2121
* <p>
2222
* Usage:
2323
* <p>
@@ -73,6 +73,7 @@ private BeanDefinition createBeanDefinition(Class<? extends Activity> activity)
7373
GenericBeanDefinition definition = new GenericBeanDefinition();
7474
definition.setBeanClass(activity);
7575
definition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
76+
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_CONSTRUCTOR);
7677
return definition;
7778
}
7879
}

dsf-bpe/dsf-bpe-process-api/src/main/java/dev/dsf/bpe/api/plugin/AbstractProcessPlugin.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,9 @@ private AnnotationConfigApplicationContext createApplicationContext()
552552
.concat(Stream.of(apiServicesSpringConfiguration), getDefinitionSpringConfigurations().stream())
553553
.toArray(Class<?>[]::new));
554554
context.setEnvironment(environment);
555+
556+
customizeApplicationContext(context, apiApplicationContext);
557+
555558
context.refresh();
556559

557560
return context;
@@ -576,6 +579,11 @@ private AnnotationConfigApplicationContext createApplicationContext()
576579
}
577580
}
578581

582+
protected void customizeApplicationContext(AnnotationConfigApplicationContext context,
583+
ApplicationContext parentContext)
584+
{
585+
}
586+
579587
private Stream<BpmnFileAndModel> loadBpmnModels(String localOrganizationIdentifierValue)
580588
{
581589
return getDefinitionProcessModels().stream().map(loadBpmnModelOrNull(localOrganizationIdentifierValue))

dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/integration/PluginV2IntegrationTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,10 @@ public void startSensitiveDataLoggerTest() throws Exception
257257
{
258258
executePluginTest(createTestTask("DataLoggerTest"));
259259
}
260+
261+
@Test
262+
public void startAutowireTest() throws Exception
263+
{
264+
executePluginTest(createTestTask("AutowireTest"));
265+
}
260266
}

dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/TestProcessPluginDefinition.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99

1010
public class TestProcessPluginDefinition implements ProcessPluginDefinition
1111
{
12+
public static final String NAME = "dsf-process-test";
1213
public static final String VERSION = "2.0.0.0";
13-
public static final LocalDate RELEASE_DATE = LocalDate.of(2025, 3, 25);
14+
public static final LocalDate RELEASE_DATE = LocalDate.of(2025, 9, 1);
1415

1516
@Override
1617
public String getName()
1718
{
18-
return "dsf-process-test";
19+
return NAME;
1920
}
2021

2122
@Override
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dev.dsf.bpe.test.autowire;
2+
3+
public class DemoService
4+
{
5+
// Intentionally empty
6+
}

0 commit comments

Comments
 (0)