Skip to content

Commit 3c7080f

Browse files
committed
Merge branch 'release/v11.2.1' of https://github.com/utmstack/UTMStack into release/v11.2.1
2 parents 27ffdc6 + 34ea89c commit 3c7080f

File tree

6 files changed

+145
-21
lines changed

6 files changed

+145
-21
lines changed

web-pdf/src/main/java/com/utmstack/webtopdf/config/WebDriverConfig.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,48 @@
44
import org.openqa.selenium.WebDriver;
55
import org.openqa.selenium.chrome.ChromeOptions;
66
import org.openqa.selenium.remote.RemoteWebDriver;
7+
import org.springframework.beans.factory.annotation.Value;
78
import org.springframework.context.annotation.Configuration;
89

910
import java.net.MalformedURLException;
1011
import java.net.URL;
12+
import java.time.Duration;
1113

1214
@Configuration
1315
@Slf4j
1416
public class WebDriverConfig {
1517

18+
@Value("${selenium.grid.url:http://localhost:4444/wd/hub}")
19+
private String seleniumGridUrl;
20+
1621
public WebDriver createWebDriver() {
1722
try {
23+
WebDriver driver = getWebDriver();
1824

19-
URL serverUrl = new URL("http://localhost:4444/wd/hub");
25+
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(60));
26+
driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(30));
2027

21-
ChromeOptions options = new ChromeOptions();
22-
options.addArguments("--headless");
23-
options.addArguments("--no-sandbox");
24-
options.setAcceptInsecureCerts(true);
28+
return driver;
2529

26-
return new RemoteWebDriver(serverUrl, options);
27-
} catch (MalformedURLException | RuntimeException exception) {
28-
log.error(exception.getMessage());
30+
} catch (Exception exception) {
31+
log.error("Failed to initialize RemoteWebDriver", exception);
2932
throw new RuntimeException("Failed to initialize RemoteWebDriver", exception);
3033
}
3134
}
32-
}
35+
36+
private WebDriver getWebDriver() throws MalformedURLException {
37+
URL serverUrl = new URL(seleniumGridUrl);
38+
39+
ChromeOptions options = new ChromeOptions();
40+
options.addArguments("--headless=new");
41+
options.addArguments("--no-sandbox");
42+
options.addArguments("--disable-dev-shm-usage");
43+
options.addArguments("--disable-gpu");
44+
options.addArguments("--disable-software-rasterizer");
45+
options.addArguments("--window-size=1920,1080");
46+
options.addArguments("--remote-allow-origins=*");
47+
options.setAcceptInsecureCerts(true);
48+
49+
return new RemoteWebDriver(serverUrl, options);
50+
}
51+
}

