• 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

75.0
cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/Tomcat.java
1
package com.devonfw.tools.ide.tool.tomcat;
2

3
import java.io.IOException;
4
import java.nio.file.Files;
5
import java.nio.file.Path;
6
import java.util.List;
7
import java.util.Set;
8
import javax.xml.parsers.DocumentBuilder;
9
import javax.xml.parsers.DocumentBuilderFactory;
10
import javax.xml.parsers.ParserConfigurationException;
11

12
import org.slf4j.Logger;
13
import org.slf4j.LoggerFactory;
14
import org.w3c.dom.Document;
15
import org.w3c.dom.Element;
16
import org.w3c.dom.NodeList;
17
import org.xml.sax.SAXException;
18

19
import com.devonfw.tools.ide.common.Tag;
20
import com.devonfw.tools.ide.context.IdeContext;
21
import com.devonfw.tools.ide.process.EnvironmentContext;
22
import com.devonfw.tools.ide.process.ProcessErrorHandling;
23
import com.devonfw.tools.ide.process.ProcessMode;
24
import com.devonfw.tools.ide.process.ProcessResult;
25
import com.devonfw.tools.ide.tool.LocalToolCommandlet;
26
import com.devonfw.tools.ide.tool.ToolCommandlet;
27
import com.devonfw.tools.ide.tool.ToolInstallation;
28
import com.devonfw.tools.ide.version.GenericVersionRange;
29

30
/**
31
 * {@link ToolCommandlet} for <a href="https://tomcat.apache.org/">tomcat</a>.
32
 */
33
public class Tomcat extends LocalToolCommandlet {
34

35
  private static final Logger LOG = LoggerFactory.getLogger(Tomcat.class);
4✔
36

37
  private static final String CATALINA = "catalina";
38
  private static final String CATALINA_BAT = CATALINA + ".bat";
39
  private static final String CATALINA_BASH_SCRIPT = CATALINA + ".sh";
40

41
  /**
42
   * The constructor.
43
   *
44
   * @param context the {@link IdeContext}.
45
   */
46
  public Tomcat(IdeContext context) {
47

48
    super(context, "tomcat", Set.of(Tag.JAVA));
6✔
49
  }
1✔
50

51
  @Override
52
  protected String getBinaryName() {
53

54
    if (this.context.getSystemInfo().isWindows()) {
5!
55
      return CATALINA_BAT;
×
56
    } else {
57
      return CATALINA_BASH_SCRIPT;
2✔
58
    }
59
  }
60

61
  @Override
62
  public ProcessResult runTool(ProcessMode processMode, GenericVersionRange toolVersion, ProcessErrorHandling errorHandling, List<String> args) {
63

64
    if (args.isEmpty()) {
3!
65
      args.add("run");
4✔
66
    }
67
    String first = args.getFirst();
4✔
68
    boolean startup = first.equals("start") || first.equals("run");
11!
69
    if (startup) {
2!
70
      processMode = ProcessMode.BACKGROUND;
2✔
71
    }
72
    ProcessResult processResult = super.runTool(processMode, toolVersion, errorHandling, args);
7✔
73
    if (processResult.isSuccessful() && startup) {
5!
74
      printTomcatPort();
2✔
75
    }
76
    return processResult;
2✔
77
  }
78

79
  @Override
80
  public void setEnvironment(EnvironmentContext environmentContext, ToolInstallation toolInstallation, boolean additionalInstallation) {
81

82
    super.setEnvironment(environmentContext, toolInstallation, additionalInstallation);
5✔
83
    environmentContext.withEnvVar("CATALINA_HOME", toolInstallation.linkDir().toString());
7✔
84
  }
1✔
85

86
  private void printTomcatPort() {
87

88
    String portNumber = findTomcatPort();
3✔
89
    if (!portNumber.isEmpty()) {
3!
90
      LOG.info("Tomcat is running at localhost on HTTP port {}:", portNumber);
4✔
91
      LOG.info("http://localhost:{}", portNumber);
4✔
92
    }
93
  }
1✔
94

95
  private String findTomcatPort() {
96

97
    String portNumber = "";
2✔
98
    Path tomcatPropertiesPath = getToolPath().resolve("conf/server.xml");
5✔
99
    if (Files.exists(tomcatPropertiesPath)) {
5!
100
      try {
101
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2✔
102
        DocumentBuilder builder = factory.newDocumentBuilder();
3✔
103
        Document document = builder.parse(tomcatPropertiesPath.toFile());
5✔
104
        NodeList connectorNodes = document.getElementsByTagName("Connector");
4✔
105
        if (connectorNodes.getLength() > 0) {
3!
106
          Element ConnectorElement = (Element) connectorNodes.item(0);
5✔
107
          portNumber = ConnectorElement.getAttribute("port");
4✔
108
        } else {
1✔
109
          LOG.warn("Port element not found in server.xml");
×
110
        }
111
      } catch (ParserConfigurationException | IOException | SAXException e) {
×
112
        LOG.error(e.toString(), e);
×
113
      }
1✔
114
    }
115
    if (portNumber.isEmpty()) {
3!
116
      LOG.warn("Could not find HTTP port in {}", tomcatPropertiesPath);
×
117
    }
118
    return portNumber;
2✔
119
  }
120

121
}
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