Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .java-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
17
21 changes: 21 additions & 0 deletions Dockerfile_debug
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
FROM eclipse-temurin:23
COPY /build/libs/healenium-backend-*.jar /healenium-backend.jar
CMD java -jar /healenium-backend.jar


LABEL maintainer="healenium"

ENV JAR=healenium-backend.jar
ENV EXECUTABLE=run.sh

WORKDIR /

COPY /build/libs/healenium-backend-*.jar /${JAR}
COPY run.sh /${EXECUTABLE}

RUN chmod +x /${EXECUTABLE}

EXPOSE 7878
EXPOSE 5005

CMD /${EXECUTABLE}
44 changes: 28 additions & 16 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
plugins {
id 'org.springframework.boot' version '3.5.8'
id 'io.spring.dependency-management' version "1.1.4"
id 'org.springframework.boot' version '4.0.4'
id 'io.spring.dependency-management' version "1.1.7"
id 'java'
id 'maven-publish'
id 'jacoco'
}

group 'com.epam.healenium'
version '3.5.0'
version '3.5.1'

ext['hibernate.version'] = '7.3.0.Final'

repositories {
mavenCentral()
Expand All @@ -24,36 +25,42 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-logging'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.retry:spring-retry'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.liquibase:liquibase-core:4.33.0'
implementation 'org.postgresql:postgresql:42.7.7'
implementation 'com.zaxxer:HikariCP:3.3.1'

implementation 'org.springframework.retry:spring-retry:2.0.12'

implementation 'org.springframework.boot:spring-boot-starter-aspectj'
implementation 'org.springframework.boot:spring-boot-starter-liquibase'
implementation 'org.postgresql:postgresql'
implementation 'com.zaxxer:HikariCP'
implementation 'com.vladmihalcea:hibernate-types-52:2.7.0'
implementation 'javax.validation:validation-api:2.0.1.Final'
implementation 'org.yaml:snakeyaml:2.0'
implementation 'com.google.guava:guava:32.1.1-jre'
implementation 'com.epam.healenium:tree-comparing:0.4.14'
implementation 'org.seleniumhq.selenium:selenium-java:4.25.0'
implementation 'org.projectlombok:lombok:1.18.22'
compileOnly 'org.projectlombok:lombok:1.18.44'
implementation 'org.jetbrains:annotations:24.1.0'
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
implementation group: 'io.netty', name: 'netty-handler', version: '4.1.125.Final'
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.5.16'
implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.5.16'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.16.0'

implementation 'org.testcontainers:junit-jupiter:1.19.3'

implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.26.0'
implementation 'commons-io:commons-io:2.15.1'
testImplementation 'org.testcontainers:postgresql:1.19.3'
testImplementation('org.testcontainers:testcontainers:1.19.3')

def testcontainersVersion = '2.0.4'
testImplementation "org.testcontainers:testcontainers-junit-jupiter:${testcontainersVersion}"
testImplementation "org.testcontainers:testcontainers-postgresql:${testcontainersVersion}"
testImplementation "org.testcontainers:testcontainers:${testcontainersVersion}"
testImplementation 'io.rest-assured:rest-assured:5.3.2'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'

annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen:6.3.1.Final'
annotationProcessor 'org.projectlombok:lombok:1.18.22'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.hibernate.orm:hibernate-processor'
annotationProcessor 'org.projectlombok:lombok:1.18.36'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.36'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
}
Expand All @@ -70,3 +77,8 @@ jacocoTestReport {
group = "reporting"
description = "Generate Jacoco coverage reports after running tests."
}

tasks.withType(JavaCompile).configureEach {
options.compilerArgs.add('-parameters')
}

17 changes: 17 additions & 0 deletions run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/bin/sh

DEFAULT_JAVA_OPTIONS="-XX:+UseG1GC -XX:MaxRAMPercentage=75"
DEBUG_OPTIONS=""

if [ -n "${JAVA_DEBUG_ENABLE:-}" ] || [ -n "${JAVA_DEBUG:-}" ]; then
debug_port="${JAVA_DEBUG_PORT:-5005}"
DEBUG_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:${debug_port}"
fi

echo -e "run.sh configuration:"
echo -e "\tDEFAULT_JAVA_OPTIONS: ${DEFAULT_JAVA_OPTIONS:-}"
echo -e "\tJAVA_OPTIONS: ${JAVA_OPTIONS:-}"
echo -e "\tDEBUG_OPTIONS: ${DEBUG_OPTIONS:-}"

java $DEFAULT_JAVA_OPTIONS $JAVA_OPTIONS $DEBUG_OPTIONS -jar /$JAR

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.epam.healenium.config;

import org.hibernate.cfg.MappingSettings;
import org.hibernate.type.format.jackson.Jackson3JsonFormatMapper;
import org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tools.jackson.databind.json.JsonMapper;

@Configuration
public class HibernateJsonConfiguration {

@Bean
public HibernatePropertiesCustomizer jsonFormatMapperPropertiesCustomizer(JsonMapper jsonMapper) {
Jackson3JsonFormatMapper formatMapper = new Jackson3JsonFormatMapper(jsonMapper);
return properties -> properties.put(MappingSettings.JSON_FORMAT_MAPPER, formatMapper);
}
}
30 changes: 16 additions & 14 deletions src/main/java/com/epam/healenium/config/JacksonConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,29 @@
import com.epam.healenium.converter.NodeDeserializer;
import com.epam.healenium.converter.NodeSerializer;
import com.epam.healenium.treecomparing.Node;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.cfg.DateTimeFeature;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.module.SimpleModule;

