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

devonfw / IDEasy / 22303886886

23 Feb 2026 11:19AM UTC coverage: 70.647% (+0.2%) from 70.474%
22303886886

Pull #1714

github

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

4069 of 6360 branches covered (63.98%)

Branch coverage included in aggregate %.

10644 of 14466 relevant lines covered (73.58%)

3.1 hits per line

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

93.68
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

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

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

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

27
  /** The optional commandlet to get help about. */
28
  public final CommandletProperty commandlet;
29

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

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

42
  @Override
43
  public String getName() {
44

45
    return "help";
2✔
46
  }
47

48
  @Override
49
  public boolean isIdeRootRequired() {
50

51
    return false;
2✔
52
  }
53

54
  @Override
55
  public boolean isWriteLogFile() {
56

57
    return false;
×
58
  }
59

60
  @Override
61
  protected void doRun() {
62

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

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

93
  private void printCommandletHelp(NlsBundle bundle, Commandlet cmd) {
94

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

131
  private void printCommandlets(NlsBundle bundle) {
132

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

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

158
  private void collectOptions(Args options, Commandlet cmd, NlsBundle bundle) {
159

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

175
  private static class Arg implements Comparable<Arg> {
176

177
    private final String key;
178

179
    private final String description;
180

181
    private Arg(String key, String description) {
182

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

188
    @Override
189
    public int compareTo(Arg arg) {
190

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

198
  private class Args {
199

200
    private final List<Arg> args;
201

202
    private int maxKeyLength;
203

204
    private Args() {
205

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

210
    private void add(String key, String description) {
211

212
      add(new Arg(key, description));
7✔
213
    }
1✔
214

215
    private void add(Arg arg) {
216

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

224
    String format(Arg arg) {
225

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

238
    void print() {
239

240
      print(IdeLogLevel.INFO);
3✔
241
    }
1✔
242

243
    void print(IdeLogLevel level) {
244

245
      for (Arg arg : get()) {
11✔
246
        String message = format(arg);
4✔
247
        level.log(LOG, message);
4✔
248
      }
1✔
249
    }
1✔
250

251
    public List<Arg> get() {
252

253
      Collections.sort(this.args);
3✔
254
      return this.args;
3✔
255
    }
256
  }
257
}
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