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

dominikriemer pushed a commit to branch migrate-configuration-storage
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit ac4d35b1e8189bcb3e14fa914210e43ed5b16fb0
Author: Dominik Riemer <[email protected]>
AuthorDate: Tue Jun 23 22:59:39 2026 +0200

    Continue migration of configuration storage
---
 .../management/management/GuessManagement.java     |  8 ++++++--
 .../management/management/WorkerRestClient.java    |  7 +++++--
 .../dataexplorer/export/OutputFormat.java          |  4 +++-
 .../streampipes/loadbalance/LoadManager.java       |  3 +--
 .../loadbalance/ResourceUnitMigration.java         |  9 +++++----
 .../loadbalance/unit/InvokeHttpRequest.java        | 23 +++++++++++++---------
 .../org/apache/streampipes/mail/MailSender.java    | 15 +++++++-------
 .../org/apache/streampipes/mail/MailTester.java    |  9 +++++++--
 .../mail/template/AbstractMailTemplate.java        | 16 ++++++++++-----
 .../template/AccountActiviationMailTemplate.java   | 10 +++++++---
 .../mail/template/CustomMailTemplate.java          |  5 ++++-
 .../mail/template/InitialPasswordMailTemplate.java | 11 +++++++----
 .../template/PasswordRecoveryMailTemplate.java     | 10 +++++++---
 .../mail/template/TestMailTemplate.java            |  7 ++++++-
 .../mail/template/part/AbstractPart.java           |  4 +++-
 .../mail/template/part/BaseUrlPart.java            |  6 ++++--
 .../streampipes/mail/template/part/LinkPart.java   |  5 +++--
 .../streampipes/mail/template/part/LogoPart.java   | 10 +++-------
 .../api/extensions/ExtensionServiceRequests.java   | 22 ++++++++++++++++-----
 .../manager/extensions/ExtensionItemInstaller.java |  4 ++--
 .../migration/AbstractMigrationManager.java        |  2 +-
 .../remote/ContainerProvidedOptionsHandler.java    |  8 ++++++--
 .../streampipes/manager/util/AuthTokenUtils.java   | 15 +++++++-------
 .../verification/extractor/TypeExtractor.java      | 14 ++++++-------
 .../resource/management/SpResourceManager.java     |  2 +-
 .../resource/management/UserResourceManager.java   | 10 +++++++---
 .../rest/impl/ContainerProvidedOptions.java        |  8 ++++++--
 .../impl/admin/EmailConfigurationResource.java     | 10 +++++++++-
 .../rest/impl/connect/CompactAdapterResource.java  |  3 ++-
 .../rest/impl/connect/GuessResource.java           | 10 ++++++++--
 .../impl/connect/RuntimeResolvableResource.java    |  9 +++++++--
 .../CertificateExpiryEmailScheduler.java           |  2 +-
 32 files changed, 186 insertions(+), 95 deletions(-)

diff --git 
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/GuessManagement.java
 
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/GuessManagement.java
index b62d5bfe0a..1cbde82a00 100644
--- 
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/GuessManagement.java
+++ 
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/GuessManagement.java
@@ -36,6 +36,7 @@ import 
org.apache.streampipes.model.connect.adapter.AdapterDescription;
 import org.apache.streampipes.model.connect.guess.SampleData;
 import org.apache.streampipes.model.monitoring.SpLogMessage;
 import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.resource.management.SpResourceManager;
 import org.apache.streampipes.resource.management.secret.SecretProvider;
 import org.apache.streampipes.serializers.json.JacksonSerializer;
 import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
