This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch remove-old-migrations
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit 7355a78f707352dfd6daa1eaa9e64fca45efb27c
Author: Dominik Riemer <[email protected]>
AuthorDate: Fri Mar 6 09:05:12 2026 +0100

    chore: Remove migrations from v097 downwards
---
 .../core/migrations/AvailableMigrations.java       |  22 --
 .../v070/CreateAssetLinkTypeMigration.java         |  50 -----
 .../v070/CreateFileAssetTypeMigration.java         |  59 ------
 .../v090/UpdateUsernameViewMigration.java          |  62 ------
 .../v093/StoreEmailTemplatesMigration.java         |  58 ------
 ...MergeFilenamesAndRenameDuplicatesMigration.java | 232 ---------------------
 .../v970/AddDataLakePipelineTemplateMigration.java |  50 -----
 .../migrations/v970/AddLinkSettingsMigration.java  |  52 -----
 .../migrations/v970/AddRolesToUserDbMigration.java |  64 ------
 .../v970/DataExplorerDataViewMigration.java        | 125 -----------
 .../v970/ModifyAssetLinkTypeMigration.java         | 101 ---------
 .../RemoveNodesFromOpcUaAdaptersMigration.java     |  98 ---------
 ...eFilenamesAndRenameDuplicatesMigrationTest.java | 112 ----------
 .../RemoveNodesFromOpcUaAdaptersMigrationTest.java |  85 --------
 .../svcdiscovery/SpServiceDiscoveryCore.java       |   1 -
 15 files changed, 1171 deletions(-)

diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
index b09d4d7ec6..220d6a58c1 100644
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
+++ 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/AvailableMigrations.java
@@ -19,11 +19,6 @@
 
 package org.apache.streampipes.service.core.migrations;
 
-import 
org.apache.streampipes.service.core.migrations.v070.CreateAssetLinkTypeMigration;
-import 
org.apache.streampipes.service.core.migrations.v070.CreateFileAssetTypeMigration;
-import 
org.apache.streampipes.service.core.migrations.v090.UpdateUsernameViewMigration;
-import 
org.apache.streampipes.service.core.migrations.v093.StoreEmailTemplatesMigration;
-import 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration;
 import 
org.apache.streampipes.service.core.migrations.v0980.AddDataLakeMeasureViewMigration;
 import 
org.apache.streampipes.service.core.migrations.v0980.AddDefaultExportProviderMigration;
 import 
org.apache.streampipes.service.core.migrations.v0980.FixImportedPermissionsMigration;
@@ -41,12 +36,6 @@ import 
org.apache.streampipes.service.core.migrations.v099.RemoveDuplicatedAsset
 import 
org.apache.streampipes.service.core.migrations.v099.RemoveObsoletePrivilegesMigration;
 import 
org.apache.streampipes.service.core.migrations.v099.UniqueDashboardIdMigration;
 import 
org.apache.streampipes.service.core.migrations.v099.connect.MigrateAdaptersToUseScript;
-import 
org.apache.streampipes.service.core.migrations.v970.AddDataLakePipelineTemplateMigration;
-import 
org.apache.streampipes.service.core.migrations.v970.AddLinkSettingsMigration;
-import 
org.apache.streampipes.service.core.migrations.v970.AddRolesToUserDbMigration;
-import 
org.apache.streampipes.service.core.migrations.v970.DataExplorerDataViewMigration;
-import 
org.apache.streampipes.service.core.migrations.v970.ModifyAssetLinkTypeMigration;
-import 
org.apache.streampipes.service.core.migrations.v970.RemoveNodesFromOpcUaAdaptersMigration;
 
 import java.util.Arrays;
 import java.util.List;
