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

yasith pushed a commit to branch feat/spring-module-reorg
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit c4660dc5dee330bf3408b602c2ce8340dd38cdcb
Author: yasithdev <[email protected]>
AuthorDate: Fri Mar 27 22:12:26 2026 -0500

    refactor: convert research-service from standalone Boot app to plain library
---
 .../research-framework/research-service/pom.xml    |  33 ------
 .../assembly/research-service-bin-assembly.xml     |  76 -------------
 .../airavata/research/service/AiravataService.java |   2 +-
 .../service/ResearchServiceApplication.java        |  34 ------
 .../research/service/config/AuthzTokenFilter.java  | 122 ---------------------
 .../service/config/DevDataInitializer.java         |  11 +-
 .../research/service/config/OpenApiConfig.java     |  90 ---------------
 .../service/config/ResearchProperties.java         |  28 +++++
 .../service/config/ResearchServiceConfig.java      |  15 +++
 .../research/service/config/WebMvcConfig.java      |  43 --------
 .../service/controller/SessionController.java      |   2 +-
 .../research/service/handlers/ProjectHandler.java  |   2 +-
 .../service/handlers/ResearchHubHandler.java       |  34 +++---
 .../research/service/handlers/ResourceHandler.java |   2 +-
 .../research/service/handlers/SessionHandler.java  |   2 +-
 .../research/service/model/UserContext.java        |  62 -----------
 .../src/main/resources/application.yml             |  76 -------------
 17 files changed, 69 insertions(+), 565 deletions(-)

diff --git a/modules/research-framework/research-service/pom.xml 
b/modules/research-framework/research-service/pom.xml
index 1c799544a1..d6796746f4 100644
--- a/modules/research-framework/research-service/pom.xml
+++ b/modules/research-framework/research-service/pom.xml
@@ -31,10 +31,6 @@ under the License.
   <artifactId>research-service</artifactId>
   <name>Airavata Research Service</name>
 
-  <properties>
-    
<research.service.dist.name>apache-airavata-research-service-${project.version}</research.service.dist.name>
-  </properties>
-
   <dependencies>
     <dependency>
       <groupId>org.mariadb.jdbc</groupId>
@@ -173,35 +169,10 @@ under the License.
         </exclusion>
       </exclusions>
     </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-actuator</artifactId>
-    </dependency>
   </dependencies>
 
   <build>
     <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>research-service-distribution-package</id>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <tarLongFileMode>posix</tarLongFileMode>
-              <finalName>${research.service.dist.name}</finalName>
-              <descriptors>
-                
<descriptor>src/main/assembly/research-service-bin-assembly.xml</descriptor>
-              </descriptors>
-              <attach>false</attach>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <plugin>
         <groupId>io.github.ascopes</groupId>
         <artifactId>protobuf-maven-plugin</artifactId>
@@ -235,10 +206,6 @@ under the License.
           <release>17</release>
         </configuration>
       </plugin>
-      <plugin>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-maven-plugin</artifactId>
-      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
diff --git 
a/modules/research-framework/research-service/src/main/assembly/research-service-bin-assembly.xml
 
