From a64b7c50816cf0c95642cf65f7f20ac74b0e037a Mon Sep 17 00:00:00 2001 From: lingniu Date: Wed, 1 Jul 2026 04:32:54 +0800 Subject: [PATCH] build: move command gateway to optional profile --- .../historyapp/MavenModuleProfileTest.java | 95 +++++++++++++++++++ pom.xml | 9 +- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java new file mode 100644 index 00000000..3f7f48f8 --- /dev/null +++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java @@ -0,0 +1,95 @@ +package com.lingniu.ingest.historyapp; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilderFactory; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class MavenModuleProfileTest { + + @Test + void commandGatewayIsOutsideDefaultProductionReactor() throws Exception { + Document pom = rootPom(); + + assertThat(defaultModules(pom)) + .doesNotContain("modules/apps/command-gateway") + .doesNotContain("modules/protocols/protocol-jt1078"); + + assertThat(profileModules(pom, "optional-command-gateway")) + .containsExactly( + "modules/protocols/protocol-jt1078", + "modules/apps/command-gateway"); + } + + private static Document rootPom() throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + return factory.newDocumentBuilder().parse(Files.newInputStream(repositoryRoot().resolve("pom.xml"))); + } + + private static List defaultModules(Document pom) { + Element project = pom.getDocumentElement(); + return directModules(firstDirectChild(project, "modules")); + } + + private static List profileModules(Document pom, String profileId) { + Element profiles = firstDirectChild(pom.getDocumentElement(), "profiles"); + if (profiles == null) { + return List.of(); + } + NodeList children = profiles.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + if (!(children.item(i) instanceof Element profile) || !"profile".equals(profile.getTagName())) { + continue; + } + Element id = firstDirectChild(profile, "id"); + if (id != null && profileId.equals(id.getTextContent().trim())) { + return directModules(firstDirectChild(profile, "modules")); + } + } + return List.of(); + } + + private static List directModules(Element modules) { + if (modules == null) { + return List.of(); + } + List out = new ArrayList<>(); + NodeList children = modules.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + if (children.item(i) instanceof Element child && "module".equals(child.getTagName())) { + out.add(child.getTextContent().trim()); + } + } + return List.copyOf(out); + } + + private static Element firstDirectChild(Element parent, String tagName) { + NodeList children = parent.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + if (children.item(i) instanceof Element child && tagName.equals(child.getTagName())) { + return child; + } + } + return null; + } + + private static Path repositoryRoot() { + Path current = Path.of(System.getProperty("user.dir")).toAbsolutePath(); + while (current != null) { + if (Files.exists(current.resolve("pom.xml")) && Files.exists(current.resolve("modules"))) { + return current; + } + current = current.getParent(); + } + throw new IllegalStateException("repository root not found"); + } +} diff --git a/pom.xml b/pom.xml index 774a239b..cc7e5e63 100644 --- a/pom.xml +++ b/pom.xml @@ -34,10 +34,8 @@ modules/services/vehicle-stat-service modules/protocols/protocol-gb32960 modules/protocols/protocol-jt808 - modules/protocols/protocol-jt1078 modules/protocols/protocol-jsatl12 modules/inbound/inbound-mqtt - modules/apps/command-gateway modules/apps/gb32960-ingest-app modules/apps/jt808-ingest-app modules/apps/yutong-mqtt-app @@ -46,6 +44,13 @@ + + optional-command-gateway + + modules/protocols/protocol-jt1078 + modules/apps/command-gateway + + legacy-xinda