/** Hooks {@link Node} serde into Boot 4's {@link JsonMapper} (used by MVC), not a standalone {@code ObjectMapper} bean. */
@Configuration
public class JacksonConfiguration {
@Order(Ordered.LOWEST_PRECEDENCE)
public class JacksonConfiguration implements JsonMapperBuilderCustomizer {

@Bean
public ObjectMapper objectMapper() {
SimpleModule module = new SimpleModule("node")
@Override
public void customize(JsonMapper.Builder builder) {
SimpleModule nodeModule = new SimpleModule("node")
.addSerializer(Node.class, new NodeSerializer())
.addDeserializer(Node.class, new NodeDeserializer());
return new ObjectMapper()
.registerModule(module)
.registerModule(new JavaTimeModule())
builder.addModule(nodeModule)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.configure(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
}

}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.epam.healenium.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.autoconfigure.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.epam.healenium.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

/**
* Servlet-based apps do not get a {@link WebClient.Builder} bean from auto-configuration in Spring Boot 4;
* outbound WebClient calls still need an explicit bean.
*/
@Configuration
public class WebClientConfiguration {

@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
14 changes: 0 additions & 14 deletions src/main/java/com/epam/healenium/config/WebConfiguration.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,20 @@
import com.epam.healenium.model.dto.SessionDto;
import com.epam.healenium.service.HealingService;
import com.epam.healenium.service.SelectorService;
import com.epam.healenium.util.Utils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.FieldError;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;
Expand All @@ -33,9 +34,6 @@
import java.util.Map;
import java.util.Set;

import static com.epam.healenium.constants.Constants.SESSION_KEY_V1;
import static com.epam.healenium.constants.Constants.SESSION_KEY_V2;

@Slf4j
@RestController
@RequestMapping("/healenium")
Expand Down Expand Up @@ -82,7 +80,8 @@ public ConfigSelectorDto getElements() {
public void save(@Valid @RequestBody List<HealingRequestDto> dto,
@RequestHeader Map<String, String> headers) {
log.debug("[Save Healing] Request: {}. Headers: {}", dto, headers);
if (StringUtils.isEmpty(headers.get(SESSION_KEY_V1)) && StringUtils.isEmpty(headers.get(SESSION_KEY_V2))) {
String sessionKey = Utils.getSessionKey(headers);
if (!StringUtils.hasText(sessionKey)) {
log.warn("Session key is not present. Current issue would not be presented in any reports, but still available in replacement!");
}
dto.forEach(requestDto -> healingService.saveHealing(requestDto, headers));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileInputStream;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,25 @@

import com.epam.healenium.model.domain.HealingResult;
import com.epam.healenium.model.domain.Report;
import com.epam.healenium.model.dto.elitea.*;
import com.epam.healenium.model.dto.elitea.DedicatedInfo;
import com.epam.healenium.model.dto.elitea.LlmDto;
import com.epam.healenium.model.dto.elitea.LocatorPathsDto;
import com.epam.healenium.model.dto.elitea.VcsDto;
import com.epam.healenium.repository.ReportRepository;
import com.epam.healenium.service.IntegrationService;
import com.epam.healenium.service.ReportService;
import com.epam.healenium.service.SelectorService;
import com.epam.healenium.service.IntegrationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;
Expand All @@ -28,6 +38,7 @@ public class IntegrationController {

@GetMapping("/dedicated-info/{reportId}")
public ResponseEntity<DedicatedInfo> getDedicatedInfo(@PathVariable String reportId) {
log.debug("[Integration] Get dedicated-info, reportId: {}", reportId);
if (reportId == null || reportId.trim().isEmpty()) {
throw new IllegalArgumentException("Report ID cannot be null or empty");
}
Expand Down Expand Up @@ -86,18 +97,21 @@ public ResponseEntity<List<LlmDto>> saveLlmCredentials(@Valid @RequestBody LlmDt

@GetMapping("/vcs/{platform}")
public ResponseEntity<VcsDto> getVcs(@PathVariable String platform) {
log.debug("[Integration] Get vcs, platform: {}", platform);
VcsDto vcsDto = integrationService.getVcs(platform);
return ResponseEntity.ok(vcsDto);
}

@GetMapping("/llm/{platform}")
public ResponseEntity<LlmDto> getLlm(@PathVariable String platform) {
log.debug("[Integration] Get llm, platform: {}", platform);
LlmDto llmDto = integrationService.getLlm(platform);
return ResponseEntity.ok(llmDto);
}

@GetMapping("/llm/all")
public ResponseEntity<List<LlmDto>> getAllLlms() {
log.debug("[Integration] Get llm all");
List<LlmDto> llmDtos = integrationService.getLlmAll();
return ResponseEntity.ok(llmDtos);
}
Expand All @@ -111,6 +125,7 @@ public ResponseEntity<List<LlmDto>> activateLlm(@PathVariable String id) {

@GetMapping("/llm/active")
public ResponseEntity<LlmDto> getActiveLlm() {
log.debug("[Integration] Get llm active");
LlmDto activeLlm = integrationService.getActiveLlm();
return ResponseEntity.ok(activeLlm);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
Expand Down
Loading
Loading