@@ -55,17 +44,6 @@ public class AvailableMigrations {
 
   public List<Migration> getAvailableMigrations() {
     return Arrays.asList(
-        new CreateAssetLinkTypeMigration(),
-        new CreateFileAssetTypeMigration(),
-        new UpdateUsernameViewMigration(),
-        new StoreEmailTemplatesMigration(),
-        new MergeFilenamesAndRenameDuplicatesMigration(),
-        new AddLinkSettingsMigration(),
-        new DataExplorerDataViewMigration(),
-        new ModifyAssetLinkTypeMigration(),
-        new RemoveNodesFromOpcUaAdaptersMigration(),
-        new AddRolesToUserDbMigration(),
-        new AddDataLakePipelineTemplateMigration(),
         new ModifyAssetLinksMigration(),
         new ModifyAssetLinkTypesMigration(),
         new AddDataLakeMeasureViewMigration(),
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateAssetLinkTypeMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateAssetLinkTypeMigration.java
deleted file mode 100644
index 42db290315..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateAssetLinkTypeMigration.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.service.core.migrations.v070;
-
-import org.apache.streampipes.commons.constants.GenericDocTypes;
-import org.apache.streampipes.manager.setup.tasks.CreateAssetLinkTypeTask;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import java.io.IOException;
-
-public class CreateAssetLinkTypeMigration implements Migration {
-
-  @Override
-  public boolean shouldExecute() {
-    try {
-      return 
StorageDispatcher.INSTANCE.getNoSqlStore().getGenericStorage().findAll(GenericDocTypes.DOC_ASSET_LINK_TYPE)
-          .size() == 0;
-    } catch (IOException e) {
-      return true;
-    }
-  }
-
-  @Override
-  public void executeMigration() {
-    new CreateAssetLinkTypeTask().execute();
-  }
-
-  @Override
-  public String getDescription() {
-    return "Populating database with default asset links";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateFileAssetTypeMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateFileAssetTypeMigration.java
deleted file mode 100644
index 7cef8f0960..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v070/CreateFileAssetTypeMigration.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.service.core.migrations.v070;
-
-import org.apache.streampipes.commons.constants.GenericDocTypes;
-import org.apache.streampipes.commons.random.UUIDGenerator;
-import org.apache.streampipes.model.assets.AssetLinkType;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import java.io.IOException;
-import java.util.List;
-
-public class CreateFileAssetTypeMigration implements Migration {
-
-  @Override
-  public boolean shouldExecute() {
-    try {
-      return StorageDispatcher
-          .INSTANCE
-          .getNoSqlStore()
-          .getGenericStorage()
-          .findAll(GenericDocTypes.DOC_ASSET_LINK_TYPE)
-          .stream()
-          .noneMatch(al -> al.get("linkType").equals("file"));
-    } catch (IOException e) {
-      return true;
-    }
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var fileAsset = new AssetLinkType("file", "File", "var(--color-file)", 
"draft", "file", List.of(), false);
-    fileAsset.setId(UUIDGenerator.generateUuid());
-    
StorageDispatcher.INSTANCE.getNoSqlStore().getGenericStorage().create(fileAsset,
 AssetLinkType.class);
-
-  }
-
-  @Override
-  public String getDescription() {
-    return "Create asset type 'File'";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v090/UpdateUsernameViewMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v090/UpdateUsernameViewMigration.java
deleted file mode 100644
index cb2368c1ec..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v090/UpdateUsernameViewMigration.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.service.core.migrations.v090;
-
-import org.apache.streampipes.manager.setup.design.UserDesignDocument;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import org.lightcouch.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class UpdateUsernameViewMigration implements Migration {
-
-  private static final Logger LOG = 
LoggerFactory.getLogger(UpdateUsernameViewMigration.class);
-  private static final String DOC_NAME = "_design/users";
-
-  @Override
-  public boolean shouldExecute() {
-    var designDoc = Utils.getCouchDbUserClient().design().getFromDb(DOC_NAME);
-    var viewKey = UserDesignDocument.USERNAME_KEY;
-    var viewMapFunction = UserDesignDocument.USERNAME_MAP_FUNCTION;
-    var views = designDoc.getViews();
-
-    if (views.containsKey(viewKey)) {
-      return !(views.get(viewKey).getMap().equals(viewMapFunction));
-    } else {
-      return true;
-    }
-  }
-
-  @Override
-  public void executeMigration() {
-    var userDocument = new UserDesignDocument().make();
-    Response resp = 
Utils.getCouchDbUserClient().design().synchronizeWithDb(userDocument);
-
-    if (resp.getError() != null) {
-      LOG.warn("Could not update user design document with reason {}", 
resp.getReason());
-    }
-  }
-
-  @Override
-  public String getDescription() {
-    return "Lowercase all keys in user database design document";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v093/StoreEmailTemplatesMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v093/StoreEmailTemplatesMigration.java
deleted file mode 100644
index dfeca224ba..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v093/StoreEmailTemplatesMigration.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.service.core.migrations.v093;
-
-import 
org.apache.streampipes.model.configuration.DefaultEmailTemplateConfiguration;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import java.io.IOException;
-
-public class StoreEmailTemplatesMigration implements Migration {
-
-  private final ISpCoreConfigurationStorage storage;
-
-  public StoreEmailTemplatesMigration() {
-    this.storage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getSpCoreConfigurationStorage();
-  }
-
-  @Override
-  public boolean shouldExecute() {
-    var config = storage.get();
-    if (config == null) {
-      return false;
-    } else {
-      return config.getEmailTemplateConfig() == null;
-    }
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var config = storage.get();
-    config.setEmailTemplateConfig(new 
DefaultEmailTemplateConfiguration().getDefaultTemplates());
-
-    storage.updateElement(config);
-  }
-
-  @Override
-  public String getDescription() {
-    return "Moving email templates to configuration storage";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
deleted file mode 100644
index 3fefb94b27..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigration.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * 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.service.core.migrations.v095;
-
-import org.apache.streampipes.manager.file.FileHandler;
-import org.apache.streampipes.model.file.FileMetadata;
-import org.apache.streampipes.serializers.json.JacksonSerializer;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.system.IFileMetadataStorage;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.lightcouch.CouchDbClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-
-public class MergeFilenamesAndRenameDuplicatesMigration implements Migration {
-
-  protected static final String ORIGINAL_FILENAME = "originalFilename";
-  protected static final String INTERNAL_FILENAME = "internalFilename";
-  protected static final String ID = "_id";
-  protected static final String FILETYPE = "filetype";
-
-  private CouchDbClient couchDbClient;
-
-  private final ObjectMapper mapper = JacksonSerializer.getObjectMapper(Map.of(
-      DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true
-    ));
-
-  private final IFileMetadataStorage fileMetadataStorage =
-      StorageDispatcher.INSTANCE.getNoSqlStore().getFileMetadataStorage();
-
-  private final FileHandler fileHandler = new FileHandler();
-
-  Logger logger = 
LoggerFactory.getLogger(MergeFilenamesAndRenameDuplicatesMigration.class);
-
-  protected Map<String, List<FileMetadata>> fileMetadataGroupedByOriginalName 
= new HashMap<>();
-
-  private boolean isTesting = false;
-
-  public MergeFilenamesAndRenameDuplicatesMigration(boolean testing) {
-    isTesting = testing;
-  }
-
-  public MergeFilenamesAndRenameDuplicatesMigration() {
-    couchDbClient = Utils.getCouchDbFileMetadataClient();
-  }
-
-  // Starting from v0.95, StreamPipes will use a single file name as the 
unique identifier of files instead of an
-  // internal filename and an original filename. This migration merges them 
and renames all the files that have
-  // duplicate names to ensure uniqueness
-  @Override
-  public boolean shouldExecute() {
-    return true;
-  }
-
-  @Override
-  public void executeMigration() {
-    var couchDbRawFileMetadata = 
getCouchDbRawFileMetadata(getAllFileIds(fileMetadataStorage));
-    getFileMetadataToUpdate(couchDbRawFileMetadata);
-    fileMetadataGroupedByOriginalName.forEach(
-        (originalFilename, fileMetadataList) -> update(originalFilename, 
fileMetadataList));
-  }
-
-  /**
-   * Gets all fileMetadata that need to be updated grouped by originalFilename
-   * key is (possibly) duplicated originalFilename and value is that file's 
FileMetadata list (if duplicated)
-   */
-  protected void getFileMetadataToUpdate(List<Map<String, Object>> 
couchDbRawFileMetadata) {
-    couchDbRawFileMetadata.forEach(
-        this::checkDuplicateOriginalFilename);
-  }
-
-  /**
-   * Fetches all fileIds stored in CouchDB
-   */
-  private List<String> getAllFileIds(IFileMetadataStorage fileMetadataStorage) 
{
-    return fileMetadataStorage.findAll().stream().map(FileMetadata::getFileId)
-        .toList();
-  }
-
-  /**
-   * Takes the list of fileIds and searches for their raw metadata in CouchDB 
and returns them
-   */
-  private List<Map<String, Object>> getCouchDbRawFileMetadata(List<String> 
fileIds) {
-    return fileIds.stream()
-        .map(fileId -> convertInputStreamToMap(couchDbClient.find(fileId)))
-        .toList();
-  }
-
-  /**
-   * Converts InputStream (as stored in CouchDB) to Map, if there's an error, 
constructs a new Map
-   */
-  private Map<String, Object> convertInputStreamToMap(InputStream inputStream) 
{
-    try {
-      return mapper.readValue(inputStream, Map.class);
-    } catch (Exception e) {
-      Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
-      String inputStreamString = scanner.hasNext() ? scanner.next() : "";
-      logger.error(
-          "Failed to construct a Map from InputStream stored in CouchDB, the 
data for this file is likely corrupted, "
-              + "skipping it for migration.\nThe original debug message is: " 
+ e.getMessage()
-              + "\nThe original InputStream is: " + inputStreamString);
-      return new HashMap<>();
-    }
-  }
-
-  /**
-   * Takes raw data stored in CouchDB and constructs 
fileMetadataGroupedByOriginalName,
-   * key is (possibly) duplicated originalFilename and value is that file's 
FileMetadata list (if duplicated)
-   */
-  private void checkDuplicateOriginalFilename(Map<String, Object> 
rawFileMetadata) {
-    // If this file was already migrated or there was an error when converting 
InputStream to Map, skip it
-    if (rawFileMetadata.containsKey(ORIGINAL_FILENAME)) {
-      var originalFilename = 
rawFileMetadata.get(ORIGINAL_FILENAME).toString().toLowerCase();
-      if (!fileMetadataGroupedByOriginalName.containsKey(originalFilename)) {
-        fileMetadataGroupedByOriginalName.put(originalFilename, new 
ArrayList<>());
-      }
-      FileMetadata fileMetadata;
-      if (isTesting) {
-        fileMetadata = new FileMetadata();
-        fileMetadata.setFileId(rawFileMetadata.get(ID).toString());
-        fileMetadata.setFiletype(rawFileMetadata.get(FILETYPE).toString());
-      } else {
-        fileMetadata = 
fileMetadataStorage.getElementById(rawFileMetadata.get(ID).toString());
-      }
-      
fileMetadataGroupedByOriginalName.get(originalFilename).add(fileMetadata);
-    }
-  }
-
-  /**
-   * For each of the file, calls updateFileMetadata() and updateLocalFile()
-   */
-  protected void update(String originalFilename, List<FileMetadata> 
fileMetadataList) {
-    var fileMetadata = fileMetadataList.get(0);
-    // just name the 1st one to its originalFilename
-    if (!isTesting) {
-      var internalFilename = getInternalFilenameFromFileMetadata(fileMetadata);
-      updateLocalFile(internalFilename, originalFilename);
-    }
-    updateFileMetadata(fileMetadata, originalFilename, isTesting);
-    for (int i = 1; i < fileMetadataList.size(); ++i) {
-      fileMetadata = fileMetadataList.get(i);
-      var newFilename = createNewFileName(i, removeFileType(originalFilename), 
fileMetadata.getFiletype());
-      if (!isTesting) {
-        var internalFilename = 
getInternalFilenameFromFileMetadata(fileMetadata);
-        updateLocalFile(internalFilename, newFilename);
-      }
-      updateFileMetadata(fileMetadata, newFilename, isTesting);
-    }
-  }
-
-  /**
-   * Updates FileMetadata: sets new merged filename to the given filename
-   */
-  private void updateFileMetadata(FileMetadata fileMetadata, String filename, 
boolean isTesting) {
-    fileMetadata.setFilename(filename);
-    if (!isTesting) {
-      fileMetadataStorage.updateElement(fileMetadata);
-    }
-  }
-
-  /**
-   * Updates the file stored locally: renames the file (i.e. before it's using 
internalFilename, now copy the
-   * InputStream stored and replace internalFilename with the given filename)
-   */
-  private void updateLocalFile(String internalFilename, String filename) {
-    fileHandler.renameFile(internalFilename, filename);
-  }
-
-  /**
-   * Gets the old internalFilename after merging
-   */
-  private String getInternalFilenameFromFileMetadata(FileMetadata 
fileMetadata) {
-    return 
convertInputStreamToMap(couchDbClient.find(fileMetadata.getFileId())).get(INTERNAL_FILENAME).toString();
-  }
-
-  /**
-   * Creates the new file name for a file with a duplicate name.
-   */
-  private String createNewFileName(
-      int index,
-      String fileName,
-      String fileType
-  ) {
-    return String.format(
-        "%s(%d).%s",
-        fileName,
-        index + 1,
-        fileType
-    );
-  }
-
-  /**
-   * Returns file name without file type suffix.
-   */
-  private String removeFileType(String fileName) {
-    var indexBeforeFileType = fileName.lastIndexOf('.');
-    return fileName.substring(0, indexBeforeFileType);
-  }
-
-  @Override
-  public String getDescription() {
-    return "Merge internalFilename and originalFilename. Additionally, rename"
-        + "duplicate files to ensure uniqueness.";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddDataLakePipelineTemplateMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddDataLakePipelineTemplateMigration.java
deleted file mode 100644
index 717d4c09c8..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddDataLakePipelineTemplateMigration.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import 
org.apache.streampipes.manager.template.instances.PersistDataLakePipelineTemplate;
-import org.apache.streampipes.service.core.migrations.Migration;
-import 
org.apache.streampipes.storage.api.pipeline.ICompactPipelineTemplateStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import java.io.IOException;
-
-public class AddDataLakePipelineTemplateMigration implements Migration {
-
-  private final ICompactPipelineTemplateStorage storage;
-
-  public AddDataLakePipelineTemplateMigration() {
-    this.storage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getPipelineTemplateStorage();
-  }
-
-  @Override
-  public boolean shouldExecute() {
-    return 
storage.getElementById(PersistDataLakePipelineTemplate.DATA_LAKE_TEMPLATE_ID) 
== null;
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    storage.persist(new PersistDataLakePipelineTemplate().getTemplate());
-  }
-
-  @Override
-  public String getDescription() {
-    return "Adding data lake pipeline template to template storage";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddLinkSettingsMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddLinkSettingsMigration.java
deleted file mode 100644
index a1a6c2d7eb..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddLinkSettingsMigration.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.model.configuration.DefaultLinkSettings;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import java.io.IOException;
-
-public class AddLinkSettingsMigration implements Migration {
-
-  private final ISpCoreConfigurationStorage coreConfigStore = StorageDispatcher
-      .INSTANCE
-      .getNoSqlStore()
-      .getSpCoreConfigurationStorage();
-
-  @Override
-  public boolean shouldExecute() {
-    return coreConfigStore.get().getGeneralConfig().getLinkSettings() == null;
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var linkSettings = new DefaultLinkSettings().make();
-    var coreConfig = coreConfigStore.get();
-    coreConfig.getGeneralConfig().setLinkSettings(linkSettings);
-    coreConfigStore.updateElement(coreConfig);
-  }
-
-  @Override
-  public String getDescription() {
-    return "Adding link settings to general config";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddRolesToUserDbMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddRolesToUserDbMigration.java
deleted file mode 100644
index 1465779ef4..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/AddRolesToUserDbMigration.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.manager.setup.design.UserDesignDocument;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.couchdb.utils.Utils;
-
-import org.lightcouch.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-public class AddRolesToUserDbMigration implements Migration {
-
-  private static final String DOC_NAME = "_design/users";
-  private static final Logger LOG = 
LoggerFactory.getLogger(AddRolesToUserDbMigration.class);
-
-  @Override
-  public boolean shouldExecute() {
-    var designDoc = Utils.getCouchDbUserClient().design().getFromDb(DOC_NAME);
-    var viewKey = UserDesignDocument.ROLE_KEY;
-    var viewMapFunction = UserDesignDocument.ROLE_MAP_FUNCTION;
-    var views = designDoc.getViews();
-
-    if (views.containsKey(viewKey)) {
-      return !(views.get(viewKey).getMap().equals(viewMapFunction));
-    } else {
-      return true;
-    }
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var userDocument = new UserDesignDocument().make();
-    Response resp = 
Utils.getCouchDbUserClient().design().synchronizeWithDb(userDocument);
-
-    if (resp.getError() != null) {
-      LOG.warn("Could not update user design document with reason {}", 
resp.getReason());
-    }
-  }
-
-  @Override
-  public String getDescription() {
-    return "Add default roles and privileges";
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java
deleted file mode 100644
index 1e107b9103..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/DataExplorerDataViewMigration.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.model.client.user.PermissionBuilder;
-import org.apache.streampipes.model.dashboard.DashboardModel;
-import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
-import org.apache.streampipes.resource.management.PermissionResourceManager;
-import org.apache.streampipes.service.core.migrations.Migration;
-import 
org.apache.streampipes.storage.api.explorer.IDataExplorerDashboardStorage;
-import org.apache.streampipes.storage.api.explorer.IDataExplorerWidgetStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Migrates data explorer dashboards and data views
- * Add permission object for each data view
- * Add time settings to data views
- * Add live settings to dashboards
- */
-public class DataExplorerDataViewMigration implements Migration {
-
-  private static final Logger LOG = 
LoggerFactory.getLogger(DataExplorerDataViewMigration.class);
-
-  private final IDataExplorerWidgetStorage dataViewStorage;
-  private final IDataExplorerDashboardStorage dataExplorerDashboardStorage;
-  private final PermissionResourceManager permissionResourceManager;
-
-  public DataExplorerDataViewMigration() {
-    var storage = StorageDispatcher.INSTANCE.getNoSqlStore();
-    this.dataViewStorage = storage.getDataExplorerWidgetStorage();
-    this.dataExplorerDashboardStorage = 
storage.getDataExplorerDashboardStorage();
-    this.permissionResourceManager = new PermissionResourceManager();
-  }
-
-  @Override
-  public boolean shouldExecute() {
-    return !findDashboardsToMigrate().isEmpty();
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var allDashboards = findDashboardsToMigrate();
-    var defaultLiveSettings = makeDefaultLiveSettings();
-
-    LOG.info("Migrating {} data explorer dashboards", allDashboards.size());
-
-    allDashboards
-        .forEach(dashboard -> {
-          var timeSettings = dashboard.getDashboardTimeSettings();
-          dashboard.getDashboardGeneralSettings().put("globalTimeEnabled", 
true);
-          dashboard.setDashboardLiveSettings(defaultLiveSettings);
-          dashboard.getWidgets().forEach(widget -> {
-            var dataView = dataViewStorage.getElementById(widget.getId());
-            if (dataView != null) {
-              dataView.setTimeSettings(timeSettings);
-              dataViewStorage.updateElement(dataView);
-              addPermissionsObject(dashboard, dataView);
-            }
-          });
-          dataExplorerDashboardStorage.updateElement(dashboard);
-        });
-  }
-
-  @Override
-  public String getDescription() {
-    return "Migrating data explorer data views";
-  }
-
-  private List<DashboardModel> findDashboardsToMigrate() {
-    return dataExplorerDashboardStorage
-        .findAll()
-        .stream()
-        .filter(dashboard -> 
!dashboard.getDashboardGeneralSettings().containsKey("globalTimeEnabled"))
-        .toList();
-  }
-
-  private Map<String, Object> makeDefaultLiveSettings() {
-    var map = new HashMap<String, Object>();
-    map.put("refreshModeActive", false);
-    map.put("refreshIntervalInSeconds", 10);
-    map.put("label", "Off");
-
-    return map;
-  }
-
-  private void addPermissionsObject(DashboardModel dashboard,
-                                    DataExplorerWidgetModel dataView) {
-    var dashboardPermissions = 
permissionResourceManager.findForObjectId(dashboard.getElementId());
-    if (!dashboardPermissions.isEmpty()) {
-      var dashboardPermission = dashboardPermissions.get(0);
-      if (permissionResourceManager.find(dataView.getElementId()) == null) {
-        var dataViewPermission = PermissionBuilder
-            .create(dataView.getElementId(), DataExplorerWidgetModel.class, 
dashboardPermission.getOwnerSid())
-            .publicElement(dashboardPermission.isPublicElement())
-            .build();
-        
dataViewPermission.setGrantedAuthorities(dashboardPermission.getGrantedAuthorities());
-        permissionResourceManager.create(dataViewPermission);
-      }
-    }
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/ModifyAssetLinkTypeMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/ModifyAssetLinkTypeMigration.java
deleted file mode 100644
index 3f7f9e6d14..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/ModifyAssetLinkTypeMigration.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.commons.constants.GenericDocTypes;
-import org.apache.streampipes.model.assets.AssetLinkType;
-import org.apache.streampipes.serializers.json.JacksonSerializer;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.system.IGenericStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.CollectionType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-public class ModifyAssetLinkTypeMigration implements Migration {
-
-  private static final Logger LOG = 
LoggerFactory.getLogger(ModifyAssetLinkTypeMigration.class);
-
-  private final IGenericStorage genericStorage = 
StorageDispatcher.INSTANCE.getNoSqlStore().getGenericStorage();
-  private final ObjectMapper objectMapper = 
JacksonSerializer.getObjectMapper(Map.of(
-      DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true
-    ));
-
-  public ModifyAssetLinkTypeMigration() {
-
-  }
-
-  @Override
-  public boolean shouldExecute() {
-    return true;
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    getAssetLinkTypes().stream()
-        .filter(assetLinkType -> switch (assetLinkType.getLinkType()) {
-          case "data-view", "adapter", "pipeline" -> true;
-          default -> false;
-        })
-        .forEach(assetLinkType -> {
-          assetLinkType.setNavPaths(switch (assetLinkType.getLinkType()) {
-            case "data-view" -> List.of("dataexplorer", "dashboard");
-            case "adapter" -> List.of("connect", "details");
-            case "pipeline" -> List.of("pipelines", "details");
-            default -> throw new IllegalStateException("Unexpected value: " + 
assetLinkType.getLinkType());
-          });
-          updateLinkType(assetLinkType);
-        });
-  }
-
-  @Override
-  public String getDescription() {
-    return "Modifying navigation targets of asset link types";
-  }
-
-  private void updateLinkType(AssetLinkType assetLinkType) {
-    try {
-      this.genericStorage.update(assetLinkType.getId(), 
objectMapper.writeValueAsString(assetLinkType));
-    } catch (IOException e) {
-      LOG.warn("Could not update asset link type {}", assetLinkType, e);
-    }
-  }
-
-  private List<AssetLinkType> getAssetLinkTypes() {
-    try {
-      return 
deserialize(genericStorage.findAll(GenericDocTypes.DOC_ASSET_LINK_TYPE));
-    } catch (IOException e) {
-      return List.of();
-    }
-  }
-
-  private List<AssetLinkType> deserialize(List<Map<String, Object>> list) {
-    CollectionType listType = objectMapper.getTypeFactory()
-        .constructCollectionType(List.class, AssetLinkType.class);
-
-    return objectMapper.convertValue(list, listType);
-  }
-}
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigration.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigration.java
deleted file mode 100644
index 820cf46203..0000000000
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigration.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import 
org.apache.streampipes.model.staticproperty.RuntimeResolvableTreeInputStaticProperty;
-import org.apache.streampipes.service.core.migrations.Migration;
-import org.apache.streampipes.storage.api.connect.IAdapterStorage;
-import org.apache.streampipes.storage.management.StorageDispatcher;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-public class RemoveNodesFromOpcUaAdaptersMigration implements Migration {
-
-  private static final Logger LOG = 
LoggerFactory.getLogger(RemoveNodesFromOpcUaAdaptersMigration.class);
-
-  private final IAdapterStorage adapterStorage;
-
-  public RemoveNodesFromOpcUaAdaptersMigration() {
-    adapterStorage = StorageDispatcher.INSTANCE.getNoSqlStore()
-                                               .getAdapterInstanceStorage();
-  }
-
-  public RemoveNodesFromOpcUaAdaptersMigration(IAdapterStorage adapterStorage) 
{
-    this.adapterStorage = adapterStorage;
-  }
-
-  @Override
-  public boolean shouldExecute() {
-    return true;
-  }
-
-  @Override
-  public String getDescription() {
-    return "Remove latestFetchedNodes and nodes from OPC UA adapter instances 
and updates the adapters in CouchDB.";
-  }
-
-  @Override
-  public void executeMigration() throws IOException {
-    var adapters = adapterStorage.findAll();
-
-    var opcUaAdapters = filterForOpcUaAdapters(adapters);
-
-    opcUaAdapters.forEach(adapter -> {
-      removeTreeNodesFromConfigurationAndUpdateAdapter(adapter);
-      LOG.info("The nodes and latest fetched nodes of the adapter {} have been 
removed.", adapter.getElementId());
-    });
-
-  }
-
-  private void 
removeTreeNodesFromConfigurationAndUpdateAdapter(AdapterDescription adapter) {
-    removeTreeNodesFromConfiguration(adapter);
-    adapterStorage.updateElement(adapter);
-  }
-
-  /**
-   * This method sets the nodes and latest fetched nodes of the adapter 
configuration to an empty list.
-   */
-  private static void removeTreeNodesFromConfiguration(AdapterDescription 
adapter) {
-    adapter.getConfig()
-           .stream()
-           .filter(RuntimeResolvableTreeInputStaticProperty.class::isInstance)
-           .map(RuntimeResolvableTreeInputStaticProperty.class::cast)
-           .forEach(treeInputProperty -> {
-             treeInputProperty.setNodes(Collections.emptyList());
-             treeInputProperty.setLatestFetchedNodes(Collections.emptyList());
-           });
-  }
-
-  private static List<AdapterDescription> 
filterForOpcUaAdapters(List<AdapterDescription> adapters) {
-    return adapters.stream()
-                   .filter(adapter -> adapter.getAppId()
-                                             
.equals("org.apache.streampipes.connect.iiot.adapters.opcua"))
-                   .toList();
-  }
-
-}
diff --git 
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigrationTest.java
 
b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigrationTest.java
deleted file mode 100644
index aa77248038..0000000000
--- 
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v095/MergeFilenamesAndRenameDuplicatesMigrationTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.service.core.migrations.v095;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration.FILETYPE;
-import static 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration.ID;
-import static 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration.INTERNAL_FILENAME;
-import static 
org.apache.streampipes.service.core.migrations.v095.MergeFilenamesAndRenameDuplicatesMigration.ORIGINAL_FILENAME;
-
-public class MergeFilenamesAndRenameDuplicatesMigrationTest {
-
-  private static final Map RAW_FILEMETADATA_1 = new HashMap<String, Object>() {
-    {
-      put(ID, "id1");
-      put(ORIGINAL_FILENAME, "file.txt");
-      put(INTERNAL_FILENAME, "doesn't matter");
-      put(FILETYPE, "txt");
-    }
-  };
-
-  private static final Map RAW_FILEMETADATA_2 = new HashMap<String, Object>() {
-    {
-      put(ID, "id2");
-      put(ORIGINAL_FILENAME, "FILE.txt");
-      put(INTERNAL_FILENAME, "doesn't matter");
-      put(FILETYPE, "TXT");
-    }
-  };
-
-  private static final Map RAW_FILEMETADATA_3 = new HashMap<String, Object>() {
-    {
-      put(ID, "id2");
-      put(ORIGINAL_FILENAME, "fIlE.TxT");
-      put(INTERNAL_FILENAME, "doesn't matter");
-      put(FILETYPE, "TxT");
-    }
-  };
-
-  private static final Map RAW_FILEMETADATA_4 = new HashMap<String, Object>() {
-    {
-      put(ID, "id3");
-      put(ORIGINAL_FILENAME, "file.csv");
-      put(INTERNAL_FILENAME, "doesn't matter");
-      put(FILETYPE, "csv");
-    }
-  };
-
-  private List<Map<String, Object>> couchDbRawFileMetadata;
-
-  private MergeFilenamesAndRenameDuplicatesMigration migration;
-
-  @BeforeEach
-  public void setUp() {
-    migration = new MergeFilenamesAndRenameDuplicatesMigration(true);
-    couchDbRawFileMetadata = new ArrayList<>() {
-      {
-        add(RAW_FILEMETADATA_1);
-        add(RAW_FILEMETADATA_2);
-        add(RAW_FILEMETADATA_3);
-        add(RAW_FILEMETADATA_4);
-      }
-    };
-  }
-
-  @Test
-  public void testMigration() {
-    // Test that the migration successfully groups FileMetadata by 
originalFilename
-    migration.getFileMetadataToUpdate(couchDbRawFileMetadata);
-    Assertions.assertEquals(2, 
migration.fileMetadataGroupedByOriginalName.size());
-    Assertions.assertEquals(3,
-                            
migration.fileMetadataGroupedByOriginalName.get("file.txt").size());
-    Assertions.assertEquals(1,
-                            
migration.fileMetadataGroupedByOriginalName.get("file.csv").size());
-
-    // Test that the migration successfully renames duplicate files
-    migration.fileMetadataGroupedByOriginalName.forEach(
-        (originalFilename, fileMetadataList) -> 
migration.update(originalFilename, fileMetadataList));
-    Assertions.assertEquals("file.txt",
-                            
migration.fileMetadataGroupedByOriginalName.get("file.txt").get(0).getFilename());
-    Assertions.assertEquals("file(2).TXT",
-                            
migration.fileMetadataGroupedByOriginalName.get("file.txt").get(1).getFilename());
-    Assertions.assertEquals("file(3).TxT",
-                            
migration.fileMetadataGroupedByOriginalName.get("file.txt").get(2).getFilename());
-    Assertions.assertEquals("file.csv",
-                            
migration.fileMetadataGroupedByOriginalName.get("file.csv").get(0).getFilename());
-  }
-}
\ No newline at end of file
diff --git 
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigrationTest.java
 
b/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigrationTest.java
deleted file mode 100644
index 7925b57bab..0000000000
--- 
a/streampipes-service-core/src/test/java/org/apache/streampipes/service/core/migrations/v970/RemoveNodesFromOpcUaAdaptersMigrationTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.service.core.migrations.v970;
-
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import 
org.apache.streampipes.model.staticproperty.RuntimeResolvableTreeInputStaticProperty;
-import org.apache.streampipes.model.staticproperty.TreeInputNode;
-import org.apache.streampipes.storage.api.connect.IAdapterStorage;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentCaptor;
-
-import java.io.IOException;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
-class RemoveNodesFromOpcUaAdaptersMigrationTest {
-
-  private RemoveNodesFromOpcUaAdaptersMigration migration;
-  private IAdapterStorage adapterStorage;
-
-  @BeforeEach
-  void setUp() {
-    adapterStorage = mock(IAdapterStorage.class);
-    migration = new RemoveNodesFromOpcUaAdaptersMigration(adapterStorage);
-  }
-
-  @Test
-  void executeMigration_RemoveConfigsFromOpcUaAdapter() throws IOException {
-    var opcUaAdapter = prepareOpcUaAdapterWithNodesAndLatestFetchedNodes();
-    when(adapterStorage.findAll()).thenReturn(List.of(opcUaAdapter));
-
-    migration.executeMigration();
-
-    // Ensure that the nodes and latestFetchedNodes are removed from the 
adapter description
-    var captor = ArgumentCaptor.forClass(AdapterDescription.class);
-    verify(adapterStorage).updateElement(captor.capture());
-    var updatedAdapter = captor.getValue();
-    var treeProperty = getFirstTreeInputProperty(updatedAdapter);
-    assertTrue(treeProperty.getNodes().isEmpty());
-    assertTrue(treeProperty.getLatestFetchedNodes()
-                           .isEmpty());
-  }
-
-  private RuntimeResolvableTreeInputStaticProperty 
getFirstTreeInputProperty(AdapterDescription adapterDescription) {
-    return adapterDescription.getConfig()
-                             .stream()
-                             .filter(config -> config instanceof 
RuntimeResolvableTreeInputStaticProperty)
-                             .map(config -> 
(RuntimeResolvableTreeInputStaticProperty) config)
-                             .findFirst()
-                             .orElse(null);
-  }
-
-  private AdapterDescription 
prepareOpcUaAdapterWithNodesAndLatestFetchedNodes() {
-    var opcUaAdapter = new AdapterDescription();
-    
opcUaAdapter.setAppId("org.apache.streampipes.connect.iiot.adapters.opcua");
-    var property = new RuntimeResolvableTreeInputStaticProperty();
-    property.setNodes(List.of(new TreeInputNode()));
-    property.setLatestFetchedNodes(List.of(new TreeInputNode()));
-    opcUaAdapter.setConfig(List.of(property));
-    return opcUaAdapter;
-  }
-}
\ No newline at end of file
diff --git 
a/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
 
b/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
index 4378eef1d4..aa769ae84c 100644
--- 
a/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
+++ 
b/streampipes-service-discovery/src/main/java/org/apache/streampipes/svcdiscovery/SpServiceDiscoveryCore.java
@@ -120,7 +120,6 @@ public class SpServiceDiscoveryCore implements 
ISpServiceDiscovery {
       if (retryCount < MAX_RETRIES) {
         try {
           retryCount++;
-          LOG.info("Could not find any extensions services, retrying ({}/{})", 
retryCount, MAX_RETRIES);
           TimeUnit.MILLISECONDS.sleep(1000);
           return findServices(retryCount);
         } catch (InterruptedException e) {

Reply via email to