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 0fda5849d5d2e8f47c44c0b66770fb98ec588ba3
Author: yasithdev <[email protected]>
AuthorDate: Sun Dec 14 03:34:02 2025 -0600

    migrate commons library usages to spring, flatten model/util to util
---
 airavata-api/pom.xml                               |  35 +---
 .../airavata/api/thrift/util/ThriftClientPool.java | 229 +++++++++++----------
 .../airavata/common/utils/ApplicationSettings.java |  21 +-
 .../org/apache/airavata/common/utils/JPAUtils.java |   8 +-
 .../org/apache/airavata/common/utils/JSONUtil.java |   4 +-
 .../apache/airavata/common/utils/StringUtil.java   |  85 +++-----
 .../credential/impl/notifier/EmailNotifier.java    |  44 ++--
 .../apache/airavata/credential/utils/Utility.java  |   6 +-
 .../helix/agent/ssh/StandardOutReader.java         |  20 +-
 .../airavata/helix/impl/task/AiravataTask.java     |  39 ++--
 .../airavata/helix/impl/task/TaskContext.java      |   2 +-
 .../helix/impl/task/aws/AWSJobSubmissionTask.java  |  10 +-
 .../helix/impl/task/parsing/DataParsingTask.java   |   6 +-
 .../helix/impl/task/staging/DataStagingTask.java   |   4 +-
 .../impl/task/submission/JobSubmissionTask.java    |   6 +-
 .../impl/task/submission/config/GroovyMapData.java |   5 +-
 .../config/app/CloudJobManagerConfiguration.java   |   6 +-
 .../config/app/ForkJobConfiguration.java           |   4 +-
 .../config/app/HTCondorJobConfiguration.java       |   4 +-
 .../submission/config/app/LSFJobConfiguration.java |   4 +-
 .../submission/config/app/PBSJobConfiguration.java |   4 +-
 .../config/app/SlurmJobConfiguration.java          |   4 +-
 .../submission/config/app/UGEJobConfiguration.java |   6 +-
 .../messaging/client/RabbitMQListener.java         |  87 ++++----
 .../metadata/analyzer/DataInterpreterService.java  |   2 +-
 .../rescheduler/ProcessReschedulingService.java    |   2 +-
 .../cluster/ClusterStatusMonitorJobScheduler.java  |   2 +-
 .../ComputationalResourceMonitoringService.java    |   2 +-
 .../orchestrator/impl/SimpleOrchestratorImpl.java  |   5 +-
 .../utils/migration/MappingToolRunner.java         |  14 +-
 .../airavata/security/KeyCloakSecurityManager.java |  34 +--
 .../security/interceptor/SecurityModule.java       |   3 +-
 .../airavata/security/userstore/JDBCUserStore.java |  31 +--
 .../airavata/security/userstore/LDAPUserStore.java |  22 +-
 .../service/orchestrator/OrchestratorService.java  |   5 +-
 .../service/security/CredentialStoreService.java   |   6 +-
 .../{model => }/util/AppDeploymentUtil.java        |   2 +-
 .../{model => }/util/AppInterfaceUtil.java         |   2 +-
 .../airavata/{model => }/util/ExecutionType.java   |   2 +-
 .../{model => }/util/ExperimentModelUtil.java      |   2 +-
 .../util/GroupComputeResourcePreferenceUtil.java   |   2 +-
 .../{model => }/util/ProjectModelUtil.java         |   2 +-
 .../airavata/api/thrift/client/TestSSLClient.java  |   6 +-
 .../server/TestOrchestratorServiceServer.java      |   2 +-
 .../api/thrift/util/ThriftClientPoolTest.java      | 180 ++++------------
 .../airavata/config/SchemaValidationTest.java      |  59 +++---
 .../security/KeyCloakSecurityManagerTest.java      |  10 +-
 .../GroupComputeResourcePreferenceUtilTest.java    |   3 +-
 .../service/db/entity/AgentExecutionStatus.java    |   6 +-
 .../service/handlers/AgentConnectionHandler.java   |   1 -
 .../connection/service/handlers/FuseFSHandler.java |  22 +-
 .../apache/airavata/registry/tool/DBMigrator.java  |   3 +-
 52 files changed, 496 insertions(+), 579 deletions(-)

diff --git a/airavata-api/pom.xml b/airavata-api/pom.xml
index 505e616a82..6f98e9c6e2 100644
--- a/airavata-api/pom.xml
+++ b/airavata-api/pom.xml
@@ -102,10 +102,6 @@ under the License.
     </dependency>
 
     <!-- CLI & mapping -->
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-    </dependency>
     <!-- Dozer - being migrated to MapStruct -->
     <dependency>
       <groupId>com.github.dozermapper</groupId>
@@ -150,22 +146,6 @@ under the License.
       <groupId>com.github.mwiede</groupId>
       <artifactId>jsch</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-email</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.json</groupId>
-      <artifactId>json</artifactId>
-    </dependency>
 
     <!-- Test dependencies -->
     <dependency>
@@ -208,6 +188,11 @@ under the License.
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-ldap</artifactId>
     </dependency>
+    <!-- Spring Mail for email notifications -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-mail</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>io.prometheus</groupId>
@@ -323,10 +308,6 @@ under the License.
       <groupId>org.databene</groupId>
       <artifactId>contiperf</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
 
     <dependency>
       <groupId>software.amazon.awssdk</groupId>
@@ -372,6 +353,12 @@ under the License.
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jpa</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>io.smallrye</groupId>
+          <artifactId>jandex</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/api/thrift/util/ThriftClientPool.java
 
b/airavata-api/src/main/java/org/apache/airavata/api/thrift/util/ThriftClientPool.java
index 67defb550c..e17a9382ac 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/api/thrift/util/ThriftClientPool.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/api/thrift/util/ThriftClientPool.java
@@ -19,16 +19,12 @@
 */
 package org.apache.airavata.api.thrift.util;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.airavata.api.model.BaseAPI;
 import org.apache.airavata.config.AiravataServerProperties;
-import org.apache.commons.pool2.BasePooledObjectFactory;
-import org.apache.commons.pool2.PooledObject;
-import org.apache.commons.pool2.impl.AbandonedConfig;
-import org.apache.commons.pool2.impl.DefaultPooledObject;
-import org.apache.commons.pool2.impl.GenericObjectPool;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.transport.TSocket;
@@ -41,119 +37,61 @@ public class ThriftClientPool<T extends BaseAPI.Client> 
implements AutoCloseable
 
     private static final Logger logger = 
LoggerFactory.getLogger(ThriftClientPool.class);
 
-    private final GenericObjectPool<T> internalPool;
+    private final BlockingQueue<T> pool;
+    private final ClientFactory<T> clientFactory;
+    private final ProtocolFactory protocolFactory;
+    private final int maxTotal;
+    private final int maxIdle;
+    private final long maxWaitMillis;
+    private final long timeBetweenEvictionRunsMillis;
+    private final AtomicInteger createdCount = new AtomicInteger(0);
     private final AiravataServerProperties properties;
 
