• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

devonfw / IDEasy / 15217656699

23 May 2025 07:22PM UTC coverage: 67.562% (-0.3%) from 67.89%
15217656699

push

github

web-flow
#1332: fixed bug pattern, proper Step usage, allow running tool if plugin failed (#1334)

Co-authored-by: jan-vcapgemini <59438728+jan-vcapgemini@users.noreply.github.com>

3151 of 5064 branches covered (62.22%)

Branch coverage included in aggregate %.

8048 of 11512 relevant lines covered (69.91%)

3.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.97
cli/src/main/java/com/devonfw/tools/ide/log/AbstractIdeSubLogger.java
1
package com.devonfw.tools.ide.log;
2

3
import com.devonfw.tools.ide.cli.CliException;
4

5
/**
6
 * Abstract base implementation of {@link IdeSubLogger}.
7
 */
8
public abstract class AbstractIdeSubLogger implements IdeSubLogger {
1✔
9

10
  /** @see #getLevel() */
11
  protected final IdeLogLevel level;
12

13
  protected final IdeLogExceptionDetails exceptionDetails;
14

15
  final IdeLogListener listener;
16

17
  protected final boolean colored;
18

19
  private boolean enabled;
20

21
  /**
22
   * The constructor.
23
   *
24
   * @param level the {@link #getLevel() log-level}.
25
   */
26
  public AbstractIdeSubLogger(IdeLogLevel level, boolean colored, IdeLogExceptionDetails exceptionDetails, IdeLogListener listener) {
27

28
    super();
2✔
29
    this.level = level;
3✔
30
    this.exceptionDetails = exceptionDetails;
3✔
31
    if (listener == null) {
2✔
32
      this.listener = IdeLogListenerNone.INSTANCE;
4✔
33
    } else {
34
      this.listener = listener;
3✔
35
    }
36
    this.colored = colored;
3✔
37
    this.enabled = true;
3✔
38
  }
1✔
39

40
  @Override
41
  public IdeLogLevel getLevel() {
42

43
    return this.level;
×
44
  }
45

46
  @Override
47
  public boolean isEnabled() {
48

49
    return this.enabled;
3✔
50
  }
51

52
  void setEnabled(boolean enabled) {
53

54
    this.enabled = enabled;
3✔
55
  }
1✔
56

57
  /**
58
   * Should only be used internally by logger implementation.
59
   *
60
   * @param message the message template.
61
   * @param args the dynamic arguments to fill in.
62
   * @return the resolved message with the parameters filled in.
63
   */
64
  protected String compose(String message, Object... args) {
65

66
    int pos = message.indexOf("{}");
4✔
67
    if (pos < 0) {
2!
68
      if (args.length > 0) {
×
69
        invalidMessage(message, false, args);
×
70
      }
71
      return message;
×
72
    }
73
    int argIndex = 0;
2✔
74
    int start = 0;
2✔
75
    int length = message.length();
3✔
76
    StringBuilder sb = new StringBuilder(length + 48);
7✔
77
    while (pos >= 0) {
2✔
78
      sb.append(message, start, pos);
6✔
79
      sb.append(args[argIndex++]);
7✔
80
      start = pos + 2;
4✔
81
      pos = message.indexOf("{}", start);
5✔
82
      if ((argIndex >= args.length) && (pos > 0)) {
6!
83
        invalidMessage(message, true, args);
×
84
        pos = -1;
×
85
      }
86
    }
87
    if (start < length) {
3✔
88
      String rest = message.substring(start);
4✔
89
      sb.append(rest);
4✔
90
    }
91
    if (argIndex < args.length) {
4!
92
      invalidMessage(message, false, args);
×
93
    }
94
    return sb.toString();
3✔
95
  }
96

97
  private void invalidMessage(String message, boolean more, Object[] args) {
98

99
    warning("Invalid log message with " + args.length + " argument(s) but " + (more ? "more" : "less")
×
100
        + " placeholders: " + message);
101
  }
×
102

103
  private void warning(String message) {
104

105
    boolean colored = isColored();
×
106
    if (colored) {
×
107
      System.err.print(IdeLogLevel.ERROR.getEndColor());
×
108
      System.err.print(IdeLogLevel.ERROR.getStartColor());
×
109
    }
110
    System.err.println(message);
×
111
    if (colored) {
×
112
      System.err.print(IdeLogLevel.ERROR.getEndColor());
×
113
    }
114
  }
×
115

116
  /**
117
   * @return {@code true} if colored logging is used, {@code false} otherwise.
118
   */
119
  public boolean isColored() {
120

121
    return this.colored;
×
122
  }
123

124
  @Override
125
  public String log(Throwable error, String message, Object... args) {
126

127
    if (!this.enabled) {
3✔
128
      // performance optimization: do not fill in arguments if disabled
129
      return message;
2✔
130
    }
131
    String actualMessage = message;
2✔
132
    if (error != null) {
2✔
133
      if (isOmitStacktrace(error)) {
4✔
134
        if (message == null) {
2!
135
          actualMessage = error.getMessage();
3✔
136
        }
137
        error = null;
3✔
138
      } else if (message == null) {
2✔
139
        actualMessage = error.toString();
3✔
140
      }
141
    }
142
    if (actualMessage == null) {
2!
143
      actualMessage = "Internal error: Both message and error is null - nothing to log!";
×
144
      // fail fast if assertions are enabled, so developers of IDEasy will find the bug immediately but in productive use better log the error and continue
145
      assert false : actualMessage;
×
146
    } else if ((args != null) && (args.length > 0)) {
5!
147
      actualMessage = compose(actualMessage, args);
5✔
148
    }
149
    boolean accept = this.listener.onLog(this.level, actualMessage, message, args, error);
10✔
150
    if (accept) {
2!
151
      doLog(actualMessage, error);
4✔
152
    }
153
    return actualMessage;
2✔
154
  }
155

156
  private boolean isOmitStacktrace(Throwable error) {
157

158
    return (error instanceof CliException);
3✔
159
  }
160

161
  /**
162
   * @param message the formatted message to log.
163
   * @param error the optional {@link Throwable} to log or {@code null} for no error.
164
   */
165
  protected abstract void doLog(String message, Throwable error);
166

167
  @Override
168
  public String toString() {
169

170
    return getClass().getSimpleName() + "@" + this.level;
×
171
  }
172

173
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc