diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 63324eb1..4e706371 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -137,4 +137,29 @@ jobs: - name: Run TomEE REST Application Maven Build run: mvn clean package --file app/rest/tomee/jakartaee-cafe/pom.xml + build-java-17: + runs-on: ubuntu-20.04 + strategy: + matrix: + java: [ 17 ] + name: Java ${{ matrix.Java }} + steps: + - uses: actions/checkout@v3 + - name: Setup java + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: ${{ matrix.java }} + + - name: Cache Maven packages + uses: actions/cache@v1 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + + - name: Build maven-project-generator + run: mvn clean install --file maven-project-generator/pom.xml + - name: Build starter-ui + run: mvn clean package --file starter-ui/pom.xml diff --git a/.gitignore b/.gitignore index 43f0f1e8..1321305c 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,5 @@ buildNumber.properties jakartaee-cafe-data jakartaee-cafe-test-data .vscode/settings.json + +artifact/ diff --git a/README.md b/README.md index 80df40c8..3c8539f6 100644 --- a/README.md +++ b/README.md @@ -22,16 +22,31 @@ There are currently multiple separate Archetypes available. There is also a demo archetype with demonstrates more features of Jakarta EE. -* The [REST/CRUD archetype](rest-starter) generates a simple RESTful CRUD service using a representative set of Jakarta EE technologies such as REST, Enterprise Beans, CDI, Persistence, JSON Binding and Bean Validation. It also includes JUnit tests. +* The [REST/CRUD archetype](rest-starter) generates a simple RESTful CRUD service using a representative set of Jakarta + EE technologies such as REST, Enterprise Beans, CDI, Persistence, JSON Binding and Bean Validation. It also includes + JUnit tests. -Please look at the documentation for the respective archetypes on how to use them. If desired, you can easily use the Maven Archetypes from a Maven capable IDE such as [Eclipse](https://www.eclipse.org/ide). The generated starter code is simply Maven projects. You can easily load, explore and run the code in a Maven capable IDE such as [Eclipse](https://www.eclipse.org/ide). +Please look at the documentation for the respective archetypes on how to use them. If desired, you can easily use the +Maven Archetypes from a Maven capable IDE such as [Eclipse](https://www.eclipse.org/ide). The generated starter code is +simply Maven projects. You can easily load, explore and run the code in a Maven capable IDE such +as [Eclipse](https://www.eclipse.org/ide). ## Roadmap The following is a high level roadmap for the project. All contributions are welcome advancing any of this work. -* Add support for other [Jakarta EE compatible runtimes](https://jakarta.ee/compatibility) such as [WildFly](https://github.com/eclipse-ee4j/starter/issues/113) and [Open Liberty](https://github.com/eclipse-ee4j/starter/issues/112). + +* Add support for other [Jakarta EE compatible runtimes](https://jakarta.ee/compatibility) such + as [WildFly](https://github.com/eclipse-ee4j/starter/issues/113) + and [Open Liberty](https://github.com/eclipse-ee4j/starter/issues/112). * [Transition to Jakarta EE 9.1](https://github.com/eclipse-ee4j/starter/issues/111). * The complete Issue list can be found [here](https://github.com/eclipse-ee4j/starter/issues) ## Known Issues -* Note that Payara does not yet work on the Apple M1 chip. If you are on an M1 chip, we suggest you use GlassFish or TomEE for the time being with the archetypes. + +* Note that Payara does not yet work on the Apple M1 chip. If you are on an M1 chip, we suggest you use GlassFish or + TomEE for the time being with the archetypes. + +## Contributing + +We welcome contributions to the project in many forms. Please see the [Contributing](CONTRIBUTING.md) page for more +information. diff --git a/maven-project-generator/pom.xml b/maven-project-generator/pom.xml index 8e56de38..aae16049 100644 --- a/maven-project-generator/pom.xml +++ b/maven-project-generator/pom.xml @@ -9,14 +9,14 @@ maven-project-generator jar Maven Project Generator - + org.apache.maven maven-embedder 3.8.6 - + org.apache.maven.resolver @@ -41,7 +41,7 @@ - + org.junit.jupiter @@ -55,11 +55,11 @@ test 3.23.1 - + - + @@ -77,7 +77,7 @@ - 11 - 11 + 17 + 17 - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 213c7a98..724d23ba 100644 --- a/pom.xml +++ b/pom.xml @@ -132,13 +132,13 @@ - + - - jdk11plus + + jdk17plus - [11,) + [17,) starter-ui diff --git a/starter-ui/Dockerfile b/starter-ui/Dockerfile new file mode 100644 index 00000000..baba7ac8 --- /dev/null +++ b/starter-ui/Dockerfile @@ -0,0 +1,6 @@ +FROM tomcat:10.0.27-jdk17-corretto + +RUN rm -rf /usr/local/tomcat/webapps/* 2>/dev/null + +ADD target/jakarta-starter-ui.war /usr/local/tomcat/webapps/ROOT.war + diff --git a/starter-ui/README.md b/starter-ui/README.md index 4e8eaca2..31f1e6d9 100644 --- a/starter-ui/README.md +++ b/starter-ui/README.md @@ -1,33 +1,47 @@ -This project serves the UI. It has s Servlet endpoint, which is supposed to take parameters, e.g. groupId, artifactId, version, runtime etc., and generate a downloadable zip folder. +# Starter-UI + +This project serves the UI. It has s Servlet endpoint, which is supposed to take parameters, e.g. groupId, artifactId, +version, runtime etc., and generate a downloadable zip folder. The following instruction works on `*nix` environment. -### Generate the war +## Pre-requisites + +- Docker installed or Tomcat 10 installed + +## Generate the war + Following maven command will generate the war. -``` + +```shell mvn clean package ``` -The command will generate `jakarta-starter-ui-1.1.0-SNAPSHOT.war` in the `/target` folder. -### Deployment & Running the UI +The command will generate `jakarta-starter-ui.war` in the `./artifact` folder. + +## Deployment & Running the UI + This war would expect a Server 5+ or Jakarta EE 9+ runtime (such as tomcat 10 or Eclipse GlassFish 6). -### Deployment on Tomcat 10 -Download Tomcat 10 from the following URL- +## Deployment on Tomcat 10 -`https://tomcat.apache.org/download-10.cgi` +Download Tomcat 10 from the following URL: + +[https://tomcat.apache.org/download-10.cgi](https://tomcat.apache.org/download-10.cgi) Unzip it, and put it in a folder. It can be at any location. Then, remove all the contents of `webapps` folder. -``` +```shell cd ~/apache-tomcat-10.0.21/webapps rm -rf . ``` -Rename the applicatoin WAR to `ROOT.war` -```a -mv target/jakarta-starter-ui-1.1.0-SNAPSHOT.war ROOT.war +Rename the application WAR to `ROOT.war` + +```shell +mv artifact/jakarta-starter-ui.war ROOT.war ``` -Copy the `ROOT.war` and paste it into this `webapps` folder. + +Copy the `ROOT.war` and paste it into this `webapps` folder. The following command will run Tomcat. @@ -38,3 +52,37 @@ sh catalina.sh start That's it. Now open the browser and hit `http://localhost:8080` +## Docker with Tomcat 10 + +With Docker you can deploy without having to install Tomcat 10 on your local machine. + +### Build the image + +from the `starter-ui` folder, run the following command to build the image. + +```shell +docker build -t eclise/starter-ui . +``` + +### Run the container + +```shell +docker run -it --rm -p 8080:8080 eclipse/starter-ui +``` + +### run in dev mode + +In this you will mount a volume to the webapp folder so that you can make changes to the code and every new +`maven package` will be reflected in the running container. + +```shell +docker run -it --rm -p 8080:8080 -v "$(pwd)/articat:/usr/local/tomcat/webapps" eclipse/starter-ui +``` + +See also the `build-docker.sh` and `run-docker.sh` scripts. + +The endpoint is now available at `http://localhost:8080/jakarta-starter-ui` + +e.g. [sample artifact](http://localhost:8080/jakarta-starter-ui/download.zip?archetypeGroupId=org.eclipse.starter&archetypeArtifactId=jakartaee10-minimal&archetypeVersion=1.1.0&groupId=com.sample&artifactId=hello_world&version=1.0.0-SNAPSHOT) + +``` diff --git a/starter-ui/build-docker.sh b/starter-ui/build-docker.sh new file mode 100755 index 00000000..0d2dfc17 --- /dev/null +++ b/starter-ui/build-docker.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + + +if ! mvn clean package; then + echo "Build failed" + exit 1 +fi + +if ! docker build -t eclipse/starter-ui .; then + echo "Docker build failed" + exit 1 +fi diff --git a/starter-ui/docker-run-dev-mode.sh b/starter-ui/docker-run-dev-mode.sh new file mode 100755 index 00000000..6e4952d1 --- /dev/null +++ b/starter-ui/docker-run-dev-mode.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +rm -rf ./artifact 2>/dev/null +mvn clean package -U +docker run -it --rm -p 8080:8080 -v "$(pwd)/artifact:/usr/local/tomcat/webapps/" eclipse/starter-ui; diff --git a/starter-ui/pom.xml b/starter-ui/pom.xml index 5fcf0184..ec606350 100644 --- a/starter-ui/pom.xml +++ b/starter-ui/pom.xml @@ -1,49 +1,85 @@ - - jakarta-starter-modules - org.eclipse.starter - 1.1.0-SNAPSHOT - - 4.0.0 - - jakarta-starter-ui - war - - - UTF-8 - UTF-8 - 11 - 11 - - - - - ${project.groupId} - maven-project-generator - ${project.version} - - - - jakarta.servlet - jakarta.servlet-api - 5.0.0 - provided - - - - - - - - - org.apache.maven.plugins - maven-war-plugin - 3.3.2 - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + jakarta-starter-modules + org.eclipse.starter + 1.1.0-SNAPSHOT + + 4.0.0 + + jakarta-starter-ui + war + + + UTF-8 + UTF-8 + 17 + 17 + + 1.7.0.Alpha13 + + + + + + org.junit + junit-bom + 5.9.0 + pom + import + + + + + + + ${project.groupId} + maven-project-generator + ${project.version} + + + + jakarta.servlet + jakarta.servlet-api + 5.0.0 + provided + + + + org.mockito + mockito-junit-jupiter + 4.9.0 + test + + + + org.junit.jupiter + junit-jupiter + test + + + + org.assertj + assertj-core + 3.22.0 + test + + + + + jakarta-starter-ui + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + false + ./artifact + + + + diff --git a/starter-ui/src/main/java/org/eclipse/starter/ui/StarterServlet.java b/starter-ui/src/main/java/org/eclipse/starter/ui/StarterServlet.java index d3269b0e..b400a694 100644 --- a/starter-ui/src/main/java/org/eclipse/starter/ui/StarterServlet.java +++ b/starter-ui/src/main/java/org/eclipse/starter/ui/StarterServlet.java @@ -1,70 +1,70 @@ package org.eclipse.starter.ui; -import jakarta.servlet.ServletException; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.eclipse.starter.mavengenerator.CliMavenContext; +import org.eclipse.starter.mavengenerator.EeArchetypeGenerateParameters; +import org.eclipse.starter.mavengenerator.ZipCodec; + import java.io.File; import java.io.IOException; import java.lang.invoke.MethodHandles; import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; +import java.util.function.Function; import java.util.logging.Logger; import java.util.stream.Stream; import java.util.zip.ZipOutputStream; -import org.eclipse.starter.mavengenerator.CliMavenContext; -import org.eclipse.starter.mavengenerator.EeArchetypeGenerateParameters; -import org.eclipse.starter.mavengenerator.ZipCodec; @WebServlet(urlPatterns = {"/download.zip"}, name = "StarterServlet") public class StarterServlet extends HttpServlet { + + private static final Function IS_EMPTY = (String s) -> s == null || s.isEmpty(); + private static final Logger logger = Logger.getLogger( MethodHandles.lookup().lookupClass().getName()); - private static final String DOWNLOADABLE_FILE_NAME = "jakartaee-cafe.zip"; + private static final String DOWNLOADABLE_FILE_NAME = "jakartaee-project.zip"; + - private static class Parameters { - String archetypeGroupId = null; - String archetypeArtifactId = null; - String archetypeVersion = null; - String groupId = null; - String artifactId = null; - String version = null; - String profile = null; - } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) + throws IOException { logger.info("Generating project from archetype"); - Parameters p = parametersFromrequest(req); + final Parameters parametersFromrequest = this.parametersFromrequest(req); logger.fine(() -> String.format("Archetype properties: archetypeGroupId=%s, archetypeArtifactId=%s, " - + "archetypeVersion=%s, profile=%s, groupId=%s, artifactId=%s, version=%s", - p.archetypeGroupId, p.archetypeArtifactId, p.archetypeVersion, p.profile, - p.groupId, p.artifactId, p.version)); - - prepareResponse(resp, DOWNLOADABLE_FILE_NAME); - Path generatedDirectory = generateProjectFromArchetype(p); - try { - Path projectDirectory = Files.list(generatedDirectory).findAny().get(); - zipDirectoryToOutput(projectDirectory, resp.getOutputStream()); + + "archetypeVersion=%s, profile=%s, groupId=%s, artifactId=%s, version=%s", + parametersFromrequest.archetypeGroupId, parametersFromrequest.archetypeArtifactId, + parametersFromrequest.archetypeVersion, parametersFromrequest.profile, + parametersFromrequest.groupId, parametersFromrequest.artifactId, parametersFromrequest.version)); + + final var downloadableFileName = IS_EMPTY.apply(parametersFromrequest.artifactId) + ? DOWNLOADABLE_FILE_NAME + : parametersFromrequest.artifactId + ".zip"; + + this.prepareResponse(resp, downloadableFileName); + final Path generatedDirectory = this.generateProjectFromArchetype(parametersFromrequest); + try (final var fileStream = Files.list(generatedDirectory)) { + final Path projectDirectory = fileStream.findAny().orElseThrow(() -> new IllegalStateException("Generated project directory not found")); + this.zipDirectoryToOutput(projectDirectory, resp.getOutputStream()); } finally { - deleteDirectoryRecursively(generatedDirectory); + this.deleteDirectoryRecursively(generatedDirectory); } } - private void prepareResponse(HttpServletResponse resp, String filename) throws IOException { + private void prepareResponse(final HttpServletResponse resp, final String filename) { resp.setContentType("application/zip"); resp.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); } // this method is synchronized because I'm not sure whether the Maven CLI is thread safe - private synchronized Path generateProjectFromArchetype(Parameters p) throws IOException { + private synchronized Path generateProjectFromArchetype(final Parameters p) throws IOException { final Path targetDirectory = Files.createTempDirectory("ee-starter-maven-project-"); new EeArchetypeGenerateParameters() @@ -86,27 +86,27 @@ private synchronized Path generateProjectFromArchetype(Parameters p) throws IOEx return targetDirectory; } - private Parameters parametersFromrequest(HttpServletRequest req) { - Parameters p = new Parameters(); + private Parameters parametersFromrequest(final HttpServletRequest req) { + final Parameters p = new Parameters(); p.archetypeGroupId = req.getParameter("archetypeGroupId"); p.archetypeArtifactId = req.getParameter("archetypeArtifactId"); p.archetypeVersion = req.getParameter("archetypeVersion"); - requireNotNull(p.archetypeGroupId, p.archetypeArtifactId, p.archetypeVersion); + this.requireNotNull(p.archetypeGroupId, p.archetypeArtifactId, p.archetypeVersion); + + p.groupId = this.getParameterOrDefaultValue(req, "groupId", "com.example"); + p.artifactId = this.getParameterOrDefaultValue(req, "artifactId", "demo"); + p.version = this.getParameterOrDefaultValue(req, "version", "1.0.0-SNAPSHOT"); + p.profile = this.getParameterOrDefaultValue(req, "profile", "api"); - p.groupId = getParameterOrDefaultValue(req, "groupId", "com.example"); - p.artifactId = getParameterOrDefaultValue(req, "artifactId", "demo"); - p.version = getParameterOrDefaultValue(req, "version", "1.0.0-SNAPSHOT"); - p.profile = getParameterOrDefaultValue(req, "profile", "api"); - return p; } - private void requireNotNull(String archetypeGroupId, String archetypeArtifactId, String archetypeVersion) { + private void requireNotNull(final String archetypeGroupId, final String archetypeArtifactId, final String archetypeVersion) { Stream.of(new String[]{"archetypeGroupId", archetypeGroupId}, - new String[]{"archetypeArtifactId", archetypeArtifactId}, - new String[]{"archetypeVersion", archetypeVersion} - ) + new String[]{"archetypeArtifactId", archetypeArtifactId}, + new String[]{"archetypeVersion", archetypeVersion} + ) .filter(entry -> entry[1] == null) .findAny() .ifPresent(entry -> { @@ -114,23 +114,34 @@ private void requireNotNull(String archetypeGroupId, String archetypeArtifactId, }); } - private String getParameterOrDefaultValue(HttpServletRequest req, String parameterName, String defaultValue) { + private String getParameterOrDefaultValue(final HttpServletRequest req, final String parameterName, final String defaultValue) { final String paramValue = req.getParameter(parameterName); return paramValue != null ? paramValue : defaultValue; } - private void zipDirectoryToOutput(Path generatedDirectory, ServletOutputStream outputStream) throws IOException { - try (ZipOutputStream zipOutStream = new ZipOutputStream(outputStream)) { + private void zipDirectoryToOutput(final Path generatedDirectory, final ServletOutputStream outputStream) throws IOException { + try (final ZipOutputStream zipOutStream = new ZipOutputStream(outputStream)) { new ZipCodec() .addDirToZipArchive(generatedDirectory, zipOutStream); } } - private void deleteDirectoryRecursively(Path rootDirectory) throws IOException { - Files.walk(rootDirectory) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); + private void deleteDirectoryRecursively(final Path rootDirectory) throws IOException { + try (final var fileStream = Files.walk(rootDirectory)) { + //noinspection ResultOfMethodCallIgnored + fileStream.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } + private static class Parameters { + String archetypeGroupId = null; + String archetypeArtifactId = null; + String archetypeVersion = null; + String groupId = null; + String artifactId = null; + String version = null; + String profile = null; } } diff --git a/starter-ui/src/main/resources/jakartaee-cafe.zip b/starter-ui/src/main/resources/jakartaee-cafe.zip deleted file mode 100644 index 98f7b741..00000000 Binary files a/starter-ui/src/main/resources/jakartaee-cafe.zip and /dev/null differ diff --git a/starter-ui/src/test/java/org/eclipse/starter/ui/StarterServletTest.java b/starter-ui/src/test/java/org/eclipse/starter/ui/StarterServletTest.java new file mode 100644 index 00000000..4d1396d8 --- /dev/null +++ b/starter-ui/src/test/java/org/eclipse/starter/ui/StarterServletTest.java @@ -0,0 +1,129 @@ +package org.eclipse.starter.ui; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Objects; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class StarterServletTest { + + private StarterServlet sut; + + @Mock + private HttpServletRequest httpServletRequestMock; + + @Mock + private HttpServletResponse httpServletResponseMock; + + private ServletOutputStream servletOutputStreamStub; + + + @BeforeEach + void setUp() { + this.servletOutputStreamStub = new StubServletOutputStream(); + + this.sut = new StarterServlet(); + } + + @Test + void doGet() throws Exception { + //given + when(this.httpServletRequestMock.getParameter("archetypeGroupId")).thenReturn("org.eclipse.starter"); + when(this.httpServletRequestMock.getParameter("archetypeArtifactId")).thenReturn("jakartaee10-minimal"); + when(this.httpServletRequestMock.getParameter("archetypeVersion")).thenReturn("1.1.0"); + when(this.httpServletRequestMock.getParameter("groupId")).thenReturn("com.sample"); + when(this.httpServletRequestMock.getParameter("artifactId")).thenReturn("hello_world"); + when(this.httpServletRequestMock.getParameter("version")).thenReturn("42.0.0-SNAPSHOT"); + when(this.httpServletResponseMock.getOutputStream()).thenReturn(this.servletOutputStreamStub); + + //when + this.sut.doGet(this.httpServletRequestMock, this.httpServletResponseMock); + + //then + // Verify mock interactions + verify(this.httpServletResponseMock).setContentType("application/zip"); + verify(this.httpServletResponseMock).setHeader("Content-Disposition", "attachment;filename=\"hello_world.zip\""); + verify(this.httpServletResponseMock, times(1)).getOutputStream(); + + // Verify the zip file + final StubServletOutputStream stubServletOutputStream = ((StubServletOutputStream) this.servletOutputStreamStub); + assertThat(stubServletOutputStream.isclosed()).isTrue(); + + final var outputStream = stubServletOutputStream.getByteArrayOutputStream(); + assertThat(outputStream).isNotNull(); + assertThat(outputStream.toString()).isNotEmpty(); + assertThat(outputStream.toByteArray()).isNotEmpty(); + + final var zipInputStream = new ZipInputStream(new ByteArrayInputStream(outputStream.toByteArray())); + final var zipFilenames = Stream.generate(() -> { + try { + return zipInputStream.getNextEntry(); + } catch (final IOException e) { + e.printStackTrace(); + } + return null; + }).takeWhile(Objects::nonNull).map(ZipEntry::getName).toArray(String[]::new); + + assertThat(zipFilenames).containsAll(() -> Stream.of("hello_world/pom.xml", + "hello_world/src/main/resources/META-INF/beans.xml", + "hello_world/src/main/java/com/sample/hello_world/ApplicationConfig.java", + "hello_world/src/main/java/com/sample/hello_world/resources/HelloRecord.java", + "hello_world/src/main/java/com/sample/hello_world/resources/RestResource.java") + .iterator()); + } + + + private static class StubServletOutputStream extends ServletOutputStream { + + private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + private boolean isclosed = false; + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(final WriteListener writeListener) { + + } + + @Override + public void write(final int b) { + this.byteArrayOutputStream.write(b); + } + + public ByteArrayOutputStream getByteArrayOutputStream() { + return this.byteArrayOutputStream; + } + + @Override + public void close() throws IOException { + this.byteArrayOutputStream.close(); + this.isclosed = true; + } + + public boolean isclosed() { + return this.isclosed; + } + } +} diff --git a/starter-ui/src/test/resources/HttpRequest.http b/starter-ui/src/test/resources/HttpRequest.http new file mode 100644 index 00000000..5ff3e221 --- /dev/null +++ b/starter-ui/src/test/resources/HttpRequest.http @@ -0,0 +1,4 @@ +### +# Gets an archetype and directs it use self defined names + +GET http://localhost:8080/jakarta-starter-ui/download.zip?archetypeGroupId=org.eclipse.starter&archetypeArtifactId=jakartaee10-minimal&archetypeVersion=1.1.0&groupId=nl.ivonet&artifactId=ivo_demo&version=1.0.0-SNAPSHOT