Skip to content

Commit 40af637

Browse files
committed
[Fix #1121] Ensuring service priority order
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent 9f56628 commit 40af637

21 files changed

Lines changed: 143 additions & 35 deletions

File tree

impl/core/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,10 @@
3333
<artifactId>junit-jupiter-engine</artifactId>
3434
<scope>test</scope>
3535
</dependency>
36+
<dependency>
37+
<groupId>org.assertj</groupId>
38+
<artifactId>assertj-core</artifactId>
39+
<scope>test</scope>
40+
</dependency>
3641
</dependencies>
3742
</project>

impl/core/src/main/java/io/serverlessworkflow/impl/FunctionReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919
import io.serverlessworkflow.impl.resources.ExternalResourceHandler;
2020
import java.util.function.Function;
2121

22-
public interface FunctionReader extends Function<ExternalResourceHandler, Task> {}
22+
public interface FunctionReader extends Function<ExternalResourceHandler, Task>, ServicePriority {}

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.serverlessworkflow.impl;
1717

18+
import static io.serverlessworkflow.impl.WorkflowUtils.loadFirst;
1819
import static io.serverlessworkflow.impl.WorkflowUtils.safeClose;
1920

2021
import io.serverlessworkflow.api.types.SchemaInline;
@@ -305,8 +306,7 @@ public Builder withDefaultCatalogURI(URI defaultCatalogURI) {
305306
public WorkflowApplication build() {
306307
if (modelFactory == null) {
307308
modelFactory =
308-
ServiceLoader.load(WorkflowModelFactory.class)
309-
.findFirst()
309+
loadFirst(WorkflowModelFactory.class)
310310
.orElseThrow(
311311
() ->
312312
new IllegalStateException(
@@ -318,21 +318,17 @@ public WorkflowApplication build() {
318318
ServiceLoader.load(ExpressionFactory.class).forEach(exprFactories::add);
319319
if (schemaValidatorFactory == null) {
320320
schemaValidatorFactory =
321-
ServiceLoader.load(SchemaValidatorFactory.class)
322-
.findFirst()
321+
loadFirst(SchemaValidatorFactory.class)
323322
.orElseGet(() -> EmptySchemaValidatorHolder.instance);
324323
}
325324
if (taskFactory == null) {
326325
taskFactory =
327-
ServiceLoader.load(TaskExecutorFactory.class)
328-
.findFirst()
329-
.orElseGet(() -> DefaultTaskExecutorFactory.get());
326+
loadFirst(TaskExecutorFactory.class).orElseGet(() -> DefaultTaskExecutorFactory.get());
330327
}
331328
ServiceLoader.load(EventPublisher.class).forEach(e -> eventPublishers.add(e));
332329
if (eventConsumer == null) {
333330
eventConsumer =
334-
ServiceLoader.load(EventConsumer.class)
335-
.findFirst()
331+
loadFirst(EventConsumer.class)
336332
.orElseGet(
337333
() -> {
338334
InMemoryEvents inMemory = new InMemoryEvents(executorFactory);
@@ -353,18 +349,14 @@ public WorkflowApplication build() {
353349

354350
if (configManager == null) {
355351
configManager =
356-
ServiceLoader.load(ConfigManager.class)
357-
.findFirst()
358-
.orElseGet(() -> new SystemPropertyConfigManager());
352+
loadFirst(ConfigManager.class).orElseGet(() -> new SystemPropertyConfigManager());
359353
}
360354
if (secretManager == null) {
361355
secretManager =
362-
ServiceLoader.load(SecretManager.class)
363-
.findFirst()
364-
.orElseGet(() -> new ConfigSecretManager(configManager));
356+
loadFirst(SecretManager.class).orElseGet(() -> new ConfigSecretManager(configManager));
365357
}
366-
templateResolver = ServiceLoader.load(URITemplateResolver.class).findFirst();
367-
functionReader = ServiceLoader.load(FunctionReader.class).findFirst();
358+
templateResolver = loadFirst(URITemplateResolver.class);
359+
functionReader = loadFirst(FunctionReader.class);
368360
if (defaultCatalogURI == null) {
369361
defaultCatalogURI = URI.create("https://github.com/serverlessworkflow/catalog");
370362
}

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.util.Map;
4040
import java.util.Objects;
4141
import java.util.Optional;
42+
import java.util.ServiceLoader;
4243
import org.slf4j.Logger;
4344
import org.slf4j.LoggerFactory;
4445

@@ -304,4 +305,11 @@ public static WorkflowValueResolver<URI> getURISupplier(
304305
}
305306
throw new IllegalArgumentException("Invalid uritemplate definition " + template);
306307
}
308+
309+
public static <T extends ServicePriority> Optional<T> loadFirst(Class<T> serviceClass) {
310+
return ServiceLoader.load(serviceClass).stream()
311+
.map(ServiceLoader.Provider::get)
312+
.sorted()
313+
.findFirst();
314+
}
307315
}

impl/core/src/main/java/io/serverlessworkflow/impl/auth/AccessTokenProviderFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
*/
1616
package io.serverlessworkflow.impl.auth;
1717

18+
import io.serverlessworkflow.impl.ServicePriority;
1819
import java.util.List;
1920

20-
public interface AccessTokenProviderFactory {
21+
public interface AccessTokenProviderFactory extends ServicePriority {
2122

2223
AccessTokenProvider build(
2324
HttpRequestInfo requestInfo, List<String> issuers, JWTConverter converter);

impl/core/src/main/java/io/serverlessworkflow/impl/auth/CommonOAuthProvider.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.serverlessworkflow.impl.auth;
1717

1818
import static io.serverlessworkflow.impl.WorkflowUtils.checkSecret;
19+
import static io.serverlessworkflow.impl.WorkflowUtils.loadFirst;
1920
import static io.serverlessworkflow.impl.WorkflowUtils.secret;
2021

2122
import io.serverlessworkflow.api.types.OAuth2AuthenticationData;
@@ -28,20 +29,17 @@
2829
import java.net.URI;
2930
import java.util.Arrays;
3031
import java.util.Map;
31-
import java.util.ServiceLoader;
3232

3333
abstract class CommonOAuthProvider implements AuthProvider {
3434

3535
private final WorkflowValueResolver<AccessTokenProvider> tokenProvider;
3636

3737
private static JWTConverter jwtConverter =
38-
ServiceLoader.load(JWTConverter.class)
39-
.findFirst()
38+
loadFirst(JWTConverter.class)
4039
.orElseThrow(() -> new IllegalStateException("No JWTConverter implementation found"));
4140

4241
private static AccessTokenProviderFactory accessTokenProviderFactory =
43-
ServiceLoader.load(AccessTokenProviderFactory.class)
44-
.findFirst()
42+
loadFirst(AccessTokenProviderFactory.class)
4543
.orElseThrow(() -> new IllegalStateException("No JWTConverter implementation found"));
4644

4745
protected CommonOAuthProvider(WorkflowValueResolver<AccessTokenProvider> tokenProvider) {

impl/core/src/main/java/io/serverlessworkflow/impl/auth/JWTConverter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package io.serverlessworkflow.impl.auth;
1717

18-
public interface JWTConverter {
18+
import io.serverlessworkflow.impl.ServicePriority;
19+
20+
public interface JWTConverter extends ServicePriority {
1921

2022
/**
2123
* Converts a JWT token string into a JWT object.

impl/core/src/main/java/io/serverlessworkflow/impl/events/EventConsumer.java

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

1818
import io.cloudevents.CloudEvent;
1919
import io.serverlessworkflow.api.types.EventFilter;
20+
import io.serverlessworkflow.impl.ServicePriority;
2021
import io.serverlessworkflow.impl.WorkflowApplication;
2122
import java.util.Collection;
2223
import java.util.function.Consumer;
2324

2425
public interface EventConsumer<T extends EventRegistration, V extends EventRegistrationBuilder>
25-
extends AutoCloseable {
26+
extends AutoCloseable, ServicePriority {
2627

2728
V listen(EventFilter filter, WorkflowApplication workflowApplication);
2829

impl/core/src/main/java/io/serverlessworkflow/impl/executors/RunScriptExecutorBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public CallableTask build(RunScript taskConfiguration, WorkflowDefinition defini
6868
ServiceLoader.load(ScriptRunner.class).stream()
6969
.map(ServiceLoader.Provider::get)
7070
.filter(s -> s.identifier().equals(language))
71+
.sorted()
7172
.findFirst()
7273
.orElseThrow(
7374
() ->

impl/core/src/main/java/io/serverlessworkflow/impl/executors/RunTaskExecutor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ protected RunTaskExecutorBuilder(
4444
runnables.stream()
4545
.map(Provider::get)
4646
.filter(r -> r.accept(config.getClass()))
47+
.sorted()
4748
.findFirst()
4849
.map(r -> r.build(config, definition))
4950
.orElseThrow(

0 commit comments

Comments
 (0)