Stirling-PDF/src/main/java/stirling/software/SPDF/SPdfApplication.java

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

153 lines
5.4 KiB
Java
Raw Normal View History

package stirling.software.SPDF;
2024-02-24 00:01:20 +05:30
import java.io.IOException;
import java.net.ServerSocket;
2024-01-03 17:59:04 +00:00
import java.nio.file.Files;
2024-02-24 00:01:20 +05:30
import java.nio.file.Path;
2024-01-03 17:59:04 +00:00
import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
2024-01-03 17:59:04 +00:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
2024-01-03 17:59:04 +00:00
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
import io.github.pixee.security.SystemCommand;
import jakarta.annotation.PostConstruct;
import stirling.software.SPDF.config.ConfigInitializer;
import stirling.software.SPDF.model.ApplicationProperties;
2024-01-03 17:59:04 +00:00
@SpringBootApplication
@EnableScheduling
public class SPdfApplication {
2024-02-24 00:01:20 +05:30
private static final Logger logger = LoggerFactory.getLogger(SPdfApplication.class);
@Autowired private Environment env;
@Autowired ApplicationProperties applicationProperties;
private static String serverPortStatic;
@Value("${server.port:8080}")
public void setServerPortStatic(String port) {
if (port.equalsIgnoreCase("auto")) {
// Use Spring Boot's automatic port assignment (server.port=0)
SPdfApplication.serverPortStatic =
"0"; // This will let Spring Boot assign an available port
} else {
SPdfApplication.serverPortStatic = port;
}
}
// Optionally keep this method if you want to provide a manual port-incrementation fallback.
private static String findAvailablePort(int startPort) {
int port = startPort;
while (!isPortAvailable(port)) {
port++;
}
return String.valueOf(port);
}
private static boolean isPortAvailable(int port) {
try (ServerSocket socket = new ServerSocket(port)) {
return true;
} catch (IOException e) {
return false;
}
}
@PostConstruct
public void init() {
// Check if the BROWSER_OPEN environment variable is set to true
String browserOpenEnv = env.getProperty("BROWSER_OPEN");
boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv);
2024-01-03 17:59:04 +00:00
if (browserOpen) {
try {
String url = "http://localhost:" + getStaticPort();
2024-01-03 17:59:04 +00:00
String os = System.getProperty("os.name").toLowerCase();
Runtime rt = Runtime.getRuntime();
if (os.contains("win")) {
// For Windows
SystemCommand.runCommand(rt, "rundll32 url.dll,FileProtocolHandler " + url);
} else if (os.contains("mac")) {
rt.exec("open " + url);
} else if (os.contains("nix") || os.contains("nux")) {
rt.exec("xdg-open " + url);
2024-01-03 17:59:04 +00:00
}
} catch (Exception e) {
2024-02-24 00:01:20 +05:30
logger.error("Error opening browser: {}", e.getMessage());
2024-01-03 17:59:04 +00:00
}
}
logger.info("Running configs {}", applicationProperties.toString());
2024-01-03 17:59:04 +00:00
}
2024-02-24 00:01:20 +05:30
public static void main(String[] args) throws IOException, InterruptedException {
SpringApplication app = new SpringApplication(SPdfApplication.class);
app.setAdditionalProfiles("default");
app.addInitializers(new ConfigInitializer());
Map<String, String> propertyFiles = new HashMap<>();
// External config files
if (Files.exists(Paths.get("configs/settings.yml"))) {
propertyFiles.put("spring.config.additional-location", "file:configs/settings.yml");
} else {
logger.warn("External configuration file 'configs/settings.yml' does not exist.");
}
if (Files.exists(Paths.get("configs/custom_settings.yml"))) {
2024-08-08 21:13:59 +01:00
String existingLocation =
propertyFiles.getOrDefault("spring.config.additional-location", "");
2024-07-31 13:25:48 -07:00
if (!existingLocation.isEmpty()) {
existingLocation += ",";
}
propertyFiles.put(
"spring.config.additional-location",
2024-07-31 13:25:48 -07:00
existingLocation + "file:configs/custom_settings.yml");
} else {
logger.warn("Custom configuration file 'configs/custom_settings.yml' does not exist.");
}
if (!propertyFiles.isEmpty()) {
app.setDefaultProperties(
Collections.singletonMap(
"spring.config.additional-location",
propertyFiles.get("spring.config.additional-location")));
}
app.run(args);
// Ensure directories are created
2024-02-24 00:01:20 +05:30
try {
Files.createDirectories(Path.of("customFiles/static/"));
Files.createDirectories(Path.of("customFiles/templates/"));
} catch (Exception e) {
logger.error("Error creating directories: {}", e.getMessage());
}
2024-02-24 00:01:20 +05:30
printStartupLogs();
}
2024-02-24 00:01:20 +05:30
private static void printStartupLogs() {
logger.info("Stirling-PDF Started.");
String url = "http://localhost:" + getStaticPort();
2024-02-24 00:01:20 +05:30
logger.info("Navigate to {}", url);
}
public static String getStaticPort() {
return serverPortStatic;
}
public String getNonStaticPort() {
return serverPortStatic;
}
2024-01-03 17:59:04 +00:00
}