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

devonfw / IDEasy / 22284264868

22 Feb 2026 08:00PM UTC coverage: 70.75% (+0.3%) from 70.474%
22284264868

Pull #1714

github

web-flow
Merge 98f01421f into 379acdc9d
Pull Request #1714: #404: #1713: advanced logging

4063 of 6346 branches covered (64.02%)

Branch coverage included in aggregate %.

10636 of 14430 relevant lines covered (73.71%)

3.1 hits per line

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

94.02
cli/src/main/java/com/devonfw/tools/ide/commandlet/HelpCommandlet.java
1
package com.devonfw.tools.ide.commandlet;
2

3
import java.util.ArrayList;
4
import java.util.Collections;
5
import java.util.List;
6

7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9
import org.slf4j.Marker;
10
import org.slf4j.event.Level;
11

12
import com.devonfw.tools.ide.context.AbstractIdeContext;
13
import com.devonfw.tools.ide.context.IdeContext;
14
import com.devonfw.tools.ide.log.IdeLogLevel;
15
import com.devonfw.tools.ide.nls.NlsBundle;
16
import com.devonfw.tools.ide.property.CommandletProperty;
17
import com.devonfw.tools.ide.property.KeywordProperty;
18
import com.devonfw.tools.ide.property.Property;
19
import com.devonfw.tools.ide.tool.ToolCommandlet;
20
import com.devonfw.tools.ide.version.IdeVersion;
21

22
/**
23
 * {@link Commandlet} to print the environment variables.
24
 */
