diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1cb1fee..aec729d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
- `EmailTablesGuardrailTest`: every table is used by runtime code, seeded or listed as starting empty with a reason, and has help.
### Fixed
+- Derive the qbit metadata version from the Maven artifact version so released artifacts report their release version.
- `email_template.ownerQbit` was stored but never read, and the built-in template did not set it. The built-in now names `qbit-email`, the field is read-only with help, and messages sent from a template name its owner qbit as `senderQbit` unless the request names one.
### Added
diff --git a/pom.xml b/pom.xml
index e819271..127ccd4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,6 +175,7 @@
true
help/*.yaml
+ qbit-email.properties
@@ -182,10 +183,20 @@
false
help/*.yaml
+ qbit-email.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/email/EmailQBitProducer.java b/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java
index 7d0ea4b..13b552e 100644
--- a/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java
+++ b/src/main/java/com/kingsrook/qbits/email/EmailQBitProducer.java
@@ -21,10 +21,13 @@
package com.kingsrook.qbits.email;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import com.kingsrook.qbits.email.app.EmailApp;
import com.kingsrook.qbits.email.bridge.EmailOutboxMessagingProviderMetaData;
import com.kingsrook.qbits.email.delivery.EmailAlerts;
@@ -53,13 +56,41 @@ public class EmailQBitProducer implements QBitMetaDataProducer
{
public static final String GROUP_ID = "com.kingsrook.qbits";
public static final String ARTIFACT_ID = "qbit-email";
- public static final String VERSION = "0.1.0";
+ public static final String VERSION = loadVersion();
private EmailQBitConfig qBitConfig;
private String namespace;
+ /*******************************************************************************
+ ** Read the artifact version from the Maven-filtered resource.
+ *******************************************************************************/
+ private static String loadVersion()
+ {
+ try(InputStream inputStream = EmailQBitProducer.class.getClassLoader().getResourceAsStream("qbit-email.properties"))
+ {
+ if(inputStream == null)
+ {
+ throw new IllegalStateException("Missing qbit-email.properties; build with Maven to generate 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-email.properties; build with Maven");
+ }
+ return (version);
+ }
+ catch(IOException e)
+ {
+ throw new IllegalStateException("Could not read artifact version from qbit-email.properties", e);
+ }
+ }
+
+
+
/*******************************************************************************
** Fluent setter for the config.
*******************************************************************************/
diff --git a/src/main/resources/qbit-email.properties b/src/main/resources/qbit-email.properties
new file mode 100644
index 0000000..defbd48
--- /dev/null
+++ b/src/main/resources/qbit-email.properties
@@ -0,0 +1 @@
+version=${project.version}
diff --git a/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java
index 406748b..bf0aceb 100644
--- a/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java
+++ b/src/test/java/com/kingsrook/qbits/email/EmailQBitProducerTest.java
@@ -48,13 +48,17 @@ class EmailQBitProducerTest
assertThat(producer.isEnabled()).isTrue();
assertThat(producer.getNamespace()).isNull();
assertThat(producer.getQBitConfig().getBackendName()).isEqualTo("memory");
+ String artifactVersion = System.getProperty("qbit.artifactVersion");
+ assertThat(artifactVersion).isNotBlank();
+ assertThat(EmailQBitProducer.VERSION).isEqualTo(artifactVersion);
+ assertThat(producer.getQBitMetaData().getVersion()).isEqualTo(artifactVersion);
assertThat(producer.produce(instance)).isNotNull();
assertThat(instance.getQBits()).isNotEmpty();
assertThat(instance.getTable("helpContent")).isNull();
assertThat(HelpBundles.of(instance).getBundles()).singleElement().satisfies(bundle ->
{
assertThat(bundle.getId()).isEqualTo("qbit-email");
- assertThat(bundle.getVersion()).matches("\\d+\\.\\d+\\.\\d+(-SNAPSHOT|-RC\\.\\d+)?");
+ assertThat(bundle.getVersion()).isEqualTo(artifactVersion).isEqualTo(EmailQBitProducer.VERSION);
});
}