From 97734bef32e58ca63c83fa86380aa39d5f474d20 Mon Sep 17 00:00:00 2001 From: aBega2000 <145266540+aBega2000@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:41:37 +0200 Subject: [PATCH] #36: Tool Commandlet for tomcat (#250) --- .../ide/commandlet/CommandletManagerImpl.java | 2 + .../devonfw/tools/ide/tool/Dependency.java | 136 ++++++++++++++++ .../tools/ide/tool/LocalToolCommandlet.java | 145 ++++++++++++++++++ .../devonfw/tools/ide/tool/tomcat/Tomcat.java | 143 +++++++++++++++++ .../tools/ide/tool/tomcat/TomcatCommand.java | 5 + .../file/dependencyJson/DependencyInfo.java | 29 ++++ cli/src/main/resources/nls/Help.properties | 3 + cli/src/main/resources/nls/Help_de.properties | 3 + .../tools/ide/tool/tomcat/TomcatTest.java | 54 +++++++ .../_ide/software/default/java/java/.gitkeep | 0 .../_ide/urls/java/java/17.0.10_7/.gitkeep | 0 .../_ide/urls/tomcat/tomcat/dependencies.json | 62 ++++++++ .../tomcat/project/conf/ide.properties | 0 .../tomcat/project/home/.ide/ide.properties | 0 .../tomcat/project/settings/ide.properties | 2 + .../tomcat/project/workspaces/main/readme | 1 + .../repository/java/java/default/.gitkeep | 0 .../tomcat/tomcat/default/bin/startup.bat | 1 + .../tomcat/tomcat/default/bin/startup.sh | 2 + .../tomcat/tomcat/default/conf/server.xml | 1 + 20 files changed, 589 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/Dependency.java create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/Tomcat.java create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/TomcatCommand.java create mode 100644 cli/src/main/java/com/devonfw/tools/ide/url/model/file/dependencyJson/DependencyInfo.java create mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/tomcat/TomcatTest.java create mode 100644 cli/src/test/resources/ide-projects/tomcat/_ide/software/default/java/java/.gitkeep create mode 100644 cli/src/test/resources/ide-projects/tomcat/_ide/urls/java/java/17.0.10_7/.gitkeep create mode 100644 cli/src/test/resources/ide-projects/tomcat/_ide/urls/tomcat/tomcat/dependencies.json create mode 100644 cli/src/test/resources/ide-projects/tomcat/project/conf/ide.properties create mode 100644 cli/src/test/resources/ide-projects/tomcat/project/home/.ide/ide.properties create mode 100644 cli/src/test/resources/ide-projects/tomcat/project/settings/ide.properties create mode 100644 cli/src/test/resources/ide-projects/tomcat/project/workspaces/main/readme create mode 100644 cli/src/test/resources/ide-projects/tomcat/repository/java/java/default/.gitkeep create mode 100644 cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.bat create mode 100644 cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.sh create mode 100644 cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/conf/server.xml diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index 6eebfab13..af4162503 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -29,6 +29,7 @@ import com.devonfw.tools.ide.tool.quarkus.Quarkus; import com.devonfw.tools.ide.tool.sonar.Sonar; import com.devonfw.tools.ide.tool.terraform.Terraform; +import com.devonfw.tools.ide.tool.tomcat.Tomcat; import com.devonfw.tools.ide.tool.vscode.Vscode; import java.util.Collection; @@ -92,6 +93,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Quarkus(context)); add(new Kotlinc(context)); add(new KotlincNative(context)); + add(new Tomcat(context)); add(new Vscode(context)); add(new Azure(context)); add(new Aws(context)); diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/Dependency.java b/cli/src/main/java/com/devonfw/tools/ide/tool/Dependency.java new file mode 100644 index 000000000..e9b1ee3e8 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/Dependency.java @@ -0,0 +1,136 @@ +package com.devonfw.tools.ide.tool; + +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.json.mapping.JsonMapping; +import com.devonfw.tools.ide.url.model.file.dependencyJson.DependencyInfo; +import com.devonfw.tools.ide.version.VersionIdentifier; +import com.devonfw.tools.ide.version.VersionRange; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +/** + * Class to represent the functionality of installing the dependencies when a tool is being installed. + */ +public class Dependency { + + private final IdeContext context; + + private final String tool; + + private static final String DEPENDENCY_FILENAME = "dependencies.json"; + + private static final ObjectMapper MAPPER = JsonMapping.create(); + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + * @param tool the tool of the context + */ + public Dependency(IdeContext context, String tool) { + + this.context = context; + this.tool = tool; + } + + /** + * Method to get the dependency json file path + * + * @param toolEdition the edition of the tool. + * @return the {@link Path} of the dependency.json file + */ + public Path getDependencyJsonPath(String toolEdition) { + + Path toolPath = this.context.getUrlsPath().resolve(tool).resolve(toolEdition); + return toolPath.resolve(DEPENDENCY_FILENAME); + } + + /** + * Method to read the Json file + * + * @param version of the main tool to be installed. + * @param toolEdition of the main tool, so that the correct folder can be checked to find the dependency json file + * @return the {@link List} of {@link DependencyInfo} to be installed + */ + public List readJson(VersionIdentifier version, String toolEdition) { + + Path dependencyJsonPath = getDependencyJsonPath(toolEdition); + + try (BufferedReader reader = Files.newBufferedReader(dependencyJsonPath)) { + TypeReference>> typeRef = new TypeReference<>() { + }; + Map> dependencyJson = MAPPER.readValue(reader, typeRef); + return findDependenciesFromJson(dependencyJson, version); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Method to search the List of versions available in the ide and find the right version to install + * + * @param dependencyFound the {@link DependencyInfo} of the dependency that was found that needs to be installed + * @return {@link VersionIdentifier} of the dependency that is to be installed + */ + public VersionIdentifier findDependencyVersionToInstall(DependencyInfo dependencyFound) { + + String dependencyEdition = this.context.getVariables().getToolEdition(dependencyFound.getTool()); + + List versions = this.context.getUrls().getSortedVersions(dependencyFound.getTool(), dependencyEdition); + + for (VersionIdentifier vi : versions) { + if (dependencyFound.getVersionRange().contains(vi)) { + return vi; + } + } + return null; + } + + /** + * Method to check if in the repository of the dependency there is a Version greater or equal to the version range to be installed, and to return the path of + * this version if it exists + * + * @param dependencyRepositoryPath the {@link Path} of the dependency repository + * @param dependencyVersionRangeFound the {@link VersionRange} of the dependency version to be installed + * @return the {@link Path} of such version if it exists in repository already, an empty Path + */ + public Path versionExistsInRepository(Path dependencyRepositoryPath, VersionRange dependencyVersionRangeFound) { + + try (Stream versions = Files.list(dependencyRepositoryPath)) { + Iterator versionsIterator = versions.iterator(); + while (versionsIterator.hasNext()) { + VersionIdentifier versionFound = VersionIdentifier.of(versionsIterator.next().getFileName().toString()); + if (dependencyVersionRangeFound.contains(versionFound)) { + assert versionFound != null; + return dependencyRepositoryPath.resolve(versionFound.toString()); + } + } + } catch (IOException e) { + throw new IllegalStateException("Failed to iterate through " + dependencyRepositoryPath, e); + } + return Path.of(""); + } + + private List findDependenciesFromJson(Map> dependencies, VersionIdentifier toolVersionToCheck) { + + for (Map.Entry> map : dependencies.entrySet()) { + + VersionRange foundToolVersionRange = map.getKey(); + + if (foundToolVersionRange.contains(toolVersionToCheck)) { + return map.getValue(); + } + } + return null; + } +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java index ace5140c3..ae8fd6870 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/LocalToolCommandlet.java @@ -5,14 +5,20 @@ import com.devonfw.tools.ide.io.FileAccess; import com.devonfw.tools.ide.io.FileCopyMode; import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.process.ProcessErrorHandling; +import com.devonfw.tools.ide.process.ProcessMode; import com.devonfw.tools.ide.repo.ToolRepository; import com.devonfw.tools.ide.step.Step; +import com.devonfw.tools.ide.url.model.file.dependencyJson.DependencyInfo; import com.devonfw.tools.ide.version.VersionIdentifier; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.HashMap; +import java.util.List; import java.util.Set; /** @@ -20,6 +26,12 @@ */ public abstract class LocalToolCommandlet extends ToolCommandlet { + protected HashMap dependenciesEnvVariableNames = null; + + protected HashMap dependenciesEnvVariablePaths = new HashMap<>(); + + private final Dependency dependency = new Dependency(this.context, this.tool); + /** * The constructor. * @@ -133,6 +145,13 @@ public ToolInstallation installInRepo(VersionIdentifier version, String edition) public ToolInstallation installInRepo(VersionIdentifier version, String edition, ToolRepository toolRepository) { VersionIdentifier resolvedVersion = toolRepository.resolveVersion(this.tool, edition, version); + + if (Files.exists(this.dependency.getDependencyJsonPath(getEdition()))) { + installDependencies(resolvedVersion); + } else { + this.context.trace("No Dependencies file found"); + } + Path toolPath = this.context.getSoftwareRepositoryPath().resolve(toolRepository.getId()).resolve(this.tool).resolve(edition) .resolve(resolvedVersion.toString()); Path toolVersionFile = toolPath.resolve(IdeContext.FILE_SOFTWARE_VERSION); @@ -283,4 +302,130 @@ private ToolInstallation createToolInstallation(Path rootDir, VersionIdentifier return createToolInstallation(rootDir, resolvedVersion, toolVersionFile, false); } + @Override + public void runTool(ProcessMode processMode, VersionIdentifier toolVersion, String... args) { + + Path binaryPath; + Path toolPath = Path.of(getBinaryName()); + if (toolVersion == null) { + install(true); + binaryPath = toolPath; + } else { + throw new UnsupportedOperationException("Not yet implemented!"); + } + + if (Files.exists(this.dependency.getDependencyJsonPath(getEdition()))) { + setDependencyRepository(getInstalledVersion()); + } else { + this.context.trace("No Dependencies file found"); + } + + ProcessContext pc = this.context.newProcess().errorHandling(ProcessErrorHandling.WARNING).executable(binaryPath).addArgs(args); + + for (String key : this.dependenciesEnvVariablePaths.keySet()) { + + String dependencyPath = this.dependenciesEnvVariablePaths.get(key); + pc = pc.withEnvVar(key, dependencyPath); + } + + pc.run(processMode); + } + + private void installDependencies(VersionIdentifier version) { + + List dependencies = this.dependency.readJson(version, getEdition()); + + for (DependencyInfo dependencyInfo : dependencies) { + + String dependencyName = dependencyInfo.getTool(); + VersionIdentifier dependencyVersionToInstall = this.dependency.findDependencyVersionToInstall(dependencyInfo); + if (dependencyVersionToInstall == null) { + continue; + } + + ToolCommandlet dependencyTool = this.context.getCommandletManager().getToolCommandlet(dependencyName); + Path dependencyRepository = getDependencySoftwareRepository(dependencyName, dependencyTool.getEdition()); + + if (!Files.exists(dependencyRepository)) { + installDependencyInRepo(dependencyName, dependencyTool, dependencyVersionToInstall); + } else { + Path versionExistingInRepository = this.dependency.versionExistsInRepository(dependencyRepository, dependencyInfo.getVersionRange()); + if (versionExistingInRepository.equals(Path.of(""))) { + installDependencyInRepo(dependencyName, dependencyTool, dependencyVersionToInstall); + } else { + this.context.info("Necessary version of the dependency {} is already installed in repository", dependencyName); + } + } + } + } + + private void installDependencyInRepo(String dependencyName, ToolCommandlet dependencyTool, VersionIdentifier dependencyVersionToInstall) { + + this.context.info("The version {} of the dependency {} is being installed", dependencyVersionToInstall, dependencyName); + LocalToolCommandlet dependencyLocal = (LocalToolCommandlet) dependencyTool; + dependencyLocal.installInRepo(dependencyVersionToInstall); + this.context.info("The version {} of the dependency {} was successfully installed", dependencyVersionToInstall, dependencyName); + } + + protected void setDependencyRepository(VersionIdentifier version) { + + List dependencies = this.dependency.readJson(version, getEdition()); + + for (DependencyInfo dependencyInfo : dependencies) { + String dependencyName = dependencyInfo.getTool(); + VersionIdentifier dependencyVersionToInstall = this.dependency.findDependencyVersionToInstall(dependencyInfo); + if (dependencyVersionToInstall == null) { + continue; + } + + ToolCommandlet dependencyTool = this.context.getCommandletManager().getToolCommandlet(dependencyName); + Path dependencyRepository = getDependencySoftwareRepository(dependencyName, dependencyTool.getEdition()); + Path versionExistingInRepository = this.dependency.versionExistsInRepository(dependencyRepository, dependencyInfo.getVersionRange()); + Path dependencyPath; + + if (versionExistingInRepository.equals(Path.of(""))) { + dependencyPath = dependencyRepository.resolve(dependencyVersionToInstall.toString()); + } else { + dependencyPath = dependencyRepository.resolve(versionExistingInRepository); + } + setDependencyEnvironmentPath(getDependencyEnvironmentName(dependencyName), dependencyPath); + } + } + + private void setDependencyEnvironmentPath(String dependencyEnvironmentName, Path dependencyPath) { + + this.dependenciesEnvVariablePaths.put(dependencyEnvironmentName, dependencyPath.toString()); + + } + + /** + * Method to return the list of the environment variable name for the dependencies. If necessary, it should be overridden in the specific tool + * + * @return the {@link HashMap} with the dependency name mapped to the env variable, for example ( java: JAVA_HOME ) + */ + + protected HashMap listOfDependencyEnvVariableNames() { + + return dependenciesEnvVariableNames; + } + + private String getDependencyEnvironmentName(String dependencyName) { + + HashMap envVariableName = listOfDependencyEnvVariableNames(); + + if (envVariableName != null) { + return envVariableName.get(dependencyName); + } + + return dependencyName.toUpperCase() + "_HOME"; + } + + private Path getDependencySoftwareRepository(String dependencyName, String dependencyEdition) { + + String defaultToolRepositoryId = this.context.getDefaultToolRepository().getId(); + Path dependencyRepository = this.context.getSoftwareRepositoryPath().resolve(defaultToolRepositoryId).resolve(dependencyName).resolve(dependencyEdition); + + return dependencyRepository; + } + } diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/Tomcat.java b/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/Tomcat.java new file mode 100644 index 000000000..e8fdece6b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/Tomcat.java @@ -0,0 +1,143 @@ +package com.devonfw.tools.ide.tool.tomcat; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.environment.EnvironmentVariables; +import com.devonfw.tools.ide.environment.EnvironmentVariablesType; +import com.devonfw.tools.ide.property.EnumProperty; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Set; + +public class Tomcat extends LocalToolCommandlet { + + private final HashMap dependenciesEnvVariableNames = new HashMap<>(); + + public final EnumProperty command; + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public Tomcat(IdeContext context) { + + super(context, "tomcat", Set.of(Tag.JAVA)); + this.command = add(new EnumProperty<>("", true, "command", TomcatCommand.class)); + // add(this.arguments); + } + + @Override + public void postInstall() { + + super.postInstall(); + + EnvironmentVariables variables = this.context.getVariables(); + EnvironmentVariables typeVariables = variables.getByType(EnvironmentVariablesType.CONF); + + typeVariables.set("CATALINA_HOME", getToolPath().toString(), true); + typeVariables.save(); + } + + @Override + protected void initProperties() { + + // Empty on purpose, because no initial properties are added to the tool + } + + @Override + public void run() { + + Path toolPath = getToolPath(); + if (!toolPath.toFile().exists()) { + super.install(true); + } + + TomcatCommand command = this.command.getValue(); + + switch (command) { + case START: + printTomcatPort(); + arguments.setValueAsString("start", context); + super.run(); + break; + case STOP: + arguments.setValueAsString("stop", context); + super.run(); + break; + default: + } + } + + @Override + protected String getBinaryName() { + + TomcatCommand command = this.command.getValue(); + + Path toolBinPath = getToolBinPath(); + + String tomcatHome = null; + + if (this.context.getSystemInfo().isWindows()) { + if (command.equals(TomcatCommand.START)) { + tomcatHome = "startup.bat"; + } else if (command.equals(TomcatCommand.STOP)) { + tomcatHome = "shutdown.bat"; + } else { + this.context.error("Unknown tomcat command"); + } + } else { + if (command.equals(TomcatCommand.START)) { + tomcatHome = "startup.sh"; + } else if (command.equals(TomcatCommand.STOP)) { + tomcatHome = "shutdown.sh"; + } else { + this.context.error("Unknown tomcat command"); + } + } + + return toolBinPath.resolve(tomcatHome).toString(); + } + + @Override + protected HashMap listOfDependencyEnvVariableNames() { + + dependenciesEnvVariableNames.put("java", "JRE_HOME"); + return dependenciesEnvVariableNames; + } + + private void printTomcatPort() { + + this.context.info("Tomcat is running at localhost on the following port (default 8080):"); + Path tomcatPropertiesPath = getToolPath().resolve("conf/server.xml"); + + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(tomcatPropertiesPath.toString()); + + NodeList connectorNodes = document.getElementsByTagName("Connector"); + if (connectorNodes.getLength() > 0) { + Element ConnectorElement = (Element) connectorNodes.item(0); + String portNumber = ConnectorElement.getAttribute("port"); + this.context.info(portNumber); + } else { + this.context.warning("Port element not found in server.xml"); + } + + } catch (ParserConfigurationException | IOException | SAXException e) { + this.context.error(e); + } + } + +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/TomcatCommand.java b/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/TomcatCommand.java new file mode 100644 index 000000000..d3cdffcc2 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/tomcat/TomcatCommand.java @@ -0,0 +1,5 @@ +package com.devonfw.tools.ide.tool.tomcat; + +public enum TomcatCommand { + START, STOP +} diff --git a/cli/src/main/java/com/devonfw/tools/ide/url/model/file/dependencyJson/DependencyInfo.java b/cli/src/main/java/com/devonfw/tools/ide/url/model/file/dependencyJson/DependencyInfo.java new file mode 100644 index 000000000..ed0af8cd7 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/url/model/file/dependencyJson/DependencyInfo.java @@ -0,0 +1,29 @@ +package com.devonfw.tools.ide.url.model.file.dependencyJson; + +import com.devonfw.tools.ide.version.VersionRange; + +/** + * Model to represent the Object of the dependencies inside the Json file. + */ +public final class DependencyInfo { + private String tool; + + private String versionRange; + + /** + * @return the dependency name + */ + public String getTool() { + + return tool; + } + + /** + * @return the VersionRange of the dependency + */ + public VersionRange getVersionRange() { + + return VersionRange.of(versionRange); + } + +} \ No newline at end of file diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index 89a3baa33..d79e45d4a 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -86,6 +86,9 @@ cmd.sonar.detail=SonarQube is a platform for continuous inspection of code quali cmd.sonar.val.command=Action to perform (START|STOP|ANALYZE) cmd.terraform=Tool commandlet for Terraform. cmd.terraform.detail=Terraform is an infrastructure as code tool for managing cloud resources. Detailed documentation can be found at https://www.terraform.io/docs/index.html +cmd.tomcat=Tool commandlet for Tomcat +cmd.tomcat.detail=Tomcat is an open-source web server and Servlet container for Java code. +cmd.tomcat.val.command=Action to perform ( START | STOP ) cmd.uninstall=Uninstall the selected tool. cmd.uninstall.detail=TODO uninstall cmd.update=Pull your settings and apply updates (software, configuration and repositories). diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index 58147300b..30f0d92f1 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -86,6 +86,9 @@ cmd.sonar.detail=SonarQube ist eine Plattform für die kontinuierliche Code-Qual cmd.sonar.val.command=Auszuführende Aktion (START|STOP|ANALYZE) cmd.terraform=Werkzeug Kommando für Terraform. cmd.terraform.detail=Terraform ist ein Tool für Infrastructure as Code zur Verwaltung von Cloud-Ressourcen. Detaillierte Dokumentation ist zu finden unter https://www.terraform.io/docs/index.html +cmd.tomcat=Werkzeug Kommando für Tomcat +cmd.tomcat.detail=Tomcat ist ein leistungsstarker Open-Source-Webserver und Servlet-Container für Java-Anwendungen. +cmd.tomcat.val.command=Auszuführende Aktion ( START | STOP ) cmd.uninstall=Deinstalliert das ausgewählte Werkzeug. cmd.uninstall.detail=TODO DE uninstall cmd.update=Updatet die Settings, Software und Repositories. diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/tomcat/TomcatTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/tomcat/TomcatTest.java new file mode 100644 index 000000000..67309451c --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/tomcat/TomcatTest.java @@ -0,0 +1,54 @@ +package com.devonfw.tools.ide.tool.tomcat; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.log.IdeLogLevel; +import org.junit.jupiter.api.Test; + +public class TomcatTest extends AbstractIdeContextTest { + + private static final String PROJECT_TOMCAT = "tomcat"; + + @Test + public void testTomcat() { + + // arrange + IdeTestContext context = newContext(PROJECT_TOMCAT); + Tomcat tomcatCommandlet = new Tomcat(context); + + // install + tomcatCommandlet.install(); + + // run + tomcatCommandlet.command.setValue(TomcatCommand.START); + tomcatCommandlet.run(); + + // assert + checkInstallation(context); + checkDependencyInstallation(context); + checkRunningTomcat(context); + } + + private void checkDependencyInstallation(IdeTestContext context) { + + assertLogMessage(context, IdeLogLevel.INFO, "The version 17.0.10_7 of the dependency java is being installed"); + assertLogMessage(context, IdeLogLevel.INFO, "The version 17.0.10_7 of the dependency java was successfully installed"); + + } + + private void checkRunningTomcat(IdeTestContext context) { + + assertLogMessage(context, IdeLogLevel.INFO, "Tomcat is running at localhost on the following port (default 8080):"); + assertLogMessage(context, IdeLogLevel.INFO, "8080"); + } + + private void checkInstallation(IdeTestContext context) { + + assertThat(context.getSoftwarePath().resolve("tomcat/bin/startup.bat")).exists().hasContent("@echo test for windows"); + assertThat(context.getSoftwarePath().resolve("tomcat/bin/startup.sh")).exists().hasContent("#!/bin/bash\n" + "echo \"Test for linux and Mac\""); + + assertThat(context.getSoftwarePath().resolve("tomcat/.ide.software.version")).exists().hasContent("10.1.14"); + assertLogMessage(context, IdeLogLevel.SUCCESS, "Successfully installed tomcat in version 10.1.14"); + } + +} diff --git a/cli/src/test/resources/ide-projects/tomcat/_ide/software/default/java/java/.gitkeep b/cli/src/test/resources/ide-projects/tomcat/_ide/software/default/java/java/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cli/src/test/resources/ide-projects/tomcat/_ide/urls/java/java/17.0.10_7/.gitkeep b/cli/src/test/resources/ide-projects/tomcat/_ide/urls/java/java/17.0.10_7/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cli/src/test/resources/ide-projects/tomcat/_ide/urls/tomcat/tomcat/dependencies.json b/cli/src/test/resources/ide-projects/tomcat/_ide/urls/tomcat/tomcat/dependencies.json new file mode 100644 index 000000000..dc3d15a7a --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/_ide/urls/tomcat/tomcat/dependencies.json @@ -0,0 +1,62 @@ +{ + "(10.0.27,11.0.0]": [ + { + "tool": "java", + "versionRange": "[11,21_35]" + } + ], + "(9.0.85,10.0.27]": [ + { + "tool": "java", + "versionRange": "[8,11)" + } + ], + "(8.5.98,9.0.85]": [ + { + "tool": "java", + "versionRange": "[8,11)" + } + ], + "(8.0.53,8.5.98]": [ + { + "tool": "java", + "versionRange": "[7,8)" + } + ], + "(7.0.109,8.0.53]": [ + { + "tool": "java", + "versionRange": "[7,8)" + } + ], + "(6.0.53,7.0.109]": [ + { + "tool": "java", + "versionRange": "[7,8)" + } + ], + "(5.5.36,6.0.53])": [ + { + "tool": "java", + "versionRange": "[5,7)" + } + ], + "(4.1.40,5.5.36]": [ + { + "tool": "java", + "versionRange": "[1.4,5)" + } + ], + "(3.3.2,4.1.40]": [ + { + "tool": "java", + "versionRange": "[1.3,1.4)" + } + ], + "(3.3.0,3.3.2]": [ + { + "tool": "java", + "versionRange": "[1.1,1.3)" + } + ] +} diff --git a/cli/src/test/resources/ide-projects/tomcat/project/conf/ide.properties b/cli/src/test/resources/ide-projects/tomcat/project/conf/ide.properties new file mode 100644 index 000000000..e69de29bb diff --git a/cli/src/test/resources/ide-projects/tomcat/project/home/.ide/ide.properties b/cli/src/test/resources/ide-projects/tomcat/project/home/.ide/ide.properties new file mode 100644 index 000000000..e69de29bb diff --git a/cli/src/test/resources/ide-projects/tomcat/project/settings/ide.properties b/cli/src/test/resources/ide-projects/tomcat/project/settings/ide.properties new file mode 100644 index 000000000..94f0da300 --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/project/settings/ide.properties @@ -0,0 +1,2 @@ +JAVA_VERSION=8u402b06 +TOMCAT_VERSION=10.1.14 \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/tomcat/project/workspaces/main/readme b/cli/src/test/resources/ide-projects/tomcat/project/workspaces/main/readme new file mode 100644 index 000000000..776cee007 --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/project/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of tomcat test case \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/tomcat/repository/java/java/default/.gitkeep b/cli/src/test/resources/ide-projects/tomcat/repository/java/java/default/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.bat b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.bat new file mode 100644 index 000000000..5fc84a864 --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.bat @@ -0,0 +1 @@ +@echo test for windows \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.sh b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.sh new file mode 100644 index 000000000..73d55c222 --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/bin/startup.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "Test for linux and Mac" \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/conf/server.xml b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/conf/server.xml new file mode 100644 index 000000000..ee1c65e67 --- /dev/null +++ b/cli/src/test/resources/ide-projects/tomcat/repository/tomcat/tomcat/default/conf/server.xml @@ -0,0 +1 @@ + \ No newline at end of file