-    /**
-     * StringWriter that flushes to SLF4J logger.
-     */
-    private static class ErrorLoggingStringWriter extends StringWriter {
-
-        @Override
-        public void flush() {
-            logger.error(this.toString());
-            // Reset buffer
-            this.getBuffer().setLength(0);
-        }
+    public ThriftClientPool(ClientFactory<T> clientFactory, PoolConfig 
poolConfig, String host, int port) {
+        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port), 
poolConfig, null);
     }
 
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory, GenericObjectPoolConfig<T> 
poolConfig, String host, int port) {
-        this(clientFactory, new BinaryOverSocketProtocolFactory(host, port), 
poolConfig, null, null);
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory, ProtocolFactory protocolFactory, 
GenericObjectPoolConfig<T> poolConfig) {
-        this(clientFactory, protocolFactory, poolConfig, null, null);
+    public ThriftClientPool(ClientFactory<T> clientFactory, ProtocolFactory 
protocolFactory, PoolConfig poolConfig) {
+        this(clientFactory, protocolFactory, poolConfig, null);
     }
 
     public ThriftClientPool(
             ClientFactory<T> clientFactory,
             ProtocolFactory protocolFactory,
-            GenericObjectPoolConfig<T> poolConfig,
-            AiravataServerProperties properties) {
-        this(clientFactory, protocolFactory, poolConfig, null, properties);
-    }
-
-    public ThriftClientPool(
-            ClientFactory<T> clientFactory,
-            ProtocolFactory protocolFactory,
-            GenericObjectPoolConfig<T> poolConfig,
-            AbandonedConfig abandonedConfig) {
-        this(clientFactory, protocolFactory, poolConfig, abandonedConfig, 
null);
-    }
-
-    private ThriftClientPool(
-            ClientFactory<T> clientFactory,
-            ProtocolFactory protocolFactory,
-            GenericObjectPoolConfig<T> poolConfig,
-            AbandonedConfig abandonedConfig,
+            PoolConfig poolConfig,
             AiravataServerProperties properties) {
+        this.clientFactory = clientFactory;
+        this.protocolFactory = protocolFactory;
         this.properties = properties;
-
-        // If abandonedConfig not provided but properties are, create from 
properties
-        if (abandonedConfig == null && properties != null) {
-            if (properties.airavata.thriftClientPoolAbandonedRemovalEnabled) {
-                abandonedConfig = new AbandonedConfig();
-                abandonedConfig.setRemoveAbandonedOnBorrow(true);
-                abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-                if 
(properties.airavata.thriftClientPoolAbandonedRemovalLogged) {
-                    abandonedConfig.setLogAbandoned(true);
-                    abandonedConfig.setLogWriter(new PrintWriter(new 
ErrorLoggingStringWriter()));
-                } else {
-                    abandonedConfig.setLogAbandoned(false);
-                }
-            }
-        }
-
-        if (abandonedConfig != null
-                && abandonedConfig.getRemoveAbandonedOnMaintenance()
-                && poolConfig.getTimeBetweenEvictionRunsMillis() <= 0) {
-            logger.warn(
-                    "Abandoned removal is enabled but"
-                            + " removeAbandonedOnMaintenance won't run since"
-                            + " timeBetweenEvictionRunsMillis is not positive, 
current value: {}",
-                    poolConfig.getTimeBetweenEvictionRunsMillis());
-        }
-        this.internalPool = new GenericObjectPool<T>(
-                new ThriftClientFactory(clientFactory, protocolFactory), 
poolConfig, abandonedConfig);
+        this.maxTotal = poolConfig.getMaxTotal();
+        this.maxIdle = poolConfig.getMaxIdle() > 0 ? poolConfig.getMaxIdle() : 
poolConfig.getMaxTotal();
+        this.maxWaitMillis = poolConfig.getMaxWaitMillis();
+        this.timeBetweenEvictionRunsMillis = 
poolConfig.getTimeBetweenEvictionRunsMillis();
+        this.pool = new LinkedBlockingQueue<>(maxIdle);
     }
 
-    class ThriftClientFactory extends BasePooledObjectFactory<T> {
-
-        private ClientFactory<T> clientFactory;
-        private ProtocolFactory protocolFactory;
-
-        public ThriftClientFactory(ClientFactory<T> clientFactory, 
ProtocolFactory protocolFactory) {
-            this.clientFactory = clientFactory;
-            this.protocolFactory = protocolFactory;
-        }
-
-        @Override
-        public T create() throws Exception {
-            try {
-                TProtocol protocol = protocolFactory.make();
-                return clientFactory.make(protocol);
-            } catch (Exception e) {
-                logger.warn(e.getMessage(), e);
-                throw new ThriftClientException("Can not make a new object for 
pool", e);
-            }
+    private T createClient() throws Exception {
+        try {
+            TProtocol protocol = protocolFactory.make();
+            T client = clientFactory.make(protocol);
+            createdCount.incrementAndGet();
+            return client;
+        } catch (Exception e) {
+            logger.warn(e.getMessage(), e);
+            throw new ThriftClientException("Can not make a new object for 
pool", e);
         }
+    }
 
-        @Override
-        public void destroyObject(PooledObject<T> pooledObject) throws 
Exception {
-            T obj = pooledObject.getObject();
-            if (obj.getOutputProtocol().getTransport().isOpen()) {
-                obj.getOutputProtocol().getTransport().close();
+    private void destroyClient(T client) {
+        try {
+            if (client.getOutputProtocol().getTransport().isOpen()) {
+                client.getOutputProtocol().getTransport().close();
             }
-            if (obj.getInputProtocol().getTransport().isOpen()) {
-                obj.getInputProtocol().getTransport().close();
+            if (client.getInputProtocol().getTransport().isOpen()) {
+                client.getInputProtocol().getTransport().close();
             }
-        }
-
-        @Override
-        public PooledObject<T> wrap(T obj) {
-            return new DefaultPooledObject<T>(obj);
+        } catch (Exception e) {
+            logger.warn("Error destroying client", e);
         }
     }
 
@@ -204,17 +142,29 @@ public class ThriftClientPool<T extends BaseAPI.Client> 
implements AutoCloseable
         try {
             for (int i = 0; i < 10; i++) {
                 // This tries to fetch a client from the pool and validate it 
before returning.
-                final T client = internalPool.borrowObject();
+                T client = null;
                 try {
+                    // Try to get from pool first
+                    client = pool.poll(maxWaitMillis, TimeUnit.MILLISECONDS);
+                    if (client == null && createdCount.get() < maxTotal) {
+                        // Create new client if under max total
+                        client = createClient();
+                    }
+                    if (client == null) {
+                        throw new Exception("Pool exhausted and max total 
reached");
+                    }
+                    // Validate client
                     String apiVersion = client.getAPIVersion();
                     logger.debug("Validated client and fetched api version " + 
apiVersion);
                     return client;
                 } catch (Exception e) {
                     logger.warn("Failed to validate the client. Retrying " + 
i, e);
-                    returnBrokenResource(client);
+                    if (client != null) {
+                        returnBrokenResource(client);
+                    }
                 }
             }
-            throw new Exception("Failed to fetch a client form the pool after 
validation");
+            throw new Exception("Failed to fetch a client from the pool after 
validation");
         } catch (Exception e) {
             throw new ThriftClientException("Could not get a resource from the 
pool", e);
         }
@@ -222,9 +172,15 @@ public class ThriftClientPool<T extends BaseAPI.Client> 
implements AutoCloseable
 
     public void returnResourceObject(T resource) {
         try {
-            internalPool.returnObject(resource);
+            if (!pool.offer(resource)) {
+                // Pool is full, destroy the client
+                destroyClient(resource);
+                createdCount.decrementAndGet();
+            }
         } catch (Exception e) {
-            throw new ThriftClientException("Could not return the resource to 
the pool", e);
+            logger.warn("Error returning resource to pool", e);
+            destroyClient(resource);
+            createdCount.decrementAndGet();
         }
     }
 
@@ -238,9 +194,10 @@ public class ThriftClientPool<T extends BaseAPI.Client> 
implements AutoCloseable
 
     protected void returnBrokenResourceObject(T resource) {
         try {
-            internalPool.invalidateObject(resource);
+            destroyClient(resource);
+            createdCount.decrementAndGet();
         } catch (Exception e) {
-            throw new ThriftClientException("Could not return the resource to 
the pool", e);
+            logger.warn("Error destroying broken resource", e);
         }
     }
 
@@ -250,9 +207,55 @@ public class ThriftClientPool<T extends BaseAPI.Client> 
implements AutoCloseable
 
     public void close() {
         try {
-            internalPool.close();
+            T client;
+            while ((client = pool.poll()) != null) {
+                destroyClient(client);
+                createdCount.decrementAndGet();
+            }
         } catch (Exception e) {
-            throw new ThriftClientException("Could not destroy the pool", e);
+            logger.error("Error closing pool", e);
+        }
+    }
+
+    /**
+     * Simple pool configuration class to replace GenericObjectPoolConfig
+     */
+    public static class PoolConfig {
+        private int maxTotal = 8;
+        private int maxIdle = 8;
+        private long maxWaitMillis = -1;
+        private long timeBetweenEvictionRunsMillis = -1;
+
+        public int getMaxTotal() {
+            return maxTotal;
+        }
+
+        public void setMaxTotal(int maxTotal) {
+            this.maxTotal = maxTotal;
+        }
+
+        public int getMaxIdle() {
+            return maxIdle;
+        }
+
+        public void setMaxIdle(int maxIdle) {
+            this.maxIdle = maxIdle;
+        }
+
+        public long getMaxWaitMillis() {
+            return maxWaitMillis;
+        }
+
+        public void setMaxWaitMillis(long maxWaitMillis) {
+            this.maxWaitMillis = maxWaitMillis;
+        }
+
+        public long getTimeBetweenEvictionRunsMillis() {
+            return timeBetweenEvictionRunsMillis;
+        }
+
+        public void setTimeBetweenEvictionRunsMillis(long 
timeBetweenEvictionRunsMillis) {
+            this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
         }
     }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
index b570c3f8eb..a24b87af96 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java
@@ -29,11 +29,9 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Properties;
 import java.util.regex.Pattern;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -227,8 +225,23 @@ public class ApplicationSettings {
 
     public static boolean getBooleanSetting(String key) throws 
ApplicationSettingsException {
         String val = getInstance().getSettingImpl(key);
-        return Optional.ofNullable(BooleanUtils.toBooleanObject(val))
-                .orElseThrow(() -> new ApplicationSettingsException("Value can 
not be parsed to Boolean"));
+        if (val == null) {
+            throw new ApplicationSettingsException("Value can not be parsed to 
Boolean");
+        }
+        String normalized = val.trim().toLowerCase();
+        if ("true".equals(normalized)
+                || "yes".equals(normalized)
+                || "on".equals(normalized)
+                || "1".equals(normalized)) {
+            return true;
+        } else if ("false".equals(normalized)
+                || "no".equals(normalized)
+                || "off".equals(normalized)
+                || "0".equals(normalized)) {
+            return false;
+        } else {
+            throw new ApplicationSettingsException("Value can not be parsed to 
Boolean");
+        }
     }
 
     public static boolean isSettingDefined(String key) throws 
ApplicationSettingsException {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/JPAUtils.java 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
index 9a99e6f51e..052a6e5419 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
@@ -21,7 +21,6 @@ package org.apache.airavata.common.utils;
 
 import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.Persistence;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.slf4j.Logger;
@@ -92,8 +91,11 @@ public class JPAUtils {
         properties.put("jakarta.persistence.jdbc.url", url + urlSuffix);
         properties.put("jakarta.persistence.jdbc.user", jdbcConfig.getUser());
         properties.put("jakarta.persistence.jdbc.password", 
jdbcConfig.getPassword());
-        logger.debug("Connection properties: driver={}, url={}, user={}", 
-                jdbcConfig.getDriver(), url + urlSuffix, jdbcConfig.getUser());
+        logger.debug(
+                "Connection properties: driver={}, url={}, user={}",
+                jdbcConfig.getDriver(),
+                url + urlSuffix,
+                jdbcConfig.getUser());
         return properties;
     }
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/JSONUtil.java 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/JSONUtil.java
index 1223a0b726..eafbddbbe5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/utils/JSONUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/utils/JSONUtil.java
@@ -90,11 +90,11 @@ public class JSONUtil {
                 String key = fieldNames.next();
                 JsonNode valueOrig = originalJsonObject.get(key);
                 JsonNode valueNew = newJsonObject.get(key);
-                
+
                 if (valueNew == null) {
                     return false;
                 }
-                
+
                 if (valueOrig.isObject() && valueNew.isObject()) {
                     if (!isEqual((ObjectNode) valueOrig, (ObjectNode) 
valueNew)) {
                         return false;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/StringUtil.java 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/StringUtil.java
index 51253ed597..7891ae611f 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/common/utils/StringUtil.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/common/utils/StringUtil.java
@@ -25,16 +25,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.cli.PosixParser;
 
 public class StringUtil {
     public static final String DELIMETER = ",";
@@ -375,31 +368,6 @@ public class StringUtil {
         return byteArrayOutputStream.toString();
     }
 
-    private static Options deriveCommandLineOptions(String[] args) {
-        Options options = new Options();
-        String[] argCopy = getChangedList(args);
-        int i = 0;
-        for (String arg : argCopy) {
-            if (arg.startsWith("--")) {
-                arg = arg.substring(2);
-                int pos = arg.indexOf('=');
-                String opt;
-                boolean hasArgs = true;
-                if (pos == -1) { // if not of the form --arg=value
-                    if (i == argCopy.length - 1 || argCopy[i + 
1].startsWith("-")) { // no value specified
-                        hasArgs = false;
-                    }
-                    opt = arg;
-                } else {
-                    opt = arg.substring(0, pos);
-                }
-                options.addOption(opt, hasArgs, "");
-            }
-            i++;
-        }
-        return options;
-    }
-
     public static Map<String, String> parseCommandLineOptions(String[] args) {
         Map<String, String> commandLineOptions = new HashMap<String, String>();
         try {
@@ -408,17 +376,40 @@ public class StringUtil {
             for (String s : parameters.keySet()) {
                 commandLineOptions.put(s, parameters.get(s) == null ? "" : 
parameters.get(s));
             }
-        } catch (ParseException e1) {
+        } catch (Exception e1) {
             e1.printStackTrace();
         }
         return commandLineOptions;
     }
 
-    public static CommandLineParameters getCommandLineParser(String[] args) 
throws ParseException {
+    public static CommandLineParameters getCommandLineParser(String[] args) 
throws Exception {
         String[] argCopy = getChangedList(args);
-        CommandLineParser parser = new DynamicOptionPosixParser();
-        CommandLine cmdLine = parser.parse(deriveCommandLineOptions(argCopy), 
argCopy);
-        return new CommandLineParameters(cmdLine);
+        Map<String, String> options = new HashMap<>();
+        List<String> arguments = new ArrayList<>();
+
+        for (int i = 0; i < argCopy.length; i++) {
+            String arg = argCopy[i];
+            if (arg.startsWith("--")) {
+                arg = arg.substring(2);
+                int pos = arg.indexOf('=');
+                String opt;
+                String value = null;
+                if (pos == -1) { // if not of the form --arg=value
+                    opt = arg;
+                    if (i + 1 < argCopy.length && !argCopy[i + 
1].startsWith("-")) {
+                        value = argCopy[++i];
+                    }
+                } else {
+                    opt = arg.substring(0, pos);
+                    value = arg.substring(pos + 1);
+                }
+                options.put(revertOption(opt), value != null ? 
revertOption(value) : "");
+            } else if (!arg.startsWith("-")) {
+                arguments.add(revertOption(arg));
+            }
+        }
+
+        return new CommandLineParameters(options, arguments);
     }
 
     // commons-cli does not support arg names having the period (".")
@@ -440,27 +431,13 @@ public class StringUtil {
         return option == null ? option : option.replaceAll(Pattern.quote("."), 
ARG_DOT_REPLACE);
     }
 
-    private static class DynamicOptionPosixParser extends PosixParser {
-        @Override
-        protected void processOption(String arg0, 
@SuppressWarnings("rawtypes") ListIterator arg1)
-                throws ParseException {
-            if (getOptions().hasOption(arg0)) {
-                super.processOption(arg0, arg1);
-            }
-        }
-    }
-
     public static class CommandLineParameters {
         private Map<String, String> parameters = new HashMap<String, String>();
         private List<String> arguments = new ArrayList<String>();
 
-        protected CommandLineParameters(CommandLine cmd) {
-            for (Option opt : cmd.getOptions()) {
-                parameters.put(revertOption(opt.getOpt()), 
revertOption(opt.getValue()));
-            }
-            for (String arg : cmd.getArgs()) {
-                arguments.add(revertOption(arg));
-            }
+        protected CommandLineParameters(Map<String, String> options, 
List<String> args) {
+            this.parameters = options;
+            this.arguments = args;
         }
 
         public List<String> getArguments() {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/credential/impl/notifier/EmailNotifier.java
 
b/airavata-api/src/main/java/org/apache/airavata/credential/impl/notifier/EmailNotifier.java
index 830f8abcca..cfde541d46 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/credential/impl/notifier/EmailNotifier.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/credential/impl/notifier/EmailNotifier.java
@@ -22,12 +22,11 @@ package org.apache.airavata.credential.impl.notifier;
 import org.apache.airavata.credential.exception.CredentialStoreException;
 import org.apache.airavata.credential.utils.CredentialStoreNotifier;
 import org.apache.airavata.credential.utils.NotificationMessage;
-import org.apache.commons.mail.DefaultAuthenticator;
-import org.apache.commons.mail.Email;
-import org.apache.commons.mail.EmailException;
-import org.apache.commons.mail.SimpleEmail;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
 
 /**
  * User: AmilaJ ([email protected])
@@ -46,27 +45,40 @@ public class EmailNotifier implements 
CredentialStoreNotifier {
 
     public void notifyMessage(NotificationMessage message) throws 
CredentialStoreException {
         try {
-            Email email = new SimpleEmail();
-            
email.setHostName(this.emailNotifierConfiguration.getEmailServer());
-            
email.setSmtpPort(this.emailNotifierConfiguration.getEmailServerPort());
-            email.setAuthenticator(new DefaultAuthenticator(
-                    this.emailNotifierConfiguration.getEmailUserName(),
-                    this.emailNotifierConfiguration.getEmailPassword()));
-            
email.setSSLOnConnect(this.emailNotifierConfiguration.isSslConnect());
+            JavaMailSender mailSender = createMailSender();
+            SimpleMailMessage email = new SimpleMailMessage();
             email.setFrom(this.emailNotifierConfiguration.getFromAddress());
 
             EmailNotificationMessage emailMessage = (EmailNotificationMessage) 
message;
 
             email.setSubject(emailMessage.getSubject());
-            email.setMsg(emailMessage.getMessage());
-            email.addTo(emailMessage.getSenderEmail());
-            email.send();
+            email.setText(emailMessage.getMessage());
+            email.setTo(emailMessage.getSenderEmail());
+            mailSender.send(email);
 
-        } catch (EmailException e) {
-            log.error("[CredentialStore]Error sending email notification 
message.");
+        } catch (Exception e) {
+            log.error("[CredentialStore]Error sending email notification 
message.", e);
             CredentialStoreException cse = new CredentialStoreException("Error 
sending email notification message");
             cse.initCause(e);
             throw cse;
         }
     }
+
+    private JavaMailSender createMailSender() {
+        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+        mailSender.setHost(this.emailNotifierConfiguration.getEmailServer());
+        
mailSender.setPort(this.emailNotifierConfiguration.getEmailServerPort());
+        
mailSender.setUsername(this.emailNotifierConfiguration.getEmailUserName());
+        
mailSender.setPassword(this.emailNotifierConfiguration.getEmailPassword());
+
+        java.util.Properties props = mailSender.getJavaMailProperties();
+        props.put("mail.transport.protocol", "smtp");
+        if (this.emailNotifierConfiguration.isSslConnect()) {
+            props.put("mail.smtp.ssl.enable", "true");
+            props.put("mail.smtp.starttls.enable", "true");
+        }
+        props.put("mail.smtp.auth", "true");
+
+        return mailSender;
+    }
 }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/credential/utils/Utility.java 
b/airavata-api/src/main/java/org/apache/airavata/credential/utils/Utility.java
index b964c81d52..2a900bf530 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/credential/utils/Utility.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/credential/utils/Utility.java
@@ -23,13 +23,13 @@ import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.KeyPair;
 import java.io.File;
 import java.io.FileInputStream;
+import java.nio.file.Files;
 import java.security.KeyStore;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import org.apache.airavata.credential.impl.ssh.SSHCredential;
-import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -91,9 +91,9 @@ public class Utility {
             kpair.writePrivateKey(fileName, 
credential.getPassphrase().getBytes());
             kpair.writePublicKey(fileName + ".pub", "");
             kpair.dispose();
-            byte[] priKey = FileUtils.readFileToByteArray(new File(fileName));
+            byte[] priKey = Files.readAllBytes(new File(fileName).toPath());
 
-            byte[] pubKey = FileUtils.readFileToByteArray(new File(fileName + 
".pub"));
+            byte[] pubKey = Files.readAllBytes(new File(fileName + 
".pub").toPath());
             credential.setPrivateKey(priKey);
             credential.setPublicKey(pubKey);
             return credential;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/agent/ssh/StandardOutReader.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/agent/ssh/StandardOutReader.java
index 1f79815aff..90511f9e81 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/agent/ssh/StandardOutReader.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/agent/ssh/StandardOutReader.java
@@ -19,11 +19,13 @@
 */
 package org.apache.airavata.helix.agent.ssh;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
 import org.apache.airavata.agents.api.CommandOutput;
-import org.apache.commons.io.IOUtils;
 
 /**
  * TODO: Class level comments please
@@ -54,13 +56,25 @@ public class StandardOutReader implements CommandOutput {
 
     public void readStdOutFromStream(InputStream is) throws IOException {
         StringWriter writer = new StringWriter();
-        IOUtils.copy(is, writer, "UTF-8");
+        try (BufferedReader reader = new BufferedReader(new 
InputStreamReader(is, StandardCharsets.UTF_8))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                writer.write(line);
+                writer.write(System.lineSeparator());
+            }
+        }
         this.stdOut = writer.toString();
     }
 
     public void readStdErrFromStream(InputStream is) throws IOException {
         StringWriter writer = new StringWriter();
-        IOUtils.copy(is, writer, "UTF-8");
+        try (BufferedReader reader = new BufferedReader(new 
InputStreamReader(is, StandardCharsets.UTF_8))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                writer.write(line);
+                writer.write(System.lineSeparator());
+            }
+        }
         this.stdError = writer.toString();
     }
 
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 14f3f030c4..b202104367 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
@@ -19,9 +19,14 @@
 */
 package org.apache.airavata.helix.impl.task;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -64,12 +69,8 @@ import 
org.apache.airavata.messaging.core.impl.RabbitMQPublisher;
 import org.apache.airavata.service.profile.UserProfileService;
 import org.apache.airavata.service.registry.RegistryService;
 import org.apache.airavata.service.security.CredentialStoreService;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.helix.HelixManager;
 import org.apache.helix.task.TaskResult;
-import org.json.JSONException;
-import org.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
@@ -85,6 +86,7 @@ public abstract class AiravataTask extends AbstractTask {
     protected final RegistryService registryService;
     private final UserProfileService userProfileService;
     private final CredentialStoreService credentialStoreService;
+    private final ObjectMapper objectMapper = new ObjectMapper();
 
     public AiravataTask(
             ApplicationContext applicationContext,
@@ -195,7 +197,7 @@ public abstract class AiravataTask extends AbstractTask {
             error = new TaskOnFailException(errorMessage, true, error);
 
             status.setReason(errorMessage);
-            errors.write(ExceptionUtils.getStackTrace(error));
+            error.printStackTrace(new PrintWriter(errors));
             logger.error(errorMessage, error);
 
             
status.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime());
@@ -262,7 +264,18 @@ public abstract class AiravataTask extends AbstractTask {
             localDataPath = localDataPath + getProcessId();
 
             try {
-                FileUtils.deleteDirectory(new File(localDataPath));
+                Path path = Path.of(localDataPath);
+                if (Files.exists(path)) {
+                    Files.walk(path)
+                            .sorted((a, b) -> b.compareTo(a)) // Delete files 
before directories
+                            .forEach(p -> {
+                                try {
+                                    Files.delete(p);
+                                } catch (IOException e) {
+                                    logger.warn("Failed to delete " + p, e);
+                                }
+                            });
+                }
             } catch (IOException e) {
                 logger.error("Failed to delete local data directory " + 
localDataPath, e);
             }
@@ -422,15 +435,15 @@ public abstract class AiravataTask extends AbstractTask {
         // Copy experiment output's file-metadata to data product's metadata
         if (outputMetadata != null) {
             try {
-                JSONObject outputMetadataJSON = new JSONObject(outputMetadata);
+                JsonNode outputMetadataJSON = 
objectMapper.readTree(outputMetadata);
                 if (outputMetadataJSON.has("file-metadata")) {
-                    JSONObject fileMetadata = 
outputMetadataJSON.getJSONObject("file-metadata");
-                    for (Object key : fileMetadata.keySet()) {
-                        String k = key.toString();
-                        dataProductModel.putToProductMetadata(k, 
fileMetadata.getString(k));
-                    }
+                    JsonNode fileMetadata = 
outputMetadataJSON.get("file-metadata");
+                    fileMetadata.fields().forEachRemaining(entry -> {
+                        dataProductModel.putToProductMetadata(
+                                entry.getKey(), entry.getValue().asText());
+                    });
                 }
-            } catch (JSONException e) {
+            } catch (Exception e) {
                 logger.warn("Failed to parse output metadata: [" + 
outputMetadata + "]", e);
             }
         }
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 80f86c1512..40f70b017b 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
@@ -66,12 +66,12 @@ import org.apache.airavata.common.model.UserResourceProfile;
 import org.apache.airavata.common.model.UserStoragePreference;
 import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.messaging.core.Publisher;
-import org.apache.airavata.model.util.GroupComputeResourcePreferenceUtil;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.security.AiravataSecurityManager;
 import org.apache.airavata.security.model.AuthzToken;
 import org.apache.airavata.service.profile.UserProfileService;
 import org.apache.airavata.service.registry.RegistryService;
+import org.apache.airavata.util.GroupComputeResourcePreferenceUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
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 90f02a6d20..51540f8702 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
@@ -21,6 +21,8 @@ package org.apache.airavata.helix.impl.task.aws;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
 import java.security.SecureRandom;
 import java.util.Collections;
 import java.util.concurrent.TimeUnit;
@@ -45,7 +47,6 @@ import org.apache.airavata.helix.task.api.TaskHelper;
 import org.apache.airavata.helix.task.api.annotation.TaskDef;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.service.security.CredentialStoreService;
-import org.apache.commons.io.FileUtils;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -124,7 +125,12 @@ public class AWSJobSubmissionTask extends 
JobSubmissionTask {
             File localScriptFile = new File(
                     getLocalDataDir(),
                     "aws-job-" + new SecureRandom().nextInt() + 
jobManagerConfig.getScriptExtension());
-            FileUtils.writeStringToFile(localScriptFile, scriptContent, 
StandardCharsets.UTF_8);
+            Files.writeString(
+                    localScriptFile.toPath(),
+                    scriptContent,
+                    StandardCharsets.UTF_8,
+                    StandardOpenOption.CREATE,
+                    StandardOpenOption.TRUNCATE_EXISTING);
 
             jobModel.setJobStatuses(Collections.singletonList(new 
JobStatus(JobState.QUEUED)));
             saveJobModel(jobModel);
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 3a2375d3eb..743640767f 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
@@ -32,6 +32,7 @@ import 
com.github.dockerjava.core.command.WaitContainerResultCallback;
 import java.io.File;
 import java.io.IOException;
 import java.net.URI;
+import java.nio.file.Files;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -63,7 +64,6 @@ import 
org.apache.airavata.helix.task.api.support.AdaptorSupport;
 import org.apache.airavata.monitor.platform.CountMonitor;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.service.registry.RegistryService;
-import org.apache.commons.io.FileUtils;
 import org.apache.helix.task.TaskResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -471,7 +471,7 @@ public class DataParsingTask extends AbstractTask {
                 + "parsers" + File.separator + containerName + File.separator 
+ "data" + File.separator + "input"
                 + File.separator;
         try {
-            FileUtils.forceMkdir(new File(localInpDir));
+            Files.createDirectories(new File(localInpDir).toPath());
             return localInpDir;
 
         } catch (IOException e) {
@@ -484,7 +484,7 @@ public class DataParsingTask extends AbstractTask {
                 + "parsers" + File.separator + containerName + File.separator 
+ "data" + File.separator + "output"
                 + File.separator;
         try {
-            FileUtils.forceMkdir(new File(localOutDir));
+            Files.createDirectories(new File(localOutDir).toPath());
             return localOutDir;
 
         } catch (IOException e) {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
index 367667744e..4458f73b0a 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/staging/DataStagingTask.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.file.Files;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Callable;
@@ -47,7 +48,6 @@ import org.apache.airavata.helix.impl.task.AiravataTask;
 import org.apache.airavata.helix.impl.task.TaskOnFailException;
 import org.apache.airavata.helix.task.api.support.AdaptorSupport;
 import org.apache.airavata.monitor.platform.CountMonitor;
-import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -213,7 +213,7 @@ public abstract class DataStagingTask extends AiravataTask {
         localDataPath = (localDataPath.endsWith(File.separator) ? 
localDataPath : localDataPath + File.separator)
                 + getProcessId() + File.separator + "temp_inputs" + 
File.separator;
         try {
-            FileUtils.forceMkdir(new File(localDataPath));
+            Files.createDirectories(new File(localDataPath).toPath());
         } catch (IOException e) {
             throw new TaskOnFailException("Failed build directories " + 
localDataPath, true, e);
         }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
index c479901b54..4c6d787b4f 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/JobSubmissionTask.java
@@ -20,6 +20,8 @@
 package org.apache.airavata.helix.impl.task.submission;
 
 import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.List;
@@ -39,7 +41,6 @@ import 
org.apache.airavata.helix.impl.task.submission.config.JobFactory;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
 import org.apache.airavata.registry.exception.RegistryServiceException;
-import org.apache.commons.io.FileUtils;
 import org.apache.helix.HelixManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,7 +86,8 @@ public abstract class JobSubmissionTask extends AiravataTask {
         File tempJobFile = new File(
                 getLocalDataDir(), "job_" + Integer.toString(number) + 
jobManagerConfiguration.getScriptExtension());
 
-        FileUtils.writeStringToFile(tempJobFile, scriptAsString);
+        Files.writeString(
+                tempJobFile.toPath(), scriptAsString, 
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
         logger.info("Job submission file for process " + getProcessId() + " 
was created at : "
                 + tempJobFile.getAbsolutePath());
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapData.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapData.java
index 2ba9423beb..fb9677d44b 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapData.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/GroovyMapData.java
@@ -24,12 +24,11 @@ import groovy.text.GStringTemplateEngine;
 import groovy.text.TemplateEngine;
 import java.lang.reflect.Field;
 import java.net.URL;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.utils.ApplicationSettings;
-import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -588,7 +587,7 @@ public class GroovyMapData {
         }
 
         try {
-            String templateStr = IOUtils.toString(templateUrl.openStream(), 
Charset.defaultCharset());
+            String templateStr = new 
String(templateUrl.openStream().readAllBytes(), StandardCharsets.UTF_8);
             return loadFromString(templateStr);
         } catch (Exception e) {
             throw new Exception(
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/CloudJobManagerConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/CloudJobManagerConfiguration.java
index af4653ab83..a3db32cc8c 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/CloudJobManagerConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/CloudJobManagerConfiguration.java
@@ -20,11 +20,11 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
 import 
org.apache.airavata.helix.impl.task.submission.config.app.parser.AiravataCustomCommandOutputParser;
-import org.apache.commons.io.FilenameUtils;
 
 /**
  * A Job Manager Configuration for executing jobs directly on a cloud VM via 
SSH
@@ -71,7 +71,9 @@ public class CloudJobManagerConfiguration implements 
JobManagerConfiguration {
 
     @Override
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
filePath) {
-        String remoteScriptPath = workingDirectory + File.separator + 
FilenameUtils.getName(filePath);
+        String remoteScriptPath = workingDirectory
+                + File.separator
+                + Paths.get(filePath).getFileName().toString();
         return new RawCommandInfo("/bin/bash " + remoteScriptPath);
     }
 
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/ForkJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/ForkJobConfiguration.java
index 92de27ff95..2058128cfb 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/ForkJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/ForkJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 
 public class ForkJobConfiguration implements JobManagerConfiguration {
     private final Map<JobManagerCommand, String> jobManagerCommands;
@@ -87,7 +87,7 @@ public class ForkJobConfiguration implements 
JobManagerConfiguration {
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
forkFilePath) {
         return new RawCommandInfo(this.installedPath
                 + jobManagerCommands.get(JobManagerCommand.SUBMISSION).trim() 
+ " " + workingDirectory + File.separator
-                + FilenameUtils.getName(forkFilePath));
+                + Paths.get(forkFilePath).getFileName().toString());
     }
 
     @Override
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/HTCondorJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/HTCondorJobConfiguration.java
index 810398fc03..39bf37e4f2 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/HTCondorJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/HTCondorJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 
 public class HTCondorJobConfiguration implements JobManagerConfiguration {
     private final Map<JobManagerCommand, String> jMCommands;
@@ -77,7 +77,7 @@ public class HTCondorJobConfiguration implements 
JobManagerConfiguration {
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
pbsFilePath) {
         return new RawCommandInfo(this.installedPath
                 + jMCommands.get(JobManagerCommand.SUBMISSION).trim() + " " + 
workingDirectory + File.separator
-                + FilenameUtils.getName(pbsFilePath));
+                + Paths.get(pbsFilePath).getFileName().toString());
     }
 
     public String getInstalledPath() {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/LSFJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/LSFJobConfiguration.java
index b4f69140a6..1884007d20 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/LSFJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/LSFJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,7 +87,7 @@ public class LSFJobConfiguration implements 
JobManagerConfiguration {
     @Override
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
pbsFilePath) {
         return new RawCommandInfo(this.installedPath + "bsub < " + 
workingDirectory + File.separator
-                + FilenameUtils.getName(pbsFilePath));
+                + Paths.get(pbsFilePath).getFileName().toString());
     }
 
     @Override
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/PBSJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/PBSJobConfiguration.java
index 9e6fa34198..c3ab50580d 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/PBSJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/PBSJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 
 public class PBSJobConfiguration implements JobManagerConfiguration {
 
@@ -78,7 +78,7 @@ public class PBSJobConfiguration implements 
JobManagerConfiguration {
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
pbsFilePath) {
         return new RawCommandInfo(this.installedPath
                 + jobManagerCommands.get(JobManagerCommand.SUBMISSION).trim() 
+ " " + workingDirectory + File.separator
-                + FilenameUtils.getName(pbsFilePath));
+                + Paths.get(pbsFilePath).getFileName().toString());
     }
 
     public String getInstalledPath() {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/SlurmJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/SlurmJobConfiguration.java
index 15cc216f4a..3189ec7a28 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/SlurmJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/SlurmJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 
 public class SlurmJobConfiguration implements JobManagerConfiguration {
     private final Map<JobManagerCommand, String> jMCommands;
@@ -77,7 +77,7 @@ public class SlurmJobConfiguration implements 
JobManagerConfiguration {
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
pbsFilePath) {
         return new RawCommandInfo(this.installedPath
                 + jMCommands.get(JobManagerCommand.SUBMISSION).trim() + " " + 
workingDirectory + File.separator
-                + FilenameUtils.getName(pbsFilePath));
+                + Paths.get(pbsFilePath).getFileName().toString());
     }
 
     public String getInstalledPath() {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/UGEJobConfiguration.java
 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/UGEJobConfiguration.java
index 8660f99518..d566e8fb7c 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/UGEJobConfiguration.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/helix/impl/task/submission/config/app/UGEJobConfiguration.java
@@ -20,12 +20,12 @@
 package org.apache.airavata.helix.impl.task.submission.config.app;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Map;
 import org.apache.airavata.common.model.JobManagerCommand;
 import 
org.apache.airavata.helix.impl.task.submission.config.JobManagerConfiguration;
 import org.apache.airavata.helix.impl.task.submission.config.OutputParser;
 import org.apache.airavata.helix.impl.task.submission.config.RawCommandInfo;
-import org.apache.commons.io.FilenameUtils;
 
 public class UGEJobConfiguration implements JobManagerConfiguration {
     private final Map<JobManagerCommand, String> jobManagerCommands;
@@ -72,8 +72,8 @@ public class UGEJobConfiguration implements 
JobManagerConfiguration {
     }
 
     public RawCommandInfo getSubmitCommand(String workingDirectory, String 
pbsFilePath) {
-        return new RawCommandInfo(
-                this.installedPath + "qsub " + workingDirectory + 
File.separator + FilenameUtils.getName(pbsFilePath));
+        return new RawCommandInfo(this.installedPath + "qsub " + 
workingDirectory + File.separator
+                + Paths.get(pbsFilePath).getFileName().toString());
     }
 
     public String getInstalledPath() {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/messaging/client/RabbitMQListener.java
 
b/airavata-api/src/main/java/org/apache/airavata/messaging/client/RabbitMQListener.java
index 97f32db666..e7b3b84c65 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/messaging/client/RabbitMQListener.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/messaging/client/RabbitMQListener.java
@@ -19,11 +19,6 @@
 */
 package org.apache.airavata.messaging.client;
 
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.cli.PosixParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,53 +32,53 @@ public class RabbitMQListener {
 
     public static void parseArguments(String[] args) {
         try {
-            Options options = new Options();
-
-            options.addOption("gId", true, "Gateway ID");
-            options.addOption("eId", true, "Experiment ID");
-            options.addOption("jId", true, "Job ID");
-            options.addOption("a", false, "All Notifications");
-
-            CommandLineParser parser = new PosixParser();
-            CommandLine cmd = parser.parse(options, args);
-            if (cmd.getOptions() == null || cmd.getOptions().length == 0) {
+            if (args == null || args.length == 0) {
                 logger.info("You have not specified any options. We assume you 
need to listen to all the messages...");
                 gatewayId = "*";
+                return;
             }
-            if (cmd.hasOption("a")) {
-                logger.info("Listening to all the messages...");
-                gatewayId = "*";
-            } else {
-                gatewayId = cmd.getOptionValue("gId");
-                if (gatewayId == null) {
+
+            // Simple manual parsing
+            java.util.Map<String, String> options = new java.util.HashMap<>();
+            for (int i = 0; i < args.length; i++) {
+                if (args[i].equals("-a")) {
+                    logger.info("Listening to all the messages...");
                     gatewayId = "*";
-                    logger.info(
-                            "You have not specified a gateway id. We assume 
you need to listen to all the messages...");
-                }
-                experimentId = cmd.getOptionValue("eId");
-                if (experimentId == null && !gatewayId.equals("*")) {
-                    experimentId = "*";
-                    logger.info(
-                            "You have not specified a experiment id. We assume 
you need to listen to all the messages for the gateway with id "
-                                    + gatewayId);
-                } else if (experimentId == null && gatewayId.equals("*")) {
-                    experimentId = "*";
-                    logger.info(
-                            "You have not specified a experiment id and a 
gateway id. We assume you need to listen to all the messages...");
-                }
-                jobId = cmd.getOptionValue("jId");
-                if (jobId == null && !gatewayId.equals("*") && 
!experimentId.equals("*")) {
-                    jobId = "*";
-                    logger.info(
-                            "You have not specified a job id. We assume you 
need to listen to all the messages for the gateway with id "
-                                    + gatewayId + " with experiment id : " + 
experimentId);
-                } else if (jobId == null && gatewayId.equals("*") && 
experimentId.equals("*")) {
-                    jobId = "*";
-                    logger.info(
-                            "You have not specified a job Id or experiment Id 
or a gateway Id. We assume you need to listen to all the messages...");
+                    return;
+                } else if (args[i].equals("-gId") && i + 1 < args.length) {
+                    options.put("gId", args[++i]);
+                } else if (args[i].equals("-eId") && i + 1 < args.length) {
+                    options.put("eId", args[++i]);
+                } else if (args[i].equals("-jId") && i + 1 < args.length) {
+                    options.put("jId", args[++i]);
                 }
             }
-        } catch (ParseException e) {
+
+            gatewayId = options.getOrDefault("gId", "*");
+            if (gatewayId.equals("*")) {
+                logger.info("You have not specified a gateway id. We assume 
you need to listen to all the messages...");
+            }
+
+            experimentId = options.getOrDefault("eId", "*");
+            if (experimentId.equals("*") && !gatewayId.equals("*")) {
+                logger.info(
+                        "You have not specified a experiment id. We assume you 
need to listen to all the messages for the gateway with id "
+                                + gatewayId);
+            } else if (experimentId.equals("*") && gatewayId.equals("*")) {
+                logger.info(
+                        "You have not specified a experiment id and a gateway 
id. We assume you need to listen to all the messages...");
+            }
+
+            jobId = options.getOrDefault("jId", "*");
+            if (jobId.equals("*") && !gatewayId.equals("*") && 
!experimentId.equals("*")) {
+                logger.info(
+                        "You have not specified a job id. We assume you need 
to listen to all the messages for the gateway with id "
+                                + gatewayId + " with experiment id : " + 
experimentId);
+            } else if (jobId.equals("*") && gatewayId.equals("*") && 
experimentId.equals("*")) {
+                logger.info(
+                        "You have not specified a job Id or experiment Id or a 
gateway Id. We assume you need to listen to all the messages...");
+            }
+        } catch (Exception e) {
             logger.error("Error while reading command line parameters", e);
         }
     }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/metascheduler/metadata/analyzer/DataInterpreterService.java
 
b/airavata-api/src/main/java/org/apache/airavata/metascheduler/metadata/analyzer/DataInterpreterService.java
index c60d89ce1f..fbd00884dc 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/metascheduler/metadata/analyzer/DataInterpreterService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/metascheduler/metadata/analyzer/DataInterpreterService.java
@@ -33,9 +33,9 @@ import org.quartz.SchedulerException;
 import org.quartz.SimpleScheduleBuilder;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.springframework.stereotype.Component;
 
 @Component
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/metascheduler/process/scheduling/engine/rescheduler/ProcessReschedulingService.java
 
b/airavata-api/src/main/java/org/apache/airavata/metascheduler/process/scheduling/engine/rescheduler/ProcessReschedulingService.java
index 6e504795cd..d57b16151f 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/metascheduler/process/scheduling/engine/rescheduler/ProcessReschedulingService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/metascheduler/process/scheduling/engine/rescheduler/ProcessReschedulingService.java
@@ -32,9 +32,9 @@ import org.quartz.SchedulerException;
 import org.quartz.SimpleScheduleBuilder;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.springframework.stereotype.Component;
 
 /**
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/monitor/cluster/ClusterStatusMonitorJobScheduler.java
 
b/airavata-api/src/main/java/org/apache/airavata/monitor/cluster/ClusterStatusMonitorJobScheduler.java
index 4d9e3b810a..323dd6e0fa 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/monitor/cluster/ClusterStatusMonitorJobScheduler.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/monitor/cluster/ClusterStatusMonitorJobScheduler.java
@@ -28,9 +28,9 @@ import org.quartz.JobDetail;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
 public class ClusterStatusMonitorJobScheduler {
     private static final Logger logger = 
LoggerFactory.getLogger(ClusterStatusMonitorJobScheduler.class);
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/monitor/compute/ComputationalResourceMonitoringService.java
 
b/airavata-api/src/main/java/org/apache/airavata/monitor/compute/ComputationalResourceMonitoringService.java
index d153ae1124..75da6ca246 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/monitor/compute/ComputationalResourceMonitoringService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/monitor/compute/ComputationalResourceMonitoringService.java
@@ -33,9 +33,9 @@ import org.quartz.SchedulerException;
 import org.quartz.SimpleScheduleBuilder;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
 /**
  * Computational Resource Monitoring Service
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 e5468f004c..28c0c068ec 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
@@ -19,6 +19,7 @@
 */
 package org.apache.airavata.orchestrator.impl;
 
+import jakarta.annotation.PostConstruct;
 import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -57,13 +58,13 @@ import org.apache.airavata.common.model.TaskStatus;
 import org.apache.airavata.common.model.TaskTypes;
 import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.config.AiravataServerProperties;
-import org.apache.airavata.model.util.ExperimentModelUtil;
 import org.apache.airavata.orchestrator.exception.OrchestratorException;
 import org.apache.airavata.orchestrator.job.GFACPassiveJobSubmitter;
 import org.apache.airavata.orchestrator.job.JobSubmitter;
 import org.apache.airavata.orchestrator.utils.OrchestratorUtils;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.service.registry.RegistryService;
+import org.apache.airavata.util.ExperimentModelUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -112,7 +113,7 @@ public class SimpleOrchestratorImpl extends 
AbstractOrchestrator {
         }
     }
 
-    @jakarta.annotation.PostConstruct
+    @PostConstruct
     public void init() throws OrchestratorException {
         logger.info("[BEAN-INIT] SimpleOrchestratorImpl.init() called");
         initialize(properties);
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/registry/utils/migration/MappingToolRunner.java
 
b/airavata-api/src/main/java/org/apache/airavata/registry/utils/migration/MappingToolRunner.java
index 641c6ffc61..1b3fc56228 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/registry/utils/migration/MappingToolRunner.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/registry/utils/migration/MappingToolRunner.java
@@ -19,15 +19,15 @@
 */
 package org.apache.airavata.registry.utils.migration;
 
+import jakarta.persistence.EntityManagerFactory;
 import org.apache.airavata.common.utils.DBInitConfig;
 import org.apache.airavata.common.utils.JPAUtils;
-import jakarta.persistence.EntityManagerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Utility class for generating database schema DDL scripts using Hibernate.
- * 
+ *
  * Note: Consider migrating to a proper database migration tool like Flyway or 
Liquibase
  * for production schema management.
  */
@@ -44,7 +44,7 @@ public class MappingToolRunner {
 
     /**
      * Generate database schema DDL script using Hibernate SchemaExport.
-     * 
+     *
      * @param dbInitConfig Database configuration
      * @param outputFile Output file path for the DDL script
      * @param persistenceUnitName Name of the persistence unit
@@ -63,25 +63,25 @@ public class MappingToolRunner {
                     dbInitConfig.getUser(),
                     dbInitConfig.getPassword(),
                     dbInitConfig.getValidationQuery());
-            
+
             // Note: Hibernate 6 schema export API has changed significantly 
from Hibernate 5.
             // For now, this method logs a warning. To implement full schema 
export:
             // 1. Use Hibernate's SchemaManagementTool with proper 
SourceDescriptor and TargetDescriptor
             // 2. Or use a database migration tool like Flyway/Liquibase
             // 3. Or use hibernate.hbm2ddl.auto=update in development
             // 4. Or use Hibernate's SchemaExport programmatically with proper 
Hibernate 6 API
-            
+
             logger.warn("Schema export via MappingToolRunner is not fully 
implemented for Hibernate 6.");
             logger.warn("Consider using hibernate.hbm2ddl.auto=update or a 
migration tool like Flyway/Liquibase.");
             logger.warn("Requested output file: {}", outputFile);
-            
+
             // TODO: Implement proper Hibernate 6 schema export API
             // The API requires:
             // - SourceDescriptor for source metadata
             // - TargetDescriptor for output target
             // - Proper ExecutionOptions
             // See: org.hibernate.tool.schema.spi.SchemaManagementTool
-            
+
         } catch (Exception ex) {
             logger.error("Failed to generate schema DDL script", ex);
             throw new RuntimeException("Failed to generate schema DDL script 
using Hibernate", ex);
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 b0b263568f..a250432b6c 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
@@ -19,6 +19,8 @@
 */
 package org.apache.airavata.security;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -55,7 +57,6 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
-import org.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -112,6 +113,7 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
     private final AiravataServerProperties properties;
     private final AuthzCacheManagerFactory authzCacheManagerFactory;
     private final GatewayGroupsInitializer gatewayGroupsInitializer;
+    private final ObjectMapper objectMapper = new ObjectMapper();
 
     public KeyCloakSecurityManager(
             RegistryService registryService,
@@ -245,9 +247,9 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
             initServiceClients();
             Gateway gateway = registryService.getGateway(gatewayId);
             String tokenURL = getTokenEndpoint(gatewayId);
-            JSONObject clientCredentials =
+            JsonNode clientCredentials =
                     getClientCredentials(tokenURL, gateway.getOauthClientId(), 
gateway.getOauthClientSecret());
-            String accessToken = clientCredentials.getString("access_token");
+            String accessToken = 
clientCredentials.get("access_token").asText();
             AuthzToken authzToken = new AuthzToken(accessToken);
             authzToken.putToClaimsMap(Constants.GATEWAY_ID, gatewayId);
             authzToken.putToClaimsMap(Constants.USER_NAME, 
gateway.getOauthClientId());
@@ -277,16 +279,16 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
         GatewayResourceProfile gwrp = 
registryService.getGatewayResourceProfile(gatewayId);
         String identityServerRealm = gwrp.getIdentityServerTenant();
         String openIdConnectUrl = 
getOpenIDConfigurationUrl(identityServerRealm);
-        JSONObject openIdConnectConfig = new 
JSONObject(getFromUrl(openIdConnectUrl, null));
-        String userInfoEndPoint = 
openIdConnectConfig.getString("userinfo_endpoint");
-        JSONObject userInfo = new JSONObject(getFromUrl(userInfoEndPoint, 
token));
+        JsonNode openIdConnectConfig = 
objectMapper.readTree(getFromUrl(openIdConnectUrl, null));
+        String userInfoEndPoint = 
openIdConnectConfig.get("userinfo_endpoint").asText();
+        JsonNode userInfo = objectMapper.readTree(getFromUrl(userInfoEndPoint, 
token));
         return new UserInfo()
-                .setSub(userInfo.getString("sub"))
-                .setFullName(userInfo.getString("name"))
-                .setFirstName(userInfo.getString("given_name"))
-                .setLastName(userInfo.getString("family_name"))
-                .setEmailAddress(userInfo.getString("email"))
-                .setUsername(userInfo.getString("preferred_username"));
+                .setSub(userInfo.get("sub").asText())
+                .setFullName(userInfo.get("name").asText())
+                .setFirstName(userInfo.get("given_name").asText())
+                .setLastName(userInfo.get("family_name").asText())
+                .setEmailAddress(userInfo.get("email").asText())
+                .setUsername(userInfo.get("preferred_username").asText());
     }
 
     private GatewayGroupMembership getGatewayGroupMembership(String username, 
String token, String gatewayId)
@@ -344,11 +346,11 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
 
     private String getTokenEndpoint(String gatewayId) throws Exception {
         String openIdConnectUrl = getOpenIDConfigurationUrl(gatewayId);
-        JSONObject openIdConnectConfig = new 
JSONObject(getFromUrl(openIdConnectUrl, null));
-        return openIdConnectConfig.getString("token_endpoint");
+        JsonNode openIdConnectConfig = 
objectMapper.readTree(getFromUrl(openIdConnectUrl, null));
+        return openIdConnectConfig.get("token_endpoint").asText();
     }
 
-    public JSONObject getClientCredentials(String tokenURL, String clientId, 
String clientSecret) throws IOException {
+    public JsonNode getClientCredentials(String tokenURL, String clientId, 
String clientSecret) throws IOException {
 
         CloseableHttpClient httpClient = HttpClients.createSystem();
 
@@ -362,7 +364,7 @@ public class KeyCloakSecurityManager implements 
AiravataSecurityManager {
         httpPost.setEntity(entity);
         try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
             String responseBody = EntityUtils.toString(response.getEntity());
-            return new JSONObject(responseBody);
+            return objectMapper.readTree(responseBody);
         } catch (IOException e) {
             throw new RuntimeException(e);
         } finally {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/interceptor/SecurityModule.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/interceptor/SecurityModule.java
index 2e143b7b39..560466b00d 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/interceptor/SecurityModule.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/interceptor/SecurityModule.java
@@ -11,7 +11,8 @@
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
-* software distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY
+* 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.
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
index 063775e5e4..0312f3f1d2 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/userstore/JDBCUserStore.java
@@ -11,7 +11,8 @@
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
-* software distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY
+* 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.
@@ -59,9 +60,9 @@ public class JDBCUserStore extends AbstractJDBCUserStore {
     public boolean authenticate(String userName, Object credentials) throws 
UserStoreException {
         try {
             String password = passwordDigester.getPasswordHashValue((String) 
credentials);
-            UsernamePasswordAuthenticationToken authRequest = 
-                new UsernamePasswordAuthenticationToken(userName, password);
-            
+            UsernamePasswordAuthenticationToken authRequest =
+                    new UsernamePasswordAuthenticationToken(userName, 
password);
+
             Authentication authentication = 
authenticationProvider.authenticate(authRequest);
             return authentication != null && authentication.isAuthenticated();
         } catch (BadCredentialsException e) {
@@ -155,12 +156,13 @@ public class JDBCUserStore extends AbstractJDBCUserStore {
     protected void initializeDatabaseLookup(String passwordColumn, String 
userTable, String userNameColumn)
             throws ApplicationSettingsException, UserStoreException {
         try {
-            DBUtil dbUtil = new DBUtil(getDatabaseURL(), 
getDatabaseUserName(), getDatabasePassword(), getDatabaseDriver());
+            DBUtil dbUtil =
+                    new DBUtil(getDatabaseURL(), getDatabaseUserName(), 
getDatabasePassword(), getDatabaseDriver());
             dataSource = dbUtil.getDataSource();
 
             // Create user details service
-            UserDetailsService userDetailsService = new JdbcUserDetailsService(
-                dataSource, userTable, userNameColumn, passwordColumn);
+            UserDetailsService userDetailsService =
+                    new JdbcUserDetailsService(dataSource, userTable, 
userNameColumn, passwordColumn);
 
             // Create password encoder adapter
             PasswordEncoder passwordEncoder = new 
PasswordDigesterEncoder(passwordDigester);
@@ -188,8 +190,8 @@ public class JDBCUserStore extends AbstractJDBCUserStore {
         private final String userNameColumn;
         private final String passwordColumn;
 
-        public JdbcUserDetailsService(DataSource dataSource, String userTable, 
-                                     String userNameColumn, String 
passwordColumn) {
+        public JdbcUserDetailsService(
+                DataSource dataSource, String userTable, String 
userNameColumn, String passwordColumn) {
             this.jdbcTemplate = new JdbcTemplate(dataSource);
             this.userTable = userTable;
             this.userNameColumn = userNameColumn;
@@ -198,18 +200,17 @@ public class JDBCUserStore extends AbstractJDBCUserStore {
 
         @Override
         public UserDetails loadUserByUsername(String username) throws 
UsernameNotFoundException {
-            String sql = String.format("SELECT %s FROM %s WHERE %s = ?", 
-                passwordColumn, userTable, userNameColumn);
-            
+            String sql = String.format("SELECT %s FROM %s WHERE %s = ?", 
passwordColumn, userTable, userNameColumn);
+
             try {
                 String password = jdbcTemplate.queryForObject(sql, 
String.class, username);
                 if (password == null) {
                     throw new UsernameNotFoundException("User not found: " + 
username);
                 }
                 return User.withUsername(username)
-                    .password(password)
-                    .authorities("ROLE_USER")
-                    .build();
+                        .password(password)
+                        .authorities("ROLE_USER")
+                        .build();
             } catch (org.springframework.dao.EmptyResultDataAccessException e) 
{
                 throw new UsernameNotFoundException("User not found: " + 
username, e);
             }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
 
b/airavata-api/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
index f948335351..6b0abeafc1 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/security/userstore/LDAPUserStore.java
@@ -11,7 +11,8 @@
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
-* software distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY
+* 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.
@@ -51,9 +52,9 @@ public class LDAPUserStore implements UserStore {
     public boolean authenticate(String userName, Object credentials) throws 
UserStoreException {
         try {
             String password = passwordDigester.getPasswordHashValue((String) 
credentials);
-            UsernamePasswordAuthenticationToken authRequest = 
-                new UsernamePasswordAuthenticationToken(userName, password);
-            
+            UsernamePasswordAuthenticationToken authRequest =
+                    new UsernamePasswordAuthenticationToken(userName, 
password);
+
             Authentication authentication = 
ldapAuthenticationProvider.authenticate(authRequest);
             return authentication != null && authentication.isAuthenticated();
         } catch (BadCredentialsException e) {
@@ -126,8 +127,8 @@ public class LDAPUserStore implements UserStore {
         initializeLDAP(url, systemUser, systemUserPassword, userTemplate);
     }
 
-    protected void initializeLDAP(
-            String ldapUrl, String systemUser, String systemUserPassword, 
String userNameTemplate) throws UserStoreException {
+    protected void initializeLDAP(String ldapUrl, String systemUser, String 
systemUserPassword, String userNameTemplate)
+            throws UserStoreException {
 
         try {
             // Create LDAP context source
@@ -154,8 +155,7 @@ public class LDAPUserStore implements UserStore {
             }
         }
 
-        FilterBasedLdapUserSearch userSearch = new FilterBasedLdapUserSearch(
-            searchBase, searchFilter, contextSource);
+        FilterBasedLdapUserSearch userSearch = new 
FilterBasedLdapUserSearch(searchBase, searchFilter, contextSource);
 
         // Create authenticator
         PasswordComparisonAuthenticator authenticator = new 
PasswordComparisonAuthenticator(contextSource);
@@ -163,8 +163,7 @@ public class LDAPUserStore implements UserStore {
         authenticator.setPasswordEncoder(new 
PasswordDigesterEncoder(passwordDigester));
 
         // Create authorities populator (empty for now - can be extended)
-        DefaultLdapAuthoritiesPopulator authoritiesPopulator = 
-            new DefaultLdapAuthoritiesPopulator(contextSource, "");
+        DefaultLdapAuthoritiesPopulator authoritiesPopulator = new 
DefaultLdapAuthoritiesPopulator(contextSource, "");
 
         // Create authentication provider
         ldapAuthenticationProvider = new 
LdapAuthenticationProvider(authenticator, authoritiesPopulator);
@@ -173,7 +172,8 @@ public class LDAPUserStore implements UserStore {
     /**
      * Password encoder adapter for PasswordDigester
      */
-    private static class PasswordDigesterEncoder implements 
org.springframework.security.crypto.password.PasswordEncoder {
+    private static class PasswordDigesterEncoder
+            implements 
org.springframework.security.crypto.password.PasswordEncoder {
         private final PasswordDigester passwordDigester;
 
         public PasswordDigesterEncoder(PasswordDigester passwordDigester) {
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/service/orchestrator/OrchestratorService.java
 
b/airavata-api/src/main/java/org/apache/airavata/service/orchestrator/OrchestratorService.java
index 19f51674e6..6c52a8aace 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/service/orchestrator/OrchestratorService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/service/orchestrator/OrchestratorService.java
@@ -74,14 +74,13 @@ import org.apache.airavata.messaging.core.Publisher;
 import org.apache.airavata.messaging.core.Subscriber;
 import org.apache.airavata.messaging.core.Type;
 import org.apache.airavata.metascheduler.core.api.ProcessScheduler;
-import org.apache.airavata.model.util.ExperimentModelUtil;
 import org.apache.airavata.orchestrator.exception.OrchestratorException;
 import org.apache.airavata.orchestrator.impl.SimpleOrchestratorImpl;
 import org.apache.airavata.orchestrator.schedule.HostScheduler;
 import org.apache.airavata.orchestrator.utils.OrchestratorConstants;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.service.registry.RegistryService;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.airavata.util.ExperimentModelUtil;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -288,7 +287,7 @@ public class OrchestratorService {
                         filePathList.add(uri);
                     }
                 }
-                pi.setValue(StringUtils.join(filePathList, ','));
+                pi.setValue(String.join(",", filePathList));
             }
         }
     }
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/service/security/CredentialStoreService.java
 
b/airavata-api/src/main/java/org/apache/airavata/service/security/CredentialStoreService.java
index de25c9b136..b15dfe1ee1 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/service/security/CredentialStoreService.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/service/security/CredentialStoreService.java
@@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.util.Base64;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -43,7 +44,6 @@ import org.apache.airavata.credential.model.SummaryType;
 import org.apache.airavata.credential.utils.CredentialStoreDBInitConfig;
 import org.apache.airavata.credential.utils.TokenGenerator;
 import org.apache.airavata.credential.utils.Utility;
-import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -159,8 +159,8 @@ public class CredentialStoreService {
             String token = TokenGenerator.generateToken(
                     certificateCredential.getCommunityUser().getGatewayName(), 
null);
             credential.setToken(token);
-            Base64 encoder = new Base64(64);
-            byte[] decoded = encoder.decode(certificateCredential
+            Base64.Decoder decoder = Base64.getMimeDecoder();
+            byte[] decoded = decoder.decode(certificateCredential
                     .getX509Cert()
                     .replaceAll("-----BEGIN CERTIFICATE-----", "")
                     .replaceAll("-----END CERTIFICATE-----", ""));
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/AppDeploymentUtil.java
 b/airavata-api/src/main/java/org/apache/airavata/util/AppDeploymentUtil.java
similarity index 97%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/AppDeploymentUtil.java
rename to 
airavata-api/src/main/java/org/apache/airavata/util/AppDeploymentUtil.java
index bafad3796a..0d6ee42a77 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/AppDeploymentUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/util/AppDeploymentUtil.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import org.apache.airavata.common.model.ApplicationDeploymentDescription;
 import org.apache.airavata.common.model.SetEnvPaths;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/AppInterfaceUtil.java
 b/airavata-api/src/main/java/org/apache/airavata/util/AppInterfaceUtil.java
similarity index 98%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/AppInterfaceUtil.java
rename to 
airavata-api/src/main/java/org/apache/airavata/util/AppInterfaceUtil.java
index 09b90a0f10..bc88b5b081 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/AppInterfaceUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/util/AppInterfaceUtil.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import java.util.List;
 import org.apache.airavata.common.model.ApplicationInterfaceDescription;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ExecutionType.java 
b/airavata-api/src/main/java/org/apache/airavata/util/ExecutionType.java
similarity index 95%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/ExecutionType.java
rename to airavata-api/src/main/java/org/apache/airavata/util/ExecutionType.java
index a5e63fec50..88ca942892 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ExecutionType.java
+++ b/airavata-api/src/main/java/org/apache/airavata/util/ExecutionType.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 public enum ExecutionType {
     UNKNOWN,
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ExperimentModelUtil.java
 b/airavata-api/src/main/java/org/apache/airavata/util/ExperimentModelUtil.java
similarity index 99%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/ExperimentModelUtil.java
rename to 
airavata-api/src/main/java/org/apache/airavata/util/ExperimentModelUtil.java
index d32cbaac9d..922a59c7b5 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ExperimentModelUtil.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/util/ExperimentModelUtil.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import java.util.List;
 import org.apache.airavata.common.model.ComputationalResourceSchedulingModel;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java
 
b/airavata-api/src/main/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtil.java
similarity index 98%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java
rename to 
airavata-api/src/main/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtil.java
index 92c5fe41a7..77c5d40e2d 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtil.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtil.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import org.apache.airavata.common.model.ComputeResourceReservation;
 import org.apache.airavata.common.model.ComputeResourceType;
diff --git 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ProjectModelUtil.java
 b/airavata-api/src/main/java/org/apache/airavata/util/ProjectModelUtil.java
similarity index 96%
rename from 
airavata-api/src/main/java/org/apache/airavata/model/util/ProjectModelUtil.java
rename to 
airavata-api/src/main/java/org/apache/airavata/util/ProjectModelUtil.java
index 6a6e85e170..367392a86b 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/model/util/ProjectModelUtil.java
+++ b/airavata-api/src/main/java/org/apache/airavata/util/ProjectModelUtil.java
@@ -17,7 +17,7 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import org.apache.airavata.common.model.Project;
 
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/client/TestSSLClient.java
 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/client/TestSSLClient.java
index 0dcfc80845..55d59830d6 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/client/TestSSLClient.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/client/TestSSLClient.java
@@ -23,11 +23,11 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
+import java.util.Base64;
 import org.apache.airavata.credential.model.CertificateCredential;
 import org.apache.airavata.credential.model.CommunityUser;
 import org.apache.airavata.credential.model.SSHCredential;
 import org.apache.airavata.service.security.CredentialStoreService;
-import org.apache.commons.codec.binary.Base64;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -81,11 +81,11 @@ public class TestSSLClient {
             char[] password = "airavata".toCharArray();
             ks.load(fis, password);
             x509Certificates[0] = (X509Certificate) 
ks.getCertificate("airavata");
-            Base64 encoder = new Base64(64);
+            Base64.Encoder encoder = Base64.getMimeEncoder(64, 
"\n".getBytes());
             String cert_begin = "-----BEGIN CERTIFICATE-----\n";
             String end_cert = "-----END CERTIFICATE-----";
             byte[] derCert = x509Certificates[0].getEncoded();
-            String pemCertPre = new String(encoder.encode(derCert));
+            String pemCertPre = encoder.encodeToString(derCert);
             String pemCert = cert_begin + pemCertPre + end_cert;
             certificateCredential.setX509Cert(pemCert);
             String token = 
credentialService.addCertificateCredential(certificateCredential);
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/server/TestOrchestratorServiceServer.java
 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/server/TestOrchestratorServiceServer.java
index 8e0f31da4c..ab1e23cbe1 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/server/TestOrchestratorServiceServer.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/server/TestOrchestratorServiceServer.java
@@ -28,11 +28,11 @@ import org.apache.airavata.common.model.InputDataObjectType;
 import org.apache.airavata.common.model.OutputDataObjectType;
 import org.apache.airavata.common.model.UserConfigurationDataModel;
 import org.apache.airavata.config.AiravataServerProperties;
-import org.apache.airavata.model.util.ExperimentModelUtil;
 import org.apache.airavata.orchestrator.exception.OrchestratorException;
 import org.apache.airavata.registry.exception.RegistryServiceException;
 import org.apache.airavata.service.orchestrator.OrchestratorService;
 import org.apache.airavata.service.registry.RegistryService;
+import org.apache.airavata.util.ExperimentModelUtil;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/util/ThriftClientPoolTest.java
 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/util/ThriftClientPoolTest.java
index 8700d21e45..6e3e8d2aa5 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/api/thrift/util/ThriftClientPoolTest.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/api/thrift/util/ThriftClientPoolTest.java
@@ -19,138 +19,57 @@
 */
 package org.apache.airavata.api.thrift.util;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import org.apache.airavata.api.model.BaseAPI;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.utils.ApplicationSettings;
-import org.apache.commons.pool2.impl.AbandonedConfig;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.thrift.TException;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TTransport;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.bean.override.mockito.MockitoBean;
 
-@SpringBootTest(
-        classes = {org.apache.airavata.config.JpaConfig.class, 
ThriftClientPoolTest.TestConfiguration.class},
-        properties = {
-            "spring.main.allow-bean-definition-overriding=true",
-            
"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration"
-        })
-@TestPropertySource(locations = "classpath:airavata.properties")
 public class ThriftClientPoolTest {
 
-    @MockitoBean
     private BaseAPI.Client mockClient;
-
-    public ThriftClientPoolTest(BaseAPI.Client mockClient) {
-        this.mockClient = mockClient;
+    private TProtocol mockInputProtocol;
+    private TProtocol mockOutputProtocol;
+    private TTransport mockInputTransport;
+    private TTransport mockOutputTransport;
+
+    @BeforeEach
+    public void setUp() {
+        mockClient = mock(BaseAPI.Client.class);
+        mockInputProtocol = mock(TProtocol.class);
+        mockOutputProtocol = mock(TProtocol.class);
+        mockInputTransport = mock(TTransport.class);
+        mockOutputTransport = mock(TTransport.class);
+
+        when(mockClient.getInputProtocol()).thenReturn(mockInputProtocol);
+        when(mockClient.getOutputProtocol()).thenReturn(mockOutputProtocol);
+        when(mockInputProtocol.getTransport()).thenReturn(mockInputTransport);
+        
when(mockOutputProtocol.getTransport()).thenReturn(mockOutputTransport);
+        when(mockInputTransport.isOpen()).thenReturn(true);
+        when(mockOutputTransport.isOpen()).thenReturn(true);
     }
 
     @Test
     public void testWithDefaultConfig() throws TException {
         when(mockClient.getAPIVersion()).thenReturn("0.19");
-        
when(mockClient.getInputProtocol().getTransport().isOpen()).thenReturn(true);
-        
when(mockClient.getOutputProtocol().getTransport().isOpen()).thenReturn(true);
 
-        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new 
GenericObjectPoolConfig<>();
-        ThriftClientPool<BaseAPI.Client> thriftClientPool =
-                new ThriftClientPool<>((protocol) -> mockClient, () -> null, 
poolConfig);
-        BaseAPI.Client client = thriftClientPool.getResource();
+        var poolConfig = new ThriftClientPool.PoolConfig();
+        var mockProtocol = mock(TProtocol.class);
+        var thriftClientPool = new ThriftClientPool<>((protocol) -> 
mockClient, () -> mockProtocol, poolConfig);
+        var client = thriftClientPool.getResource();
         thriftClientPool.returnResource(client);
         thriftClientPool.close();
 
-        verify(mockClient.getInputProtocol().getTransport()).close();
-        verify(mockClient.getOutputProtocol().getTransport()).close();
-    }
-
-    @Test
-    public void testWithAbandonConfigAndAbandoned() throws TException {
-
-        when(mockClient.getAPIVersion()).thenReturn("0.19");
-        
when(mockClient.getInputProtocol().getTransport().isOpen()).thenReturn(true);
-        
when(mockClient.getOutputProtocol().getTransport().isOpen()).thenReturn(true);
-
-        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new 
GenericObjectPoolConfig<>();
-        // timeBetweenEvictionRunsMillis must be positive for abandoned 
removal on
-        // maintenance to run
-        poolConfig.setTimeBetweenEvictionRunsMillis(1);
-        AbandonedConfig abandonedConfig = new AbandonedConfig();
-        abandonedConfig.setRemoveAbandonedTimeout(1);
-        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-        abandonedConfig.setLogAbandoned(true);
-        StringWriter log = new StringWriter();
-        assertEquals(0, log.toString().length(), "Initial length of log is 0");
-        PrintWriter logWriter = new PrintWriter(log);
-        abandonedConfig.setLogWriter(logWriter);
-        ThriftClientPool<BaseAPI.Client> thriftClientPool =
-                new ThriftClientPool<>((protocol) -> mockClient, () -> null, 
poolConfig, abandonedConfig);
-        thriftClientPool.getResource();
-        try {
-            // Sleep long enough for the client to be considered abandoned
-            Thread.sleep(1001);
-            thriftClientPool.close();
-        } catch (InterruptedException e) {
-            fail("sleep interrupted");
-        }
-
-        assertTrue(log.toString().length() > 0);
-        // The stack trace should contain this method's name
-        
assertTrue(log.toString().contains("testWithAbandonConfigAndAbandoned"));
-
-        // Verify client is destroyed when abandoned
-        verify(mockClient.getInputProtocol().getTransport(), times(1)).close();
-        verify(mockClient.getOutputProtocol().getTransport(), 
times(1)).close();
-    }
-
-    @Test
-    public void testWithAbandonConfigAndAbandonedAndNotLogged() throws 
TException {
-
-        when(mockClient.getAPIVersion()).thenReturn("0.19");
-        
when(mockClient.getInputProtocol().getTransport().isOpen()).thenReturn(true);
-        
when(mockClient.getOutputProtocol().getTransport().isOpen()).thenReturn(true);
-
-        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new 
GenericObjectPoolConfig<>();
-        // timeBetweenEvictionRunsMillis must be positive for abandoned 
removal on
-        // maintenance to run
-        poolConfig.setTimeBetweenEvictionRunsMillis(1);
-        AbandonedConfig abandonedConfig = new AbandonedConfig();
-        abandonedConfig.setRemoveAbandonedTimeout(1);
-        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
-        abandonedConfig.setLogAbandoned(false);
-        // Setup log writer so we can verify that nothing was logged
-        StringWriter log = new StringWriter();
-        assertEquals(0, log.toString().length(), "Initial length of log is 0");
-        PrintWriter logWriter = new PrintWriter(log);
-        abandonedConfig.setLogWriter(logWriter);
-        ThriftClientPool<BaseAPI.Client> thriftClientPool =
-                new ThriftClientPool<>((protocol) -> mockClient, () -> null, 
poolConfig, abandonedConfig);
-        thriftClientPool.getResource();
-        try {
-            // Sleep long enough for the client to be considered abandoned
-            Thread.sleep(1001);
-            thriftClientPool.close();
-        } catch (InterruptedException e) {
-            fail("sleep interrupted");
-        }
-
-        // Verify that nothing was logged
-        assertEquals(0, log.toString().length());
-
-        // Verify client is destroyed when abandoned
-        verify(mockClient.getInputProtocol().getTransport(), times(1)).close();
-        verify(mockClient.getOutputProtocol().getTransport(), 
times(1)).close();
+        verify(mockInputTransport).close();
+        verify(mockOutputTransport).close();
     }
 
     /**
@@ -163,44 +82,17 @@ public class ThriftClientPoolTest {
     @Test
     @Disabled("Test requires long wait time to account for default 
removeAbandonedTimeout")
     public void testWithDefaultAbandonedRemovalEnabled() throws TException, 
ApplicationSettingsException {
-
         when(mockClient.getAPIVersion()).thenReturn("0.19");
-        
when(mockClient.getInputProtocol().getTransport().isOpen()).thenReturn(true);
-        
when(mockClient.getOutputProtocol().getTransport().isOpen()).thenReturn(true);
 
-        GenericObjectPoolConfig<BaseAPI.Client> poolConfig = new 
GenericObjectPoolConfig<>();
-        // timeBetweenEvictionRunsMillis must be positive for abandoned 
removal on
-        // maintenance to run
+        var poolConfig = new ThriftClientPool.PoolConfig();
         poolConfig.setTimeBetweenEvictionRunsMillis(1);
-        
ApplicationSettings.setSetting("airavata.thrift-client-pool-abandoned-removal-enabled",
 "true");
-        ThriftClientPool<BaseAPI.Client> thriftClientPool =
-                new ThriftClientPool<>((protocol) -> mockClient, () -> null, 
poolConfig);
+        var mockProtocol = mock(TProtocol.class);
+        var thriftClientPool = new ThriftClientPool<>((protocol) -> 
mockClient, () -> mockProtocol, poolConfig);
         thriftClientPool.getResource();
-        try {
-            // Sleep long enough for the client to be considered abandoned
-            // Default removeAbandonedTimeout is 300 seconds
-            Thread.sleep(new AbandonedConfig().getRemoveAbandonedTimeout() * 
1000 + 1);
-            thriftClientPool.close();
-        } catch (InterruptedException e) {
-            fail("sleep interrupted");
-        }
+        thriftClientPool.close();
 
-        // Verify client is destroyed when abandoned
-        verify(mockClient.getInputProtocol().getTransport(), times(1)).close();
-        verify(mockClient.getOutputProtocol().getTransport(), 
times(1)).close();
+        // Verify client is destroyed when pool is closed
+        verify(mockInputTransport, times(1)).close();
+        verify(mockOutputTransport, times(1)).close();
     }
-
-    @org.springframework.context.annotation.Configuration
-    @ComponentScan(
-            basePackages = {"org.apache.airavata.api", 
"org.apache.airavata.config"},
-            excludeFilters = {
-                @org.springframework.context.annotation.ComponentScan.Filter(
-                        type = 
org.springframework.context.annotation.FilterType.ASSIGNABLE_TYPE,
-                        classes = {
-                            
org.apache.airavata.config.BackgroundServicesLauncher.class,
-                            
org.apache.airavata.config.ThriftServerLauncher.class
-                        })
-            })
-    @Import(org.apache.airavata.config.AiravataPropertiesConfiguration.class)
-    static class TestConfiguration {}
 }
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/config/SchemaValidationTest.java
 
b/airavata-api/src/test/java/org/apache/airavata/config/SchemaValidationTest.java
index 721bc5f036..823b3fc2a4 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/config/SchemaValidationTest.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/config/SchemaValidationTest.java
@@ -19,6 +19,9 @@
 */
 package org.apache.airavata.config;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.Persistence;
 import java.sql.Connection;
@@ -32,12 +35,9 @@ import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.fail;
-
 /**
  * Test to validate that Hibernate entities match the database schema defined 
in ddl.sql.
- * 
+ *
  * This test:
  * 1. Loads the DDL SQL file
  * 2. Creates an in-memory H2 database with the schema from DDL
@@ -69,7 +69,7 @@ public class SchemaValidationTest {
         } catch (ClassNotFoundException e) {
             throw new IllegalStateException("H2 database driver not found. 
Ensure h2 dependency is in test scope.", e);
         }
-        
+
         // Create in-memory H2 database
         // Note: Hibernate validate mode will check entity mappings against 
the database schema.
         // For this test, we're primarily validating that:
@@ -81,7 +81,7 @@ public class SchemaValidationTest {
         // set up with the schema from ddl.sql, and this test will validate 
entities match.
         jdbcUrl = 
"jdbc:h2:mem:schema_validation_test;DB_CLOSE_DELAY=-1;MODE=MySQL";
         h2Connection = DriverManager.getConnection(jdbcUrl, "sa", "");
-        
+
         loadAndExecuteDDL(h2Connection);
     }
 
@@ -94,25 +94,25 @@ public class SchemaValidationTest {
 
     /**
      * Set up database connection for schema validation.
-     * 
+     *
      * Note: Hibernate's validate mode (hibernate.hbm2ddl.auto=validate) will:
      * - Check that tables exist (if schema is present)
      * - Validate column types match entity field types
      * - Verify foreign key constraints
      * - Check that required columns are not null
-     * 
+     *
      * For full validation against ddl.sql:
      * 1. Set up a test database with the schema from ddl.sql
      * 2. Configure the test to use that database connection
      * 3. Hibernate validate mode will then check entities against the actual 
schema
-     * 
+     *
      * This test validates entity structure and mapping correctness.
      * To validate against the full ddl.sql, ensure the database schema is set 
up first.
      */
     private void loadAndExecuteDDL(Connection connection) throws SQLException {
         // For this test, we're primarily validating that:
         // 1. Entity classes are correctly annotated
-        // 2. Entity mappings are syntactically correct  
+        // 2. Entity mappings are syntactically correct
         // 3. Hibernate can process entities without mapping errors
         //
         // Hibernate validate mode requires the schema to exist.
@@ -120,7 +120,7 @@ public class SchemaValidationTest {
         // - Set up a test database with the schema from ddl.sql
         // - Update the jdbcUrl to point to that database
         // - Hibernate will then validate entities against the actual schema
-        
+
         logger.info("Schema validation test initialized");
         logger.info("Using Hibernate validate mode - entities will be 
validated against database schema");
         logger.info("For full ddl.sql validation, ensure database schema 
matches ddl.sql");
@@ -173,7 +173,7 @@ public class SchemaValidationTest {
                 logger.error("✗ Persistence unit '{}' validation failed: {}", 
puName, e.getMessage());
             }
         }
-        
+
         if (failures > 0) {
             fail(String.format("Schema validation failed for %d persistence 
unit(s)", failures));
         }
@@ -181,13 +181,13 @@ public class SchemaValidationTest {
 
     /**
      * Validate a persistence unit against the database schema.
-     * 
+     *
      * Hibernate's validate mode checks:
      * - Entity mappings are syntactically correct
      * - Tables exist (if schema is present)
      * - Column types match
      * - Foreign keys are correctly defined
-     * 
+     *
      * Note: For full validation against ddl.sql, ensure the database schema
      * matches the DDL. This test validates entity structure and mapping 
correctness.
      */
@@ -200,7 +200,7 @@ public class SchemaValidationTest {
             properties.put("jakarta.persistence.jdbc.user", "sa");
             properties.put("jakarta.persistence.jdbc.password", "");
             properties.put("hibernate.dialect", 
"org.hibernate.dialect.H2Dialect");
-            
+
             // Use update mode to create schema from entities
             // This validates that:
             // 1. Entity mappings are syntactically correct
@@ -212,35 +212,35 @@ public class SchemaValidationTest {
             // 2. Change hbm2ddl.auto to "validate"
             // 3. Hibernate will then check entities match the actual schema
             properties.put("hibernate.hbm2ddl.auto", "update");
-            
+
             // For better error messages
             properties.put("hibernate.show_sql", "false");
             properties.put("hibernate.format_sql", "false");
-            
+
             logger.info("Validating persistence unit: {}", 
persistenceUnitName);
-            
+
             // This will throw an exception if:
             // - Entity mappings are invalid
             // - Schema validation fails (tables/columns don't match)
             // - Entity classes have errors
             emf = Persistence.createEntityManagerFactory(persistenceUnitName, 
properties);
-            
+
             assertNotNull(emf, "EntityManagerFactory should be created");
             assertNotNull(emf.getMetamodel(), "Metamodel should be available");
-            
+
             // Try to access the metamodel to ensure it's fully initialized
             var entities = emf.getMetamodel().getEntities();
             assertNotNull(entities, "Entities should be available in 
metamodel");
-            
-            logger.info("✓ Persistence unit '{}' schema validation passed ({} 
entities)", 
-                    persistenceUnitName, entities.size());
-            
+
+            logger.info(
+                    "✓ Persistence unit '{}' schema validation passed ({} 
entities)",
+                    persistenceUnitName,
+                    entities.size());
+
         } catch (jakarta.persistence.PersistenceException e) {
             // Hibernate validation errors are wrapped in PersistenceException
             String errorMsg = String.format(
-                    "Schema validation failed for persistence unit '%s': %s",
-                    persistenceUnitName,
-                    e.getMessage());
+                    "Schema validation failed for persistence unit '%s': %s", 
persistenceUnitName, e.getMessage());
             if (e.getCause() != null) {
                 errorMsg += " (Caused by: " + e.getCause().getMessage() + ")";
             }
@@ -248,9 +248,7 @@ public class SchemaValidationTest {
             fail(errorMsg, e);
         } catch (Exception e) {
             String errorMsg = String.format(
-                    "Unexpected error validating persistence unit '%s': %s",
-                    persistenceUnitName,
-                    e.getMessage());
+                    "Unexpected error validating persistence unit '%s': %s", 
persistenceUnitName, e.getMessage());
             logger.error(errorMsg, e);
             fail(errorMsg, e);
         } finally {
@@ -260,4 +258,3 @@ public class SchemaValidationTest {
         }
     }
 }
-
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/security/KeyCloakSecurityManagerTest.java
 
b/airavata-api/src/test/java/org/apache/airavata/security/KeyCloakSecurityManagerTest.java
index ffd7e1a67b..cc4c0b4da1 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/security/KeyCloakSecurityManagerTest.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/security/KeyCloakSecurityManagerTest.java
@@ -41,6 +41,7 @@ import 
org.apache.airavata.security.authzcache.AuthzCachedStatus;
 import org.apache.airavata.security.model.AuthzToken;
 import org.apache.airavata.service.SharingRegistryService;
 import org.apache.airavata.service.registry.RegistryService;
+import org.apache.airavata.service.security.CredentialStoreService;
 import org.apache.airavata.sharing.model.UserGroup;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -49,6 +50,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.FilterType;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.bean.override.mockito.MockitoBean;
@@ -73,11 +75,11 @@ public class KeyCloakSecurityManagerTest {
     @MockitoBean
     private AuthzCacheManager mockAuthzCacheManager;
 
-    private final KeyCloakSecurityManager keyCloakSecurityManager;
+    @MockitoBean
+    private CredentialStoreService mockCredentialStoreService;
 
-    public KeyCloakSecurityManagerTest(KeyCloakSecurityManager 
keyCloakSecurityManager) {
-        this.keyCloakSecurityManager = keyCloakSecurityManager;
-    }
+    @Autowired
+    private KeyCloakSecurityManager keyCloakSecurityManager;
 
     @Configuration
     @ComponentScan(
diff --git 
a/airavata-api/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java
 
b/airavata-api/src/test/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtilTest.java
similarity index 98%
rename from 
airavata-api/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java
rename to 
airavata-api/src/test/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtilTest.java
index e1c8983506..7be133ed8d 100644
--- 
a/airavata-api/src/test/java/org/apache/airavata/model/util/GroupComputeResourcePreferenceUtilTest.java
+++ 
b/airavata-api/src/test/java/org/apache/airavata/util/GroupComputeResourcePreferenceUtilTest.java
@@ -17,13 +17,14 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.model.util;
+package org.apache.airavata.util;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import org.apache.airavata.common.model.ComputeResourceReservation;
 import org.apache.airavata.common.model.GroupComputeResourcePreference;
+import org.apache.airavata.util.GroupComputeResourcePreferenceUtil;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
index 0527542eab..196afcdc58 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
@@ -19,16 +19,14 @@
 */
 package org.apache.airavata.agent.connection.service.db.entity;
 
-import org.hibernate.annotations.GenericGenerator;
-
+import jakarta.persistence.CascadeType;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
-
-import jakarta.persistence.CascadeType;
 import jakarta.persistence.FetchType;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
 import jakarta.persistence.ManyToOne;
+import org.hibernate.annotations.GenericGenerator;
 
 @Entity(name = "AGENT_EXECUTION_STATUS")
 public class AgentExecutionStatus {
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
index 775383b9d4..868f3936f6 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
@@ -27,7 +27,6 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 import net.devh.boot.grpc.server.service.GrpcService;
-
 import org.apache.airavata.agent.AgentCommunicationServiceGrpc;
 import org.apache.airavata.agent.AgentMessage;
 import org.apache.airavata.agent.AgentPing;
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
index 537cf57b83..8d491512aa 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
@@ -24,30 +24,30 @@ import com.google.protobuf.Timestamp;
 import io.grpc.stub.StreamObserver;
 import java.nio.charset.Charset;
 import net.devh.boot.grpc.server.service.GrpcService;
-import org.apache.airavata.fuse.FuseServiceGrpc;
-import org.apache.airavata.fuse.StatFsReq;
-import org.apache.airavata.fuse.StatFsRes;
-import org.apache.airavata.fuse.StatFs;
+import org.apache.airavata.fuse.DirEntry;
+import org.apache.airavata.fuse.FileEntry;
+import org.apache.airavata.fuse.FileInfo;
 import org.apache.airavata.fuse.FileInfoReq;
 import org.apache.airavata.fuse.FileInfoRes;
-import org.apache.airavata.fuse.FileInfo;
+import org.apache.airavata.fuse.FuseServiceGrpc;
+import org.apache.airavata.fuse.InodeAtt;
 import org.apache.airavata.fuse.OpenDirReq;
 import org.apache.airavata.fuse.OpenDirRes;
-import org.apache.airavata.fuse.OpenedDir;
 import org.apache.airavata.fuse.OpenFileReq;
 import org.apache.airavata.fuse.OpenFileRes;
+import org.apache.airavata.fuse.OpenedDir;
 import org.apache.airavata.fuse.OpenedFile;
 import org.apache.airavata.fuse.ReadDirReq;
 import org.apache.airavata.fuse.ReadDirRes;
-import org.apache.airavata.fuse.DirEntry;
 import org.apache.airavata.fuse.ReadFileReq;
 import org.apache.airavata.fuse.ReadFileRes;
-import org.apache.airavata.fuse.FileEntry;
-import org.apache.airavata.fuse.WriteFileReq;
-import org.apache.airavata.fuse.WriteFileRes;
 import org.apache.airavata.fuse.SetInodeAttReq;
 import org.apache.airavata.fuse.SetInodeAttRes;
-import org.apache.airavata.fuse.InodeAtt;
+import org.apache.airavata.fuse.StatFs;
+import org.apache.airavata.fuse.StatFsReq;
+import org.apache.airavata.fuse.StatFsRes;
+import org.apache.airavata.fuse.WriteFileReq;
+import org.apache.airavata.fuse.WriteFileRes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git 
a/modules/registry-db-migrator/src/main/java/org/apache/airavata/registry/tool/DBMigrator.java
 
b/modules/registry-db-migrator/src/main/java/org/apache/airavata/registry/tool/DBMigrator.java
index 908be800be..f471a7cfdf 100644
--- 
a/modules/registry-db-migrator/src/main/java/org/apache/airavata/registry/tool/DBMigrator.java
+++ 
b/modules/registry-db-migrator/src/main/java/org/apache/airavata/registry/tool/DBMigrator.java
@@ -39,12 +39,11 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Scanner;
 import java.util.StringTokenizer;
-
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
-import org.apache.commons.cli.DefaultParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Reply via email to