1. import java.util.HashMap;
  2. import java.util.Map;
  3. class LogValidator {
  4. /**
  5. * Maps log stream fields for validation checks.
  6. *
  7. * @param logStream The input log stream as a string.
  8. * @param fieldMapping A map defining the fields to be validated. Key is the field name, value is a validation function.
  9. * @return A map containing the validation results for each field. Returns an empty map if logStream is null or fieldMapping is empty.
  10. */
  11. public static Map<String, Boolean> validateLogStream(String logStream, Map<String, ValidationFunction> fieldMapping) {
  12. Map<String, Boolean> validationResults = new HashMap<>();
  13. if (logStream == null || fieldMapping == null || fieldMapping.isEmpty()) {
  14. return validationResults; // Return empty map if input is invalid
  15. }
  16. String[] lines = logStream.split("\\r?\\n"); // Split log stream into lines
  17. for (Map.Entry<String, ValidationFunction> entry : fieldMapping.entrySet()) {
  18. String fieldName = entry.getKey();
  19. ValidationFunction validationFunction = entry.getValue();
  20. validationResults.put(fieldName, validateField(lines, fieldName, validationFunction));
  21. }
  22. return validationResults;
  23. }
  24. /**
  25. * Validates a specific field in the log stream.
  26. *
  27. * @param lines The array of log lines.
  28. * @param fieldName The name of the field to validate.
  29. * @param validationFunction The validation function for the field.
  30. * @return True if validation passes, false otherwise.
  31. */
  32. private static boolean validateField(String[] lines, String fieldName, ValidationFunction validationFunction) {
  33. for (String line : lines) {
  34. if (line.contains(fieldName)) {
  35. try {
  36. return validationFunction.validate(line, fieldName);
  37. } catch (Exception e) {
  38. System.err.println("Error validating field " + fieldName + ": " + e.getMessage());
  39. return false; // Return false on error
  40. }
  41. }
  42. }
  43. return false; // Field not found in any line
  44. }
  45. /**
  46. * Functional interface for defining validation logic.
  47. */
  48. public interface ValidationFunction {
  49. boolean validate(String line, String fieldName);
  50. }
  51. public static void main(String[] args) {
  52. // Example usage
  53. String logStream = "Timestamp: 2023-10-27 10:00:00, User: John Doe, Message: Successful operation";
  54. Map<String, ValidationFunction> fieldMapping = new HashMap<>();
  55. fieldMapping.put("Timestamp", TimestampValidator.validateTimestamp);
  56. fieldMapping.put("User", UserValidator.validateUsername);
  57. fieldMapping.put("Message", MessageValidator.validateMessageLength);
  58. Map<String, Boolean> results = validateLogStream(logStream, fieldMapping);
  59. for (Map.Entry<String, Boolean> entry : results.entrySet()) {
  60. System.out.println(entry.getKey() + ": " + entry.getValue());
  61. }
  62. }
  63. //Example Validation Functions
  64. static class TimestampValidator implements ValidationFunction {
  65. @Override
  66. public boolean validate(String line, String fieldName) {
  67. return line.contains(fieldName) && line.substring(line.indexOf(fieldName) + fieldName.length()).matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"); //Basic Timestamp check
  68. }
  69. }
  70. static class UserValidator implements ValidationFunction {
  71. @Override
  72. public boolean validate(String line, String fieldName) {
  73. return line.contains(fieldName) && line.substring(line.indexOf(fieldName) + fieldName.length()).matches("[a-zA-Z\\s]+"); //Basic username check
  74. }
  75. }
  76. static class MessageValidator implements ValidationFunction {
  77. @Override
  78. public boolean validate(String line, String fieldName) {
  79. return line.contains(fieldName) && line.substring(line.indexOf(fieldName) + fieldName.length()).length() <= 100; //Message length check
  80. }
  81. }
  82. }

Add your comment