This is an automated email from the ASF dual-hosted git repository.
dominikriemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to refs/heads/dev by this push:
new dd43edcfb2 fix: Fix adapter script migration for file stream adapter
(#4761)
dd43edcfb2 is described below
commit dd43edcfb28eac0ebd72ba6eda73d25643ee960b
Author: Sven Oehler <[email protected]>
AuthorDate: Thu Jul 23 21:18:07 2026 +0200
fix: Fix adapter script migration for file stream adapter (#4761)
---
.../compact/generator/AdapterSchemaGenerator.java | 31 +-------
.../management/AdapterMasterManagement.java | 1 +
.../AdapterTransformationConfigDefaults.java | 37 ++++++++++
.../management/AdapterUpdateManagement.java | 1 +
.../iiot/protocol/stream/FileReplayAdapter.java | 31 ++++++--
.../protocol/stream/FileReplayAdapterTest.java | 26 +++++++
.../model/connect/TransformationConfig.java | 22 ++++++
.../v099/connect/MigrateAdaptersToUseScript.java | 44 ++++++++---
.../v099/MigrateAdaptersToUseScriptTest.java | 86 ++++++++++++++++++++++
9 files changed, 234 insertions(+), 45 deletions(-)
diff --git
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/generator/AdapterSchemaGenerator.java
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/generator/AdapterSchemaGenerator.java
index ff240bd30d..6b22c4abd9 100644
---
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/generator/AdapterSchemaGenerator.java
+++
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/compact/generator/AdapterSchemaGenerator.java
@@ -62,8 +62,8 @@ public class AdapterSchemaGenerator implements
AdapterModelGenerator {
adapterDescription.getTransformationConfig()
.setInputs(sampleData.getSamples());
- setDefaultScriptIfNotSet(adapterDescription);
- setDefaultScriptLanguageIfNotSet(adapterDescription);
+ adapterDescription.getTransformationConfig()
+ .applyScriptDefaults();
guessManagement.transformSampleData(adapterDescription, userId);
@@ -88,31 +88,4 @@ public class AdapterSchemaGenerator implements
AdapterModelGenerator {
}
}
- private void setDefaultScriptIfNotSet(AdapterDescription adapterDescription)
{
- if (adapterDescription.getTransformationConfig()
- .getScript() == null
- || adapterDescription.getTransformationConfig()
- .getScript()
- .isEmpty()) {
- adapterDescription.getTransformationConfig().setScriptActive(true);
- adapterDescription.getTransformationConfig()
- .setScript("""
- function transform(event, out, ctx) {
- out.collect(event);
- }
- """);
-
- }
- }
-
- private void setDefaultScriptLanguageIfNotSet(AdapterDescription
adapterDescription) {
- if (adapterDescription.getTransformationConfig()
- .getLanguage() == null
- || adapterDescription.getTransformationConfig()
- .getLanguage()
- .isEmpty()) {
- adapterDescription.getTransformationConfig()
- .setLanguage("javascript");
- }
- }
}
diff --git
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
index 8e87a97401..cee9cc2f7b 100644
---
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
+++
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterMasterManagement.java
@@ -85,6 +85,7 @@ public class AdapterMasterManagement {
var eventGrounding = GroundingUtils.createEventGrounding();
adapterDescription.setEventGrounding(eventGrounding);
+ AdapterTransformationConfigDefaults.applyTo(adapterDescription);
adapterResourceManager.encryptAndCreate(adapterDescription);
// Stream is only created if the adpater is successfully stored
diff --git
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterTransformationConfigDefaults.java
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterTransformationConfigDefaults.java
new file mode 100644
index 0000000000..fafde63318
--- /dev/null
+++
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterTransformationConfigDefaults.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.streampipes.connect.management.management;
+
+import org.apache.streampipes.model.connect.TransformationConfig;
+import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+
+class AdapterTransformationConfigDefaults {
+
+ private AdapterTransformationConfigDefaults() {
+ }
+
+ static void applyTo(AdapterDescription adapterDescription) {
+ if (adapterDescription.getTransformationConfig() == null) {
+
adapterDescription.setTransformationConfig(TransformationConfig.withDefaultScript());
+ } else {
+ adapterDescription.getTransformationConfig()
+ .applyScriptDefaults();
+ }
+ }
+}
diff --git
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
index 2c3d9f2504..66512001d3 100644
---
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
+++
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/AdapterUpdateManagement.java
@@ -48,6 +48,7 @@ public class AdapterUpdateManagement {
public void updateAdapter(AdapterDescription ad)
throws AdapterException {
// update adapter in database
+ AdapterTransformationConfigDefaults.applyTo(ad);
this.adapterResourceManager.encryptAndUpdate(ad);
boolean shouldRestart = ad.isRunning();
diff --git
a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
index ce0c70c77b..aa194d8b79 100644
---
a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
+++
b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
@@ -196,17 +196,15 @@ public class FileReplayAdapter implements
StreamPipesAdapter {
protected void validateTimestampFieldInInputEvent(IAdapterParameterExtractor
extractor)
throws AdapterException {
- var inputEvents = extractor.getAdapterDescription()
- .getTransformationConfig()
- .getInputs();
+ var sampleInputEvent = getSampleInputEvent(extractor);
- if (inputEvents == null || inputEvents.isEmpty()) {
+ if (sampleInputEvent == null || sampleInputEvent.isEmpty()) {
throw new AdapterException("Could not validate timestamp field in
original input event. "
+ "No sample input event is available.
The file replay adapter requires a Unix "
+ "timestamp to be present in the
original input data.");
}
- var timestampFieldValue = inputEvents.get(0).get(timestampRuntimeName);
+ var timestampFieldValue = sampleInputEvent.get(timestampRuntimeName);
if (!(timestampFieldValue instanceof Number)) {
throw new AdapterException("The timestamp field in the original input
event must be numeric. "
@@ -218,6 +216,27 @@ public class FileReplayAdapter implements
StreamPipesAdapter {
}
}
+ private Map<String, Object> getSampleInputEvent(IAdapterParameterExtractor
extractor) throws AdapterException {
+ var transformationConfig = extractor.getAdapterDescription()
+ .getTransformationConfig();
+
+ if (transformationConfig != null
+ && transformationConfig.getInputs() != null
+ && !transformationConfig.getInputs().isEmpty()) {
+ return transformationConfig.getInputs().get(0);
+ }
+
+ var inputStream = getFileAsInputStreamFromEndpoint(extractor);
+ var sampleData = extractor.selectedParser().getSampleData(inputStream);
+ if (sampleData == null
+ || sampleData.getSamples() == null
+ || sampleData.getSamples().isEmpty()) {
+ return Map.of();
+ }
+
+ return sampleData.getSamples().get(0);
+ }
+
private void getFileFromEndpointAndParseFile(
IAdapterParameterExtractor extractor,
IEventCollector collector,
@@ -329,7 +348,7 @@ public class FileReplayAdapter implements
StreamPipesAdapter {
.getSampleData(inputStream);
}
- private InputStream
getFileAsInputStreamFromEndpoint(IAdapterParameterExtractor extractor) throws
AdapterException {
+ protected InputStream
getFileAsInputStreamFromEndpoint(IAdapterParameterExtractor extractor) throws
AdapterException {
var selectedFileName = extractor
.getStaticPropertyExtractor()
.selectedFilename(FILE_PATH);
diff --git
a/streampipes-extensions/streampipes-connect-adapters-iiot/src/test/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapterTest.java
b/streampipes-extensions/streampipes-connect-adapters-iiot/src/test/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapterTest.java
index a11884dd26..7bbad69a6b 100644
---
a/streampipes-extensions/streampipes-connect-adapters-iiot/src/test/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapterTest.java
+++
b/streampipes-extensions/streampipes-connect-adapters-iiot/src/test/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapterTest.java
@@ -20,19 +20,24 @@ package org.apache.streampipes.connect.iiot.protocol.stream;
import org.apache.streampipes.commons.exceptions.connect.AdapterException;
import org.apache.streampipes.extensions.api.connect.IEventCollector;
+import org.apache.streampipes.extensions.api.connect.IParser;
import
org.apache.streampipes.extensions.api.extractor.IAdapterParameterExtractor;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.connect.guess.SampleData;
import org.apache.streampipes.sdk.helpers.EpProperties;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -112,6 +117,20 @@ class FileReplayAdapterTest {
fileReplayAdapter.validateTimestampFieldInInputEvent(extractor);
}
+ @Test
+ void
validateTimestampFieldInInputEvent_shouldUseParserSampleWhenOriginalInputIsEmpty()
throws AdapterException {
+ var parser = mock(IParser.class);
+ var sampleData = new SampleData();
+ sampleData.setSamples(List.of(Map.of(TIMESTAMP, TIMESTAMP_VALUE)));
+ adapterDescription.getTransformationConfig().setInputs(List.of());
+ when(extractor.selectedParser()).thenReturn(parser);
+ when(parser.getSampleData(any(InputStream.class))).thenReturn(sampleData);
+ fileReplayAdapter = new TestFileReplayAdapter();
+ fileReplayAdapter.setTimestampRuntimeName(TIMESTAMP);
+
+ fileReplayAdapter.validateTimestampFieldInInputEvent(extractor);
+ }
+
@Test
void
validateTimestampFieldInInputEvent_shouldThrowForStringTimestampInOriginalInput()
{
adapterDescription.getTransformationConfig().setInputs(List.of(Map.of(TIMESTAMP,
"2021-12-24T12:55:12.123+01:00")));
@@ -130,4 +149,11 @@ class FileReplayAdapterTest {
assertEquals(Long.class, event.get(TIMESTAMP).getClass());
}
+ private static class TestFileReplayAdapter extends FileReplayAdapter {
+
+ @Override
+ protected InputStream
getFileAsInputStreamFromEndpoint(IAdapterParameterExtractor extractor) {
+ return new ByteArrayInputStream(new byte[0]);
+ }
+ }
}
diff --git
a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/TransformationConfig.java
b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/TransformationConfig.java
index fb8596c326..1e06253a56 100644
---
a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/TransformationConfig.java
+++
b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/TransformationConfig.java
@@ -23,6 +23,12 @@ import java.util.List;
import java.util.Map;
public class TransformationConfig {
+ public static final String DEFAULT_LANGUAGE = "javascript";
+ public static final String DEFAULT_SCRIPT = """
+ function transform(event, out, ctx) {
+ out.collect(event);
+ }""";
+
private boolean scriptActive;
private String language;
private String script;
@@ -37,6 +43,22 @@ public class TransformationConfig {
this.outputs = new ArrayList<>();
}
+ public static TransformationConfig withDefaultScript() {
+ var config = new TransformationConfig();
+ config.applyScriptDefaults();
+ return config;
+ }
+
+ public void applyScriptDefaults() {
+ if (language == null || language.isBlank()) {
+ language = DEFAULT_LANGUAGE;
+ }
+
+ if (script == null || script.isBlank()) {
+ script = DEFAULT_SCRIPT;
+ }
+ }
+
public String getLanguage() {
return language;
}
diff --git
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/connect/MigrateAdaptersToUseScript.java
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/connect/MigrateAdaptersToUseScript.java
index 3cad25f3b2..ee1b7ff218 100644
---
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/connect/MigrateAdaptersToUseScript.java
+++
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v099/connect/MigrateAdaptersToUseScript.java
@@ -36,6 +36,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
public class MigrateAdaptersToUseScript implements Migration {
@@ -50,17 +51,17 @@ public class MigrateAdaptersToUseScript implements
Migration {
}
@Override
- // Execute if there is an adapter with no transformation config or script
+ // Execute if an adapter still has legacy transformation rules or misses its
script config
public boolean shouldExecute() {
List<AdapterDescription> adapters = adapterStorage.findAll();
- return adapters != null &&
adapters.stream().anyMatch(this::hasEmptyTransformationConfig);
+ return adapters != null && adapters.stream().anyMatch(this::shouldMigrate);
}
@Override
public void executeMigration() throws IOException {
adapterStorage.findAll()
.stream()
- .filter(this::hasEmptyTransformationConfig)
+ .filter(this::shouldMigrate)
.forEach(this::migrateAndUpdateAdapter);
}
@@ -69,8 +70,19 @@ public class MigrateAdaptersToUseScript implements Migration
{
return "Changes the rules based adapters to use script based
transformations instead.";
}
- private boolean hasEmptyTransformationConfig(AdapterDescription adapter) {
- return adapter.getTransformationConfig() == null ||
adapter.getTransformationConfig().getScript() == null;
+ private boolean shouldMigrate(AdapterDescription adapter) {
+ return adapter.getTransformationConfig() == null
+ || hasNoScript(adapter)
+ || hasLegacyRules(adapter);
+ }
+
+ private boolean hasNoScript(AdapterDescription adapter) {
+ var script = adapter.getTransformationConfig().getScript();
+ return script == null || script.isBlank();
+ }
+
+ private boolean hasLegacyRules(AdapterDescription adapter) {
+ return adapter.getRules() != null && !adapter.getRules().isEmpty();
}
private void migrateAndUpdateAdapter(AdapterDescription adapterDescription) {
@@ -86,7 +98,7 @@ public class MigrateAdaptersToUseScript implements Migration {
removeAdditionalMetadata(adapter);
// migration logic for a single adapter
- var config = initializeTransformationConfig();
+ var config =
initializeTransformationConfig(adapter.getTransformationConfig());
var scriptBuilder = TransformationScriptBuilder.create();
@@ -121,14 +133,26 @@ public class MigrateAdaptersToUseScript implements
Migration {
}
- private TransformationConfig initializeTransformationConfig() {
+ private TransformationConfig
initializeTransformationConfig(TransformationConfig oldConfig) {
var config = new TransformationConfig();
- config.setLanguage("javascript");
- config.setInputs(new ArrayList<>());
- config.setOutputs(new ArrayList<>());
+ config.setLanguage(TransformationConfig.DEFAULT_LANGUAGE);
+
+ if (oldConfig == null) {
+ return config;
+ }
+
+ config.setInputs(copyOrEmpty(oldConfig.getInputs()));
+ config.setOutputs(copyOrEmpty(oldConfig.getOutputs()));
+ config.setReduceEventRateRule(oldConfig.getReduceEventRateRule());
+ config.setRemoveDuplicateRule(oldConfig.getRemoveDuplicateRule());
+
return config;
}
+ private List<Map<String, Object>> copyOrEmpty(List<Map<String, Object>>
values) {
+ return values == null ? new ArrayList<>() : new ArrayList<>(values);
+ }
+
/**
* Removes deprecated parser configuration options from the adapter's
"format" -> "Json" configuration.
* <p>
diff --git
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v099/MigrateAdaptersToUseScriptTest.java
b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v099/MigrateAdaptersToUseScriptTest.java
index f2d901137e..0fb5362eeb 100644
---
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v099/MigrateAdaptersToUseScriptTest.java
+++
b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v099/MigrateAdaptersToUseScriptTest.java
@@ -19,6 +19,9 @@
package org.apache.streampipes.service.core.migrations.v099;
import org.apache.streampipes.model.SpDataStream;
+import org.apache.streampipes.model.connect.ReduceEventRateRule;
+import org.apache.streampipes.model.connect.RemoveDuplicateRule;
+import org.apache.streampipes.model.connect.TransformationConfig;
import org.apache.streampipes.model.connect.adapter.AdapterDescription;
import
org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
import org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription;
@@ -47,10 +50,12 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -80,10 +85,23 @@ class MigrateAdaptersToUseScriptTest {
assertTrue(result);
}
+ @Test
+ void shouldExecute_ReturnsTrue_WhenAdapterHasLegacyRulesAndDefaultScript() {
+ var adapter = createBaseAdapter(new RenameRuleDescription("old", "new"));
+ adapter.setTransformationConfig(TransformationConfig.withDefaultScript());
+
+ when(mockStorage.findAll()).thenReturn(List.of(adapter));
+
+ boolean result = migration.shouldExecute();
+
+ assertTrue(result);
+ }
+
@Test
void executeMigration_RemoveAdditionalMetadata() throws IOException {
// Arrange
var adapter = new AdapterDescription();
+ adapter.getTransformationConfig().setScript(null);
var eventPropertyPrimitive = new EventPropertyPrimitive();
eventPropertyPrimitive.setAdditionalMetadata(Collections.singletonMap("key",
"value"));
var eventSchema = new EventSchema();
@@ -113,6 +131,66 @@ class MigrateAdaptersToUseScriptTest {
verify(mockStorage).updateElement(adapter);
}
+ @Test
+ void
executeMigration_KeepsInputsAndOutputsNonNull_WhenExistingConfigHasNullLists()
throws IOException {
+ var adapter = createBaseAdapterWithoutRules();
+ var oldConfig = new TransformationConfig();
+ oldConfig.setScript(null);
+ oldConfig.setInputs(null);
+ oldConfig.setOutputs(null);
+ adapter.setTransformationConfig(oldConfig);
+
+ when(mockStorage.findAll()).thenReturn(List.of(adapter));
+
+ migration.executeMigration();
+
+ var resultConfig = adapter.getTransformationConfig();
+ assertNotNull(resultConfig.getInputs());
+ assertTrue(resultConfig.getInputs().isEmpty());
+ assertNotNull(resultConfig.getOutputs());
+ assertTrue(resultConfig.getOutputs().isEmpty());
+ verify(mockStorage).updateElement(adapter);
+ }
+
+ @Test
+ void executeMigration_CopiesExistingTransformationConfigValues() throws
IOException {
+ var input = new HashMap<String, Object>();
+ input.put("runtimeName", "temperature");
+ var output = new HashMap<String, Object>();
+ output.put("runtimeName", "temperature_celsius");
+
+ var inputs = new ArrayList<Map<String, Object>>();
+ inputs.add(input);
+ var outputs = new ArrayList<Map<String, Object>>();
+ outputs.add(output);
+
+ var reduceEventRateRule = new ReduceEventRateRule(10, "mean");
+ var removeDuplicateRule = new RemoveDuplicateRule("500");
+
+ var oldConfig = new TransformationConfig();
+ oldConfig.setScript(null);
+ oldConfig.setInputs(inputs);
+ oldConfig.setOutputs(outputs);
+ oldConfig.setReduceEventRateRule(reduceEventRateRule);
+ oldConfig.setRemoveDuplicateRule(removeDuplicateRule);
+
+ var adapter = createBaseAdapterWithoutRules();
+ adapter.setTransformationConfig(oldConfig);
+
+ when(mockStorage.findAll()).thenReturn(List.of(adapter));
+
+ migration.executeMigration();
+
+ var resultConfig = adapter.getTransformationConfig();
+ assertEquals(TransformationConfig.DEFAULT_LANGUAGE,
resultConfig.getLanguage());
+ assertEquals(inputs, resultConfig.getInputs());
+ assertEquals(outputs, resultConfig.getOutputs());
+ assertNotSame(inputs, resultConfig.getInputs());
+ assertNotSame(outputs, resultConfig.getOutputs());
+ assertEquals(reduceEventRateRule, resultConfig.getReduceEventRateRule());
+ assertEquals(removeDuplicateRule, resultConfig.getRemoveDuplicateRule());
+ }
+
@Test
void executeMigration_TransformsRenameRuleToScript() throws IOException {
// Arrange
@@ -424,4 +502,12 @@ class MigrateAdaptersToUseScriptTest {
adapter.getDataStream().setEventSchema(new EventSchema());
return adapter;
}
+
+ private AdapterDescription createBaseAdapterWithoutRules() {
+ AdapterDescription adapter = new AdapterDescription();
+ adapter.setRules(new ArrayList<>());
+ adapter.setDataStream(new SpDataStream());
+ adapter.getDataStream().setEventSchema(new EventSchema());
+ return adapter;
+ }
}