b/modules/research-framework/research-service/src/main/assembly/research-service-bin-assembly.xml
deleted file mode 100644
index 46bd0b32ff..0000000000
--- 
a/modules/research-framework/research-service/src/main/assembly/research-service-bin-assembly.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-
--->
-<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0";
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-  xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2.0 
http://maven.apache.org/xsd/assembly-2.2.0.xsd";>
-  <id>bin</id>
-  <includeBaseDirectory>true</includeBaseDirectory>
-  <baseDirectory>${research.service.dist.name}</baseDirectory>
-  <formats>
-    <format>tar.gz</format>
-  </formats>
-
-  <fileSets>
-    <fileSet>
-      <directory>src/main/resources/distribution/bin</directory>
-      <outputDirectory>bin</outputDirectory>
-      <fileMode>777</fileMode>
-      <includes>
-        <include>*.sh</include>
-      </includes>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/distribution/conf</directory>
-      <outputDirectory>conf</outputDirectory>
-      <includes>
-        <include>application.yml</include>
-        <include>airavata.p12</include>
-        <include>log4j2.xml</include>
-      </includes>
-    </fileSet>
-    <fileSet>
-      <directory>./</directory>
-      <outputDirectory>logs</outputDirectory>
-      <excludes>
-        <exclude>*/**</exclude>
-      </excludes>
-    </fileSet>
-    <fileSet>
-      <directory>target</directory>
-      <outputDirectory>lib</outputDirectory>
-      <includes>
-        <include>*.jar</include>
-      </includes>
-    </fileSet>
-  </fileSets>
-
-  <dependencySets>
-    <dependencySet>
-      <useProjectArtifact>false</useProjectArtifact>
-      <outputDirectory>lib</outputDirectory>
-      <includes>
-        <include>*</include>
-      </includes>
-    </dependencySet>
-  </dependencySets>
-
-</assembly>
\ No newline at end of file
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
index 67f8493ac6..2dc09ed6a5 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
@@ -21,7 +21,7 @@ package org.apache.airavata.research.service;
 
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.security.profile.client.ProfileServiceClientFactory;
 import org.apache.airavata.service.profile.user.cpi.UserProfileService;
 import 
org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException;
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
deleted file mode 100644
index c24f8e75c6..0000000000
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.airavata.research.service;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-
-@SpringBootApplication
-@EnableJpaRepositories()
-@EnableJpaAuditing
-public class ResearchServiceApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(ResearchServiceApplication.class, args);
-    }
-}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
deleted file mode 100644
index fa55625547..0000000000
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.airavata.research.service.config;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Map;
-import org.apache.airavata.model.security.AuthzToken;
-import org.apache.airavata.model.user.UserProfile;
-import org.apache.airavata.research.service.AiravataService;
-import org.apache.airavata.research.service.model.UserContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-@Component
-public class AuthzTokenFilter extends OncePerRequestFilter {
-
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(AuthzTokenFilter.class);
-    private static final String USERNAME_CLAIM = "userName";
-    private static final String GATEWAY_CLAIM = "gatewayID";
-
-    private final AiravataService airavataService;
-
-    @Value("${airavata.research-hub.url}")
-    private String csHubUrl;
-
-    public AuthzTokenFilter(AiravataService airavataService) {
-        this.airavataService = airavataService;
-    }
-
-    @Override
-    protected boolean shouldNotFilter(HttpServletRequest request) throws 
ServletException {
-        String path = request.getRequestURI();
-
-        if (request.getMethod().equalsIgnoreCase("POST")
-                || request.getMethod().equalsIgnoreCase("PUT")
-                || request.getMethod().equalsIgnoreCase("PATCH")
-                || request.getMethod().equalsIgnoreCase("DELETE")) {
-            return false; // mutation requests should be authenticated
-        }
-
-        return path.startsWith("/swagger")
-                || path.startsWith("/v2/api-docs")
-                || path.startsWith("/v3/api-docs")
-                || path.startsWith("/swagger-ui")
-                || path.startsWith("/swagger-resources")
-                || path.startsWith("/webjars/");
-    }
-
-    @Override
-    protected void doFilterInternal(HttpServletRequest request, 
HttpServletResponse response, FilterChain filterChain)
-            throws ServletException, IOException {
-        try {
-            String authorizationHeader = request.getHeader("Authorization");
-            String xClaimsHeader = request.getHeader("X-Claims");
-
-            if (request.getMethod().equals("OPTIONS")) {
-                filterChain.doFilter(request, response);
-                return;
-            }
-
-            if (authorizationHeader != null && 
authorizationHeader.startsWith("Bearer ") && xClaimsHeader != null) {
-                try {
-                    String accessToken = authorizationHeader.substring(7); // 
Remove "Bearer " prefix
-                    ObjectMapper objectMapper = new ObjectMapper();
-                    Map<String, String> claimsMap = 
objectMapper.readValue(xClaimsHeader, new TypeReference<>() {});
-
-                    AuthzToken authzToken = new AuthzToken();
-                    authzToken.setAccessToken(accessToken);
-                    authzToken.setClaimsMap(claimsMap);
-                    UserContext.setAuthzToken(authzToken);
-
-                    UserProfile userProfile = airavataService.getUserProfile(
-                            authzToken, getClaim(authzToken, USERNAME_CLAIM), 
getClaim(authzToken, GATEWAY_CLAIM));
-                    UserContext.setUser(userProfile);
-                } catch (Exception e) {
-                    LOGGER.error("Invalid authorization data", e);
-                    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, 
"Invalid authorization data");
-                    return;
-                }
-            }
-
-            filterChain.doFilter(request, response);
-        } finally {
-            UserContext.clear();
-        }
-    }
-
-    private static String getClaim(AuthzToken authzToken, String claimId) {
-        return authzToken.getClaimsMap().entrySet().stream()
-                .filter(entry -> entry.getKey().equalsIgnoreCase(claimId))
-                .map(Map.Entry::getValue)
-                .findFirst()
-                .orElseThrow(() ->
-                        new IllegalArgumentException("Missing '" + claimId + 
"' claim in the authentication token"));
-    }
-}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
index ceb321fbbf..8576d0b214 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
@@ -30,7 +30,6 @@ import org.apache.airavata.research.service.model.entity.Tag;
 import org.apache.airavata.research.service.model.repo.ProjectRepository;
 import org.apache.airavata.research.service.model.repo.ResourceRepository;
 import org.apache.airavata.research.service.model.repo.TagRepository;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
@@ -42,15 +41,17 @@ public class DevDataInitializer implements 
CommandLineRunner {
     private final ProjectRepository projectRepository;
     private final ResourceRepository resourceRepository;
     private final TagRepository tagRepository;
-
-    @Value("${airavata.research-hub.dev-user}")
-    private String devUserEmail;
+    private final ResearchProperties researchProperties;
 
     public DevDataInitializer(
-            ProjectRepository projectRepository, ResourceRepository 
resourceRepository, TagRepository tagRepository) {
+            ProjectRepository projectRepository,
+            ResourceRepository resourceRepository,
+            TagRepository tagRepository,
+            ResearchProperties researchProperties) {
         this.projectRepository = projectRepository;
         this.resourceRepository = resourceRepository;
         this.tagRepository = tagRepository;
+        this.researchProperties = researchProperties;
     }
 
     private void createProject(
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/OpenApiConfig.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/OpenApiConfig.java
deleted file mode 100644
index db49d784c5..0000000000
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/OpenApiConfig.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.airavata.research.service.config;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.info.Info;
-import io.swagger.v3.oas.models.media.StringSchema;
-import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.security.OAuthFlow;
-import io.swagger.v3.oas.models.security.OAuthFlows;
-import io.swagger.v3.oas.models.security.Scopes;
-import io.swagger.v3.oas.models.security.SecurityRequirement;
-import io.swagger.v3.oas.models.security.SecurityScheme;
-import org.springdoc.core.customizers.OpenApiCustomizer;
-import org.springdoc.core.models.GroupedOpenApi;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class OpenApiConfig {
-
-    @Value("${airavata.openid.url}")
-    private String openIdConfigURL;
-
-    @Bean
-    public GroupedOpenApi publicApi() {
-        return GroupedOpenApi.builder()
-                .group("public")
-                .pathsToMatch("/api/**")
-                .addOpenApiCustomizer(globalHeaderCustomizer())
-                .build();
-    }
-
-    @Bean
-    public OpenAPI researchServiceOpenAPI() {
-        return new OpenAPI()
-                .info(new Info().title("Research Service 
API").version("1.0.0"))
-                .addSecurityItem(new 
SecurityRequirement().addList("oauth2-pkce"))
-                .components(new io.swagger.v3.oas.models.Components()
-                        .addSecuritySchemes(
-                                "oauth2-pkce",
-                                new SecurityScheme()
-                                        .type(SecurityScheme.Type.OAUTH2)
-                                        .flows(new OAuthFlows()
-                                                .authorizationCode(new 
OAuthFlow()
-                                                        .authorizationUrl(
-                                                                
openIdConfigURL + "/protocol/openid-connect/auth")
-                                                        
.tokenUrl(openIdConfigURL + "/protocol/openid-connect/token")
-                                                        .scopes(new Scopes()
-                                                                
.addString("openid", "openid")
-                                                                
.addString("email", "email"))))));
-    }
-
-    @Bean
-    public OpenApiCustomizer globalHeaderCustomizer() {
-        System.out.println("Applying global header customizer...");
-        return openApi -> {
-            Parameter claimsHeader = new Parameter()
-                    .in("header")
-                    .schema(new StringSchema())
-                    .name("X-Claims")
-                    .description("{userName: ..., gatewayID: ...}")
-                    .required(false);
-
-            openApi.getPaths().values().forEach(pathItem -> {
-                pathItem.readOperations().forEach(operation -> {
-                    operation.addParametersItem(claimsHeader);
-                });
-            });
-        };
-    }
-}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java
new file mode 100644
index 0000000000..f289ecabe1
--- /dev/null
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java
@@ -0,0 +1,28 @@
+package org.apache.airavata.research.service.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "airavata.research")
+public class ResearchProperties {
+    private String hubUrl;
+    private String portalUrl;
+    private String devUrl;
+    private String devUser;
+    private String adminApiKey;
+    private int limit = 10;
+
+    public String getHubUrl() { return hubUrl; }
+    public void setHubUrl(String hubUrl) { this.hubUrl = hubUrl; }
+    public String getPortalUrl() { return portalUrl; }
+    public void setPortalUrl(String portalUrl) { this.portalUrl = portalUrl; }
+    public String getDevUrl() { return devUrl; }
+    public void setDevUrl(String devUrl) { this.devUrl = devUrl; }
+    public String getDevUser() { return devUser; }
+    public void setDevUser(String devUser) { this.devUser = devUser; }
+    public String getAdminApiKey() { return adminApiKey; }
+    public void setAdminApiKey(String adminApiKey) { this.adminApiKey = 
adminApiKey; }
+    public int getLimit() { return limit; }
+    public void setLimit(int limit) { this.limit = limit; }
+}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
new file mode 100644
index 0000000000..2ba233945c
--- /dev/null
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
@@ -0,0 +1,15 @@
+package org.apache.airavata.research.service.config;
+
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@ComponentScan(basePackages = "org.apache.airavata.research.service")
+@EntityScan(basePackages = "org.apache.airavata.research.service")
+@EnableJpaRepositories(basePackages = "org.apache.airavata.research.service")
+@EnableJpaAuditing
+public class ResearchServiceConfig {
+}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/WebMvcConfig.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/WebMvcConfig.java
deleted file mode 100644
index 06b393c56a..0000000000
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/WebMvcConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.airavata.research.service.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-@Configuration
-public class WebMvcConfig implements WebMvcConfigurer {
-
-    @Value("${airavata.research-portal.url}")
-    private String deployedOrigin;
-
-    @Value("${airavata.research-portal.dev-url}")
-    private String devOrigin;
-
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        registry.addMapping("/**")
-                .allowedOrigins(deployedOrigin, devOrigin)
-                .allowedMethods("GET", "POST", "OPTIONS", "PATCH", "DELETE", 
"PUT")
-                .allowedHeaders("*");
-    }
-}
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
index 521acad8a5..4396f50c2a 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
@@ -24,7 +24,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.List;
 import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.research.service.handlers.SessionHandler;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
index 9fca965303..0106ebce34 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 import org.apache.airavata.research.service.dto.CreateProjectRequest;
 import org.apache.airavata.research.service.enums.ResourceTypeEnum;
 import org.apache.airavata.research.service.enums.StateEnum;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.DatasetResource;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.RepositoryResource;
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
index 3cecf1c512..c5a583c81c 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
@@ -25,14 +25,14 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.airavata.research.service.enums.SessionStatusEnum;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.DatasetResource;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.apache.airavata.research.service.model.repo.ProjectRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
+import org.apache.airavata.research.service.config.ResearchProperties;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
@@ -53,29 +53,25 @@ public class ResearchHubHandler {
     private final ProjectHandler projectHandler;
     private final SessionHandler sessionHandler;
     private final ProjectRepository projectRepository;
-
-    @Value("${airavata.research-hub.url}")
-    private String csHubUrl;
-
-    @Value("${airavata.research-hub.adminApiKey}")
-    private String adminApiKey;
-
-    @Value("${airavata.research-hub.limit}")
-    private int maxRHubSessions;
+    private final ResearchProperties researchProperties;
 
     public ResearchHubHandler(
-            ProjectHandler projectHandler, SessionHandler sessionHandler, 
ProjectRepository projectRepository) {
+            ProjectHandler projectHandler,
+            SessionHandler sessionHandler,
+            ProjectRepository projectRepository,
+            ResearchProperties researchProperties) {
         this.projectHandler = projectHandler;
         this.sessionHandler = sessionHandler;
         this.projectRepository = projectRepository;
+        this.researchProperties = researchProperties;
     }
 
     public boolean stopSession(String sessionId) {
         String userId = UserContext.userId();
-        String url = String.format(SERVERS_API_URL, csHubUrl, userId, 
sessionId);
+        String url = String.format(SERVERS_API_URL, 
researchProperties.getHubUrl(), userId, sessionId);
 
         HttpHeaders headers = new HttpHeaders();
-        headers.set("Authorization", "token " + adminApiKey);
+        headers.set("Authorization", "token " + 
researchProperties.getAdminApiKey());
         HttpEntity<Void> request = new HttpEntity<>(headers);
 
         ResponseEntity<Void> response = new RestTemplate().exchange(url, 
HttpMethod.DELETE, request, Void.class);
@@ -90,10 +86,10 @@ public class ResearchHubHandler {
 
     public boolean deleteSession(String sessionId) {
         String userId = UserContext.userId();
-        String url = String.format(SERVERS_API_URL, csHubUrl, userId, 
sessionId);
+        String url = String.format(SERVERS_API_URL, 
researchProperties.getHubUrl(), userId, sessionId);
 
         HttpHeaders headers = new HttpHeaders();
-        headers.set("Authorization", "token " + adminApiKey);
+        headers.set("Authorization", "token " + 
researchProperties.getAdminApiKey());
 
         Map<String, Object> body = new HashMap<>();
         body.put("remove", true);
@@ -113,7 +109,7 @@ public class ResearchHubHandler {
     public String spinRHubSession(String projectId, String sessionName) {
         String userId = UserContext.userId();
         int alreadyCreated = 
sessionHandler.countSessionsByUserIdAndStatus(userId, 
SessionStatusEnum.CREATED);
-        if (alreadyCreated >= maxRHubSessions) {
+        if (alreadyCreated >= researchProperties.getLimit()) {
             throw new RuntimeException(
                     "Max number of active sessions (10) has already been 
reached. Please terminate or delete a session to continue.");
         }
@@ -126,7 +122,7 @@ public class ResearchHubHandler {
 
         String baseSpawnUrl = String.format(
                 RH_SPAWN_URL,
-                csHubUrl,
+                researchProperties.getHubUrl(),
                 UserContext.userId(),
                 session.getId(),
                 project.getRepositoryResource().getRepositoryUrl());
@@ -153,7 +149,7 @@ public class ResearchHubHandler {
         // TODO restrict this execution for owner
         Session session = sessionHandler.findSession(sessionId);
 
-        String sessionUrl = String.format(RH_SESSION_URL, csHubUrl, 
UserContext.userId(), session.getId());
+        String sessionUrl = String.format(RH_SESSION_URL, 
researchProperties.getHubUrl(), UserContext.userId(), session.getId());
         LOGGER.debug("Generated the session url: {} for the user: {}", 
sessionUrl, UserContext.userId());
         return sessionUrl;
     }
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
index d76b11aae6..02c30e963e 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
@@ -34,7 +34,7 @@ import org.apache.airavata.research.service.enums.PrivacyEnum;
 import org.apache.airavata.research.service.enums.ResourceTypeEnum;
 import org.apache.airavata.research.service.enums.StateEnum;
 import org.apache.airavata.research.service.enums.StatusEnum;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.RepositoryResource;
 import org.apache.airavata.research.service.model.entity.Resource;
 import org.apache.airavata.research.service.model.entity.ResourceStar;
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
index ae25f0caaf..6c1d442a44 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
@@ -23,7 +23,7 @@ import jakarta.persistence.EntityNotFoundException;
 import java.util.List;
 import java.util.UUID;
 import org.apache.airavata.research.service.enums.SessionStatusEnum;
-import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.apache.airavata.research.service.model.repo.SessionRepository;
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
deleted file mode 100644
index b6c1b52887..0000000000
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.airavata.research.service.model;
-
-import org.apache.airavata.model.security.AuthzToken;
-import org.apache.airavata.model.user.UserProfile;
-
-public class UserContext {
-
-    private static final ThreadLocal<AuthzToken> AUTHZ_TOKEN = new 
ThreadLocal<>();
-    private static final ThreadLocal<UserProfile> CURRENT_USER = new 
ThreadLocal<>();
-
-    public static AuthzToken authzToken() {
-        return AUTHZ_TOKEN.get();
-    }
-
-    public static void setAuthzToken(AuthzToken token) {
-        AUTHZ_TOKEN.set(token);
-    }
-
-    public static UserProfile user() {
-        return CURRENT_USER.get();
-    }
-
-    public static void setUser(UserProfile user) {
-        CURRENT_USER.set(user);
-    }
-
-    public static String userId() {
-        return CURRENT_USER.get().getUserId();
-    }
-
-    public static String gatewayId() {
-        return CURRENT_USER.get().getGatewayId();
-    }
-
-    public static boolean isAuthenticated() {
-        return AUTHZ_TOKEN.get() != null;
-    }
-
-    public static void clear() {
-        AUTHZ_TOKEN.remove();
-        CURRENT_USER.remove();
-    }
-}
diff --git 
a/modules/research-framework/research-service/src/main/resources/application.yml
 
b/modules/research-framework/research-service/src/main/resources/application.yml
deleted file mode 100644
index 64657d99e0..0000000000
--- 
a/modules/research-framework/research-service/src/main/resources/application.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-#  Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-
-grpc:
-  server:
-    port: 19908
-
-server:
-  port: 18889
-  address: localhost
-
-airavata:
-  research-hub:
-    url: http://localhost:20000
-    dev-user: "[email protected]"
-    adminApiKey: "JUPYTER_ADMIN_API_KEY"
-    limit: 10
-  research-portal:
-    url: http://localhost:5173
-    dev-url: http://localhost:5173
-  openid:
-    url: "http://localhost:18080/realms/default";
-  user-profile:
-    server:
-      url: localhost
-      port: 8930
-
-spring:
-  servlet:
-    multipart:
-      max-file-size: 200MB
-      max-request-size: 200MB
-  datasource:
-    url: "jdbc:mariadb://localhost:13306/airavata"
-    username: "airavata"
-    password: "123456"
-    driver-class-name: org.mariadb.jdbc.Driver
-    hikari:
-      pool-name: ResearchCatalogPool
-      leak-detection-threshold: 20000
-  jpa:
-    hibernate:
-      ddl-auto: update
-    open-in-view: false
-
-springdoc:
-  api-docs:
-    enabled: true
-  swagger-ui:
-    path: /swagger-ui.html
-    operationsSorter: alpha
-    tagsSorter: alpha
-    doc-expansion: none
-    oauth:
-      use-pkce-with-authorization-code-grant: true
-      client-id: data-catalog-portal
-
-management:
-  endpoints:
-    web:
-      exposure:
-        include: health
-


Reply via email to