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

devonfw / IDEasy / 22241505980

20 Feb 2026 09:16PM UTC coverage: 70.656% (+0.2%) from 70.474%
22241505980

Pull #1710

github

web-flow
Merge 04e4bdacd into 379acdc9d
Pull Request #1710: #404: allow logging via SLF4J

4121 of 6440 branches covered (63.99%)

Branch coverage included in aggregate %.

10704 of 14542 relevant lines covered (73.61%)

3.13 hits per line

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

94.29
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.log.IdeSubLogger;
14
import com.devonfw.tools.ide.nls.NlsBundle;
15
import com.devonfw.tools.ide.property.CommandletProperty;
16
import com.devonfw.tools.ide.property.KeywordProperty;
17
import com.devonfw.tools.ide.property.Property;
18
import com.devonfw.tools.ide.tool.ToolCommandlet;
19
import com.devonfw.tools.ide.version.IdeVersion;
20

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

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

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

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

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

43
  @Override
44
  public String getName() {
45

46
    return "help";
2✔
47
  }
48

49
  @Override
50
  public boolean isIdeRootRequired() {
51

52
    return false;
2✔
53
  }
54

55
  @Override
56
  protected boolean isActivateJaveUtilLogging() {
57

58
    return false;
2✔
59
  }
60

61
  @Override
62
  protected void doRun() {
63

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

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

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

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

132
  private void printCommandlets(NlsBundle bundle) {
133

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

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

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

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

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

178
    private final String key;
179

180
    private final String description;
181

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

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

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

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

199
  private class Args {
200

201
    private final List<Arg> args;
202

203
    private int maxKeyLength;
204

205
    private Args() {
3✔
206

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

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

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

216
    private void add(Arg arg) {
217

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

225
    String format(Arg arg) {
226

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

239
    void print() {
240

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

244
    void print(IdeLogLevel level) {
245

246
      IdeSubLogger logger = HelpCommandlet.this.context.level(level);
6✔
247
      for (Arg arg : get()) {
11✔
248
        logger.log(format(arg));
5✔
249
      }
1✔
250
    }
1✔
251

252
    public List<Arg> get() {
253

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