25
public final class HelpCommandlet extends Commandlet {
26

27
  private static final Logger LOG = LoggerFactory.getLogger(HelpCommandlet.class);
4✔
28

29
  /** The optional commandlet to get help about. */
30
  public final CommandletProperty commandlet;
31

32
  /**
33
   * The constructor.
34
   *
35
   * @param context the {@link IdeContext}.
36
   */
37
  public HelpCommandlet(IdeContext context) {
38

39
    super(context);
3✔
40
    addKeyword("--help", "-h");
4✔
41
    this.commandlet = add(new CommandletProperty("", false, "commandlet"));
11✔
42
  }
1✔
43

44
  @Override
45
  public String getName() {
46

47
    return "help";
2✔
48
  }
49

50
  @Override
51
  public boolean isIdeRootRequired() {
52

53
    return false;
2✔
54
  }
55

56
  @Override
57
  public boolean isWriteLogFile() {
58

59
    return false;
2✔
60
  }
61

62
  @Override
63
  protected void doRun() {
64

65
    this.context.printLogo();
3✔
66
    NlsBundle bundle = NlsBundle.of(this.context);
4✔
67
    LOG.info(IdeLogLevel.SUCCESS.getSlf4jMarker(), bundle.get("version-banner"), IdeVersion.getVersionString());
8✔
68
    Commandlet cmd = this.commandlet.getValue();
5✔
69
    if (cmd == null) {
2✔
70
      String usage = bundle.get("usage") + " ide [option]* [[commandlet] [arg]*]";
5✔
71
      LOG.info(usage);
3✔
72
      LOG.info("");
3✔
73
      printCommandlets(bundle);
3✔
74
    } else {
1✔
75
      printCommandletHelp(bundle, cmd);
4✔
76
    }
77
    LOG.info("");
3✔
78
    LOG.info(bundle.get("options"));
5✔
79
    Args options = new Args();
5✔
80
    ContextCommandlet cxtCmd = new ContextCommandlet(((AbstractIdeContext) this.context).getStartContext());
8✔
81
    collectOptions(options, cxtCmd, bundle);
5✔
82
    if (cmd != null) {
2✔
83
      collectOptions(options, cmd, bundle);
5✔
84
    }
85
    options.print();
2✔
86
    if (cmd == null) {
2✔
87
      LOG.info("");
3✔
88
      LOG.info(bundle.getDetail(this.context.getCommandletManager().getCommandlet(HelpCommandlet.class)));
9✔
89
    }
90

91
    LOG.info("");
3✔
92
    LOG.info(bundle.get("icd-hint"));
5✔
93
  }
1✔
94

95
  private void printCommandletHelp(NlsBundle bundle, Commandlet cmd) {
96

97
    StringBuilder usage = new StringBuilder();
4✔
98
    Args values = new Args();
5✔
99
    usage.append(bundle.get("usage"));
6✔
100
    usage.append(" ide [option]*");
4✔
101
    for (Property<?> property : cmd.getProperties()) {
11✔
102
      if (property.isValue() || property.isRequired()) {
3!
103
        usage.append(" ");
4✔
104
        if (!property.isRequired()) {
3✔
105
          usage.append('[');
4✔
106
        }
107
        String name = property.getName();
3✔
108
        if (name.isEmpty()) {
3✔
109
          assert !(property instanceof KeywordProperty);
4!
110
          String key = "<" + property.getAlias() + ">";
4✔
111
          usage.append(key);
4✔
112
          values.add(key, bundle.get(cmd, property));
7✔
113
        } else {
1✔
114
          usage.append(name);
4✔
115
        }
116
        if (property.isMultiValued()) {
3✔
117
          usage.append('*');
4✔
118
        }
119
        if (!property.isRequired()) {
3✔
120
          usage.append(']');
4✔
121
        }
122
      }
123
    }
1✔
124
    LOG.info(usage.toString());
4✔
125
    LOG.info(bundle.get(cmd));
5✔
126
    LOG.info(bundle.getDetail(cmd));
5✔
127
    LOG.info("");
3✔
128
    LOG.info(bundle.get("values"));
5✔
129
    values.print();
2✔
130
    cmd.printHelp(bundle);
3✔
131
  }
1✔
132

133
  private void printCommandlets(NlsBundle bundle) {
134

135
    Args commandlets = new Args();
5✔
136
    Args toolcommandlets = new Args();
5✔
137
    for (Commandlet cmd : this.context.getCommandletManager().getCommandlets()) {
13✔
138
      String key = cmd.getName();
3✔
139
      KeywordProperty keyword = cmd.getFirstKeyword();
3✔
140
      if (keyword != null) {
2!
141
        String name = keyword.getName();
3✔
142
        if (!name.equals(key)) {
4!
143
          key = key + "(" + keyword + ")";
×
144
        }
145
      }
146
      if (cmd instanceof ToolCommandlet) {
3✔
147
        toolcommandlets.add(key, bundle.get(cmd));
7✔
148
      } else {
149
        commandlets.add(key, bundle.get(cmd));
6✔
150
      }
151
    }
1✔
152

153
    LOG.info(bundle.get("commandlets"));
5✔
154
    commandlets.print(IdeLogLevel.INTERACTION);
3✔
155
    LOG.info("");
3✔
156
    LOG.info(bundle.get("toolcommandlets"));
5✔
157
    toolcommandlets.print(IdeLogLevel.INTERACTION);
3✔
158
  }
1✔
159

160
  private void collectOptions(Args options, Commandlet cmd, NlsBundle bundle) {
161

162
    for (Property<?> property : cmd.getProperties()) {
11✔
163
      if (property.isOption() && !property.isRequired()) {
6!
164
        String id = property.getAlias();
3✔
165
        String name = property.getName();
3✔
166
        if (id == null) {
2✔
167
          id = name;
3✔
168
        } else {
169
          id = id + " | " + name;
4✔
170
        }
171
        String description = bundle.get(cmd, property);
5✔
172
        options.add(id, description);
4✔
173
      }
174
    }
1✔
175
  }
1✔
176

177
  private static class Arg implements Comparable<Arg> {
178

179
    private final String key;
180

181
    private final String description;
182

183
    private Arg(String key, String description) {
184

185
      super();
2✔
186
      this.key = key;
3✔
187
      this.description = description;
3✔
188
    }
1✔
189

190
    @Override
191
    public int compareTo(Arg arg) {
192

193
      if (arg == null) {
2!
194
        return 1;
×
195
      }
196
      return this.key.compareTo(arg.key);
6✔
197
    }
198
  }
199

200
  private class Args {
1✔
201

202
    private final List<Arg> args;
203

204
    private int maxKeyLength;
205

206
    private Args() {
207

208
      super();
2✔
209
      this.args = new ArrayList<>();
5✔
210
    }
1✔
211

212
    private void add(String key, String description) {
213

214
      add(new Arg(key, description));
7✔
215
    }
1✔
216

217
    private void add(Arg arg) {
218

219
      this.args.add(arg);
5✔
220
      int keyLength = arg.key.length();
4✔
221
      if (keyLength > this.maxKeyLength) {
4✔
222
        this.maxKeyLength = keyLength;
3✔
223
      }
224
    }
1✔
225

226
    String format(Arg arg) {
227

228
      StringBuilder sb = new StringBuilder(this.maxKeyLength + 2 + arg.description.length());
12✔
229
      sb.append(arg.key);
5✔
230
      int delta = this.maxKeyLength - arg.key.length();
7✔
231
      while (delta > 0) {
2✔
232
        sb.append(' ');
4✔
233
        delta--;
2✔
234
      }
235
      sb.append("  ");
4✔
236
      sb.append(arg.description);
5✔
237
      return sb.toString();
3✔
238
    }
239

240
    void print() {
241

242
      print(IdeLogLevel.INFO);
3✔
243
    }
1✔
244

245
    void print(IdeLogLevel level) {
246

247
      for (Arg arg : get()) {
11✔
248
        String message = format(arg);
4✔
249
        Level slf4jLevel = level.getSlf4jLevel();
3✔
250
        Marker marker = level.getSlf4jMarker();
3✔
251
        if (marker == null) {
2✔
252
          LOG.atLevel(slf4jLevel).log(message);
6✔
253
        } else {
254
          assert slf4jLevel == Level.INFO;
4!
255
          LOG.info(marker, message);
4✔
256
        }
257
      }
1✔
258
    }
1✔
259

260
    public List<Arg> get() {
261

262
      Collections.sort(this.args);
3✔
263
      return this.args;
3✔
264
    }
265
  }
266
}
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