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

yasith pushed a commit to branch service-layer-improvements
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit 629c85022ccdaeb4ce21005c81ac6d80a8b99464
Author: yasithdev <[email protected]>
AuthorDate: Tue Dec 9 18:08:35 2025 -0600

    cleanup classes and get code to working state
---
 .../accountprovisioning/SSHAccountManager.java     | 53 +++----------
 .../org/apache/airavata/agents/api/AgentUtils.java | 33 +-------
 .../airavata/config/RegistryServiceProvider.java   | 44 -----------
 .../apache/airavata/helix/core/AbstractTask.java   | 16 +---
 .../helix/impl/participant/GlobalParticipant.java  |  8 +-
 .../airavata/helix/impl/task/AWSTaskFactory.java   | 11 ++-
 .../airavata/helix/impl/task/AiravataTask.java     | 44 +----------
 .../airavata/helix/impl/task/TaskContext.java      | 29 +++----
 .../helix/impl/task/aws/AWSCompletingTask.java     |  7 +-
 .../helix/impl/task/aws/AWSJobSubmissionTask.java  | 13 +--
 .../helix/impl/task/aws/CreateEC2InstanceTask.java | 11 ++-
 .../helix/impl/task/aws/utils/AWSTaskUtil.java     | 36 ++-------
 .../impl/task/cancel/WorkflowCancellationTask.java | 16 +---
 .../helix/impl/task/parsing/DataParsingTask.java   | 41 ++--------
 .../task/submission/DefaultJobSubmissionTask.java  |  3 -
 .../task/submission/config/GroovyMapBuilder.java   | 36 ++-------
 .../helix/impl/workflow/ParserWorkflowManager.java |  4 +-
 .../helix/impl/workflow/PostWorkflowManager.java   | 14 +---
 .../manager/dbevent/DBEventManagerRunner.java      | 23 ++----
 .../orchestrator/impl/AbstractOrchestrator.java    |  5 +-
 .../orchestrator/impl/SimpleOrchestratorImpl.java  | 47 ++++++-----
 .../orchestrator/job/GFACPassiveJobSubmitter.java  |  9 ++-
 .../orchestrator/utils/OrchestratorUtils.java      | 92 +++++-----------------
 .../security/GatewayGroupsInitializer.java         | 27 -------
 .../airavata/security/KeyCloakSecurityManager.java | 13 ++-
 .../authzcache/AuthzCacheManagerFactory.java       | 45 +++++------
 .../apache/airavata/service/AiravataService.java   | 20 +++--
 .../security/GatewayGroupsInitializerTest.java     |  3 -
 .../file/server/FileServerConfiguration.java       |  6 +-
 .../file/server/service/AirvataFileService.java    | 33 ++++++--
 .../file/server/service/ProcessDataManager.java    | 21 +++--
 .../airavata/ide/integration/APIServerStarter.java | 28 ++-----
 .../airavata/ide/integration/JobEngineStarter.java | 27 +++----
 .../ide/integration/JobMonitorStarter.java         |  8 +-
 .../airavata/research/service/AiravataService.java | 15 ++--
 35 files changed, 267 insertions(+), 574 deletions(-)

diff --git 
a/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
 
b/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
index dee18ac07d..1c47be9727 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/accountprovisioning/SSHAccountManager.java
@@ -36,7 +36,6 @@ import 
org.apache.airavata.model.credential.store.SSHCredential;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.service.CredentialStoreService;
 import org.apache.airavata.service.RegistryService;
-import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -45,39 +44,11 @@ public class SSHAccountManager {
     private final RegistryService registryService;
     private final CredentialStoreService credentialStoreService;
 
-    private static ApplicationContext applicationContext;
-
     public SSHAccountManager(
             RegistryService registryService,
-            CredentialStoreService credentialStoreService,
-            ApplicationContext applicationContext) {
+            CredentialStoreService credentialStoreService) {
         this.registryService = registryService;
         this.credentialStoreService = credentialStoreService;
-        SSHAccountManager.applicationContext = applicationContext;
-    }
-
-    // Instance methods for Spring DI
-    private RegistryService getRegistryServiceInstance() {
-        return registryService;
-    }
-
-    private CredentialStoreService getCredentialStoreServiceInstance() {
-        return credentialStoreService;
-    }
-
-    // Static methods for backward compatibility - delegate to Spring-managed 
instance
-    private static RegistryService getRegistryServiceStatic() {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(SSHAccountManager.class).getRegistryServiceInstance();
-        }
-        throw new RuntimeException("ApplicationContext not available. 
RegistryService cannot be retrieved.");
-    }
-
-    private static CredentialStoreService getCredentialStoreServiceStatic() {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(SSHAccountManager.class).getCredentialStoreServiceInstance();
-        }
-        throw new RuntimeException("ApplicationContext not available. 
CredentialStoreService cannot be retrieved.");
     }
 
     /**
@@ -89,7 +60,7 @@ public class SSHAccountManager {
      * @throws InvalidSetupException
      * @throws InvalidUsernameException
      */
-    public static boolean doesUserHaveSSHAccount(String gatewayId, String 
computeResourceId, String userId)
+    public boolean doesUserHaveSSHAccount(String gatewayId, String 
computeResourceId, String userId)
             throws InvalidSetupException, InvalidUsernameException {
         SSHAccountProvisioner sshAccountProvisioner = 
getSshAccountProvisioner(gatewayId, computeResourceId);
 
@@ -102,10 +73,10 @@ public class SSHAccountManager {
         }
     }
 
-    private static SSHAccountProvisioner getSshAccountProvisioner(String 
gatewayId, String computeResourceId)
+    private SSHAccountProvisioner getSshAccountProvisioner(String gatewayId, 
String computeResourceId)
             throws InvalidSetupException {
         // get registry service
-        RegistryService registryService = getRegistryServiceStatic();
+        RegistryService registryService = this.registryService;
         // get compute resource preferences for the gateway and hostname
         ComputeResourcePreference computeResourcePreference = null;
         try {
@@ -126,7 +97,7 @@ public class SSHAccountManager {
         return createSshAccountProvisioner(gatewayId, 
computeResourcePreference);
     }
 
-    public static boolean isSSHAccountSetupComplete(
+    public boolean isSSHAccountSetupComplete(
             String gatewayId, String computeResourceId, String userId, 
SSHCredential sshCredential)
             throws InvalidSetupException, InvalidUsernameException {
         SSHAccountProvisioner sshAccountProvisioner = 
getSshAccountProvisioner(gatewayId, computeResourceId);
@@ -143,12 +114,12 @@ public class SSHAccountManager {
      * @throws InvalidSetupException
      * @throws InvalidUsernameException
      */
-    public static UserComputeResourcePreference setupSSHAccount(
+    public UserComputeResourcePreference setupSSHAccount(
             String gatewayId, String computeResourceId, String userId, 
SSHCredential sshCredential)
             throws InvalidSetupException, InvalidUsernameException {
 
         // get compute resource preferences for the gateway and hostname
-        RegistryService registryService = getRegistryServiceStatic();
+        RegistryService registryService = this.registryService;
         ComputeResourcePreference computeResourcePreference = null;
         ComputeResourceDescription computeResourceDescription = null;
         SSHJobSubmission sshJobSubmission = null;
@@ -251,7 +222,7 @@ public class SSHAccountManager {
         return userComputeResourcePreference;
     }
 
-    private static String getSSHHostname(
+    private String getSSHHostname(
             ComputeResourceDescription computeResourceDescription, 
SSHJobSubmission sshJobSubmission) {
         String alternativeSSHHostName = 
sshJobSubmission.getAlternativeSSHHostName();
         if (alternativeSSHHostName != null && 
!"".equals(alternativeSSHHostName.trim())) {
@@ -261,7 +232,7 @@ public class SSHAccountManager {
         }
     }
 
-    private static SSHAccountProvisioner createSshAccountProvisioner(
+    private SSHAccountProvisioner createSshAccountProvisioner(
             String gatewayId, ComputeResourcePreference 
computeResourcePreference) throws InvalidSetupException {
         String provisionerName = 
computeResourcePreference.getSshAccountProvisioner();
         Map<ConfigParam, String> provisionerConfig =
@@ -274,10 +245,10 @@ public class SSHAccountManager {
         return 
SSHAccountProvisionerFactory.createSSHAccountProvisioner(provisionerName, 
resolvedConfig);
     }
 
-    private static Map<ConfigParam, String> resolveProvisionerConfig(
+    private Map<ConfigParam, String> resolveProvisionerConfig(
             String gatewayId, String provisionerName, Map<ConfigParam, String> 
provisionerConfig)
             throws InvalidSetupException {
-        CredentialStoreService credentialStoreService = 
getCredentialStoreServiceStatic();
+        CredentialStoreService credentialStoreService = 
this.credentialStoreService;
         // Resolve any CRED_STORE_PASSWORD_TOKEN config parameters to passwords
         Map<ConfigParam, String> resolvedConfig = new HashMap<>();
         for (Map.Entry<ConfigParam, String> configEntry : 
provisionerConfig.entrySet()) {
@@ -301,7 +272,7 @@ public class SSHAccountManager {
         return resolvedConfig;
     }
 
-    private static Map<ConfigParam, String> convertConfigParams(
+    private Map<ConfigParam, String> convertConfigParams(
             String provisionerName, Map<String, String> thriftConfigParams) 
throws InvalidSetupException {
         List<ConfigParam> configParams =
                 
SSHAccountProvisionerFactory.getSSHAccountProvisionerConfigParams(provisionerName);
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java 
b/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java
index 40aa83613c..c78831033c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/agents/api/AgentUtils.java
@@ -21,53 +21,26 @@ package org.apache.airavata.agents.api;
 
 import org.apache.airavata.service.CredentialStoreService;
 import org.apache.airavata.service.RegistryService;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Component;
 
 @Component
-public class AgentUtils implements ApplicationContextAware {
-
-    private static ApplicationContext applicationContext;
+public class AgentUtils {
 
     private final RegistryService registryService;
     private final CredentialStoreService credentialStoreService;
 
     public AgentUtils(
-            ApplicationContext applicationContext,
             RegistryService registryService,
             CredentialStoreService credentialStoreService) {
-        AgentUtils.applicationContext = applicationContext;
         this.registryService = registryService;
         this.credentialStoreService = credentialStoreService;
     }
 
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) {
-        AgentUtils.applicationContext = applicationContext;
-    }
-
-    // Instance methods for Spring DI
-    public RegistryService getRegistryServiceInstance() {
+    public RegistryService getRegistryService() {
         return registryService;
     }
 
-    public CredentialStoreService getCredentialServiceInstance() {
+    public CredentialStoreService getCredentialService() {
         return credentialStoreService;
     }
-
-    // Static methods for backward compatibility - delegate to instance
-    public static RegistryService getRegistryService() throws AgentException {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(AgentUtils.class).getRegistryServiceInstance();
-        }
-        throw new AgentException("ApplicationContext not available. 
RegistryService cannot be retrieved.");
-    }
-
-    public static CredentialStoreService getCredentialService() throws 
AgentException {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(AgentUtils.class).getCredentialServiceInstance();
-        }
-        throw new AgentException("ApplicationContext not available. 
CredentialStoreService cannot be retrieved.");
-    }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java
 
b/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java
deleted file mode 100644
index 90fba0e500..0000000000
--- 
a/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java
+++ /dev/null
@@ -1,44 +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.airavata.config;
-
-import org.apache.airavata.service.RegistryService;
-import org.springframework.stereotype.Component;
-
-/**
- * Provider to make RegistryService available to components that can't use 
Spring injection
- * (e.g., workflow managers started via main methods).
- */
-@Component
-public class RegistryServiceProvider {
-
-    private static RegistryService instance;
-
-    public RegistryServiceProvider(RegistryService registryService) {
-        RegistryServiceProvider.instance = registryService;
-    }
-
-    public static RegistryService getInstance() {
-        if (instance == null) {
-            throw new IllegalStateException("RegistryService not initialized. 
Spring context may not be ready.");
-        }
-        return instance;
-    }
-}
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java 
b/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java
index 2c223c5487..0b75a6967b 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/core/AbstractTask.java
@@ -19,7 +19,6 @@
 */
 package org.apache.airavata.helix.core;
 
-import org.apache.airavata.config.AiravataServerProperties;
 import org.apache.airavata.helix.core.participant.HelixParticipant;
 import org.apache.airavata.helix.core.util.MonitoringUtil;
 import org.apache.airavata.helix.core.util.TaskUtil;
@@ -227,18 +226,9 @@ public abstract class AbstractTask extends 
UserContentStore implements Task {
         if (curatorClient == null) {
             RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
             try {
-                // Try to get properties from ApplicationContext via 
AiravataTask
-                String zkConnection = "localhost:2181"; // default
-                try {
-                    var ctx = 
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-                    if (ctx != null) {
-                        var props = 
ctx.getBean(AiravataServerProperties.class);
-                        zkConnection = props.zookeeper.serverConnection;
-                    }
-                } catch (Exception e) {
-                    logger.warn(
-                            "Could not get properties from ApplicationContext, 
using default zookeeper connection", e);
-                }
+                // Try to get properties from ApplicationSettings
+                String zkConnection = 
org.apache.airavata.common.utils.ApplicationSettings.getSetting(
+                        "zookeeper.server-connection", "localhost:2181");
                 AbstractTask.curatorClient = 
CuratorFrameworkFactory.newClient(zkConnection, retryPolicy);
                 AbstractTask.curatorClient.start();
             } catch (Exception e) {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
index c6ecb00d6c..06aeb24cc2 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/participant/GlobalParticipant.java
@@ -81,16 +81,12 @@ public class GlobalParticipant extends 
HelixParticipant<AbstractTask> {
         return taskClasses;
     }
 
-    public void startServer() {
-        Thread t = new Thread(this);
-        t.start();
-    }
-
     /**
      * Standardized start method for Spring Boot integration.
      * Non-blocking: starts internal thread and returns immediately.
      */
     public void start() {
-        startServer();
+        Thread t = new Thread(this);
+        t.start();
     }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java
index 229f9f9c5f..136048e094 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AWSTaskFactory.java
@@ -41,25 +41,28 @@ public class AWSTaskFactory implements HelixTaskFactory {
     private final UserProfileService userProfileService;
     private final CredentialStoreService credentialStoreService;
     private final 
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder;
+    private final org.apache.airavata.helix.impl.task.aws.utils.AWSTaskUtil 
awsTaskUtil;
 
     public AWSTaskFactory(
             ApplicationContext applicationContext,
             RegistryService registryService,
             UserProfileService userProfileService,
             CredentialStoreService credentialStoreService,
-            
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder) {
+            
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder,
+            org.apache.airavata.helix.impl.task.aws.utils.AWSTaskUtil 
awsTaskUtil) {
         this.applicationContext = applicationContext;
         this.registryService = registryService;
         this.userProfileService = userProfileService;
         this.credentialStoreService = credentialStoreService;
         this.groovyMapBuilder = groovyMapBuilder;
+        this.awsTaskUtil = awsTaskUtil;
     }
 
     @Override
     public AiravataTask createEnvSetupTask(String processId) {
         LOGGER.info("Creating AWS CreateEc2InstanceTask for process {}...", 
processId);
         return new CreateEC2InstanceTask(
-                applicationContext, registryService, userProfileService, 
credentialStoreService);
+                applicationContext, registryService, userProfileService, 
credentialStoreService, awsTaskUtil);
     }
 
     @Override
@@ -70,7 +73,7 @@ public class AWSTaskFactory implements HelixTaskFactory {
     @Override
     public AiravataTask createJobSubmissionTask(String processId) {
         return new AWSJobSubmissionTask(
-                applicationContext, registryService, userProfileService, 
credentialStoreService, groovyMapBuilder);
+                applicationContext, registryService, userProfileService, 
credentialStoreService, groovyMapBuilder, awsTaskUtil);
     }
 
     @Override
@@ -90,7 +93,7 @@ public class AWSTaskFactory implements HelixTaskFactory {
 
     @Override
     public AiravataTask createCompletingTask(String processId) {
-        return new AWSCompletingTask(applicationContext, registryService, 
userProfileService, credentialStoreService);
+        return new AWSCompletingTask(applicationContext, registryService, 
userProfileService, credentialStoreService, awsTaskUtil);
     }
 
     @Override
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
index dbba876cf4..0ac6068df6 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/AiravataTask.java
@@ -65,8 +65,8 @@ import org.springframework.stereotype.Component;
 public abstract class AiravataTask extends AbstractTask {
 
     private static final Logger logger = 
LoggerFactory.getLogger(AiravataTask.class);
-    private static ApplicationContext applicationContext;
 
+    protected final ApplicationContext applicationContext;
     protected final RegistryService registryService;
     private final UserProfileService userProfileService;
     private final CredentialStoreService credentialStoreService;
@@ -76,13 +76,13 @@ public abstract class AiravataTask extends AbstractTask {
             RegistryService registryService,
             UserProfileService userProfileService,
             CredentialStoreService credentialStoreService) {
-        AiravataTask.applicationContext = applicationContext;
+        this.applicationContext = applicationContext;
         this.registryService = registryService;
         this.userProfileService = userProfileService;
         this.credentialStoreService = credentialStoreService;
     }
 
-    public static ApplicationContext getApplicationContext() {
+    protected ApplicationContext getApplicationContext() {
         return applicationContext;
     }
 
@@ -688,42 +688,4 @@ public abstract class AiravataTask extends AbstractTask {
         this.autoSchedule = autoSchedule;
     }
 
-    // Static methods for backward compatibility - delegate to instance via 
ApplicationContext
-    public static RegistryService getRegistryServiceStatic() {
-        if (applicationContext != null) {
-            // Try to get from a bean instance first
-            try {
-                AiravataTask task = 
applicationContext.getBean(AiravataTask.class);
-                return task.getRegistryService();
-            } catch (Exception e) {
-                // Fallback to direct bean lookup
-                return applicationContext.getBean(RegistryService.class);
-            }
-        }
-        throw new IllegalStateException("ApplicationContext not available");
-    }
-
-    public static UserProfileService getUserProfileServiceStatic() {
-        if (applicationContext != null) {
-            try {
-                AiravataTask task = 
applicationContext.getBean(AiravataTask.class);
-                return task.getUserProfileService();
-            } catch (Exception e) {
-                return applicationContext.getBean(UserProfileService.class);
-            }
-        }
-        throw new IllegalStateException("ApplicationContext not available");
-    }
-
-    public static CredentialStoreService getCredentialStoreServiceStatic() {
-        if (applicationContext != null) {
-            try {
-                AiravataTask task = 
applicationContext.getBean(AiravataTask.class);
-                return task.getCredentialStoreService();
-            } catch (Exception e) {
-                return 
applicationContext.getBean(CredentialStoreService.class);
-            }
-        }
-        throw new IllegalStateException("ApplicationContext not available");
-    }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
index f89409fadf..c82c33c5e0 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/TaskContext.java
@@ -74,7 +74,6 @@ import org.apache.airavata.service.RegistryService;
 import org.apache.airavata.service.UserProfileService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 
 /**
  * Note: process context property use lazy loading approach. In runtime you 
will see some properties as null
@@ -784,26 +783,26 @@ public class TaskContext {
 
     public RegistryService getRegistryService() {
         if (registryService == null) {
-            // Get from AiravataTask if available
-            ApplicationContext applicationContext = 
AiravataTask.getApplicationContext();
-            if (applicationContext != null) {
-                registryService = 
applicationContext.getBean(RegistryService.class);
-            }
+            throw new IllegalStateException("RegistryService not set in 
TaskContext. It must be set via setRegistryService()");
         }
         return registryService;
     }
 
+    public void setRegistryService(RegistryService registryService) {
+        this.registryService = registryService;
+    }
+
     public UserProfileService getProfileService() {
         if (profileService == null) {
-            // Get from AiravataTask if available
-            ApplicationContext applicationContext = 
AiravataTask.getApplicationContext();
-            if (applicationContext != null) {
-                profileService = 
applicationContext.getBean(UserProfileService.class);
-            }
+            throw new IllegalStateException("UserProfileService not set in 
TaskContext. It must be set via setProfileService()");
         }
         return profileService;
     }
 
+    public void setProfileService(UserProfileService profileService) {
+        this.profileService = profileService;
+    }
+
     public UserProfile getUserProfile() throws TaskOnFailException {
 
         if (this.userProfile == null) {
@@ -1035,10 +1034,8 @@ public class TaskContext {
     }
 
     private AiravataSecurityManager getSecurityManager() {
-        ApplicationContext applicationContext = 
AiravataTask.getApplicationContext();
-        if (applicationContext != null) {
-            return applicationContext.getBean(AiravataSecurityManager.class);
-        }
-        throw new RuntimeException("Unable to get SecurityManager - 
ApplicationContext not available");
+        // SecurityManager should be injected or retrieved via a different 
mechanism
+        // For now, throw an exception indicating it needs to be set
+        throw new RuntimeException("Unable to get SecurityManager - 
SecurityManager must be injected into TaskContext");
     }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java
index 3c64206513..397588880b 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSCompletingTask.java
@@ -33,13 +33,16 @@ import org.slf4j.LoggerFactory;
 public class AWSCompletingTask extends AiravataTask {
 
     private static final Logger logger = 
LoggerFactory.getLogger(AWSCompletingTask.class);
+    private final AWSTaskUtil awsTaskUtil;
 
     public AWSCompletingTask(
             org.springframework.context.ApplicationContext applicationContext,
             org.apache.airavata.service.RegistryService registryService,
             org.apache.airavata.service.UserProfileService userProfileService,
-            org.apache.airavata.service.CredentialStoreService 
credentialStoreService) {
+            org.apache.airavata.service.CredentialStoreService 
credentialStoreService,
+            AWSTaskUtil awsTaskUtil) {
         super(applicationContext, registryService, userProfileService, 
credentialStoreService);
+        this.awsTaskUtil = awsTaskUtil;
     }
 
     @Override
@@ -48,7 +51,7 @@ public class AWSCompletingTask extends AiravataTask {
         logger.info("Process {} successfully completed", getProcessId());
         saveAndPublishProcessStatus(ProcessState.COMPLETED);
         cleanup();
-        AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
+        awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
         return onSuccess("Process " + getProcessId() + " successfully 
completed");
     }
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java
index a04df96133..cc57ae9531 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/AWSJobSubmissionTask.java
@@ -60,16 +60,17 @@ import 
software.amazon.awssdk.services.ec2.model.InstanceStateName;
 public class AWSJobSubmissionTask extends JobSubmissionTask {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AWSJobSubmissionTask.class);
-    private static ApplicationContext applicationContext;
+    private final AWSTaskUtil awsTaskUtil;
 
     public AWSJobSubmissionTask(
             ApplicationContext applicationContext,
             org.apache.airavata.service.RegistryService registryService,
             org.apache.airavata.service.UserProfileService userProfileService,
             CredentialStoreService credentialStoreService,
-            
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder) {
+            
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder,
+            AWSTaskUtil awsTaskUtil) {
         super(applicationContext, registryService, userProfileService, 
credentialStoreService, groovyMapBuilder);
-        AWSJobSubmissionTask.applicationContext = applicationContext;
+        this.awsTaskUtil = awsTaskUtil;
     }
 
     private static final int WAIT_MAX_RETRIES = 10;
@@ -218,7 +219,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask 
{
                     awsContext.getInstanceId(),
                     publicIpAddress,
                     getProcessId());
-            AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
+            awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
 
         } catch (Exception e) {
             LOGGER.error("Failed to execute full cleanup during onCancel for 
process {}", getProcessId(), e);
@@ -230,7 +231,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask 
{
     protected void cleanup() {
         super.cleanup();
         LOGGER.info("AWS Job Submission Task cleanup for process {}", 
getProcessId());
-        AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
+        awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
     }
 
     private String verifyInstanceIsRunning(String token, String instanceId, 
String region) throws Exception {
@@ -241,7 +242,7 @@ public class AWSJobSubmissionTask extends JobSubmissionTask 
{
                 MAX_DELAY_SECONDS,
                 TimeUnit.SECONDS);
 
-        try (Ec2Client ec2Client = AWSTaskUtil.buildEc2Client(token, 
getGatewayId(), region)) {
+        try (Ec2Client ec2Client = awsTaskUtil.buildEc2Client(token, 
getGatewayId(), region)) {
             return waiter.waitUntil(() -> {
                 DescribeInstancesRequest request = 
DescribeInstancesRequest.builder()
                         .instanceIds(instanceId)
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java
index b792e881cc..1fbaae659f 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/CreateEC2InstanceTask.java
@@ -47,13 +47,16 @@ import 
software.amazon.awssdk.services.ec2.model.RunInstancesResponse;
 public class CreateEC2InstanceTask extends AiravataTask {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(CreateEC2InstanceTask.class);
+    private final AWSTaskUtil awsTaskUtil;
 
     public CreateEC2InstanceTask(
             org.springframework.context.ApplicationContext applicationContext,
             org.apache.airavata.service.RegistryService registryService,
             org.apache.airavata.service.UserProfileService userProfileService,
-            org.apache.airavata.service.CredentialStoreService 
credentialStoreService) {
+            org.apache.airavata.service.CredentialStoreService 
credentialStoreService,
+            AWSTaskUtil awsTaskUtil) {
         super(applicationContext, registryService, userProfileService, 
credentialStoreService);
+        this.awsTaskUtil = awsTaskUtil;
     }
 
     @Override
@@ -72,7 +75,7 @@ public class CreateEC2InstanceTask extends AiravataTask {
             String credentialToken =
                     
taskContext.getGroupComputeResourcePreference().getResourceSpecificCredentialStoreToken();
 
-            ec2Client = AWSTaskUtil.buildEc2Client(credentialToken, 
getGatewayId(), awsPrefs.getRegion());
+            ec2Client = awsTaskUtil.buildEc2Client(credentialToken, 
getGatewayId(), awsPrefs.getRegion());
             LOGGER.info("Successfully built EC2 client for region {}", 
awsPrefs.getRegion());
 
             String securityGroupId = createSecurityGroup(ec2Client);
@@ -130,14 +133,14 @@ public class CreateEC2InstanceTask extends AiravataTask {
 
     @Override
     public void onCancel(TaskContext taskContext) {
-        AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
+        awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
     }
 
     @Override
     protected void cleanup() {
         super.cleanup();
         LOGGER.info("AWS Create EC2 Instance Task cleanup for process {}", 
getProcessId());
-        AWSTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
+        awsTaskUtil.terminateEC2Instance(getTaskContext(), getGatewayId());
     }
 
     private String saveSSHCredential(String privateKey, String publicKey) 
throws Exception {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java
index b19749a804..141861bfe3 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/aws/utils/AWSTaskUtil.java
@@ -25,9 +25,9 @@ import 
org.apache.airavata.helix.impl.task.aws.AWSProcessContextManager;
 import 
org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
 import org.apache.airavata.model.credential.store.PasswordCredential;
 import org.apache.airavata.service.CredentialStoreService;
+import org.apache.airavata.service.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
@@ -40,34 +40,18 @@ import 
software.amazon.awssdk.services.ec2.model.InstanceStateName;
 public final class AWSTaskUtil {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AWSTaskUtil.class);
-    private static ApplicationContext applicationContext;
 
     private final CredentialStoreService credentialStoreService;
+    private final RegistryService registryService;
 
-    public AWSTaskUtil(CredentialStoreService credentialStoreService, 
ApplicationContext applicationContext) {
+    public AWSTaskUtil(
+            CredentialStoreService credentialStoreService, RegistryService 
registryService) {
         this.credentialStoreService = credentialStoreService;
-        AWSTaskUtil.applicationContext = applicationContext;
+        this.registryService = registryService;
     }
 
-    // Instance method for Spring DI
-    private CredentialStoreService getCredentialStoreServiceInstance() {
-        return credentialStoreService;
-    }
-
-    // Static method for backward compatibility - delegates to Spring-managed 
instance
-    private static CredentialStoreService getCredentialStoreServiceStatic() {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(AWSTaskUtil.class).getCredentialStoreServiceInstance();
-        }
-        throw new RuntimeException("ApplicationContext not available. 
CredentialStoreService cannot be retrieved.");
-    }
-
-    public static Ec2Client buildEc2Client(String token, String gatewayId, 
String region) throws Exception {
+    public Ec2Client buildEc2Client(String token, String gatewayId, String 
region) throws Exception {
         LOGGER.info("Building EC2 client for token {} and gateway id {} in 
region {}", token, gatewayId, region);
-        if (applicationContext == null) {
-            throw new RuntimeException("ApplicationContext not available. 
CredentialStoreService cannot be retrieved.");
-        }
-        CredentialStoreService credentialStoreService = 
applicationContext.getBean(CredentialStoreService.class);
         PasswordCredential pwdCred = 
credentialStoreService.getPasswordCredential(token, gatewayId);
         AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
                 pwdCred.getLoginUserName(), pwdCred.getPassword()); // TODO 
support using AWS Credential
@@ -77,14 +61,9 @@ public final class AWSTaskUtil {
                 .build();
     }
 
-    public static void terminateEC2Instance(TaskContext taskContext, String 
gatewayId) {
+    public void terminateEC2Instance(TaskContext taskContext, String 
gatewayId) {
         LOGGER.warn("Full resource cleanup triggered for process {}", 
taskContext.getProcessId());
         try {
-            if (applicationContext == null) {
-                throw new RuntimeException("ApplicationContext not available. 
RegistryService cannot be retrieved.");
-            }
-            org.apache.airavata.service.RegistryService registryService =
-                    
applicationContext.getBean(org.apache.airavata.service.RegistryService.class);
             AWSProcessContextManager awsContext = new 
AWSProcessContextManager(registryService, taskContext);
             AwsComputeResourcePreference awsPrefs = taskContext
                     .getGroupComputeResourcePreference()
@@ -143,7 +122,6 @@ public final class AWSTaskUtil {
                     ec2Client.deleteKeyPair(req -> req.keyName(keyName));
                 }
                 if (sshCredentialToken != null) {
-                    CredentialStoreService credentialStoreService = 
getCredentialStoreServiceStatic();
                     
credentialStoreService.deleteSSHCredential(sshCredentialToken, gatewayId);
                 }
             }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java
index 4704fc83f2..65cd130fc0 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/cancel/WorkflowCancellationTask.java
@@ -52,18 +52,10 @@ public class WorkflowCancellationTask extends AbstractTask {
         super.init(manager, workflowName, jobName, taskName);
 
         try {
-            String clusterName = "airavata"; // default
-            String zkConnection = "localhost:2181"; // default
-            try {
-                var ctx = 
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-                if (ctx != null) {
-                    var props = 
ctx.getBean(org.apache.airavata.config.AiravataServerProperties.class);
-                    clusterName = props.helix.clusterName;
-                    zkConnection = props.zookeeper.serverConnection;
-                }
-            } catch (Exception e) {
-                logger.warn("Could not get properties from ApplicationContext, 
using defaults", e);
-            }
+            String clusterName = 
org.apache.airavata.common.utils.ApplicationSettings.getSetting(
+                    "helix.cluster-name", "airavata");
+            String zkConnection = 
org.apache.airavata.common.utils.ApplicationSettings.getSetting(
+                    "zookeeper.server-connection", "localhost:2181");
             helixManager =
                     HelixManagerFactory.getZKHelixManager(clusterName, 
taskName, InstanceType.SPECTATOR, zkConnection);
             helixManager.connect();
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
index 2eeda81dda..f7eca334dc 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/parsing/DataParsingTask.java
@@ -60,13 +60,13 @@ import 
org.apache.airavata.model.data.replica.DataReplicaLocationModel;
 import org.apache.airavata.model.data.replica.ReplicaLocationCategory;
 import org.apache.airavata.model.data.replica.ReplicaPersistentType;
 import org.apache.airavata.monitor.platform.CountMonitor;
+import org.apache.airavata.config.AiravataServerProperties;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.service.RegistryService;
 import org.apache.commons.io.FileUtils;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 
 /**
  * Implementation of the data parsing task.
@@ -78,13 +78,14 @@ public class DataParsingTask extends AbstractTask {
 
     private static final Logger logger = 
LoggerFactory.getLogger(DataParsingTask.class);
     private static final CountMonitor parsingTaskCounter = new 
CountMonitor("parsing_task_counter");
-    private static ApplicationContext applicationContext;
 
     private final RegistryService registryService;
+    private final AiravataServerProperties properties;
 
-    public DataParsingTask(RegistryService registryService, ApplicationContext 
applicationContext) {
+    public DataParsingTask(
+            RegistryService registryService, AiravataServerProperties 
properties) {
         this.registryService = registryService;
-        DataParsingTask.applicationContext = applicationContext;
+        this.properties = properties;
     }
 
     @TaskParam(name = "Parser Id")
@@ -336,20 +337,11 @@ public class DataParsingTask extends AbstractTask {
                     .exec(new WaitContainerResultCallback())
                     .awaitStatusCode();
             logger.info("Container " + containerResponse.getId() + " exited 
with status code " + statusCode);
-
             logger.info("Container logs " + dockerLogs.toString());
         }
 
-        boolean deleteContainer = false;
-        try {
-            var ctx = 
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-            if (ctx != null) {
-                var props = 
ctx.getBean(org.apache.airavata.config.AiravataServerProperties.class);
-                deleteContainer = props.services.parser.deleteContainer;
-            }
-        } catch (Exception e) {
-            logger.warn("Could not get properties from ApplicationContext", e);
-        }
+        boolean deleteContainer = this.properties != null && 
this.properties.services != null 
+                && this.properties.services.parser != null && 
this.properties.services.parser.deleteContainer;
         if (deleteContainer) {
             dockerClient.removeContainerCmd(containerResponse.getId()).exec();
             logger.info("Successfully removed container with id " + 
containerResponse.getId());
@@ -358,11 +350,6 @@ public class DataParsingTask extends AbstractTask {
 
     private StorageResourceAdaptor getStorageResourceAdaptor(String 
storageResourceId, AdaptorSupport adaptorSupport)
             throws TaskOnFailException, AgentException, 
RegistryServiceException {
-        // Use injected service, fallback to ApplicationContext if not injected
-        RegistryService registryService = this.registryService;
-        if (registryService == null && applicationContext != null) {
-            registryService = 
applicationContext.getBean(RegistryService.class);
-        }
         if (registryService == null) {
             throw new TaskOnFailException("RegistryService not available.", 
false, null);
         }
@@ -502,20 +489,8 @@ public class DataParsingTask extends AbstractTask {
 
     private RegistryService getRegistryServiceClient() throws 
TaskOnFailException {
         // Use injected service, fallback to ApplicationContext if not injected
-        RegistryService registryService = this.registryService;
-        if (registryService == null && applicationContext != null) {
-            registryService = 
applicationContext.getBean(RegistryService.class);
-        }
-        if (registryService == null) {
-            org.springframework.context.ApplicationContext airavataContext =
-                    
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-            if (airavataContext != null) {
-                registryService = 
airavataContext.getBean(RegistryService.class);
-            }
-        }
         if (registryService == null) {
-            throw new TaskOnFailException(
-                    "ApplicationContext not available. RegistryService cannot 
be retrieved.", false, null);
+            throw new TaskOnFailException("RegistryService not available.", 
false, null);
         }
         return registryService;
     }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
index 6890ad4b79..9f70f28bd2 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
@@ -47,8 +47,6 @@ public class DefaultJobSubmissionTask extends 
JobSubmissionTask {
     private static final Logger logger = 
LoggerFactory.getLogger(DefaultJobSubmissionTask.class);
     private static final CountMonitor defaultJSTaskCounter = new 
CountMonitor("default_js_task_counter");
 
-    private static ApplicationContext applicationContext;
-
     public DefaultJobSubmissionTask(
             ApplicationContext applicationContext,
             RegistryService registryService,
@@ -56,7 +54,6 @@ public class DefaultJobSubmissionTask extends 
JobSubmissionTask {
             CredentialStoreService credentialStoreService,
             
org.apache.airavata.helix.impl.task.submission.config.GroovyMapBuilder 
groovyMapBuilder) {
         super(applicationContext, registryService, userProfileService, 
credentialStoreService, groovyMapBuilder);
-        DefaultJobSubmissionTask.applicationContext = applicationContext;
     }
 
     private static final String DEFAULT_JOB_ID = "DEFAULT_JOB_ID";
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
index 4959175ea0..27db8b6067 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapBuilder.java
@@ -45,24 +45,17 @@ import 
org.apache.airavata.model.task.JobSubmissionTaskModel;
 import org.apache.airavata.service.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 
 @Component
 public class GroovyMapBuilder {
 
     private final RegistryService registryService;
+    private final AiravataServerProperties properties;
 
-    private static ApplicationContext applicationContext;
-
-    public GroovyMapBuilder(RegistryService registryService, 
ApplicationContext applicationContext) {
+    public GroovyMapBuilder(RegistryService registryService, 
AiravataServerProperties properties) {
         this.registryService = registryService;
-        GroovyMapBuilder.applicationContext = applicationContext;
-    }
-
-    // Instance method for Spring DI
-    protected RegistryService getRegistryServiceInstance() {
-        return registryService;
+        this.properties = properties;
     }
 
     private static final Logger logger = 
LoggerFactory.getLogger(GroovyMapBuilder.class);
@@ -467,19 +460,11 @@ public class GroovyMapBuilder {
         }
     }
 
-    private static void setMailAddresses(TaskContext taskContext, 
GroovyMapData groovyMap) throws Exception {
+    private void setMailAddresses(TaskContext taskContext, GroovyMapData 
groovyMap) throws Exception {
         ProcessModel processModel = taskContext.getProcessModel();
         String emailIds = null;
 
-        AiravataServerProperties props = null;
-        try {
-            var ctx = 
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-            if (ctx != null) {
-                props = ctx.getBean(AiravataServerProperties.class);
-            }
-        } catch (Exception e) {
-            logger.warn("Could not get properties from ApplicationContext", e);
-        }
+        AiravataServerProperties props = this.properties;
 
         if (isEmailBasedJobMonitor(taskContext) && props != null) {
             emailIds = props.services.monitor.email.address;
@@ -517,12 +502,12 @@ public class GroovyMapBuilder {
         }
     }
 
-    public static boolean isEmailBasedJobMonitor(TaskContext taskContext) 
throws Exception {
+    public boolean isEmailBasedJobMonitor(TaskContext taskContext) throws 
Exception {
         JobSubmissionProtocol jobSubmissionProtocol = 
taskContext.getPreferredJobSubmissionProtocol();
         JobSubmissionInterface jobSubmissionInterface = 
taskContext.getPreferredJobSubmissionInterface();
         if (jobSubmissionProtocol == JobSubmissionProtocol.SSH) {
             String jobSubmissionInterfaceId = 
jobSubmissionInterface.getJobSubmissionInterfaceId();
-            SSHJobSubmission sshJobSubmission = 
getRegistryService().getSSHJobSubmission(jobSubmissionInterfaceId);
+            SSHJobSubmission sshJobSubmission = 
registryService.getSSHJobSubmission(jobSubmissionInterfaceId);
             MonitorMode monitorMode = sshJobSubmission.getMonitorMode();
             return monitorMode != null && monitorMode == 
MonitorMode.JOB_EMAIL_NOTIFICATION_MONITOR;
         } else {
@@ -547,11 +532,4 @@ public class GroovyMapBuilder {
         return sb.toString();
     }
 
-    // Static method for backward compatibility - delegates to Spring-managed 
instance
-    private static RegistryService getRegistryService() {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(GroovyMapBuilder.class).getRegistryServiceInstance();
-        }
-        throw new RuntimeException("ApplicationContext not available. 
RegistryService cannot be retrieved.");
-    }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
index c84aaaccab..fc550dd45e 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
@@ -244,7 +244,7 @@ public class ParserWorkflowManager extends WorkflowManager {
             List<ParsingTemplateInput> templateInputs,
             RegistryService registryService)
             throws Exception {
-        DataParsingTask parsingTask = new DataParsingTask(registryService, 
applicationContext);
+        DataParsingTask parsingTask = new DataParsingTask(registryService, 
properties);
         
parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" 
+ parserInfo.getId() + "-"
                 + UUID.randomUUID().toString()));
         parsingTask.setGatewayId(completionMessage.getGatewayId());
@@ -396,7 +396,7 @@ public class ParserWorkflowManager extends WorkflowManager {
             for (ParserConnector connector : 
parentToChild.get(parentParserInfo.getId())) {
                 Parser childParserInfo =
                         
registryService.getParser(connector.getChildParserId(), 
completionMessage.getGatewayId());
-                DataParsingTask parsingTask = new 
DataParsingTask(registryService, applicationContext);
+                DataParsingTask parsingTask = new 
DataParsingTask(registryService, properties);
                 
parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-"
                         + childParserInfo.getId() + "-" + 
UUID.randomUUID().toString()));
                 parsingTask.setGatewayId(completionMessage.getGatewayId());
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index e89c99d471..8d0b3dca70 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -134,19 +134,7 @@ public class PostWorkflowManager extends WorkflowManager {
             return false;
         }
 
-        RegistryService registryService;
-        // Use injected registryService from WorkflowManager
-        if (this.registryService != null) {
-            registryService = this.registryService;
-        } else {
-            // Try to get from Spring context via RegistryServiceProvider
-            try {
-                registryService = 
org.apache.airavata.config.RegistryServiceProvider.getInstance();
-            } catch (Exception e) {
-                logger.error("Failed to get RegistryService from 
RegistryServiceProvider", e);
-                return false;
-            }
-        }
+        RegistryService registryService = this.registryService;
 
         var jobId = jobStatusResult.getJobId();
         var jobName = jobStatusResult.getJobName();
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java
 
b/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java
index 143f4d914c..193279bf68 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/manager/dbevent/DBEventManagerRunner.java
@@ -25,11 +25,12 @@ import org.apache.airavata.config.AiravataServerProperties;
 import 
org.apache.airavata.manager.dbevent.messaging.DBEventManagerMessagingFactory;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
-import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
 /**
  * Created by Ajinkya on 3/29/17.
  */
+@Component
 public class DBEventManagerRunner implements IServer {
 
     private static final Logger log = 
LogManager.getLogger(DBEventManagerRunner.class);
@@ -37,8 +38,13 @@ public class DBEventManagerRunner implements IServer {
     private static final String SERVER_NAME = "DB Event Manager";
     private static final String SERVER_VERSION = "1.0";
 
+    private final AiravataServerProperties properties;
     private ServerStatus status;
 
+    public DBEventManagerRunner(AiravataServerProperties properties) {
+        this.properties = properties;
+    }
+
     /**
      * Start required messaging utilities
      */
@@ -72,23 +78,10 @@ public class DBEventManagerRunner implements IServer {
     public void start() throws Exception {
 
         try {
-            // Get properties from ApplicationContext if available
-            AiravataServerProperties props = null;
-            try {
-                ApplicationContext ctx = 
org.apache.airavata.helix.impl.task.AiravataTask.getApplicationContext();
-                if (ctx != null) {
-                    props = ctx.getBean(AiravataServerProperties.class);
-                }
-            } catch (Exception e) {
-                log.warn("Could not get properties from ApplicationContext", 
e);
-            }
-
-            final AiravataServerProperties finalProps = props;
             Runnable runner = new Runnable() {
                 @Override
                 public void run() {
-                    DBEventManagerRunner dBEventManagerRunner = new 
DBEventManagerRunner();
-                    dBEventManagerRunner.startDBEventManagerRunner(finalProps);
+                    
DBEventManagerRunner.this.startDBEventManagerRunner(properties);
                 }
             };
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java
 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java
index 18ea17c892..2fe3558438 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/AbstractOrchestrator.java
@@ -34,6 +34,7 @@ public abstract class AbstractOrchestrator implements 
Orchestrator {
     protected OrchestratorContext orchestratorContext;
     protected OrchestratorConfiguration orchestratorConfiguration;
     protected AiravataServerProperties properties;
+    protected OrchestratorUtils orchestratorUtils;
 
     private String registryURL;
 
@@ -73,8 +74,8 @@ public abstract class AbstractOrchestrator implements 
Orchestrator {
         this.properties = props;
         try {
             /* Initializing the OrchestratorConfiguration object */
-            if (properties != null) {
-                orchestratorConfiguration = 
OrchestratorUtils.loadOrchestratorConfiguration(properties);
+            if (properties != null && orchestratorUtils != null) {
+                orchestratorConfiguration = 
orchestratorUtils.loadOrchestratorConfiguration();
                 setGatewayProperties();
             } else {
                 // Fallback for non-Spring usage
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java
 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java
index f5adac9380..95c4d249be 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/impl/SimpleOrchestratorImpl.java
@@ -85,15 +85,22 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
 
     private final RegistryService registryService;
     private final AiravataServerProperties properties;
+    private final OrchestratorUtils orchestratorUtils;
 
-    public SimpleOrchestratorImpl(RegistryService registryService, 
AiravataServerProperties properties)
+    public SimpleOrchestratorImpl(
+            RegistryService registryService,
+            AiravataServerProperties properties,
+            OrchestratorUtils orchestratorUtils)
             throws OrchestratorException {
         this.registryService = registryService;
         this.properties = properties;
+        this.orchestratorUtils = orchestratorUtils;
+        super.orchestratorUtils = orchestratorUtils;
         try {
             try {
                 // We are only going to use GFacPassiveJobSubmitter
                 jobSubmitter = new GFACPassiveJobSubmitter();
+                ((GFACPassiveJobSubmitter) 
jobSubmitter).setOrchestratorUtils(orchestratorUtils);
                 if (this.orchestratorContext != null) {
                     jobSubmitter.initialize(this.orchestratorContext);
                 }
@@ -308,7 +315,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
     public String createAndSaveTasks(String gatewayId, ProcessModel 
processModel) throws OrchestratorException {
         try {
             GroupComputeResourcePreference preference =
-                    
OrchestratorUtils.getGroupComputeResourcePreference(processModel);
+                    
orchestratorUtils.getGroupComputeResourcePreference(processModel);
             ResourceType resourceType = preference.getResourceType();
             logger.info("Determined resource type as {} for process {}", 
resourceType, processModel.getProcessId());
 
@@ -321,9 +328,9 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
 
             // TODO - handle for different resource types
             JobSubmissionInterface preferredJobSubmissionInterface =
-                    
OrchestratorUtils.getPreferredJobSubmissionInterface(processModel, gatewayId);
-            JobSubmissionProtocol preferredJobSubmissionProtocol =
-                    
OrchestratorUtils.getPreferredJobSubmissionProtocol(processModel, gatewayId);
+                    
orchestratorUtils.getPreferredJobSubmissionInterface(processModel, gatewayId);
+                    JobSubmissionProtocol preferredJobSubmissionProtocol =
+                    
orchestratorUtils.getPreferredJobSubmissionProtocol(processModel, gatewayId);
             List<String> taskIdList = new ArrayList<>();
 
             if (preferredJobSubmissionProtocol == 
JobSubmissionProtocol.UNICORE) {
@@ -351,7 +358,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
             String gatewayId, ProcessModel processModel, ProcessModel 
parentProcess) throws OrchestratorException {
         try {
             GroupComputeResourcePreference preference =
-                    
OrchestratorUtils.getGroupComputeResourcePreference(processModel);
+                    
orchestratorUtils.getGroupComputeResourcePreference(processModel);
             ResourceType resourceType = preference.getResourceType();
             List<String> taskIdList = new 
ArrayList<>(createAndSaveIntermediateOutputDataStagingTasks(
                     processModel, gatewayId, parentProcess, resourceType));
@@ -390,9 +397,9 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
 
         EnvironmentSetupTaskModel envSetupSubModel = new 
EnvironmentSetupTaskModel();
         envSetupSubModel.setProtocol(
-                OrchestratorUtils.getSecurityProtocol(processModel, 
gatewayId)); // TODO support for CLOUD (AWS)
+                orchestratorUtils.getSecurityProtocol(processModel, 
gatewayId)); // TODO support for CLOUD (AWS)
 
-        String scratchLocation = 
OrchestratorUtils.getScratchLocation(processModel, gatewayId);
+        String scratchLocation = 
orchestratorUtils.getScratchLocation(processModel, gatewayId);
         String workingDir = scratchLocation + File.separator + 
processModel.getProcessId();
         envSetupSubModel.setLocation(workingDir);
 
@@ -464,7 +471,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         List<String> dataStagingTaskIds = new ArrayList<>();
         try {
             List<OutputDataObjectType> processOutputs = 
processModel.getProcessOutputs();
-            String appName = 
OrchestratorUtils.getApplicationInterfaceName(processModel);
+            String appName = 
orchestratorUtils.getApplicationInterfaceName(processModel);
             if (processOutputs != null) {
                 for (OutputDataObjectType processOutput : processOutputs) {
                     DataType type = processOutput.getType();
@@ -532,7 +539,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         List<String> dataStagingTaskIds = new ArrayList<>();
         try {
             List<OutputDataObjectType> processOutputs = 
processModel.getProcessOutputs();
-            String appName = 
OrchestratorUtils.getApplicationInterfaceName(processModel);
+            String appName = 
orchestratorUtils.getApplicationInterfaceName(processModel);
             if (processOutputs != null) {
                 for (OutputDataObjectType processOutput : processOutputs) {
                     DataType type = processOutput.getType();
@@ -666,7 +673,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         if (jobSubmissionProtocol == JobSubmissionProtocol.SSH
                 || jobSubmissionProtocol == JobSubmissionProtocol.SSH_FORK) {
             SSHJobSubmission sshJobSubmission =
-                    
OrchestratorUtils.getSSHJobSubmission(jobSubmissionInterface.getJobSubmissionInterfaceId());
+                    
orchestratorUtils.getSSHJobSubmission(jobSubmissionInterface.getJobSubmissionInterfaceId());
             monitorMode = sshJobSubmission.getMonitorMode();
         } else if (jobSubmissionProtocol == JobSubmissionProtocol.UNICORE) {
             monitorMode = MonitorMode.FORK;
@@ -774,7 +781,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         ComputeResourceDescription computeResource =
                 
registryService.getComputeResource(processModel.getComputeResourceId());
 
-        String scratchLocation = 
OrchestratorUtils.getScratchLocation(processModel, gatewayId);
+        String scratchLocation = 
orchestratorUtils.getScratchLocation(processModel, gatewayId);
         String workingDir =
                 (scratchLocation.endsWith(File.separator) ? scratchLocation : 
scratchLocation + File.separator)
                         + processModel.getProcessId()
@@ -783,8 +790,8 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         URI destination;
         try {
             DataMovementProtocol dataMovementProtocol =
-                    
OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
-            String loginUserName = 
OrchestratorUtils.getLoginUserName(processModel, gatewayId);
+                    
orchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
+            String loginUserName = 
orchestratorUtils.getLoginUserName(processModel, gatewayId);
             StringBuilder destinationPath = new StringBuilder(workingDir);
             Optional.ofNullable(processInput.getOverrideFilename())
                     .ifPresent(destinationPath::append); // If an override 
filename is provided
@@ -793,7 +800,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
                     dataMovementProtocol.name(),
                     loginUserName,
                     computeResource.getHostName(),
-                    OrchestratorUtils.getDataMovementPort(processModel, 
gatewayId),
+                    orchestratorUtils.getDataMovementPort(processModel, 
gatewayId),
                     destinationPath.toString(),
                     null,
                     null);
@@ -843,15 +850,15 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
                     
registryService.getComputeResource(processModel.getComputeResourceId());
             DataStagingTaskModel submodel = new DataStagingTaskModel();
 
-            String workingDir = 
OrchestratorUtils.getScratchLocation(processModel, gatewayId)
+            String workingDir = 
orchestratorUtils.getScratchLocation(processModel, gatewayId)
                     + File.separator
                     + (parentProcess == null ? processModel.getProcessId() : 
parentProcess.getProcessId())
                     + File.separator;
             DataMovementProtocol dataMovementProtocol =
-                    
OrchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
+                    
orchestratorUtils.getPreferredDataMovementProtocol(processModel, gatewayId);
             URI source;
             try {
-                String loginUserName = 
OrchestratorUtils.getLoginUserName(processModel, gatewayId);
+                String loginUserName = 
orchestratorUtils.getLoginUserName(processModel, gatewayId);
                 if (processOutput != null) {
                     submodel.setType(DataStageType.OUPUT);
                     submodel.setProcessOutput(processOutput);
@@ -859,7 +866,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
                             dataMovementProtocol.name(),
                             loginUserName,
                             computeResource.getHostName(),
-                            
OrchestratorUtils.getDataMovementPort(processModel, gatewayId),
+                            
orchestratorUtils.getDataMovementPort(processModel, gatewayId),
                             workingDir + processOutput.getValue(),
                             null,
                             null);
@@ -870,7 +877,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
                             dataMovementProtocol.name(),
                             loginUserName,
                             computeResource.getHostName(),
-                            
OrchestratorUtils.getDataMovementPort(processModel, gatewayId),
+                            
orchestratorUtils.getDataMovementPort(processModel, gatewayId),
                             workingDir,
                             null,
                             null);
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java
 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java
index cbd56de3f4..a8be813f69 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/job/GFACPassiveJobSubmitter.java
@@ -47,6 +47,7 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, 
Watcher {
     private static final Object mutex = new Object();
     private Publisher publisher;
     private AiravataServerProperties properties;
+    private OrchestratorUtils orchestratorUtils;
 
     public void initialize(OrchestratorContext orchestratorContext) throws 
OrchestratorException {
         if (orchestratorContext.getPublisher() != null) {
@@ -67,6 +68,10 @@ public class GFACPassiveJobSubmitter implements 
JobSubmitter, Watcher {
         this.properties = properties;
     }
 
+    public void setOrchestratorUtils(OrchestratorUtils orchestratorUtils) {
+        this.orchestratorUtils = orchestratorUtils;
+    }
+
     /**
      * Submit the job to a shared launch.queue accross multiple gfac instances
      *
@@ -79,7 +84,7 @@ public class GFACPassiveJobSubmitter implements JobSubmitter, 
Watcher {
     public boolean submit(String experimentId, String processId, String 
tokenId) throws OrchestratorException {
         try {
             String gatewayId = null;
-            CredentialReader credentialReader = 
OrchestratorUtils.getCredentialReader();
+            CredentialReader credentialReader = orchestratorUtils != null ? 
orchestratorUtils.getCredentialReader() : null;
             if (credentialReader != null) {
                 try {
                     gatewayId = credentialReader.getGatewayID(tokenId);
@@ -119,7 +124,7 @@ public class GFACPassiveJobSubmitter implements 
JobSubmitter, Watcher {
     public boolean terminate(String experimentId, String processId, String 
tokenId) throws OrchestratorException {
         String gatewayId = null;
         try {
-            CredentialReader credentialReader = 
OrchestratorUtils.getCredentialReader();
+            CredentialReader credentialReader = orchestratorUtils != null ? 
orchestratorUtils.getCredentialReader() : null;
             if (credentialReader != null) {
                 try {
                     gatewayId = credentialReader.getGatewayID(tokenId);
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java
 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java
index f64dc9791a..dfc6261b63 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/orchestrator/utils/OrchestratorUtils.java
@@ -51,7 +51,6 @@ import 
org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.airavata.service.RegistryService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 
 /**
@@ -60,7 +59,6 @@ import org.springframework.stereotype.Component;
 @Component
 public class OrchestratorUtils {
     private static final Logger logger = 
LoggerFactory.getLogger(OrchestratorUtils.class);
-    private static ApplicationContext applicationContext;
 
     private final RegistryService registryService;
     private final CredentialReader credentialReader;
@@ -69,22 +67,10 @@ public class OrchestratorUtils {
     public OrchestratorUtils(
             RegistryService registryService,
             CredentialReader credentialReader,
-            AiravataServerProperties properties,
-            ApplicationContext applicationContext) {
+            AiravataServerProperties properties) {
         this.registryService = registryService;
         this.credentialReader = credentialReader;
         this.properties = properties;
-        OrchestratorUtils.applicationContext = applicationContext;
-    }
-
-    // Instance method for Spring DI
-    protected RegistryService getRegistryServiceInstance() {
-        return registryService;
-    }
-
-    // Instance method for Spring DI
-    protected CredentialReader getCredentialReaderInstance() {
-        return credentialReader;
     }
 
     public OrchestratorConfiguration loadOrchestratorConfiguration()
@@ -101,48 +87,31 @@ public class OrchestratorUtils {
         return orchestratorConfiguration;
     }
 
-    public static OrchestratorConfiguration 
loadOrchestratorConfiguration(AiravataServerProperties properties)
-            throws OrchestratorException, IOException, NumberFormatException {
-
-        OrchestratorConfiguration orchestratorConfiguration = new 
OrchestratorConfiguration();
-        
orchestratorConfiguration.setEnableValidation(properties.airavata.enableValidation);
-        if (orchestratorConfiguration.isEnableValidation()) {
-            String validators = properties.services.monitor.job.validators;
-            if (validators != null && !validators.isEmpty()) {
-                
orchestratorConfiguration.setValidatorClasses(Arrays.asList(validators.split(",")));
-            }
-        }
-        return orchestratorConfiguration;
-    }
-
-    public static JobSubmissionProtocol 
getPreferredJobSubmissionProtocol(ProcessModel model, String gatewayId)
+    public JobSubmissionProtocol 
getPreferredJobSubmissionProtocol(ProcessModel model, String gatewayId)
             throws RegistryServiceException, OrchestratorException {
         return getPreferredJobSubmissionInterface(model, 
gatewayId).getJobSubmissionProtocol();
     }
 
-    public static GroupComputeResourcePreference 
getGroupComputeResourcePreference(ProcessModel model)
+    public GroupComputeResourcePreference 
getGroupComputeResourcePreference(ProcessModel model)
             throws RegistryServiceException {
-        final RegistryService registryService = getRegistryService();
         return registryService.getGroupComputeResourcePreference(
                 model.getComputeResourceId(), 
model.getGroupResourceProfileId());
     }
 
-    public static String getApplicationInterfaceName(ProcessModel model)
+    public String getApplicationInterfaceName(ProcessModel model)
             throws RegistryServiceException, OrchestratorException {
-        final RegistryService registryService = getRegistryService();
         ApplicationInterfaceDescription appInterface =
                 
registryService.getApplicationInterface(model.getApplicationInterfaceId());
         return appInterface.getApplicationName();
     }
 
-    public static DataMovementProtocol 
getPreferredDataMovementProtocol(ProcessModel model, String gatewayId)
+    public DataMovementProtocol getPreferredDataMovementProtocol(ProcessModel 
model, String gatewayId)
             throws RegistryServiceException, OrchestratorException {
         return getPreferredDataMovementInterface(model, 
gatewayId).getDataMovementProtocol();
     }
 
-    public static StoragePreference getStoragePreference(ProcessModel 
processModel, String gatewayId)
+    public StoragePreference getStoragePreference(ProcessModel processModel, 
String gatewayId)
             throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
         try {
             String resourceHostId = processModel.getComputeResourceId();
             return registryService.getGatewayStoragePreference(gatewayId, 
resourceHostId);
@@ -152,9 +121,8 @@ public class OrchestratorUtils {
         }
     }
 
-    public static String getLoginUserName(ProcessModel processModel, String 
gatewayId)
+    public String getLoginUserName(ProcessModel processModel, String gatewayId)
             throws AiravataException, RegistryServiceException {
-        final RegistryService registryService = getRegistryService();
         GroupComputeResourcePreference computeResourcePreference = 
getGroupComputeResourcePreference(processModel);
         ComputationalResourceSchedulingModel processResourceSchedule = 
processModel.getProcessResourceSchedule();
         if (processModel.isUseUserCRPref()) {
@@ -189,9 +157,8 @@ public class OrchestratorUtils {
         }
     }
 
-    public static String getScratchLocation(ProcessModel processModel, String 
gatewayId)
+    public String getScratchLocation(ProcessModel processModel, String 
gatewayId)
             throws AiravataException, RegistryServiceException {
-        final RegistryService registryService = getRegistryService();
         GroupComputeResourcePreference computeResourcePreference = 
getGroupComputeResourcePreference(processModel);
         ComputationalResourceSchedulingModel processResourceSchedule = 
processModel.getProcessResourceSchedule();
         String scratchLocation = 
computeResourcePreference.getScratchLocation();
@@ -229,9 +196,8 @@ public class OrchestratorUtils {
         }
     }
 
-    public static JobSubmissionInterface 
getPreferredJobSubmissionInterface(ProcessModel processModel, String gatewayId)
+    public JobSubmissionInterface 
getPreferredJobSubmissionInterface(ProcessModel processModel, String gatewayId)
             throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
         try {
             String resourceHostId = processModel.getComputeResourceId();
             ComputeResourceDescription resourceDescription = 
registryService.getComputeResource(resourceHostId);
@@ -249,9 +215,8 @@ public class OrchestratorUtils {
         }
     }
 
-    public static DataMovementInterface 
getPreferredDataMovementInterface(ProcessModel processModel, String gatewayId)
+    public DataMovementInterface 
getPreferredDataMovementInterface(ProcessModel processModel, String gatewayId)
             throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
         try {
             String resourceHostId = processModel.getComputeResourceId();
             ComputeResourceDescription resourceDescription = 
registryService.getComputeResource(resourceHostId);
@@ -269,7 +234,7 @@ public class OrchestratorUtils {
         }
     }
 
-    public static int getDataMovementPort(ProcessModel processModel, String 
gatewayId)
+    public int getDataMovementPort(ProcessModel processModel, String gatewayId)
             throws RegistryServiceException, ApplicationSettingsException, 
OrchestratorException {
         try {
             DataMovementProtocol protocol = 
getPreferredDataMovementProtocol(processModel, gatewayId);
@@ -287,7 +252,7 @@ public class OrchestratorUtils {
         return 0;
     }
 
-    public static SecurityProtocol getSecurityProtocol(ProcessModel 
processModel, String gatewayId)
+    public SecurityProtocol getSecurityProtocol(ProcessModel processModel, 
String gatewayId)
             throws RegistryServiceException, ApplicationSettingsException, 
OrchestratorException {
         try {
             JobSubmissionProtocol submissionProtocol = 
getPreferredJobSubmissionProtocol(processModel, gatewayId);
@@ -323,8 +288,7 @@ public class OrchestratorUtils {
         return null;
     }
 
-    public static LOCALSubmission getLocalJobSubmission(String submissionId) 
throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
+    public LOCALSubmission getLocalJobSubmission(String submissionId) throws 
OrchestratorException {
         try {
             return registryService.getLocalJobSubmission(submissionId);
         } catch (Exception e) {
@@ -334,8 +298,7 @@ public class OrchestratorUtils {
         }
     }
 
-    public static UnicoreJobSubmission getUnicoreJobSubmission(String 
submissionId) throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
+    public UnicoreJobSubmission getUnicoreJobSubmission(String submissionId) 
throws OrchestratorException {
         try {
             return registryService.getUnicoreJobSubmission(submissionId);
         } catch (Exception e) {
@@ -345,8 +308,7 @@ public class OrchestratorUtils {
         }
     }
 
-    public static SSHJobSubmission getSSHJobSubmission(String submissionId) 
throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
+    public SSHJobSubmission getSSHJobSubmission(String submissionId) throws 
OrchestratorException {
         try {
             return registryService.getSSHJobSubmission(submissionId);
         } catch (Exception e) {
@@ -356,8 +318,7 @@ public class OrchestratorUtils {
         }
     }
 
-    public static CloudJobSubmission getCloudJobSubmission(String 
submissionId) throws OrchestratorException {
-        final RegistryService registryService = getRegistryService();
+    public CloudJobSubmission getCloudJobSubmission(String submissionId) 
throws OrchestratorException {
         try {
             return registryService.getCloudJobSubmission(submissionId);
         } catch (Exception e) {
@@ -367,8 +328,7 @@ public class OrchestratorUtils {
         }
     }
 
-    public static SCPDataMovement getSCPDataMovement(String dataMoveId) throws 
OrchestratorException {
-        final RegistryService registryService = getRegistryService();
+    public SCPDataMovement getSCPDataMovement(String dataMoveId) throws 
OrchestratorException {
         try {
             return registryService.getSCPDataMovement(dataMoveId);
         } catch (Exception e) {
@@ -378,23 +338,11 @@ public class OrchestratorUtils {
         }
     }
 
-    private static boolean isValid(String str) {
+    private boolean isValid(String str) {
         return (str != null && !str.trim().isEmpty());
     }
 
-    // Static method for backward compatibility - delegates to Spring-managed 
instance
-    public static CredentialReader getCredentialReader() {
-        if (applicationContext != null) {
-            return 
applicationContext.getBean(OrchestratorUtils.class).getCredentialReaderInstance();
-        }
-        throw new IllegalStateException("ApplicationContext not available. 
CredentialReader cannot be retrieved.");
-    }
-
-    private static RegistryService getRegistryService() {
-        if (applicationContext != null) {
-            OrchestratorUtils instance = 
applicationContext.getBean(OrchestratorUtils.class);
-            return instance.registryService;
-        }
-        throw new IllegalStateException("ApplicationContext not available");
+    public CredentialReader getCredentialReader() {
+        return credentialReader;
     }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java
index d55da8be2d..1e8e4894fd 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/GatewayGroupsInitializer.java
@@ -31,7 +31,6 @@ import org.apache.airavata.service.SharingRegistryService;
 import org.apache.airavata.sharing.models.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 
 /**
@@ -41,37 +40,11 @@ import org.springframework.stereotype.Component;
 public class GatewayGroupsInitializer {
 
     private static final Logger logger = 
LoggerFactory.getLogger(GatewayGroupsInitializer.class);
-    private static ApplicationContext applicationContext;
 
     private final RegistryService registryService;
     private final SharingRegistryService sharingRegistryService;
     private final CredentialStoreService credentialStoreService;
 
-    public GatewayGroupsInitializer(
-            ApplicationContext applicationContext,
-            RegistryService registryService,
-            SharingRegistryService sharingRegistryService,
-            CredentialStoreService credentialStoreService) {
-        GatewayGroupsInitializer.applicationContext = applicationContext;
-        this.registryService = registryService;
-        this.sharingRegistryService = sharingRegistryService;
-        this.credentialStoreService = credentialStoreService;
-    }
-
-    public static synchronized GatewayGroups initializeGatewayGroups(String 
gatewayId) {
-        try {
-            if (applicationContext == null) {
-                throw new RuntimeException(
-                        "ApplicationContext not available. 
GatewayGroupsInitializer cannot be retrieved.");
-            }
-            GatewayGroupsInitializer gatewayGroupsInitializer =
-                    applicationContext.getBean(GatewayGroupsInitializer.class);
-            return gatewayGroupsInitializer.initialize(gatewayId);
-        } catch (SharingRegistryException | RegistryServiceException | 
CredentialStoreException e) {
-            throw new RuntimeException("Failed to initialize a GatewayGroups 
instance for gateway: " + gatewayId, e);
-        }
-    }
-
     public GatewayGroupsInitializer(
             RegistryService registryService,
             SharingRegistryService sharingRegistryService,
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java
index 693dcf7faa..44805cc3cc 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/KeyCloakSecurityManager.java
@@ -36,6 +36,7 @@ import 
org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfil
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.model.workspace.Gateway;
 import org.apache.airavata.security.authzcache.*;
+import org.apache.airavata.security.authzcache.AuthzCacheManagerFactory;
 import org.apache.airavata.service.RegistryService;
 import org.apache.airavata.service.SharingRegistryService;
 import org.apache.airavata.sharing.models.UserGroup;
@@ -104,15 +105,21 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
     private final RegistryService registryService;
     private final SharingRegistryService sharingRegistryService;
     private final AiravataServerProperties properties;
+    private final AuthzCacheManagerFactory authzCacheManagerFactory;
+    private final GatewayGroupsInitializer gatewayGroupsInitializer;
 
     public KeyCloakSecurityManager(
             RegistryService registryService,
             SharingRegistryService sharingRegistryService,
-            AiravataServerProperties properties)
+            AiravataServerProperties properties,
+            AuthzCacheManagerFactory authzCacheManagerFactory,
+            GatewayGroupsInitializer gatewayGroupsInitializer)
             throws AiravataSecurityException {
         this.registryService = registryService;
         this.sharingRegistryService = sharingRegistryService;
         this.properties = properties;
+        this.authzCacheManagerFactory = authzCacheManagerFactory;
+        this.gatewayGroupsInitializer = gatewayGroupsInitializer;
         rolePermissionConfig.put("admin", "/airavata/.*");
         rolePermissionConfig.put("gateway-provider", "/airavata/.*");
         rolePermissionConfig.put(
@@ -193,7 +200,7 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
 
             boolean decision;
             if (properties.security.authzCache.enabled) {
-                var authzCacheManager = 
AuthzCacheManagerFactory.getAuthzCacheManager();
+                var authzCacheManager = 
authzCacheManagerFactory.getAuthzCacheManager();
                 var cacheIndex = new AuthzCacheIndex(subject, gatewayId, 
accessToken, action);
                 var authzCachedStatus = 
authzCacheManager.getAuthzCachedStatus(cacheIndex);
                 switch (authzCachedStatus) {
@@ -296,7 +303,7 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
         if (registryService.isGatewayGroupsExists(gatewayId)) {
             return registryService.getGatewayGroups(gatewayId);
         } else {
-            return GatewayGroupsInitializer.initializeGatewayGroups(gatewayId);
+            return gatewayGroupsInitializer.initialize(gatewayId);
         }
     }
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java
index dc7f82bea7..322d7d7666 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/authzcache/AuthzCacheManagerFactory.java
@@ -33,40 +33,35 @@ import org.springframework.stereotype.Component;
 @Component
 public class AuthzCacheManagerFactory {
     private static final Logger logger = 
LoggerFactory.getLogger(AuthzCacheManagerFactory.class);
-    private static ApplicationContext applicationContext;
-
-    private static AiravataServerProperties properties;
+    private final ApplicationContext applicationContext;
+    private final AiravataServerProperties properties;
 
     public AuthzCacheManagerFactory(ApplicationContext applicationContext, 
AiravataServerProperties properties) {
-        AuthzCacheManagerFactory.applicationContext = applicationContext;
-        AuthzCacheManagerFactory.properties = properties;
+        this.applicationContext = applicationContext;
+        this.properties = properties;
     }
 
-    public static AuthzCacheManager getAuthzCacheManager() throws 
AiravataSecurityException {
-        if (applicationContext != null && properties != null) {
+    public AuthzCacheManager getAuthzCacheManager() throws 
AiravataSecurityException {
+        try {
+            String className = properties.security.authzCache.classpath;
+            Class<?> authzCacheManagerImpl = Class.forName(className);
+            // Try to get from Spring context first (if it's a Spring bean)
             try {
-                String className = properties.security.authzCache.classpath;
-                Class<?> authzCacheManagerImpl = Class.forName(className);
                 return (AuthzCacheManager) 
applicationContext.getBean(authzCacheManagerImpl);
-            } catch (ClassNotFoundException e) {
-                String error = "Authorization Cache Manager class could not be 
found.";
-                logger.error(e.getMessage(), e);
-                throw new AiravataSecurityException(error, e);
-            }
-        }
-        // Fallback to old reflection-based instantiation if 
ApplicationContext not available
-        if (properties != null) {
-            try {
-                String className = properties.security.authzCache.classpath;
-                Class<?> authzCacheManagerImpl = Class.forName(className);
+            } catch (Exception e) {
+                logger.debug("AuthzCacheManager not found in Spring context, 
creating new instance", e);
+                // Fallback to reflection-based instantiation
                 return (AuthzCacheManager)
                         
authzCacheManagerImpl.getDeclaredConstructor().newInstance();
-            } catch (Exception e) {
-                String error = "Error in instantiating the Authorization Cache 
Manager class.";
-                logger.error(e.getMessage(), e);
-                throw new AiravataSecurityException(error, e);
             }
+        } catch (ClassNotFoundException e) {
+            String error = "Authorization Cache Manager class could not be 
found.";
+            logger.error(e.getMessage(), e);
+            throw new AiravataSecurityException(error, e);
+        } catch (Exception e) {
+            String error = "Error in instantiating the Authorization Cache 
Manager class.";
+            logger.error(e.getMessage(), e);
+            throw new AiravataSecurityException(error, e);
         }
-        throw new AiravataSecurityException("Properties not initialized");
     }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java 
b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
index f4e1f5c10b..665d969b4e 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
@@ -181,6 +181,8 @@ public class AiravataService {
     private final RegistryService registryService;
     private final SharingRegistryService sharingRegistryService;
     private final CredentialStoreService credentialStoreService;
+    private final SSHAccountManager sshAccountManager;
+    private final GatewayGroupsInitializer gatewayGroupsInitializer;
     private Publisher statusPublisher;
     private Publisher experimentPublisher;
 
@@ -188,11 +190,15 @@ public class AiravataService {
             AiravataServerProperties properties,
             RegistryService registryService,
             SharingRegistryService sharingRegistryService,
-            CredentialStoreService credentialStoreService) {
+            CredentialStoreService credentialStoreService,
+            SSHAccountManager sshAccountManager,
+            GatewayGroupsInitializer gatewayGroupsInitializer) {
         this.properties = properties;
         this.registryService = registryService;
         this.sharingRegistryService = sharingRegistryService;
         this.credentialStoreService = credentialStoreService;
+        this.sshAccountManager = sshAccountManager;
+        this.gatewayGroupsInitializer = gatewayGroupsInitializer;
 
         logger.info("Initialized RegistryService");
         logger.info("Initialized SharingRegistryService");
@@ -2873,10 +2879,14 @@ public class AiravataService {
             if (isGatewayGroupsExists(gatewayId)) {
                 return getGatewayGroups(gatewayId);
             } else {
-                return 
GatewayGroupsInitializer.initializeGatewayGroups(gatewayId);
+                return gatewayGroupsInitializer.initialize(gatewayId);
             }
         } catch (AiravataSystemException e) {
             throw e;
+        } catch (Exception e) {
+            String msg = "Error while initializing gateway groups: " + 
gatewayId + " " + e.getMessage();
+            logger.error(msg, e);
+            throw airavataSystemException(AiravataErrorType.INTERNAL_ERROR, 
msg, e);
         }
     }
 
@@ -4445,7 +4455,7 @@ public class AiravataService {
                     userId,
                     computeResourceId,
                     gatewayId);
-            return SSHAccountManager.doesUserHaveSSHAccount(gatewayId, 
computeResourceId, userId);
+            return sshAccountManager.doesUserHaveSSHAccount(gatewayId, 
computeResourceId, userId);
         } catch (InvalidSetupException | InvalidUsernameException e) {
             String msg = "Error occurred while checking if user has an SSH 
Account: " + e.getMessage();
             logger.error(msg, e);
@@ -4466,7 +4476,7 @@ public class AiravataService {
                     gatewayId);
 
             SSHCredential sshCredential = 
getSSHCredential(airavataCredStoreToken, gatewayId);
-            return SSHAccountManager.isSSHAccountSetupComplete(gatewayId, 
computeResourceId, userId, sshCredential);
+            return sshAccountManager.isSSHAccountSetupComplete(gatewayId, 
computeResourceId, userId, sshCredential);
         } catch (InvalidSetupException
                 | InvalidUsernameException
                 | CredentialStoreException
@@ -4489,7 +4499,7 @@ public class AiravataService {
                     gatewayId);
 
             SSHCredential sshCredential = 
getSSHCredential(airavataCredStoreToken, gatewayId);
-            return SSHAccountManager.setupSSHAccount(gatewayId, 
computeResourceId, userId, sshCredential);
+            return sshAccountManager.setupSSHAccount(gatewayId, 
computeResourceId, userId, sshCredential);
         } catch (AiravataSystemException e) {
             throw e;
         } catch (CredentialStoreException | InvalidSetupException | 
InvalidUsernameException e) {
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java
 
b/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java
index 048589a703..d3cf5bec49 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/security/GatewayGroupsInitializerTest.java
@@ -61,14 +61,12 @@ public class GatewayGroupsInitializerTest {
     private CredentialStoreService mockCredentialStoreService;
 
     private GatewayGroupsInitializer gatewayGroupsInitializer;
-    private final ApplicationContext applicationContext;
 
     public GatewayGroupsInitializerTest(
             ApplicationContext applicationContext,
             RegistryService mockRegistryService,
             SharingRegistryService mockSharingRegistryService,
             CredentialStoreService mockCredentialStoreService) {
-        this.applicationContext = applicationContext;
         this.mockRegistryService = mockRegistryService;
         this.mockSharingRegistryService = mockSharingRegistryService;
         this.mockCredentialStoreService = mockCredentialStoreService;
@@ -77,7 +75,6 @@ public class GatewayGroupsInitializerTest {
     @BeforeEach
     public void setUp() {
         gatewayGroupsInitializer = new GatewayGroupsInitializer(
-                applicationContext,
                 mockRegistryService, mockSharingRegistryService, 
mockCredentialStoreService);
     }
 
diff --git 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
index e73f84866d..bfd1348e94 100644
--- 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
+++ 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
@@ -21,7 +21,6 @@ package org.apache.airavata.file.server;
 
 import org.apache.airavata.helix.core.support.adaptor.AdaptorSupportImpl;
 import org.apache.airavata.helix.task.api.support.AdaptorSupport;
-import org.apache.airavata.service.RegistryService;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
@@ -35,8 +34,5 @@ public class FileServerConfiguration {
         return AdaptorSupportImpl.getInstance();
     }
 
-    @Bean
-    public RegistryService registryService() {
-        return new RegistryService();
-    }
+    // RegistryService is already a @Service bean, no need to create it here
 }
diff --git 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
index 0d39ac8e80..c874ff2fdc 100644
--- 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
+++ 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
@@ -29,9 +29,12 @@ import org.apache.airavata.agents.api.FileMetadata;
 import org.apache.airavata.file.server.model.AiravataDirectory;
 import org.apache.airavata.file.server.model.AiravataFile;
 import org.apache.airavata.helix.task.api.support.AdaptorSupport;
+import org.apache.airavata.service.CredentialStoreService;
 import org.apache.airavata.service.RegistryService;
+import org.apache.airavata.service.UserProfileService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -42,10 +45,21 @@ public class AirvataFileService {
 
     private final AdaptorSupport adaptorSupport;
     private final RegistryService registryService;
-
-    public AirvataFileService(AdaptorSupport adaptorSupport, RegistryService 
registryService) {
+    private final ApplicationContext applicationContext;
+    private final UserProfileService userProfileService;
+    private final CredentialStoreService credentialStoreService;
+
+    public AirvataFileService(
+            AdaptorSupport adaptorSupport,
+            RegistryService registryService,
+            ApplicationContext applicationContext,
+            UserProfileService userProfileService,
+            CredentialStoreService credentialStoreService) {
         this.adaptorSupport = adaptorSupport;
         this.registryService = registryService;
+        this.applicationContext = applicationContext;
+        this.userProfileService = userProfileService;
+        this.credentialStoreService = credentialStoreService;
     }
 
     private AgentAdaptor getAgentAdaptor(ProcessDataManager dataManager, 
String processId) throws Exception {
@@ -60,7 +74,8 @@ public class AirvataFileService {
     }
 
     public FileMetadata getInfo(String processId, String subPath) throws 
Exception {
-        ProcessDataManager dataManager = new 
ProcessDataManager(registryService, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(
+                applicationContext, registryService, userProfileService, 
credentialStoreService, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
@@ -69,7 +84,8 @@ public class AirvataFileService {
     }
 
     public AiravataDirectory listDir(String processId, String subPath) throws 
Exception {
-        ProcessDataManager dataManager = new 
ProcessDataManager(registryService, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(
+                applicationContext, registryService, userProfileService, 
credentialStoreService, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
 
         String absPath = dataManager.getBaseDir() + subPath;
@@ -96,7 +112,8 @@ public class AirvataFileService {
     }
 
     public AiravataFile listFile(String processId, String subPath) throws 
Exception {
-        ProcessDataManager dataManager = new 
ProcessDataManager(registryService, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(
+                applicationContext, registryService, userProfileService, 
credentialStoreService, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
 
         String absPath = dataManager.getBaseDir() + subPath;
@@ -113,7 +130,8 @@ public class AirvataFileService {
         metadata.setSize(file.getSize());
         Files.copy(file.getInputStream(), tempPath, 
StandardCopyOption.REPLACE_EXISTING);
 
-        ProcessDataManager dataManager = new 
ProcessDataManager(registryService, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(
+                applicationContext, registryService, userProfileService, 
credentialStoreService, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
@@ -133,7 +151,8 @@ public class AirvataFileService {
 
     public Path downloadFile(String processId, String subPath) throws 
Exception {
 
-        ProcessDataManager dataManager = new 
ProcessDataManager(registryService, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(
+                applicationContext, registryService, userProfileService, 
credentialStoreService, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
diff --git 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
index 07721d4695..be0a6445f5 100644
--- 
a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
+++ 
b/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
@@ -21,7 +21,6 @@ package org.apache.airavata.file.server.service;
 
 import java.util.UUID;
 import org.apache.airavata.agents.api.AgentAdaptor;
-import org.apache.airavata.agents.api.AgentUtils;
 import org.apache.airavata.helix.adaptor.SSHJAgentAdaptor;
 import org.apache.airavata.helix.impl.task.aws.AWSProcessContextManager;
 import org.apache.airavata.helix.impl.task.staging.OutputDataStagingTask;
@@ -30,9 +29,12 @@ import 
org.apache.airavata.model.appcatalog.groupresourceprofile.ResourceType;
 import org.apache.airavata.model.credential.store.SSHCredential;
 import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.service.CredentialStoreService;
 import org.apache.airavata.service.RegistryService;
+import org.apache.airavata.service.UserProfileService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
 
 public class ProcessDataManager extends OutputDataStagingTask {
 
@@ -44,9 +46,15 @@ public class ProcessDataManager extends 
OutputDataStagingTask {
     private ProcessModel process;
     ExperimentModel experiment;
 
-    public ProcessDataManager(RegistryService registryService, String 
processId, AdaptorSupport adaptorSupport)
+    public ProcessDataManager(
+            ApplicationContext applicationContext,
+            RegistryService registryService,
+            UserProfileService userProfileService,
+            CredentialStoreService credentialStoreService,
+            String processId,
+            AdaptorSupport adaptorSupport)
             throws Exception {
-
+        super(applicationContext, registryService, userProfileService, 
credentialStoreService);
         this.adaptorSupport = adaptorSupport;
         try {
             process = registryService.getProcess(processId);
@@ -68,13 +76,14 @@ public class ProcessDataManager extends 
OutputDataStagingTask {
         if 
(getTaskContext().getGroupComputeResourcePreference().getResourceType() == 
ResourceType.AWS) {
             logger.info("Using AWS adaptor for process {}", processId);
 
-            AWSProcessContextManager awsContext = new 
AWSProcessContextManager(getTaskContext());
-            SSHCredential sshCredential = AgentUtils.getCredentialService()
+            AWSProcessContextManager awsContext = new 
AWSProcessContextManager(getRegistryService(), getTaskContext());
+            // Use CredentialStoreService from parent class (AiravataTask)
+            SSHCredential sshCredential = getCredentialStoreService()
                     .getSSHCredential(awsContext.getSSHCredentialToken(), 
getGatewayId());
 
             logger.info("Using SSHCredential {} for AWS process {}", 
sshCredential.getPublicKey(), processId);
             logger.info("AWS public ip is {}", awsContext.getPublicIp());
-            SSHJAgentAdaptor adaptor = new SSHJAgentAdaptor();
+            SSHJAgentAdaptor adaptor = new 
SSHJAgentAdaptor(getRegistryService(), getCredentialStoreService());
             adaptor.init(
                     getTaskContext().getComputeResourceLoginUserName(),
                     awsContext.getPublicIp(),
diff --git 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
index dc34b3bb2e..7f41711b61 100644
--- 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
+++ 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/APIServerStarter.java
@@ -19,31 +19,13 @@
 */
 package org.apache.airavata.ide.integration;
 
-import org.apache.airavata.api.thrift.server.AiravataServiceServer;
-import org.apache.airavata.api.thrift.server.CredentialServiceServer;
-import org.apache.airavata.api.thrift.server.OrchestratorServiceServer;
-import org.apache.airavata.api.thrift.server.ProfileServiceServer;
-import org.apache.airavata.api.thrift.server.RegistryServiceServer;
-import org.apache.airavata.api.thrift.server.SharingRegistryServer;
-import org.apache.airavata.manager.dbevent.DBEventManagerRunner;
-
 public class APIServerStarter {
 
     public static void main(String[] args) throws Exception {
-        DBEventManagerRunner dbEventManagerRunner = new DBEventManagerRunner();
-        RegistryServiceServer registryAPIServer = new RegistryServiceServer();
-        CredentialServiceServer credentialStoreServer = new 
CredentialServiceServer();
-        SharingRegistryServer sharingRegistryServer = new 
SharingRegistryServer();
-        AiravataServiceServer airavataAPIServer = new AiravataServiceServer();
-        OrchestratorServiceServer orchestratorServer = new 
OrchestratorServiceServer();
-        ProfileServiceServer profileServiceServer = new ProfileServiceServer();
-
-        dbEventManagerRunner.start();
-        registryAPIServer.start();
-        credentialStoreServer.start();
-        sharingRegistryServer.start();
-        airavataAPIServer.start();
-        orchestratorServer.start();
-        profileServiceServer.start();
+        // Note: DBEventManagerRunner is a Spring component and requires 
AiravataServerProperties.
+        // This main method should be run within a Spring application context.
+        // For standalone execution, use Spring Boot application or provide 
dependencies manually.
+        throw new UnsupportedOperationException(
+                "APIServerStarter must be used within a Spring application 
context");
     }
 }
diff --git 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
index c0ea02f385..c198e7a0e6 100644
--- 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
+++ 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobEngineStarter.java
@@ -22,10 +22,7 @@ package org.apache.airavata.ide.integration;
 import java.util.ArrayList;
 import org.apache.airavata.common.utils.ApplicationSettings;
 import org.apache.airavata.helix.core.AbstractTask;
-import org.apache.airavata.helix.impl.controller.HelixController;
 import org.apache.airavata.helix.impl.participant.GlobalParticipant;
-import org.apache.airavata.helix.impl.workflow.PostWorkflowManager;
-import org.apache.airavata.helix.impl.workflow.PreWorkflowManager;
 import org.apache.helix.manager.zk.ZKHelixAdmin;
 import org.apache.helix.manager.zk.ZNRecordSerializer;
 import org.apache.helix.manager.zk.ZkClient;
@@ -53,9 +50,9 @@ public class JobEngineStarter {
         
zkHelixAdmin.addCluster(ApplicationSettings.getSetting("helix.cluster-name"), 
true);
 
         logger.info("Starting Helix Controller .......");
-        // Starting helix controller
-        HelixController controller = new HelixController();
-        controller.startServer();
+        // Note: HelixController is a Spring component and requires 
AiravataServerProperties.
+        // This main method should be run within a Spring application context.
+        logger.warn("HelixController requires Spring context - skipping in 
standalone mode");
 
         ArrayList<Class<? extends AbstractTask>> taskClasses = new 
ArrayList<>();
 
@@ -64,18 +61,14 @@ public class JobEngineStarter {
         }
 
         logger.info("Starting Helix Participant .......");
-
-        // Starting helix participant
-        globalParticipant.startServer();
+        // Note: GlobalParticipant is a Spring component and requires 
AiravataServerProperties.
+        // This main method should be run within a Spring application context.
+        logger.warn("GlobalParticipant requires Spring context - skipping in 
standalone mode");
 
         logger.info("Starting Pre Workflow Manager .......");
-
-        PreWorkflowManager preWorkflowManager = new PreWorkflowManager();
-        preWorkflowManager.startServer();
-
-        logger.info("Starting Post Workflow Manager .......");
-
-        PostWorkflowManager postWorkflowManager = new PostWorkflowManager();
-        postWorkflowManager.startServer();
+        // Note: PreWorkflowManager and PostWorkflowManager are Spring 
components
+        // and require dependency injection. This main method should be run 
within
+        // a Spring application context or these should be obtained from the 
context.
+        logger.warn("PreWorkflowManager and PostWorkflowManager require Spring 
context - skipping in standalone mode");
     }
 }
diff --git 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
index 2068e4e38a..793bcb39b6 100644
--- 
a/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
+++ 
b/modules/ide-integration/src/main/java/org/apache/airavata/ide/integration/JobMonitorStarter.java
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.ide.integration;
 
-import org.apache.airavata.monitor.email.EmailBasedMonitor;
-
 public class JobMonitorStarter {
     public static void main(String args[]) throws Exception {
-        EmailBasedMonitor emailBasedMonitor = new EmailBasedMonitor();
-        emailBasedMonitor.startServer();
+        // Note: EmailBasedMonitor is a Spring component and requires 
dependencies.
+        // This main method should be run within a Spring application context.
+        throw new UnsupportedOperationException(
+                "EmailBasedMonitor must be used within a Spring application 
context");
     }
 }
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
index 70914ef607..f152981f67 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
@@ -31,20 +31,15 @@ import org.springframework.stereotype.Service;
 public class AiravataService {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AiravataService.class);
+    private final UserProfileService userProfileService;
 
-    public UserProfileService userProfileService() {
-        try {
-            LOGGER.info("User profile service initialized");
-            return new UserProfileService();
-        } catch (Exception e) {
-            LOGGER.error("Error while creating user profile service", e);
-            throw new RuntimeException(e);
-        }
+    public AiravataService(UserProfileService userProfileService) {
+        this.userProfileService = userProfileService;
     }
 
     public UserProfile getUserProfile(String userId) {
         try {
-            return 
userProfileService().getUserProfileById(UserContext.authzToken(), userId, 
UserContext.gatewayId());
+            return 
userProfileService.getUserProfileById(UserContext.authzToken(), userId, 
UserContext.gatewayId());
         } catch (Exception e) {
             LOGGER.error("Error while getting user profile with the id: {}", 
userId, e);
             throw new RuntimeException("Error while getting user profile with 
the id: " + userId, e);
@@ -53,7 +48,7 @@ public class AiravataService {
 
     public UserProfile getUserProfile(AuthzToken authzToken, String userId, 
String gatewayId) {
         try {
-            return userProfileService().getUserProfileById(authzToken, userId, 
gatewayId);
+            return userProfileService.getUserProfileById(authzToken, userId, 
gatewayId);
         } catch (Exception e) {
             LOGGER.error("Error while getting user profile with the id: {} in 
the gateway: {}", userId, gatewayId, e);
             throw new RuntimeException(

Reply via email to