Skip to content

Commit 59fe298

Browse files
committed
GH-1139 Fix function composition with non-existing functions
Resolves #1139
1 parent 26e507f commit 59fe298

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,12 @@ public <T> T lookup(Class<?> type, String functionDefinition, String... expected
144144
Set<String> functionRegistratioinNames = super.getNames(null);
145145
String[] functionNames = StringUtils.delimitedListToStringArray(functionDefinition.replaceAll(",", "|").trim(), "|");
146146
for (String functionName : functionNames) {
147-
if (functionRegistratioinNames.contains(functionName) && logger.isDebugEnabled()) {
148-
logger.debug("Skipping function '" + functionName + "' since it is already present");
147+
if (functionRegistratioinNames.contains(functionName)) {
148+
if (logger.isDebugEnabled()) {
149+
logger.debug("Skipping function '" + functionName + "' since it is already present");
150+
}
149151
}
150152
else {
151-
152153
Object functionCandidate = this.discoverFunctionInBeanFactory(functionName);
153154
if (functionCandidate != null) {
154155
Type functionType = null;

spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030
import java.util.Map;
3131
import java.util.Map.Entry;
32+
import java.util.Set;
3233
import java.util.concurrent.ExecutorService;
3334
import java.util.concurrent.Executors;
3435
import java.util.concurrent.TimeUnit;
@@ -115,6 +116,30 @@ public void testEmptyPojoConversion() {
115116
assertThat(result).isEqualTo("{}");
116117
}
117118

119+
@SuppressWarnings({ "rawtypes", "unchecked" })
120+
@Test
121+
public void testCompositionWithNonExistingFunction() throws Exception {
122+
FunctionCatalog catalog = this.configureCatalog(CompositionWithNullReturnInBetween.class);
123+
for (int i = 0; i < 10; i++) {
124+
catalog.lookup("echo1|any");
125+
}
126+
Field functionRegistrationsField = ReflectionUtils.findField(catalog.getClass(), "functionRegistrations");
127+
functionRegistrationsField.setAccessible(true);
128+
Set<FunctionRegistration> functionRegistrations = (Set) functionRegistrationsField.get(catalog);
129+
assertThat(functionRegistrations.size()).isEqualTo(1);
130+
FunctionRegistration registration = functionRegistrations.iterator().next();
131+
assertThat(registration.getNames().size()).isEqualTo(1);
132+
assertThat(registration.getNames().iterator().next()).isEqualTo("echo1");
133+
134+
for (int i = 0; i < 10; i++) {
135+
catalog.lookup("echo1|any|foo|bar|bye");
136+
}
137+
assertThat(functionRegistrations.size()).isEqualTo(1);
138+
registration = functionRegistrations.iterator().next();
139+
assertThat(registration.getNames().size()).isEqualTo(1);
140+
assertThat(registration.getNames().iterator().next()).isEqualTo("echo1");
141+
}
142+
118143
@SuppressWarnings({ "rawtypes", "unchecked" })
119144
@Test
120145
public void testCompositionWithNullReturnInBetween() {

0 commit comments

Comments
 (0)