<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 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">

	<modelVersion>4.0.0</modelVersion>

	<groupId>guru.mikelue.foxglove</groupId>
	<artifactId>core</artifactId>
	<version>1.0.1</version>
	<packaging>jar</packaging>
	<url>https://foxglove.mikelue.guru/</url>

	<name>core</name>
	<description>Foxglove Core Project</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

		<maven.compiler.source>21</maven.compiler.source>
		<maven.compiler.target>17</maven.compiler.target>
		<maven.compiler.release>17</maven.compiler.release>

		<version.assertj>3.27.6</version.assertj>
		<version.commons-dbutils>1.8.1</version.commons-dbutils>
		<version.commons-lang3>3.19.0</version.commons-lang3>
		<version.instancio>5.5.1</version.instancio>
		<version.jmockit>1.50</version.jmockit>
		<version.logback>1.5.19</version.logback>
		<version.slf4j>2.0.17</version.slf4j>
		<version.hikaricp>7.0.2</version.hikaricp>
		<version.awaitility>4.3.0</version.awaitility>

		<!--
			- Versions of database drivers(or embedded databases) for testing
		-->
		<version.h2>2.4.240</version.h2>
		<version.hsqldb>2.7.4</version.hsqldb>
		<version.derby>10.17.1.0</version.derby>
		<version.sqlite>3.42.0.0</version.sqlite>
		<version.postgres>42.7.8</version.postgres>
		<version.mysql>9.5.0</version.mysql>
		<version.mssql>11.2.3.jre17</version.mssql>
		<version.oracle>23.9.0.25.07</version.oracle>
		<!-- :~) -->

		<version.spring>6.0.23</version.spring>
		<version.spring-boot>3.1.12</version.spring-boot>

		<version.junit>5.10.5</version.junit>

		<version.plugin.clean>3.5.0</version.plugin.clean>
		<version.plugin.compiler>3.14.1</version.plugin.compiler>
		<version.plugin.deploy>3.1.4</version.plugin.deploy>
		<version.plugin.enforcer>3.6.2</version.plugin.enforcer>
		<version.plugin.install>3.1.4</version.plugin.install>
		<version.plugin.jar>3.4.2</version.plugin.jar>
		<version.plugin.resources>3.3.1</version.plugin.resources>
		<version.plugin.surefire>3.5.4</version.plugin.surefire>
		<version.plugin.versions>2.19.1</version.plugin.versions>
		<version.plugin.javadoc>3.12.0</version.plugin.javadoc>
		<version.plugin.site>3.21.0</version.plugin.site>
		<version.plugin.report>3.9.0</version.plugin.report>
		<version.plugin.report.surefire>3.5.4</version.plugin.report.surefire>
		<version.plugin.hugo>0.2.20</version.plugin.hugo>
		<version.plugin.clover>4.5.2</version.plugin.clover>
		<version.plugin.scm-publish>3.3.0</version.plugin.scm-publish>
		<version.plugin.release>3.3.1</version.plugin.release>

		<version.highlightjs>11.9.0</version.highlightjs>

		<!--
			- Default setting of JDBC for testing
		-->
		<test.jdbc.host>127.0.0.1</test.jdbc.host>
		<test.jdbc.database>foxglove_test</test.jdbc.database>
		<test.jdbc.h2.mode>regular</test.jdbc.h2.mode>

		<test.jdbc.className>org.h2.Driver</test.jdbc.className>
		<test.jdbc.username>foxglove</test.jdbc.username>
		<test.jdbc.password>foxglove_password</test.jdbc.password>
		<test.jdbc.url>jdbc:h2:file:${project.build.directory}/h2/${test.jdbc.database};user=${test.jdbc.username};password=${test.jdbc.password};MODE=${test.jdbc.h2.mode};DATABASE_TO_LOWER=TRUE</test.jdbc.url>

		<excludedGroups>vendor</excludedGroups>
		<!-- :~) -->

		<hugo.output>site/public</hugo.output>
		<maven.clover.outputDirectory>${hugo.output}/clover</maven.clover.outputDirectory>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${version.slf4j}</version>
		</dependency>
		<dependency>
			<groupId>commons-dbutils</groupId>
			<artifactId>commons-dbutils</artifactId>
			<version>${version.commons-dbutils}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>${version.commons-lang3}</version>
		</dependency>
		<dependency>
			<groupId>org.instancio</groupId>
			<artifactId>instancio-core</artifactId>
			<version>${version.instancio}</version>
		</dependency>

		<!--
			- Optional dependencies
		-->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${version.logback}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter</artifactId>
			<version>${version.junit}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${version.spring}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${version.spring}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${version.spring}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${version.spring}</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${version.spring}</version>
			<optional>true</optional>
		</dependency>
		<!-- :~) -->

		<!--
			- Testing libraries
		-->
		<dependency>
			<groupId>org.assertj</groupId>
			<artifactId>assertj-core</artifactId>
			<version>${version.assertj}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.jmockit</groupId>
			<artifactId>jmockit</artifactId>
			<version>${version.jmockit}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.awaitility</groupId>
			<artifactId>awaitility</artifactId>
			<version>${version.awaitility}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
			<version>${version.spring-boot}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<version>${version.spring-boot}</version>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.mockito</groupId>
					<artifactId>mockito-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.mockito</groupId>
					<artifactId>mockito-junit-jupiter</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- ~:) -->

		<!--
			- Database/JDBC driver for testing
		-->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>${version.hikaricp}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>${version.h2}</version>
			<scope>test</scope>
		</dependency>
		<!-- :~) -->
	</dependencies>

	<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>false</filtering>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<directory>src/test/resources</directory>
				<filtering>false</filtering>
				<excludes>
					<exclude>application.properties</exclude>
				</excludes>
			</testResource>
			<testResource>
				<directory>src/test/resources</directory>
				<filtering>true</filtering>
				<includes>
					<include>application.properties</include>
				</includes>
			</testResource>
		</testResources>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-enforcer-plugin</artifactId>
				<version>${version.plugin.enforcer}</version>
				<executions>
					<execution>
						<id>enforce-versions</id>
						<goals>
							<goal>enforce</goal>
						</goals>
						<configuration>
							<rules>
								<requireMavenVersion>
									<version>[3.9,)</version>
									<message>Maven 3.9 or higher is required.</message>
								</requireMavenVersion>
								<requireJavaVersion>
									<version>[21,)</version>
									<message>JDK 21 or higher is required.</message>
								</requireJavaVersion>
							</rules>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>versions-maven-plugin</artifactId>
				<version>${version.plugin.versions}</version>
				<configuration>
					<rulesUri>file:///${project.basedir}/maven-version-rules.xml</rulesUri>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>${version.plugin.compiler}</version>
				<configuration>
					<source>21</source>
					<target>17</target>
					<release>17</release>
					<compilerArgs>
						<arg>-Xlint:all</arg>
					</compilerArgs>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>${version.plugin.surefire}</version>
				<configuration>
					<argLine>-javaagent:"${settings.localRepository}/org/jmockit/jmockit/${version.jmockit}/jmockit-${version.jmockit}.jar"</argLine>

					<systemPropertyVariables>
						<database.vendor>${test.jdbc.className}</database.vendor>
					</systemPropertyVariables>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>${version.plugin.jar}</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>${version.plugin.resources}</version>
				<configuration>
					<propertiesEncoding>${project.build.sourceEncoding}</propertiesEncoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-clean-plugin</artifactId>
				<version>${version.plugin.clean}</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-install-plugin</artifactId>
				<version>${version.plugin.install}</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-site-plugin</artifactId>
				<version>${version.plugin.site}</version>
				<configuration>
					<outputDirectory>${hugo.output}/maven-site</outputDirectory>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>org.asciidoctor</groupId>
						<artifactId>asciidoctor-converter-doxia-module</artifactId>
						<version>3.2.0</version>
					</dependency>
					<dependency>
						<groupId>org.apache.maven.skins</groupId>
						<artifactId>maven-fluido-skin</artifactId>
						<version>2.1.0</version>
					</dependency>
				</dependencies>
			</plugin>
			<plugin>
				<groupId>org.echocat.maven.plugins</groupId>
				<artifactId>hugo-maven-plugin</artifactId>
				<version>${version.plugin.hugo}</version>
				<executions>
					<execution>
						<id>build-hugo</id>
						<phase>pre-site</phase>
						<goals>
							<goal>build</goal>
						</goals>
						<configuration>
							<version>0.152.2</version>
							<download>onDemand</download>
							<workingDirectory>${project.basedir}/site</workingDirectory>
							<config>${project.basedir}/site/hugo.toml</config>
							<additionalArguments>
								<additionalArgument>--minify</additionalArgument>
								<additionalArgument>--gc</additionalArgument>
							</additionalArguments>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.openclover</groupId>
				<artifactId>clover-maven-plugin</artifactId>
				<version>${version.plugin.clover}</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-scm-publish-plugin</artifactId>
				<version>${version.plugin.scm-publish}</version>  <!-- latest as of now -->
				<configuration>
					<scmBranch>gh-pages</scmBranch>
					<skipDefaultStaging>true</skipDefaultStaging>
					<content>${hugo.output}</content>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<version>${version.plugin.release}</version>
				<configuration>
					<autoVersionSubmodules>true</autoVersionSubmodules>
					<useReleaseProfile>false</useReleaseProfile>
					<releaseProfiles>release</releaseProfiles>
					<goals>deploy</goals>
					<arguments>-DskipTests -DskipITs</arguments>
					<pushChanges>true</pushChanges>
					<localCheckout>true</localCheckout>
					<tagNameFormat>v@{project.version}</tagNameFormat>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<profiles>
		<profile>
			<id>maven-central</id>

			<properties>
				<version.plugin.source>3.4.0</version.plugin.source>
				<version.plugin.maven-publish>0.10.0</version.plugin.maven-publish>
				<version.plugin.pgp>3.2.8</version.plugin.pgp>
			</properties>

			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-source-plugin</artifactId>
						<version>${version.plugin.source}</version>
						<executions>
							<execution>
								<id>attach-sources</id>
								<goals>
									<goal>jar-no-fork</goal>
								</goals>
							</execution>
						</executions>
					</plugin>

					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-javadoc-plugin</artifactId>
						<version>${version.plugin.javadoc}</version>
						<executions>
							<execution>
								<id>attach-javadocs</id>
								<goals>
									<goal>jar</goal>
								</goals>
							</execution>
						</executions>
					</plugin>

					<!--
						- Deployment to Maven central
					-->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-gpg-plugin</artifactId>
						<version>${version.plugin.pgp}</version> <executions>
							<execution>
								<id>sign-artifacts</id>
								<phase>verify</phase>
								<goals>
									<goal>sign</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
					<plugin>
						<groupId>org.sonatype.central</groupId>
						<artifactId>central-publishing-maven-plugin</artifactId>
						<version>${version.plugin.maven-publish}</version>
						<extensions>true</extensions>
						<configuration>
							<publishingServerId>central</publishingServerId>
						</configuration>
					</plugin>
					<!-- :~) -->
				</plugins>
			</build>
		</profile>

		<profile>
			<id>test-hsqldb</id>

			<properties>
				<test.jdbc.className>org.hsqldb.jdbcDriver</test.jdbc.className>
				<test.jdbc.url>jdbc:hsqldb:file:${project.build.directory}/hsqldb/${test.jdbc.database}</test.jdbc.url>

				<excludedGroups>!vendor-hsqldb</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>org.hsqldb</groupId>
					<artifactId>hsqldb</artifactId>
					<version>${version.hsqldb}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<profile>
			<id>test-derby</id>
			<properties>
				<test.jdbc.className>org.apache.derby.iapi.jdbc.AutoloadedDriver</test.jdbc.className>
				<test.jdbc.url>jdbc:derby:${project.build.directory}/derby/${test.jdbc.database};create=true</test.jdbc.url>

				<excludedGroups>!vendor-derby</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>org.apache.derby</groupId>
					<artifactId>derby</artifactId>
					<version>${version.derby}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<profile>
			<id>test-sqlite</id>
			<properties>
				<test.jdbc.className>org.sqlite.JDBC</test.jdbc.className>
				<test.jdbc.url>jdbc:sqlite:${project.build.directory}/sqlite-${test.jdbc.database}</test.jdbc.url>

				<excludedGroups>!vendor-sqlite</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>org.xerial</groupId>
					<artifactId>sqlite-jdbc</artifactId>
					<version>${version.sqlite}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<!-- Add postgresql profile -->
		<profile>
			<id>test-postgres</id>
			<properties>
				<test.jdbc.className>org.postgresql.Driver</test.jdbc.className>
				<test.jdbc.url>jdbc:postgresql://${test.jdbc.host}/${test.jdbc.database}</test.jdbc.url>

				<excludedGroups>!vendor-postgres</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>org.postgresql</groupId>
					<artifactId>postgresql</artifactId>
					<version>${version.postgres}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<profile>
			<id>test-mysql</id>
			<properties>
				<test.jdbc.className>com.mysql.cj.jdbc.Driver</test.jdbc.className>
				<test.jdbc.url>jdbc:mysql://${test.jdbc.host}/${test.jdbc.database}?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;connectionTimeZone=UTC&amp;serverTimezone=UTC</test.jdbc.url>

				<excludedGroups>!vendor-mysql</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>com.mysql</groupId>
					<artifactId>mysql-connector-j</artifactId>
					<version>${version.mysql}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<profile>
			<id>test-oracle</id>

			<properties>
				<test.jdbc.className>oracle.jdbc.OracleDriver</test.jdbc.className>
				<test.jdbc.url>jdbc:oracle:thin:@${test.jdbc.host}/freepdb1</test.jdbc.url>

				<excludedGroups>!vendor-oracle</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>com.oracle.database.jdbc</groupId>
					<artifactId>ojdbc17</artifactId>
					<version>${version.oracle}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>

		<profile>
			<id>test-mssql</id>

			<properties>
				<test.jdbc.className>com.microsoft.sqlserver.jdbc.SQLServerDriver</test.jdbc.className>
				<test.jdbc.url>jdbc:sqlserver://${test.jdbc.host};database=${test.jdbc.database};trustServerCertificate=true</test.jdbc.url>

				<excludedGroups>!vendor-mssql</excludedGroups>
			</properties>
			<dependencies>
				<dependency>
					<groupId>com.microsoft.sqlserver</groupId>
					<artifactId>mssql-jdbc</artifactId>
					<version>${version.mssql}</version>
					<scope>test</scope>
				</dependency>
			</dependencies>
		</profile>
	</profiles>

	<reporting>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>${version.plugin.javadoc}</version>
				<reportSets>
					<reportSet>
						<reports>
							<report>javadoc</report>
						</reports>
					</reportSet>
				</reportSets>
				<configuration>
					<doclint>all</doclint>
					<failOnError>true</failOnError>
					<additionalOptions>
						<additionalOption>--allow-script-in-comments</additionalOption>
					</additionalOptions>
					<header><![CDATA[
						<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/${version.highlightjs}/styles/base16/atelier-sulphurpool-light.min.css">
						<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/${version.highlightjs}/highlight.min.js"></script>
						<script>hljs.highlightAll();</script>
						<script type="text/javascript">
							window.addEventListener('load', function() {
								var links = document.links;
								for (var i = 0; i < links.length; i++) { if (links[i].hostname != window.location.hostname) {
										links[i].target = '_blank';
									}
								}
							});
						</script>
					]]></header>
					<links>
						<link>https://docs.oracle.com/en/java/javase/${maven.compiler.release}/docs/api/</link>
						<link>https://docs.spring.io/spring-framework/docs/6.0.x/javadoc-api/</link>
						<link>https://javadoc.io/doc/org.instancio/instancio-core/${version.instancio}/</link>
						<link>https://docs.junit.org/${version.junit}/api/</link>
					</links>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-project-info-reports-plugin</artifactId>
				<version>${version.plugin.report}</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-report-plugin</artifactId>
				<version>${version.plugin.report.surefire}</version>
			</plugin>
		</plugins>
	</reporting>

	<repositories>
		<repository>
			<id>echocat</id>
			<url>https://packages.echocat.org/maven</url>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>echocat</id>
			<url>https://packages.echocat.org/maven</url>
		</pluginRepository>
	</pluginRepositories>

	<scm>
		<connection>scm:git:git://github.com/mikelue/foxglove</connection>
		<developerConnection>scm:git:ssh://git@github.com/mikelue/foxglove</developerConnection>
		<url>https://github.com/mikelue/foxglove</url>
		<tag>v1.0.1</tag>
	</scm>

	<distributionManagement>
		<site>
			<id>github</id>
			<url>scm:git:https://github.com/mikelue/foxglove.git</url>
		</site>

		<repository>
			<id>central</id>
			<name>Sonatype Central Portal</name>
			<url>https://central.sonatype.com/</url>
		</repository>

		<snapshotRepository>
			<id>github</id>
			<name>GitHub Packages</name>
			<url>https://maven.pkg.github.com/mikelue/foxglove</url>
		</snapshotRepository>
	</distributionManagement>

	<licenses>
		<license>
			<name>MIT License</name>
			<url>https://opensource.org/licenses/MIT</url>
			<distribution>repo</distribution>
		</license>
	</licenses>

	<developers>
		<developer>
			<name>Mike Lue</name>
			<email>mike.lue0627@msa.hinet.net</email>
			<organization>Sonatype</organization>
			<organizationUrl>http://www.sonatype.com</organizationUrl>
		</developer>
	</developers>

</project>
