View Javadoc
1   /**************************************************************************
2    *
3    * Copyright (c) 2018-2020 Yawg project contributors.
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   * Utility functions related with logging.
19   */
20  public final class Logs {
21  
22  
23      /**
24       * No instance of this class are to be created.
25       */
26      private Logs() {
27          // Nothing to do.
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                 // Log with stack trace.
122                 log.warning(cause, "Failed {0} ({1} ms)", subject, delay);
123             } else {
124                 // Log without stack trace.
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 }