web-pdf/src/main/java/com/utmstack/webtopdf/controller/WebPdfController.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,33 @@ public class WebPdfController {
2222
private final PdfGenerationService pdfGenerationService;
2323

2424
@GetMapping("/generate-pdf")
25-
public ResponseEntity<ResponseDto> generatePdf(@RequestParam String baseUrl, @RequestParam String url, @RequestParam String accessType, @RequestParam String accessKey) {
26-
try {
27-
byte[] pdfBytes = pdfGenerationService.generatePdf(baseUrl, url, accessKey, AccessType.valueOf(accessType.toUpperCase()));
25+
public ResponseEntity<ResponseDto> generatePdf(@RequestParam String baseUrl,
26+
@RequestParam String url,
27+
@RequestParam String accessType,
28+
@RequestParam String accessKey) {
2829

29-
return ResponseEntity.ok().body(ResponseDto.builder().pdfBytes(pdfBytes).build());
3030

31-
} catch (Exception e) {
32-
log.error("Error generating the PDF for the URL: {}", url, e);
33-
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResponseDto.builder().message("Error generating the PDF for the URL").build());
31+
byte[] pdfBytes = pdfGenerationService.generatePdf(baseUrl,
32+
url,
33+
accessKey,
34+
AccessType.valueOf(accessType.toUpperCase()));
35+
36+
if (pdfBytes == null || pdfBytes.length == 0) {
37+
log.error("PDF generation returned empty bytes for URL: {}", url);
38+
39+
return ResponseEntity
40+
.status(HttpStatus.BAD_REQUEST)
41+
.body(ResponseDto.builder()
42+
.error(true)
43+
.message("The")
44+
.build());
3445
}
46+
47+
return ResponseEntity.ok(
48+
ResponseDto.builder()
49+
.pdfBytes(pdfBytes)
50+
.error(false)
51+
.message("PDF generado correctamente")
52+
.build());
3553
}
3654
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.utmstack.webtopdf.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
6+
@Data
7+
@Builder
8+
public class ErrorResponse {
9+
private boolean error;
10+
private String message;
11+
private String details;
12+
}
13+

web-pdf/src/main/java/com/utmstack/webtopdf/dto/ResponseDto.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010
public class ResponseDto {
1111
private byte[] pdfBytes;
1212
private String message;
13+
private boolean error;
1314
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.utmstack.webtopdf.exception;
2+
3+
import com.utmstack.webtopdf.dto.ErrorResponse;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.openqa.selenium.TimeoutException;
6+
import org.openqa.selenium.NoSuchElementException;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.ControllerAdvice;
10+
import org.springframework.web.bind.annotation.ExceptionHandler;
11+
12+
@Slf4j
13+
@ControllerAdvice
14+
public class GlobalExceptionHandler {
15+
16+
@ExceptionHandler(TimeoutException.class)
17+
public ResponseEntity<ErrorResponse> handleTimeout(TimeoutException ex) {
18+
log.error("Timeout while waiting for Selenium condition: {}", ex.getMessage());
19+
20+
return ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT)
21+
.body(ErrorResponse.builder()
22+
.error(true)
23+
.message("The report took too long to load.")
24+
.details(ex.getMessage())
25+
.build());
26+
}
27+
28+
@ExceptionHandler(NoSuchElementException.class)
29+
public ResponseEntity<ErrorResponse> handleNoSuchElement(NoSuchElementException ex) {
30+
log.error("Required element not found in Selenium: {}", ex.getMessage());
31+
32+
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
33+
.body(ErrorResponse.builder()
34+
.error(true)
35+
.message("A required element was not found while generating the PDF.")
36+
.details(ex.getMessage())
37+
.build());
38+
}
39+
40+
@ExceptionHandler(Exception.class)
41+
public ResponseEntity<ErrorResponse> handleGeneral(Exception ex) {
42+
log.error("Unexpected error: {}", ex.getMessage(), ex);
43+
44+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
45+
.body(ErrorResponse.builder()
46+
.error(true)
47+
.message("An unexpected error occurred while generating the PDF.")
48+
.details(ex.getMessage())
49+
.build());
50+
}
51+
}

web-pdf/src/main/java/com/utmstack/webtopdf/service/PdfGenerationService.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,38 @@ public byte[] generatePdf(String url, String route, String accessKey, AccessType
3737

3838
try {
3939
webDriver.get(reportUrl);
40-
WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(10));
40+
41+
WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(15));
42+
43+
wait.until(d -> ((JavascriptExecutor) d)
44+
.executeScript("return document.readyState").equals("complete"));
45+
46+
Thread.sleep(500);
47+
4148
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".report-loading")));
4249

4350
Pdf print = ((PrintsPage) webDriver).print(printOptions);
44-
webDriver.quit();
4551
return OutputType.BYTES.convertFromBase64Png(print.getContent());
52+
53+
} catch (TimeoutException e) {
54+
log.error("Timeout waiting for report to load: {}", e.getMessage());
55+
throw new TimeoutException("The report took too long to load.");
56+
57+
} catch (NoSuchElementException e) {
58+
log.error("Required element not found: {}", e.getMessage());
59+
throw new NoSuchElementException("A required element was not found while generating the PDF.");
60+
4661
} catch (Exception e) {
47-
log.error("Error generating PDF report: {}", e.getMessage(), e);
48-
webDriver.quit();
49-
return new byte[0];
62+
log.error("Unexpected error generating PDF: {}", e.getMessage(), e);
63+
throw new RuntimeException("Unexpected error generating the PDF.");
64+
65+
} finally {
66+
try {
67+
webDriver.quit();
68+
} catch (Exception ex) {
69+
log.warn("Error closing WebDriver: {}", ex.getMessage());
70+
}
5071
}
5172
}
73+
5274
}

0 commit comments

Comments
 (0)