import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class EnvVariableThrottler {
private final Map<String, String> envVariables; // Store environment variables and their validation status.
private final Map<String, Long> lastAccessTime; // Last time an environment variable was accessed.
private final Map<String, String> defaultValues; // Default values for environment variables.
private final long throttleIntervalMillis; // Time interval for throttling (e.g., 1000 milliseconds = 1 second).
private final ScheduledExecutorService scheduler; // Executor service for scheduling throttling tasks.
public EnvVariableThrottler(long throttleIntervalMillis, Map<String, String> defaultValues) {
this.envVariables = new ConcurrentHashMap<>();
this.lastAccessTime = new ConcurrentHashMap<>();
this.defaultValues = defaultValues;
this.throttleIntervalMillis = throttleIntervalMillis;
this.scheduler = Executors.newSingleThreadScheduledExecutor();
}
public String getOrDefault(String envVarName) {
// Get the environment variable value.
String envValue = System.getenv(envVarName);
// If the environment variable is not set or is null, use the default value.
if (envValue == null || envValue.isEmpty()) {
return defaultValues.getOrDefault(envVarName, ""); // Return default value if not set.
}
// Check if the environment variable has been accessed within the throttle interval.
long currentTime = System.currentTimeMillis();
if (!lastAccessTime.containsKey(envVarName) || (currentTime - lastAccessTime.get(envVarName)) > throttleIntervalMillis) {
// Validate the environment variable (e.g., check if it's a valid format).
validateEnvVar(envVarName, envValue);
lastAccessTime.put(envVarName, currentTime);
}
return envValue;
}
private void validateEnvVar(String envVarName, String envValue) {
// Perform validation checks on the environment variable.
// Example: Check if the value is a valid number.
if (envVarName.equals("PORT")) {
try {
Integer.parseInt(envValue);
} catch (NumberFormatException e) {
System.err.println("Invalid PORT value. Using default: " + defaultValues.getOrDefault(envVarName, ""));
envVariables.put(envVarName, defaultValues.getOrDefault(envVarName, ""));
}
}
// Add more validation checks as needed.
else {
envVariables.put(envVarName, envValue); // Store env variable value after validation
}
}
public void start() {
scheduler.scheduleAtFixedRate(() -> {
// Periodically check and reset the access time for all environment variables.
for (String envVar : envVariables.keySet()) {
lastAccessTime.remove(envVar);
}
}, throttleIntervalMillis, throttleIntervalMillis, TimeUnit.MILLISECONDS);
}
public void stop() {
scheduler.shutdown();
try {
scheduler.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) throws InterruptedException {
// Example usage
Map<String, String> defaults = new HashMap<>();
defaults.put("PORT", "8080");
defaults.put("DEBUG", "false");
EnvVariableThrottler throttler = new EnvVariableThrottler(1000, defaults); // Throttle every 1 second.
throttler.start();
System.out.println("PORT: " + throttler.getOrDefault("PORT"));
System.out.println("DEBUG: " + throttler.getOrDefault("DEBUG"));
System.out.println("NON_EXISTENT_VAR: " + throttler.getOrDefault("NON_EXISTENT_VAR"));
Thread.sleep(2000);
System.out.println("PORT: " + throttler.getOrDefault("PORT")); // Should use the
Add your comment