diff --git a/CHANGELOG.md b/CHANGELOG.md
index 293f957..5d7dc82 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
+### Fixed
+- QBit metadata now reports the Maven artifact version, including release versions, from a filtered properties resource.
+
### Added
- Complete host-neutral in-app help bundle with live labels and core `HelpBundleAssertions` coverage; registered through QQQ 4.1.0-RC.7 `HelpBundles`, replacing the temporary loader.
- "Check channels" action on Registered Channels; readiness now writes the channel's Slack name, private, bot is member, archived, purpose and checked time back to the row.
diff --git a/pom.xml b/pom.xml
index b2376f3..8d01b73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -127,6 +127,7 @@
true
help/*.yaml
+ qbit-slack.properties
@@ -134,10 +135,20 @@
false
help/*.yaml
+ qbit-slack.properties
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ ${project.version}
+
+
+
org.apache.maven.plugins
maven-checkstyle-plugin
diff --git a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java
index d249279..2334439 100644
--- a/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java
+++ b/src/main/java/com/kingsrook/qbits/slack/SlackQBitProducer.java
@@ -21,8 +21,11 @@
package com.kingsrook.qbits.slack;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
+import java.util.Properties;
import com.kingsrook.qbits.slack.bridge.SlackOutboxMessagingProviderMetaData;
import com.kingsrook.qbits.slack.delivery.SlackAlerts;
import com.kingsrook.qbits.slack.metadata.SlackTables;
@@ -43,13 +46,41 @@ public class SlackQBitProducer implements QBitMetaDataProducer
{
public static final String GROUP_ID = "com.kingsrook.qbits";
public static final String ARTIFACT_ID = "qbit-slack";
- public static final String VERSION = "0.1.0";
+ public static final String VERSION = loadVersion();
private SlackQBitConfig qBitConfig;
private String namespace;
+ /*******************************************************************************
+ ** Read the artifact version from the Maven-filtered properties resource.
+ *******************************************************************************/
+ private static String loadVersion()
+ {
+ try(InputStream inputStream = SlackQBitProducer.class.getClassLoader().getResourceAsStream("qbit-slack.properties"))
+ {
+ if(inputStream == null)
+ {
+ throw (new IllegalStateException("Missing qbit-slack.properties; build with Maven to supply the artifact version"));
+ }
+ Properties properties = new Properties();
+ properties.load(inputStream);
+ String version = properties.getProperty("version");
+ if(version == null || version.isBlank() || version.contains("${"))
+ {
+ throw (new IllegalStateException("Missing or unfiltered version in qbit-slack.properties; build with Maven"));
+ }
+ return (version);
+ }
+ catch(IOException e)
+ {
+ throw (new IllegalStateException("Could not read artifact version from qbit-slack.properties", e));
+ }
+ }
+
+
+
/*******************************************************************************
** Fluent setter for the config.
*******************************************************************************/
diff --git a/src/main/resources/qbit-slack.properties b/src/main/resources/qbit-slack.properties
new file mode 100644
index 0000000..defbd48
--- /dev/null
+++ b/src/main/resources/qbit-slack.properties
@@ -0,0 +1 @@
+version=${project.version}
diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java
index 6632b41..14a2298 100644
--- a/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java
+++ b/src/test/java/com/kingsrook/qbits/slack/SlackQBitProducerTest.java
@@ -45,6 +45,8 @@ class SlackQBitProducerTest
SlackQBitProducer producer = new SlackQBitProducer().withQBitConfig(config).withNamespace("ns");
QBitMetaData metaData = producer.getQBitMetaData();
+ assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank();
+ assertThat(metaData.getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION);
assertThat(metaData.getArtifactId()).isEqualTo("qbit-slack");
assertThat(metaData.getGroupId()).isEqualTo("com.kingsrook.qbits");
assertThat(producer.getNamespace()).isEqualTo("ns");
diff --git a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java
index d458e69..7f0c775 100644
--- a/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java
+++ b/src/test/java/com/kingsrook/qbits/slack/SlackTablesGuardrailTest.java
@@ -160,6 +160,8 @@ class SlackTablesGuardrailTest
var bundles = HelpBundles.of(instance).getBundles();
assertThat(bundles).hasSize(1);
assertThat(bundles.get(0).getId()).isEqualTo("qbit-slack");
+ assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank();
+ assertThat(bundles.get(0).getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(SlackQBitProducer.VERSION);
for(String table : SlackTables.ALL)
{
assertThat(bundles.get(0).getEntries()).filteredOn(entry -> entry.getKey().equals("table:" + table + ";slot:help"))