Skip to content

Commit bfe0edd

Browse files
committed
runtime access to ProcessPluginDefinition via API
* Adds a get method to the ProcessPluginApi for accessing the object of the plugins ProcessPluginDefinition class created by the java service loader during plugin loading. * This addition simplifies access to the plugins name, version and release-date at runtime specially if the ProcessPluginDefinition class extends dev.dsf.bpe.v2.AbstractProcessPluginDefinition to specify these values via maven property replacement.
1 parent b41cd81 commit bfe0edd

File tree

8 files changed

+157
-26
lines changed

8 files changed

+157
-26
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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.FhirClientProvider;
17+
import dev.dsf.bpe.v2.service.MailService;
18+
import dev.dsf.bpe.v2.service.MimeTypeService;
19+
import dev.dsf.bpe.v2.service.OidcClientProvider;
20+
import dev.dsf.bpe.v2.service.OrganizationProvider;
21+
import dev.dsf.bpe.v2.service.QuestionnaireResponseHelper;
22+
import dev.dsf.bpe.v2.service.ReadAccessHelper;
23+
import dev.dsf.bpe.v2.service.TargetProvider;
24+
import dev.dsf.bpe.v2.service.TaskHelper;
25+
import dev.dsf.bpe.v2.service.process.ProcessAuthorizationHelper;
26+
27+
public class ProcessPluginApiFactory implements Supplier<ProcessPluginApi>
28+
{
29+
private final ApplicationContext parentContext;
30+
private final ProcessPluginDefinition processPluginDefinition;
31+
32+
public ProcessPluginApiFactory(ProcessPluginDefinition processPluginDefinition, ApplicationContext parentContext)
33+
{
34+
this.processPluginDefinition = Objects.requireNonNull(processPluginDefinition, "processPluginDefinition");
35+
this.parentContext = Objects.requireNonNull(parentContext, "parentContext");
36+
}
37+
38+
private <T> T fromParent(Class<T> t)
39+
{
40+
return parentContext.getBean(t);
41+
}
42+
43+
@Override
44+
public ProcessPluginApi get()
45+
{
46+
return new ProcessPluginApiImpl(processPluginDefinition, fromParent(ProxyConfig.class),
47+
fromParent(EndpointProvider.class), fromParent(FhirContext.class), fromParent(DsfClientProvider.class),
48+
fromParent(FhirClientProvider.class), fromParent(OidcClientProvider.class),
49+
fromParent(MailService.class), fromParent(MimeTypeService.class), fromParent(ObjectMapper.class),
50+
fromParent(OrganizationProvider.class), fromParent(ProcessAuthorizationHelper.class),
51+
fromParent(QuestionnaireResponseHelper.class), fromParent(ReadAccessHelper.class),
52+
fromParent(TaskHelper.class), fromParent(CryptoService.class), fromParent(TargetProvider.class),
53+
fromParent(DataLogger.class));
54+
}
55+
}

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
public class ProcessPluginApiImpl implements ProcessPluginApi, InitializingBean
2727
{
28+
private final ProcessPluginDefinition processPluginDefinition;
2829
private final ProxyConfig proxyConfig;
2930
private final EndpointProvider endpointProvider;
3031
private final FhirContext fhirContext;
@@ -43,14 +44,15 @@ public class ProcessPluginApiImpl implements ProcessPluginApi, InitializingBean
4344
private final TargetProvider targetProvider;
4445
private final DataLogger dataLogger;
4546

46-
public ProcessPluginApiImpl(ProxyConfig proxyConfig, EndpointProvider endpointProvider, FhirContext fhirContext,
47-
DsfClientProvider dsfClientProvider, FhirClientProvider fhirClientProvider,
48-
OidcClientProvider oidcClientProvider, MailService mailService, MimeTypeService mimeTypeService,
49-
ObjectMapper objectMapper, OrganizationProvider organizationProvider,
47+
public ProcessPluginApiImpl(ProcessPluginDefinition processPluginDefinition, ProxyConfig proxyConfig,
48+
EndpointProvider endpointProvider, FhirContext fhirContext, DsfClientProvider dsfClientProvider,
49+
FhirClientProvider fhirClientProvider, OidcClientProvider oidcClientProvider, MailService mailService,
50+
MimeTypeService mimeTypeService, ObjectMapper objectMapper, OrganizationProvider organizationProvider,
5051
ProcessAuthorizationHelper processAuthorizationHelper,
5152
QuestionnaireResponseHelper questionnaireResponseHelper, ReadAccessHelper readAccessHelper,
5253
TaskHelper taskHelper, CryptoService cryptoService, TargetProvider targetProvider, DataLogger dataLogger)
5354
{
55+
this.processPluginDefinition = processPluginDefinition;
5456
this.proxyConfig = proxyConfig;
5557
this.endpointProvider = endpointProvider;
5658
this.fhirContext = fhirContext;
@@ -73,6 +75,7 @@ public ProcessPluginApiImpl(ProxyConfig proxyConfig, EndpointProvider endpointPr
7375
@Override
7476
public void afterPropertiesSet() throws Exception
7577
{
78+
Objects.requireNonNull(processPluginDefinition, "processPluginDefinition");
7679
Objects.requireNonNull(proxyConfig, "proxyConfig");
7780
Objects.requireNonNull(endpointProvider, "endpointProvider");
7881
Objects.requireNonNull(fhirContext, "fhirContext");
@@ -92,6 +95,12 @@ public void afterPropertiesSet() throws Exception
9295
Objects.requireNonNull(dataLogger, "dataLogger");
9396
}
9497

98+
@Override
99+
public ProcessPluginDefinition getProcessPluginDefinition()
100+
{
101+
return processPluginDefinition;
102+
}
103+
95104
@Override
96105
public ProxyConfig getProxyConfig()
97106
{

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 & 11 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;
@@ -97,15 +95,6 @@ public class ApiServiceConfig
9795
@Autowired
9896
private BpeOidcClientProvider bpeOidcClientProvider;
9997

100-
@Bean
101-
public ProcessPluginApi processPluginApiV2()
102-
{
103-
return new ProcessPluginApiImpl(proxyConfigDelegate(), endpointProvider(), fhirContext(), dsfClientProvider(),
104-
fhirClientProvider(), oidcClientProvider(), mailService(), mimeTypeService(), objectMapper(),
105-
organizationProvider(), processAuthorizationHelper(), questionnaireResponseHelper(), readAccessHelper(),
106-
taskHelper(), cryptoService(), targetProvider(), dataLogger());
107-
}
108-
10998
@Bean
11099
public ProxyConfig proxyConfigDelegate()
111100
{

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
@@ -31,6 +31,8 @@
3131
*/
3232
public interface ProcessPluginApi
3333
{
34+
ProcessPluginDefinition getProcessPluginDefinition();
35+
3436
ProxyConfig getProxyConfig();
3537

3638
EndpointProvider getEndpointProvider();

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-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

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package dev.dsf.bpe.test.service;
22

33
import static dev.dsf.bpe.test.PluginTestExecutor.expectNotNull;
4+
import static dev.dsf.bpe.test.PluginTestExecutor.expectSame;
45

56
import dev.dsf.bpe.test.AbstractTest;
67
import dev.dsf.bpe.test.PluginTest;
8+
import dev.dsf.bpe.test.TestProcessPluginDefinition;
79
import dev.dsf.bpe.v2.ProcessPluginApi;
810
import dev.dsf.bpe.v2.activity.ServiceTask;
911
import dev.dsf.bpe.v2.error.ErrorBoundaryEvent;
@@ -23,6 +25,19 @@ public void apiNotNull(ProcessPluginApi api) throws Exception
2325
expectNotNull(api);
2426
}
2527

28+
@PluginTest
29+
public void apiGetProcessPluginDefinition(ProcessPluginApi api) throws Exception
30+
{
31+
expectNotNull(api.getProcessPluginDefinition());
32+
33+
expectSame(TestProcessPluginDefinition.NAME, api.getProcessPluginDefinition().getName());
34+
expectSame(TestProcessPluginDefinition.RELEASE_DATE, api.getProcessPluginDefinition().getReleaseDate());
35+
expectSame(TestProcessPluginDefinition.RELEASE_DATE, api.getProcessPluginDefinition().getResourceReleaseDate());
36+
expectSame(TestProcessPluginDefinition.VERSION, api.getProcessPluginDefinition().getVersion());
37+
expectSame(TestProcessPluginDefinition.VERSION.substring(0, 3),
38+
api.getProcessPluginDefinition().getResourceVersion());
39+
}
40+
2641
@PluginTest
2742
public void apiGetEndpointProviderNotNull(ProcessPluginApi api) throws Exception
2843
{

0 commit comments

Comments
 (0)