1
2
3
4
5
6
7 package com.varmateo.yawg.logging;
8
9 import java.util.function.BiConsumer;
10 import java.util.function.BiFunction;
11 import java.util.function.Supplier;
12
13 import io.vavr.Function0;
14 import io.vavr.control.Try;
15
16
17
18
19
20 public final class Logs {
21
22
23
24
25
26 private Logs() {
27
28 }
29
30
31
32
33
34 public static <T> T logDuration(
35 final Log log,
36 final String subject,
37 final Supplier<T> action) {
38
39 final Supplier<Try<T>> liftedAction = Function0.liftTry(action);
40 final boolean isVerbose = false;
41 final Try<T> result = logTryDuration(log, subject, liftedAction, isVerbose);
42
43 return result.get();
44 }
45
46
47
48
49
50 public static void logDuration(
51 final Log log,
52 final String subject,
53 final Runnable action) {
54
55 final Supplier<Void> wrappedAction = () -> {
56 action.run();
57 return null;
58 };
59
60 logDuration(log, subject, wrappedAction);
61 }
62
63
64
65
66
67 public static Runnable decorateWithLogDuration(
68 final Log log,
69 final String description,
70 final Runnable function) {
71
72 return () -> logDuration(
73 log,
74 description,
75 () -> {
76 function.run();
77 return null;
78 });
79 }
80
81
82
83
84
85 public static <T, U> BiConsumer<T, U> decorateWithLogDuration(
86 final Log log,
87 final BiFunction<T, U, String> description,
88 final BiConsumer<T, U> function) {
89
90 return (t, u) -> logDuration(
91 log,
92 description.apply(t, u),
93 () -> {
94 function.accept(t, u);
95 return null;
96 });
97 }
98
99
100
101
102
103 private static <T> Try<T> logTryDuration(
104 final Log log,
105 final String subject,
106 final Supplier<Try<T>> action,
107 final boolean isVerbose) {
108
109 log.info("Starting {0}...", subject);
110
111 final long startTime = System.currentTimeMillis();
112 final Try<T> result = Try.of(action::get).flatMap(x -> x);
113 final long delay = System.currentTimeMillis() - startTime;
114
115 if (result.isSuccess()) {
116 log.info("Done {0} ({1} ms)", subject, delay);
117 } else {
118 final Throwable cause = result.getCause();
119
120 if (isVerbose) {
121
122 log.warning(cause, "Failed {0} ({1} ms)", subject, delay);
123 } else {
124
125 log.warning(
126 "Failed {0} ({1} ms) - {2} - {3}",
127 subject, delay,
128 cause.getClass().getName(), cause.getMessage());
129 }
130 }
131
132 return result;
133 }
134
135 }