@@ -56,12 +57,15 @@ public class GuessManagement {
   private final ExtensionServiceRequestManager extensionRequestManager;
   private final IExtensionsServiceEndpointGenerator endpointGenerator;
   private final ObjectMapper objectMapper;
+  private final SpResourceManager resourceManager;
 
   public GuessManagement(IExtensionsServiceEndpointGenerator endpointGenerator,
-                         ExtensionServiceRequestManager 
extensionRequestManager) {
+                         ExtensionServiceRequestManager 
extensionRequestManager,
+                         SpResourceManager resourceManager) {
     this.endpointGenerator = endpointGenerator;
     this.extensionRequestManager = extensionRequestManager;
     this.objectMapper = JacksonSerializer.getObjectMapper();
+    this.resourceManager = resourceManager;
   }
 
   public EventSchema guessSchema(AdapterDescription adapterDescription) {
@@ -88,7 +92,7 @@ public class GuessManagement {
     LOG.debug("Calling get sample data at service: {}", 
requestTarget.serviceId());
 
     var response = extensionRequestManager.request(
-        ExtensionServiceRequests.sampleData(requestTarget, 
adapterDescriptionString)
+        ExtensionServiceRequests.sampleData(requestTarget, 
adapterDescriptionString, resourceManager)
     );
     var responseString = response.responseBody();
 
diff --git 
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
 
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
index 92331c4c52..27df7db7a1 100644
--- 
a/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
+++ 
b/streampipes-connect-management/src/main/java/org/apache/streampipes/connect/management/management/WorkerRestClient.java
@@ -129,13 +129,16 @@ public class WorkerRestClient {
 
   public RuntimeOptionsResponse getConfiguration(SpServiceRegistration service,
                                                  String appId,
-                                                 RuntimeOptionsRequest 
runtimeOptionsRequest)
+                                                 RuntimeOptionsRequest 
runtimeOptionsRequest,
+                                                 SpResourceManager 
resourceManager)
       throws AdapterException, SpConfigurationException {
 
     try {
       String payload = 
JacksonSerializer.getObjectMapper().writeValueAsString(runtimeOptionsRequest);
       var requestTarget = 
ExtensionServiceRequestTargets.adapterRuntimeOptions(service, appId);
-      var response = 
requestManager.request(ExtensionServiceRequests.runtimeOptions(requestTarget, 
payload));
+      var response = requestManager.request(
+          ExtensionServiceRequests.runtimeOptions(requestTarget, payload, 
resourceManager)
+      );
       String responseString = response.responseBody();
 
       if (response.statusCode() == HttpStatus.SC_OK) {
diff --git 
a/streampipes-data-explorer-export/src/main/java/org/apache/streampipes/dataexplorer/export/OutputFormat.java
 
b/streampipes-data-explorer-export/src/main/java/org/apache/streampipes/dataexplorer/export/OutputFormat.java
index d1237afc23..f36409b105 100644
--- 
a/streampipes-data-explorer-export/src/main/java/org/apache/streampipes/dataexplorer/export/OutputFormat.java
+++ 
b/streampipes-data-explorer-export/src/main/java/org/apache/streampipes/dataexplorer/export/OutputFormat.java
@@ -26,7 +26,9 @@ import java.util.function.Supplier;
 public enum OutputFormat {
   JSON(ConfiguredJsonOutputWriter::new),
   CSV(ConfiguredCsvOutputWriter::new),
-  XLSX(() -> new 
ConfiguredExcelOutputWriter(StorageDispatcher.INSTANCE.getNoSqlStore().getFileMetadataStorage()));
+  XLSX(() -> new ConfiguredExcelOutputWriter(
+      StorageDispatcher.INSTANCE.getNoSqlStore().getFileMetadataStorage())
+  );
 
   private final Supplier<ConfiguredOutputWriter> writerSupplier;
 
diff --git 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/LoadManager.java
 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/LoadManager.java
index 42228165bb..cfc1727e73 100644
--- 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/LoadManager.java
+++ 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/LoadManager.java
@@ -167,7 +167,6 @@ public class LoadManager {
 
   public static void migrateForHealthCheck(List<SpServiceRegistration> 
needDeletedServices,
                                            SpResourceManager resourceManager) {
-    var pipelineStorage = resourceManager.managePipelines().getDb();
     if (!environment.getLoadManagerEnable().getValueOrDefault() || 
loadBalancer == null) {
       return;
     }
@@ -201,7 +200,7 @@ public class LoadManager {
                                          loadBalanceResourceUnit.getLabels());
               if (targetService != null) {
                 
ResourceUnitMigration.migrationForHealth(loadBalanceResourceUnit, targetService,
-                                                         service, 
pipelineStorage);
+                                                         service, 
resourceManager);
               }
             }
           }
diff --git 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/ResourceUnitMigration.java
 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/ResourceUnitMigration.java
index 1b7df77431..2d3d064f54 100644
--- 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/ResourceUnitMigration.java
+++ 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/ResourceUnitMigration.java
@@ -52,7 +52,7 @@ public class ResourceUnitMigration {
   public static void 
migrationForHealth(LoadBalanceResourceUnit<InvocableStreamPipesEntity> 
resourceUnit,
                                         SpServiceRegistration targetService,
                                         SpServiceRegistration sourceService,
-                                        IPipelineStorage pipelineStorage) {
+                                        SpResourceManager resourceManager) {
 
     logger.info("Migrating pipeline resource unit {} to service {} for health 
recovery",
                 resourceUnit.getId(), targetService.getSvcId());
@@ -68,11 +68,12 @@ public class ResourceUnitMigration {
         logger.debug("Invoking element {} on new endpoint {}", 
element.getElementId(),
                      newEndpointUrl);
 
-        new InvokeHttpRequest().execute(element, newEndpointUrl, 
resourceUnit.getPipelineId());
+        new InvokeHttpRequest().execute(
+            element, newEndpointUrl, resourceUnit.getPipelineId(), 
resourceManager.getCoreConfigurationStorage());
       }
 
       // Update pipeline in storage with new endpoints
-      updatePipelineEndpoints(resourceUnit, pipelineStorage);
+      updatePipelineEndpoints(resourceUnit, 
resourceManager.managePipelines().getDb());
 
       logger.info("Successfully migrated pipeline resource unit {} to service 
{}",
                   resourceUnit.getId(), targetService.getSvcId());
@@ -296,7 +297,7 @@ public class ResourceUnitMigration {
         if (isAdapter) {
           migrateAdapterForHealth(matchingUnit, targetService, sourceService, 
resourceManager);
         } else {
-          migrationForHealth(matchingUnit, targetService, sourceService, 
pipelineStorage);
+          migrationForHealth(matchingUnit, targetService, sourceService, 
resourceManager);
         }
         transferredAmount += stats.getEventRateOut() + stats.getEventRateIn();
         migratedCount++;
diff --git 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
index 0af6c20bcd..468ee2f783 100644
--- 
a/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
+++ 
b/streampipes-load-balancer/src/main/java/org/apache/streampipes/loadbalance/unit/InvokeHttpRequest.java
@@ -23,6 +23,7 @@ import org.apache.streampipes.model.client.user.Permission;
 import org.apache.streampipes.model.client.user.Principal;
 import org.apache.streampipes.model.pipeline.PipelineElementStatus;
 import org.apache.streampipes.serializers.json.JacksonSerializer;
+import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
 import org.apache.streampipes.storage.couchdb.impl.user.PermissionStorageImpl;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 import org.apache.streampipes.user.management.jwt.JwtTokenProvider;
@@ -64,10 +65,11 @@ public class InvokeHttpRequest{
 
   public PipelineElementStatus execute(EndpointSelectable pipelineElement,
                                        String endpointUrl,
-                                       String pipelineId) {
+                                       String pipelineId,
+                                       ISpCoreConfigurationStorage 
configurationStorage) {
     try {
       Response httpResp = initRequest(pipelineElement, endpointUrl)
-              .addHeader("Authorization", getAuthToken(pipelineId))
+              .addHeader("Authorization", getAuthToken(pipelineId, 
configurationStorage))
               .connectTimeout(10000)
               .execute();
       return handleResponse(httpResp, pipelineElement, endpointUrl);
@@ -94,27 +96,30 @@ public class InvokeHttpRequest{
             response.getOptionalMessage());
   }
 
-  public static String getAuthToken(String resourceId) {
+  public static String getAuthToken(String resourceId,
+                                    ISpCoreConfigurationStorage 
configurationStorage) {
     if (SecurityContextHolder.getContext().getAuthentication() != null) {
       Authentication auth = 
SecurityContextHolder.getContext().getAuthentication();
-      return makeBearerToken(new JwtTokenProvider().createToken(auth));
+      return makeBearerToken(new 
JwtTokenProvider(configurationStorage).createToken(auth));
     } else {
       if (resourceId != null) {
         String ownerSid = getOwnerSid(resourceId);
-        return getAuthTokenForUser(ownerSid);
+        return getAuthTokenForUser(ownerSid, configurationStorage);
       } else {
         throw new IllegalArgumentException("No authenticated user found to 
associate with request");
       }
     }
   }
 
-  public static String getAuthTokenForUser(String ownerSid) {
+  public static String getAuthTokenForUser(String ownerSid,
+                                           ISpCoreConfigurationStorage 
configurationStorage) {
     Principal correspondingUser = 
StorageDispatcher.INSTANCE.getNoSqlStore().getUserStorageAPI().getUserById(ownerSid);
-    return getAuthTokenForUser(correspondingUser);
+    return getAuthTokenForUser(correspondingUser, configurationStorage);
   }
 
-  public static String getAuthTokenForUser(Principal principal) {
-    return makeBearerToken(new JwtTokenProvider().createToken(principal));
+  public static String getAuthTokenForUser(Principal principal,
+                                           ISpCoreConfigurationStorage 
configurationStorage) {
+    return makeBearerToken(new 
JwtTokenProvider(configurationStorage).createToken(principal));
   }
 
   private static String makeBearerToken(String token) {
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailSender.java 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailSender.java
index 145ef282d3..6f41f23f18 100644
--- a/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailSender.java
+++ b/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailSender.java
@@ -42,7 +42,8 @@ public class MailSender extends AbstractMailer {
         .appendTextHTML(new CustomMailTemplate(
             mail.getSubject(),
             mail.getPreheader(),
-            
mail.getMessage()).generateTemplate(spCoreConfiguration.getEmailTemplateConfig()))
+            mail.getMessage(),
+            spCoreConfiguration).generateTemplate())
         .buildEmail();
 
     deliverMail(email);
@@ -52,8 +53,8 @@ public class MailSender extends AbstractMailer {
                                         String activationCode) throws 
IOException {
     Email email = baseEmail()
         .withSubject(MailUtils.extractAppName(spCoreConfiguration) + " - 
Account Activation")
-        .appendTextHTML(new AccountActiviationMailTemplate(activationCode)
-            .generateTemplate(spCoreConfiguration.getEmailTemplateConfig()))
+        .appendTextHTML(new AccountActiviationMailTemplate(activationCode, 
spCoreConfiguration)
+            .generateTemplate())
         .to(recipientAddress)
         .buildEmail();
 
@@ -64,8 +65,8 @@ public class MailSender extends AbstractMailer {
                                        String recoveryCode) throws IOException 
{
     Email email = baseEmail()
         .withSubject(MailUtils.extractAppName(spCoreConfiguration) + " - 
Password Recovery")
-        .appendTextHTML(new PasswordRecoveryMailTemplate(recoveryCode)
-            .generateTemplate(spCoreConfiguration.getEmailTemplateConfig()))
+        .appendTextHTML(new PasswordRecoveryMailTemplate(recoveryCode, 
spCoreConfiguration)
+            .generateTemplate())
         .to(recipientAddress)
         .buildEmail();
 
@@ -76,8 +77,8 @@ public class MailSender extends AbstractMailer {
                                       String generatedProperty) throws 
IOException {
     Email email = baseEmail()
         .withSubject(MailUtils.extractAppName(spCoreConfiguration) + " - New 
Account")
-        .appendTextHTML(new InitialPasswordMailTemplate(generatedProperty)
-            .generateTemplate(spCoreConfiguration.getEmailTemplateConfig()))
+        .appendTextHTML(new InitialPasswordMailTemplate(generatedProperty, 
spCoreConfiguration)
+            .generateTemplate())
         .to(recipientAddress)
         .buildEmail();
 
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailTester.java 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailTester.java
index 9a017e0297..1658b37ec3 100644
--- a/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailTester.java
+++ b/streampipes-mail/src/main/java/org/apache/streampipes/mail/MailTester.java
@@ -20,6 +20,7 @@ package org.apache.streampipes.mail;
 import org.apache.streampipes.mail.template.TestMailTemplate;
 import org.apache.streampipes.mail.utils.MailUtils;
 import org.apache.streampipes.model.configuration.EmailConfig;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import org.simplejavamail.api.email.Email;
 
@@ -27,14 +28,18 @@ import java.io.IOException;
 
 public class MailTester extends AbstractMailer {
 
+  public MailTester(SpCoreConfiguration configuration) {
+    super(configuration);
+  }
+
   public void sendTestMail(EmailConfig emailConfig) throws IOException {
     deliverMail(emailConfig, makeTestMail(emailConfig));
   }
 
   private Email makeTestMail(EmailConfig emailConfig) throws IOException {
     return baseEmail(emailConfig)
-        .withSubject("Hello from " + MailUtils.extractAppName())
-        .appendTextHTML(new TestMailTemplate().generateTemplate())
+        .withSubject("Hello from " + 
MailUtils.extractAppName(spCoreConfiguration))
+        .appendTextHTML(new 
TestMailTemplate(spCoreConfiguration).generateTemplate())
         .to(emailConfig.getTestRecipientAddress())
         .buildEmail();
   }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AbstractMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AbstractMailTemplate.java
index 51a6553ffe..01a65e41af 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AbstractMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AbstractMailTemplate.java
@@ -21,7 +21,7 @@ import 
org.apache.streampipes.mail.template.generation.DefaultPlaceholders;
 import org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
 import org.apache.streampipes.mail.template.part.BaseUrlPart;
 import org.apache.streampipes.mail.template.part.LogoPart;
-import org.apache.streampipes.model.configuration.EmailTemplateConfig;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import com.google.common.base.Charsets;
 
@@ -32,6 +32,12 @@ import java.util.Map;
 
 public abstract class AbstractMailTemplate {
 
+  protected final SpCoreConfiguration configuration;
+
+  public AbstractMailTemplate(SpCoreConfiguration configuration) {
+    this.configuration = configuration;
+  }
+
   protected abstract String getTitle();
 
   protected abstract String getPreHeader();
@@ -40,18 +46,18 @@ public abstract class AbstractMailTemplate {
 
   protected abstract void configureTemplate(MailTemplateBuilder builder);
 
-  public String generateTemplate(EmailTemplateConfig emailTemplateConfig) 
throws IOException {
+  public String generateTemplate() throws IOException {
     Map<String, String> placeholders = new HashMap<>();
     addPlaceholders(placeholders);
 
-    var template = emailTemplateConfig
+    var template = configuration.getEmailTemplateConfig()
         .getTemplate();
 
     var builder = MailTemplateBuilder.create(template)
         .withPlaceholder(DefaultPlaceholders.TITLE, getTitle())
         .withPlaceholder(DefaultPlaceholders.PREHEADER, getPreHeader())
-        .withPlaceholder(DefaultPlaceholders.LOGO, new LogoPart().generate())
-        .withPlaceholder(DefaultPlaceholders.BASE_URL, new 
BaseUrlPart().generate())
+        .withPlaceholder(DefaultPlaceholders.LOGO, new 
LogoPart().generate(configuration))
+        .withPlaceholder(DefaultPlaceholders.BASE_URL, new 
BaseUrlPart().generate(configuration))
         .withPlaceholders(placeholders);
 
     configureTemplate(builder);
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AccountActiviationMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AccountActiviationMailTemplate.java
index 945b9fb174..ceb92a3fad 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AccountActiviationMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/AccountActiviationMailTemplate.java
@@ -22,6 +22,7 @@ import 
org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
 import org.apache.streampipes.mail.template.part.LinkPart;
 import org.apache.streampipes.mail.template.part.MailTemplatePart;
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import java.util.Map;
 
@@ -29,7 +30,9 @@ public class AccountActiviationMailTemplate extends 
AbstractMailTemplate {
 
   private final String activationCode;
 
-  public AccountActiviationMailTemplate(String activationCode) {
+  public AccountActiviationMailTemplate(String activationCode,
+                                        SpCoreConfiguration configuration) {
+    super(configuration);
     this.activationCode = activationCode;
   }
 
@@ -40,7 +43,7 @@ public class AccountActiviationMailTemplate extends 
AbstractMailTemplate {
 
   @Override
   protected String getPreHeader() {
-    return "Activate your " + MailUtils.extractAppName() + " account";
+    return "Activate your " + MailUtils.extractAppName(configuration) + " 
account";
   }
 
   @Override
@@ -60,6 +63,7 @@ public class AccountActiviationMailTemplate extends 
AbstractMailTemplate {
   }
 
   private String makeLink() {
-    return new LinkPart("/#/activate-account?activationCode=" + 
encodeUrlPart(this.activationCode)).generate();
+    return new LinkPart("/#/activate-account?activationCode=" + 
encodeUrlPart(this.activationCode))
+        .generate(configuration);
   }
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/CustomMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/CustomMailTemplate.java
index 1ea53286d8..c868aa8eee 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/CustomMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/CustomMailTemplate.java
@@ -19,6 +19,7 @@
 package org.apache.streampipes.mail.template;
 
 import org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import java.util.Map;
 
@@ -30,7 +31,9 @@ public class CustomMailTemplate extends AbstractMailTemplate {
 
   public CustomMailTemplate(String title,
                             String preheader,
-                            String content) {
+                            String content,
+                            SpCoreConfiguration configuration) {
+    super(configuration);
     this.title = title;
     this.preheader = preheader;
     this.content = content;
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/InitialPasswordMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/InitialPasswordMailTemplate.java
index f74f279f1f..53b7150e5e 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/InitialPasswordMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/InitialPasswordMailTemplate.java
@@ -22,14 +22,17 @@ import 
org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
 import org.apache.streampipes.mail.template.part.LinkPart;
 import org.apache.streampipes.mail.template.part.MailTemplatePart;
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import java.util.Map;
 
 public class InitialPasswordMailTemplate extends AbstractMailTemplate {
 
-  private String initialPassword;
+  private final String initialPassword;
 
-  public InitialPasswordMailTemplate(String initialPassword) {
+  public InitialPasswordMailTemplate(String initialPassword,
+                                     SpCoreConfiguration configuration) {
+    super(configuration);
     this.initialPassword = initialPassword;
   }
 
@@ -40,7 +43,7 @@ public class InitialPasswordMailTemplate extends 
AbstractMailTemplate {
 
   @Override
   protected String getPreHeader() {
-    return "A new account for " + MailUtils.extractAppName() + " has been 
created.";
+    return "A new account for " + MailUtils.extractAppName(configuration) + " 
has been created.";
   }
 
   @Override
@@ -60,6 +63,6 @@ public class InitialPasswordMailTemplate extends 
AbstractMailTemplate {
   }
 
   private String makeLink() {
-    return new LinkPart("/#/login").generate();
+    return new LinkPart("/#/login").generate(configuration);
   }
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/PasswordRecoveryMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/PasswordRecoveryMailTemplate.java
index 190cced8d1..90fbd1c109 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/PasswordRecoveryMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/PasswordRecoveryMailTemplate.java
@@ -22,6 +22,7 @@ import 
org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
 import org.apache.streampipes.mail.template.part.LinkPart;
 import org.apache.streampipes.mail.template.part.MailTemplatePart;
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import java.util.Map;
 
@@ -29,7 +30,9 @@ public class PasswordRecoveryMailTemplate extends 
AbstractMailTemplate {
 
   private final String recoveryCode;
 
-  public PasswordRecoveryMailTemplate(String recoveryCode) {
+  public PasswordRecoveryMailTemplate(String recoveryCode,
+                                      SpCoreConfiguration configuration) {
+    super(configuration);
     this.recoveryCode = recoveryCode;
   }
 
@@ -40,7 +43,7 @@ public class PasswordRecoveryMailTemplate extends 
AbstractMailTemplate {
 
   @Override
   protected String getPreHeader() {
-    return "Restore your " + MailUtils.extractAppName() + " password";
+    return "Restore your " + MailUtils.extractAppName(configuration) + " 
password";
   }
 
   @Override
@@ -60,6 +63,7 @@ public class PasswordRecoveryMailTemplate extends 
AbstractMailTemplate {
   }
 
   private String makeLink() {
-    return new LinkPart("/#/set-new-password?recoveryCode=" + 
encodeUrlPart(this.recoveryCode)).generate();
+    return new LinkPart("/#/set-new-password?recoveryCode=" + 
encodeUrlPart(this.recoveryCode))
+        .generate(configuration);
   }
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/TestMailTemplate.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/TestMailTemplate.java
index d6f913f4cf..2618be6f88 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/TestMailTemplate.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/TestMailTemplate.java
@@ -21,11 +21,16 @@ import 
org.apache.streampipes.mail.template.generation.DefaultPlaceholders;
 import org.apache.streampipes.mail.template.generation.MailTemplateBuilder;
 import org.apache.streampipes.mail.template.part.MailTemplatePart;
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 import java.util.Map;
 
 public class TestMailTemplate extends AbstractMailTemplate {
 
+  public TestMailTemplate(SpCoreConfiguration configuration) {
+    super(configuration);
+  }
+
   @Override
   protected String getTitle() {
     return "Mail settings verification";
@@ -33,7 +38,7 @@ public class TestMailTemplate extends AbstractMailTemplate {
 
   @Override
   protected String getPreHeader() {
-    return "Your " + MailUtils.extractAppName() + " mail configuration is 
working!";
+    return "Your " + MailUtils.extractAppName(configuration) + " mail 
configuration is working!";
   }
 
   @Override
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/AbstractPart.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/AbstractPart.java
index 47cdc7628c..3918f20605 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/AbstractPart.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/AbstractPart.java
@@ -17,7 +17,9 @@
  */
 package org.apache.streampipes.mail.template.part;
 
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
+
 public abstract class AbstractPart {
 
-  public abstract String generate();
+  public abstract String generate(SpCoreConfiguration configuration);
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/BaseUrlPart.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/BaseUrlPart.java
index 38c42fecab..3ada79d0bf 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/BaseUrlPart.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/BaseUrlPart.java
@@ -18,10 +18,12 @@
 package org.apache.streampipes.mail.template.part;
 
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 public class BaseUrlPart extends AbstractPart {
+
   @Override
-  public String generate() {
-    return MailUtils.extractBaseUrl();
+  public String generate(SpCoreConfiguration configuration) {
+    return MailUtils.extractBaseUrl(configuration);
   }
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LinkPart.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LinkPart.java
index 623d112958..e24e01bdac 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LinkPart.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LinkPart.java
@@ -18,6 +18,7 @@
 package org.apache.streampipes.mail.template.part;
 
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 public class LinkPart extends AbstractPart {
 
@@ -27,7 +28,7 @@ public class LinkPart extends AbstractPart {
     this.path = path;
   }
 
-  public String generate() {
-    return MailUtils.extractBaseUrl() + path;
+  public String generate(SpCoreConfiguration configuration) {
+    return MailUtils.extractBaseUrl(configuration) + path;
   }
 }
diff --git 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LogoPart.java
 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LogoPart.java
index 2e835f58cd..62d08eb3c9 100644
--- 
a/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LogoPart.java
+++ 
b/streampipes-mail/src/main/java/org/apache/streampipes/mail/template/part/LogoPart.java
@@ -18,19 +18,15 @@
 package org.apache.streampipes.mail.template.part;
 
 import org.apache.streampipes.mail.utils.MailUtils;
+import org.apache.streampipes.model.configuration.SpCoreConfiguration;
 
 public class LogoPart extends AbstractPart {
 
   private static final String LOGO_PATH = "/assets/img/sp/logo.png";
 
-  private final String baseUrl;
-
-  public LogoPart() {
-    this.baseUrl = MailUtils.extractBaseUrl();
-  }
-
   @Override
-  public String generate() {
+  public String generate(SpCoreConfiguration configuration) {
+    var baseUrl = MailUtils.extractBaseUrl(configuration);
     return baseUrl + LOGO_PATH;
   }
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
index aa411d839d..5acb784ecc 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/api/extensions/ExtensionServiceRequests.java
@@ -84,12 +84,24 @@ public final class ExtensionServiceRequests {
     return post(target, payload, AuthTokenUtils.getAuthToken(elementId, 
resourceManager));
   }
 
-  public static ExtensionServiceRequest 
runtimeOptions(ExtensionServiceRequestTarget target, String payload) {
-    return post(target, payload, AuthTokenUtils.getAuthTokenForCurrentUser());
+  public static ExtensionServiceRequest 
runtimeOptions(ExtensionServiceRequestTarget target,
+                                                       String payload,
+                                                       SpResourceManager 
resourceManager) {
+    return post(
+        target,
+        payload,
+        
AuthTokenUtils.getAuthTokenForCurrentUser(resourceManager.getCoreConfigurationStorage())
+    );
   }
 
-  public static ExtensionServiceRequest 
sampleData(ExtensionServiceRequestTarget target, String payload) {
-    return post(target, payload, AuthTokenUtils.getAuthTokenForCurrentUser());
+  public static ExtensionServiceRequest 
sampleData(ExtensionServiceRequestTarget target,
+                                                   String payload,
+                                                   SpResourceManager 
resourceManager) {
+    return post(
+        target,
+        payload,
+        
AuthTokenUtils.getAuthTokenForCurrentUser(resourceManager.getCoreConfigurationStorage())
+    );
   }
 
   public static ExtensionServiceRequest 
extensionInstanceHealth(ExtensionServiceRequestTarget target,
@@ -146,6 +158,6 @@ public final class ExtensionServiceRequests {
   private static String serviceAdminToken(SpResourceManager resourceManager) {
     return AuthTokenUtils.getAuthTokenForUser(
         resourceManager.manageUsers().getServiceAdmin().getPrincipalId(),
-        resourceManager.manageUsers());
+        resourceManager);
   }
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
index 0420bebe86..00cd6906a9 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/extensions/ExtensionItemInstaller.java
@@ -50,14 +50,14 @@ public class ExtensionItemInstaller {
     var requestTarget = getDescriptionRequestTarget(req);
     var description = fetchDescription(requestTarget);
     return new TypeExtractor(description, requestManager,
-        
resourceManager.managePermissions()).getTypeVerifier().verifyAndAdd(principalSid,
 req.publicElement());
+        resourceManager).getTypeVerifier().verifyAndAdd(principalSid, 
req.publicElement());
   }
 
   public Message updateExtension(ExtensionItemInstallationRequest req) throws 
IOException, SepaParseException {
     var requestTarget = getDescriptionRequestTarget(req);
     var description = fetchDescription(requestTarget);
     return new TypeExtractor(description, requestManager,
-        
resourceManager.managePermissions()).getTypeVerifier().verifyAndUpdate();
+        resourceManager).getTypeVerifier().verifyAndUpdate();
   }
 
   private ExtensionServiceRequestTarget 
getDescriptionRequestTarget(ExtensionItemInstallationRequest req) {
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
index 7af2a5598b..b8a1368def 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/migration/AbstractMigrationManager.java
@@ -157,7 +157,7 @@ public abstract class AbstractMigrationManager {
       var entityPayload = requestManager
           .request(ExtensionServiceRequests.descriptionUpdate(requestTarget, 
resourceManager))
           .responseBody();
-      var updateResult = new TypeExtractor(entityPayload, requestManager, 
resourceManager.managePermissions())
+      var updateResult = new TypeExtractor(entityPayload, requestManager, 
resourceManager)
           .getTypeVerifier().verifyAndUpdate();
       if (!updateResult.isSuccess()) {
         LOG.error(
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
index 88b531524a..312d08957c 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/remote/ContainerProvidedOptionsHandler.java
@@ -27,6 +27,7 @@ import 
org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpoi
 import org.apache.streampipes.manager.util.AuthTokenUtils;
 import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
 import org.apache.streampipes.model.runtime.RuntimeOptionsResponse;
+import org.apache.streampipes.resource.management.SpResourceManager;
 import org.apache.streampipes.serializers.json.JacksonSerializer;
 import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
 
@@ -38,9 +39,12 @@ import java.util.Set;
 public class ContainerProvidedOptionsHandler {
 
   private final ExtensionServiceRequestManager extensionRequestManager;
+  private final SpResourceManager resourceManager;
 
-  public ContainerProvidedOptionsHandler(ExtensionServiceRequestManager 
extensionRequestManager) {
+  public ContainerProvidedOptionsHandler(ExtensionServiceRequestManager 
extensionRequestManager,
+                                         SpResourceManager resourceManager) {
     this.extensionRequestManager = extensionRequestManager;
+    this.resourceManager = resourceManager;
   }
 
   public RuntimeOptionsResponse fetchRemoteOptions(RuntimeOptionsRequest 
request) {
@@ -48,7 +52,7 @@ public class ContainerProvidedOptionsHandler {
     try {
       var payload = 
JacksonSerializer.getObjectMapper().writeValueAsString(request);
       var requestTarget = getEndpointRequestTarget(request.getAppId());
-      var authToken = AuthTokenUtils.getAuthTokenForCurrentUser();
+      var authToken = 
AuthTokenUtils.getAuthTokenForCurrentUser(resourceManager.getCoreConfigurationStorage());
       var response = extensionRequestManager.request(
           ExtensionServiceRequests.containerProvidedOptions(requestTarget, 
payload, authToken)
       );
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
index e34bd26f4e..b296d5f07a 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/util/AuthTokenUtils.java
@@ -22,7 +22,6 @@ import org.apache.streampipes.model.client.user.Permission;
 import org.apache.streampipes.model.client.user.Principal;
 import org.apache.streampipes.resource.management.PermissionResourceManager;
 import org.apache.streampipes.resource.management.SpResourceManager;
-import org.apache.streampipes.resource.management.UserResourceManager;
 import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
 import org.apache.streampipes.user.management.jwt.JwtTokenProvider;
 
@@ -43,20 +42,22 @@ public class AuthTokenUtils {
     } else {
       if (resourceId != null) {
         String ownerSid = getOwnerSid(resourceId, 
resourceManager.managePermissions());
-        return getAuthTokenForUser(ownerSid, resourceManager.manageUsers());
+        return getAuthTokenForUser(ownerSid, resourceManager);
       } else {
         throw new IllegalArgumentException("No authenticated user found to 
associate with request");
       }
     }
   }
 
-  public static String getAuthTokenForUser(String ownerSid, 
UserResourceManager userResourceManager) {
-    Principal correspondingUser = 
userResourceManager.getPrincipalById(ownerSid);
-    return getAuthTokenForUser(correspondingUser);
+  public static String getAuthTokenForUser(String ownerSid,
+                                           SpResourceManager resourceManager) {
+    Principal correspondingUser = 
resourceManager.manageUsers().getPrincipalById(ownerSid);
+    return getAuthTokenForUser(correspondingUser, 
resourceManager.getCoreConfigurationStorage());
   }
 
-  public static String getAuthTokenForUser(Principal principal) {
-    return makeBearerToken(new JwtTokenProvider().createToken(principal));
+  public static String getAuthTokenForUser(Principal principal,
+                                           ISpCoreConfigurationStorage 
configurationStorage) {
+    return makeBearerToken(new 
JwtTokenProvider(configurationStorage).createToken(principal));
   }
 
   private static String makeBearerToken(String token) {
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
index 7a0863bf2f..cb57bcc10c 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/verification/extractor/TypeExtractor.java
@@ -27,7 +27,7 @@ import 
org.apache.streampipes.model.base.NamedStreamPipesEntity;
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
 import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.graph.DataSinkDescription;
-import org.apache.streampipes.resource.management.PermissionResourceManager;
+import org.apache.streampipes.resource.management.SpResourceManager;
 import org.apache.streampipes.serializers.json.JacksonSerializer;
 import 
org.apache.streampipes.storage.api.pipeline.IPipelineElementDescriptionStorage;
 import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -50,24 +50,24 @@ public class TypeExtractor {
   private final String extensionElementDescription;
   private final IPipelineElementDescriptionStorage storageApi;
   private final ExtensionServiceRequestManager requestManager;
-  private final PermissionResourceManager permissionResourceManager;
+  private final SpResourceManager resourceManager;
 
   public TypeExtractor(String extensionElementDescription,
                        ExtensionServiceRequestManager requestManager,
-                       PermissionResourceManager permissionResourceManager) {
-    this(extensionElementDescription, defaultStorageApi(), requestManager, 
permissionResourceManager);
+                       SpResourceManager resourceManager) {
+    this(extensionElementDescription, defaultStorageApi(), requestManager, 
resourceManager);
   }
 
   public TypeExtractor(
       String extensionElementDescription,
       IPipelineElementDescriptionStorage storageApi,
       ExtensionServiceRequestManager requestManager,
-      PermissionResourceManager permissionResourceManager
+      SpResourceManager resourceManager
   ) {
     this.extensionElementDescription = extensionElementDescription;
     this.storageApi = storageApi;
     this.requestManager = requestManager;
-    this.permissionResourceManager = permissionResourceManager;
+    this.resourceManager = resourceManager;
   }
 
   public ElementVerifier<?> getTypeVerifier() throws SepaParseException {
@@ -140,7 +140,7 @@ public class TypeExtractor {
         updateOperation,
         serviceUrlProvider,
         requestManager,
-        permissionResourceManager
+        resourceManager
     );
   }
 
diff --git 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
index 8d2653b1cb..03cb4d3ffb 100644
--- 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
+++ 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/SpResourceManager.java
@@ -107,6 +107,6 @@ public class SpResourceManager {
   }
 
   public UserResourceManager manageUsers() {
-    return new UserResourceManager();
+    return new UserResourceManager(coreConfigurationStorage);
   }
 }
diff --git 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
index 02f958fc4e..aa1b043654 100644
--- 
a/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
+++ 
b/streampipes-resource-management/src/main/java/org/apache/streampipes/resource/management/UserResourceManager.java
@@ -30,6 +30,7 @@ import org.apache.streampipes.model.client.user.Principal;
 import org.apache.streampipes.model.client.user.UserAccount;
 import org.apache.streampipes.model.client.user.UserActivationToken;
 import org.apache.streampipes.model.client.user.UserRegistrationData;
+import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
 import org.apache.streampipes.storage.api.user.IPasswordRecoveryTokenStorage;
 import org.apache.streampipes.storage.api.user.IUserActivationTokenStorage;
 import org.apache.streampipes.storage.api.user.IUserStorage;
@@ -51,8 +52,11 @@ public class UserResourceManager extends 
AbstractResourceManager<IUserStorage> {
   private static final int RECOVERY_TOKEN_LENGTH = 40;
   private static final Logger LOG = 
LoggerFactory.getLogger(UserResourceManager.class);
 
-  public UserResourceManager() {
+  private final ISpCoreConfigurationStorage coreConfigurationStorage;
+
+  public UserResourceManager(ISpCoreConfigurationStorage 
coreConfigurationStorage) {
     super(StorageDispatcher.INSTANCE.getNoSqlStore().getUserStorageAPI());
+    this.coreConfigurationStorage = coreConfigurationStorage;
   }
 
   public static void setHideTutorial(String username, boolean hideTutorial) {
@@ -147,7 +151,7 @@ public class UserResourceManager extends 
AbstractResourceManager<IUserStorage> {
                                    String activationCode) throws IOException {
     UserActivationToken token = UserActivationToken.create(activationCode, 
username);
     getUserActivationTokenStorage().persist(token);
-    new MailSender().sendAccountActivationMail(username, activationCode);
+    new 
MailSender(coreConfigurationStorage.get()).sendAccountActivationMail(username, 
activationCode);
   }
 
   public void sendPasswordRecoveryLink(String username) throws 
UserNotFoundException, IOException {
@@ -155,7 +159,7 @@ public class UserResourceManager extends 
AbstractResourceManager<IUserStorage> {
     if (db.checkUserExists(username)) {
       String recoveryCode = TokenUtil.generateToken(RECOVERY_TOKEN_LENGTH);
       storeRecoveryCode(username, recoveryCode);
-      new MailSender().sendPasswordRecoveryMail(username, recoveryCode);
+      new 
MailSender(coreConfigurationStorage.get()).sendPasswordRecoveryMail(username, 
recoveryCode);
     }
   }
 
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ContainerProvidedOptions.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ContainerProvidedOptions.java
index fa1b1d798b..b74c155537 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ContainerProvidedOptions.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ContainerProvidedOptions.java
@@ -21,6 +21,7 @@ import 
org.apache.streampipes.manager.api.extensions.ExtensionServiceRequestMana
 import org.apache.streampipes.manager.remote.ContainerProvidedOptionsHandler;
 import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
 import org.apache.streampipes.model.runtime.RuntimeOptionsResponse;
+import org.apache.streampipes.resource.management.SpResourceManager;
 import org.apache.streampipes.rest.core.base.impl.AbstractRestResource;
 
 import org.springframework.http.MediaType;
@@ -36,8 +37,11 @@ public class ContainerProvidedOptions extends 
AbstractRestResource {
 
   private final ContainerProvidedOptionsHandler 
containerProvidedOptionsHandler;
 
-  public ContainerProvidedOptions(ExtensionServiceRequestManager 
extensionServiceRequestManager) {
-    this.containerProvidedOptionsHandler = new 
ContainerProvidedOptionsHandler(extensionServiceRequestManager);
+  public ContainerProvidedOptions(ExtensionServiceRequestManager 
extensionServiceRequestManager,
+                                  SpResourceManager resourceManager) {
+    this.containerProvidedOptionsHandler = new ContainerProvidedOptionsHandler(
+        extensionServiceRequestManager, resourceManager
+    );
   }
 
   @PostMapping(
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/EmailConfigurationResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/EmailConfigurationResource.java
index 7dc8bb077a..43f521c288 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/EmailConfigurationResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/admin/EmailConfigurationResource.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.model.message.Notifications;
 import 
org.apache.streampipes.rest.core.base.impl.AbstractAuthGuardedRestResource;
 import org.apache.streampipes.rest.security.AuthConstants;
 import org.apache.streampipes.rest.shared.exception.SpMessageException;
+import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage;
 import 
org.apache.streampipes.user.management.encryption.SecretEncryptionManager;
 
 import org.simplejavamail.MailException;
@@ -44,6 +45,12 @@ import java.io.IOException;
 @RequestMapping("/api/v2/admin/mail-config")
 public class EmailConfigurationResource extends 
AbstractAuthGuardedRestResource {
 
+  private final ISpCoreConfigurationStorage configurationStorage;
+
+  public EmailConfigurationResource(ISpCoreConfigurationStorage 
coreConfigurationStorage) {
+    this.configurationStorage = coreConfigurationStorage;
+  }
+
   @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
   @PreAuthorize(AuthConstants.IS_ADMIN_ROLE)
   public ResponseEntity<EmailConfig> getMailConfiguration() {
@@ -90,7 +97,8 @@ public class EmailConfigurationResource extends 
AbstractAuthGuardedRestResource
   @PreAuthorize(AuthConstants.IS_ADMIN_ROLE)
   public ResponseEntity<Void> sendTestMail(@RequestBody EmailConfig config) {
     try {
-      new MailTester().sendTestMail(config);
+      var coreConfiguration = configurationStorage.get();
+      new MailTester(coreConfiguration).sendTestMail(config);
       return ok();
     } catch (MailException | IllegalArgumentException | IOException e) {
       throw new SpMessageException(HttpStatus.BAD_REQUEST, 
Notifications.error(e.getMessage()));
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
index 8727c3336d..9d2cc76625 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/CompactAdapterResource.java
@@ -77,7 +77,8 @@ public class CompactAdapterResource extends 
AbstractAdapterResource<AdapterMaste
     ));
     var guessManagement = new GuessManagement(
         new ExtensionsServiceEndpointGenerator(),
-        requestManager
+        requestManager,
+        resourceManager
     );
     this.requestManager = requestManager;
     this.compactAdapterManagement = new CompactAdapterManagement(
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/GuessResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/GuessResource.java
index 8dce2589a8..2da499d326 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/GuessResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/GuessResource.java
@@ -27,6 +27,7 @@ import 
org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpoi
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
 import org.apache.streampipes.model.monitoring.SpLogMessage;
 import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.resource.management.SpResourceManager;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,8 +47,13 @@ public class GuessResource extends 
AbstractAdapterResource<GuessManagement> {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(GuessResource.class);
 
-  public GuessResource(ExtensionServiceRequestManager 
extensionServiceRequestManager) {
-    super(() -> new GuessManagement(new ExtensionsServiceEndpointGenerator(), 
extensionServiceRequestManager));
+  public GuessResource(ExtensionServiceRequestManager 
extensionServiceRequestManager,
+                       SpResourceManager resourceManager) {
+    super(() -> new GuessManagement(
+        new ExtensionsServiceEndpointGenerator(),
+        extensionServiceRequestManager,
+        resourceManager)
+    );
   }
 
 
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/RuntimeResolvableResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/RuntimeResolvableResource.java
index c9a66bc655..f4a560467c 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/RuntimeResolvableResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/connect/RuntimeResolvableResource.java
@@ -27,6 +27,7 @@ import 
org.apache.streampipes.manager.execution.endpoint.ExtensionsServiceEndpoi
 import org.apache.streampipes.model.monitoring.SpLogMessage;
 import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
 import org.apache.streampipes.model.runtime.RuntimeOptionsResponse;
+import org.apache.streampipes.resource.management.SpResourceManager;
 import org.apache.streampipes.resource.management.secret.SecretProvider;
 import org.apache.streampipes.svcdiscovery.api.model.SpServiceUrlProvider;
 
@@ -49,11 +50,14 @@ public class RuntimeResolvableResource extends 
AbstractAdapterResource<Void> {
 
   private final IExtensionsServiceEndpointGenerator endpointGenerator;
   private final WorkerRestClient workerRestClient;
+  private final SpResourceManager resourceManager;
 
-  public RuntimeResolvableResource(WorkerRestClient workerRestClient) {
+  public RuntimeResolvableResource(WorkerRestClient workerRestClient,
+                                   SpResourceManager resourceManager) {
     super();
     this.endpointGenerator = new ExtensionsServiceEndpointGenerator();
     this.workerRestClient = workerRestClient;
+    this.resourceManager = resourceManager;
   }
 
   @PostMapping(
@@ -71,7 +75,8 @@ public class RuntimeResolvableResource extends 
AbstractAdapterResource<Void> {
           
runtimeOptionsRequest.getDeploymentConfiguration().getDesiredServiceTags()
       );
       
SecretProvider.getDecryptionService().applyConfig(runtimeOptionsRequest.getStaticProperties());
-      RuntimeOptionsResponse result = 
workerRestClient.getConfiguration(service, appId, runtimeOptionsRequest);
+      RuntimeOptionsResponse result = workerRestClient
+          .getConfiguration(service, appId, runtimeOptionsRequest, 
resourceManager);
 
       return ok(result);
     } catch (AdapterException | NoServiceEndpointsAvailableException e) {
diff --git 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/certificates/CertificateExpiryEmailScheduler.java
 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/certificates/CertificateExpiryEmailScheduler.java
index df8d376d17..f12c2296f1 100644
--- 
a/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/certificates/CertificateExpiryEmailScheduler.java
+++ 
b/streampipes-service-core/src/main/java/org/apache/streampipes/service/core/scheduler/certificates/CertificateExpiryEmailScheduler.java
@@ -121,7 +121,7 @@ public class CertificateExpiryEmailScheduler implements 
SchedulingConfigurer {
   private void sendEmail(List<String> recipients, String message) {
     var email = SpEmail.from(recipients, SUBJECT, message);
     try {
-      new MailSender().sendEmail(email);
+      new MailSender(coreConfigurationStorage.get()).sendEmail(email);
     } catch (IOException e) {
       LOG.error("Failed to send certificate expiry email to {}", recipients, 
e);
     }

Reply via email to