<?xml version="1.0" encoding="utf-8"?>
<!--
    Copyright (c) Telicent Ltd.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>io.telicent.smart-caches.graph</groupId>
  <artifactId>scg-base</artifactId>
  <packaging>pom</packaging>
  <version>0.91.2</version>

  <name>Telicent Smart Cache Graph - Parent</name>
  <description>Telicent Smart Cache Graph</description>
  <url>https://github.com/telicent-oss/smart-cache-graph</url>

  <scm>
    <connection>scm:git:git@github.com:Telicent-oss/smart-cache-graph</connection>
    <developerConnection>scm:git:git@github.com:Telicent-oss/smart-cache-graph</developerConnection>
    <url>https://github.com/telicent-oss/smart-cache-graph</url>
    <tag>0.91.2</tag>
  </scm>

  <licenses>
    <license>
      <name>Apache-2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
      <comments>A business-friendly OSS license</comments>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Telicent Developers</name>
      <email>opensource@telicent.io</email>
      <organization>Telicent Ltd</organization>
      <organizationUrl>https://telicent.io</organizationUrl>
    </developer>
  </developers>

  <properties>
    <!-- Build properties -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.build.outputTimestamp>2025-11-14T18:05:38Z</project.build.outputTimestamp>
    <java.version>21</java.version>

    <!-- Maven Plugin versions -->
    <plugin.central>0.9.0</plugin.central>
    <plugin.clean>3.3.2</plugin.clean>
    <plugin.compiler>3.14.1</plugin.compiler>
    <plugin.cyclonedx>2.9.1</plugin.cyclonedx>
    <plugin.dependency>3.9.0</plugin.dependency>
    <plugin.deploy>3.1.4</plugin.deploy>
    <plugin.enforcer>3.4.1</plugin.enforcer>
    <plugin.gpg>3.2.8</plugin.gpg>
    <plugin.install>3.1.1</plugin.install>
    <plugin.jar>3.4.2</plugin.jar>
    <plugin.jacoco>0.8.14</plugin.jacoco>
    <plugin.javadoc>3.12.0</plugin.javadoc>
    <plugin.resources>3.3.1</plugin.resources>
    <plugin.shade>3.4.1</plugin.shade>
    <plugin.site>3.9.1</plugin.site>
    <plugin.source>3.3.1</plugin.source>
    <plugin.surefire>3.5.4</plugin.surefire>
    <plugin.versions>2.19.1</plugin.versions>

    <!-- Dependency versions -->
    <!-- Internal dependencies -->
    <dependency.rdf-abac>1.1.2</dependency.rdf-abac>
    <dependency.fuseki-kafka>2.1.1</dependency.fuseki-kafka>
    <dependency.jena>5.6.0</dependency.jena>
    <dependency.fuseki-server>${dependency.jena}</dependency.fuseki-server>
    <dependency.graphql>0.10.8</dependency.graphql>
    <dependency.jwt-servlet-auth>2.0.1</dependency.jwt-servlet-auth>
    <dependency.smart-caches-core>0.31.1</dependency.smart-caches-core>

    <!-- External dependencies -->
    <dependency.jackson>2.20.1</dependency.jackson>
    <dependency.bouncycastle>1.82</dependency.bouncycastle>
    <dependency.kafka>3.9.1</dependency.kafka>
    <dependency.kotlin>2.2.21</dependency.kotlin>
    <dependency.otel>1.33.0</dependency.otel> <!-- These two must be in-step. -->
    <dependency.otel-semconv>1.30.1-alpha</dependency.otel-semconv> <!-- These two must be in-step. -->

    <!-- Logging dependencies -->
    <dependency.log4j2>2.25.2</dependency.log4j2>
    <dependency.logback>1.5.21</dependency.logback>
    <dependency.slf4j>2.0.17</dependency.slf4j>

    <!-- Test dependencies -->
    <dependency.jmh>1.37</dependency.jmh>
    <dependency.junit5>6.0.1</dependency.junit5>
    <dependency.junit5-platform>6.0.1</dependency.junit5-platform>
    <dependency.mockito>5.20.0</dependency.mockito>
    <dependency.testcontainers>1.21.3</dependency.testcontainers>
    <dependency.yaml-config>2.0.1</dependency.yaml-config>

    <!-- CVE Patches -->
    <!-- CVE-2025-48734-->
    <dependency.commons-beanutils>1.11.0</dependency.commons-beanutils>
    <!-- CVE-2025-28976 -->
    <dependency.commons-fileupload2>2.0.0-M4</dependency.commons-fileupload2>

  </properties>

  <modules>
    <module>scg-system</module>
    <module>scg-server</module>
    <module>scg-docker</module>
    <module>scg-benchmark</module>
  </modules>

  <dependencyManagement>
    <dependencies>

      <!-- Internal dependencies-->
      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-fuseki-main</artifactId>
        <version>${dependency.jena}</version>
        <exclusions>
          <!-- CVE-2025-48734-->
          <exclusion>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
          </exclusion>
          <exclusion>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- Complete Fuseki Main server as a single jar -->
      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-arq</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-base</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-cmds</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-core</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-dboe-base</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-fuseki-core</artifactId>
        <version>${dependency.jena}</version>
        <exclusions>
          <!-- CVE-2025-48976 -->
          <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-fileupload2-jakarta-servlet6</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-fuseki-server</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-rdfpatch</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-shacl</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-tdb1</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-tdb2</artifactId>
        <version>${dependency.jena}</version>
      </dependency>

      <!-- Fuseki-Kafka connector -->
      <dependency>
        <groupId>io.telicent.jena</groupId>
        <artifactId>jena-fuseki-kafka-module</artifactId>
        <version>${dependency.fuseki-kafka}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>io.telicent.jena</groupId>
        <artifactId>jena-kafka-connector</artifactId>
        <version>${dependency.fuseki-kafka}</version>
      </dependency>
      <!-- ABAC engine -->
      <dependency>
        <!-- Used in scg-system -->
        <groupId>io.telicent.jena</groupId>
        <artifactId>rdf-abac-fuseki</artifactId>
        <version>${dependency.rdf-abac}</version>
        <exclusions>
          <exclusion>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-slf4j2-impl</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>io.telicent.jena</groupId>
        <artifactId>rdf-abac-core</artifactId>
        <version>${dependency.rdf-abac}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.jena</groupId>
        <artifactId>rdf-abac-fmod</artifactId>
        <version>${dependency.rdf-abac}</version>
      </dependency>

      <!-- Authentication -->
      <dependency>
        <groupId>io.telicent.public</groupId>
        <artifactId>jwt-servlet-auth-aws</artifactId>
        <version>${dependency.jwt-servlet-auth}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.public</groupId>
        <artifactId>jwt-servlet-auth-core</artifactId>
        <version>${dependency.jwt-servlet-auth}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.public</groupId>
        <artifactId>jwt-servlet-auth-servlet5</artifactId>
        <version>${dependency.jwt-servlet-auth}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.smart-caches</groupId>
        <artifactId>configurator</artifactId>
        <version>${dependency.smart-caches-core}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.smart-caches</groupId>
        <artifactId>jwt-auth-common</artifactId>
        <version>${dependency.smart-caches-core}</version>
      </dependency>

      <!-- GraphQL -->
      <dependency>
        <groupId>io.telicent.jena.graphql</groupId>
        <artifactId>graphql-jena-core</artifactId>
        <version>${dependency.graphql}</version>
      </dependency>
      <dependency>
        <groupId>io.telicent.jena.graphql</groupId>
        <artifactId>graphql-fuseki-module</artifactId>
        <version>${dependency.graphql}</version>
        <exclusions>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>io.telicent.jena.graphql</groupId>
        <artifactId>telicent-graph-schema</artifactId>
        <version>${dependency.graphql}</version>
      </dependency>

      <!-- External Dependencies -->
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${dependency.jackson}</version>
      </dependency>
      <!-- Kafka for Event Sourcing -->
      <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>${dependency.kafka}</version>
      </dependency>

      <!-- Logging dependencies -->
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${dependency.logback}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${dependency.log4j2}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${dependency.log4j2}</version>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j2-impl</artifactId>
        <version>${dependency.log4j2}</version>
        <scope>test</scope>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!-- Open Telemetry -->
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-bom</artifactId>
        <version>${dependency.otel}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry.javaagent</groupId>
        <artifactId>opentelemetry-javaagent</artifactId>
        <scope>runtime</scope>
        <version>${dependency.otel}</version>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-testing</artifactId>
        <version>${dependency.otel}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>${dependency.otel-semconv}</version>
      </dependency>
      <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${dependency.kotlin}</version>
      </dependency>
      <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-common</artifactId>
        <version>${dependency.kotlin}</version>
      </dependency>

      <!-- Testing dependencies -->
      <!-- JUnit 5 -->
      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${dependency.junit5}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${dependency.junit5}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite</artifactId>
        <version>${dependency.junit5-platform}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>${dependency.mockito}</version>
      </dependency>
      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-junit-jupiter</artifactId>
        <version>${dependency.mockito}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${dependency.testcontainers}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>kafka</artifactId>
        <version>${dependency.testcontainers}</version>
        <scope>test</scope>
        <exclusions>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>testcontainers</artifactId>
        <version>${dependency.testcontainers}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>io.telicent.public</groupId>
        <artifactId>fuseki-yaml-config</artifactId>
        <version>${dependency.yaml-config}</version>
      </dependency>


      <!-- Benchmark libs -->
      <dependency>
        <groupId>org.openjdk.jmh</groupId>
        <artifactId>jmh-core</artifactId>
        <version>${dependency.jmh}</version>
      </dependency>

      <dependency>
        <groupId>org.openjdk.jmh</groupId>
        <artifactId>jmh-generator-annprocess</artifactId>
        <version>${dependency.jmh}</version>
      </dependency>

      <!-- CVE Fixes -->
      <!-- CVE-2025-48734-->
      <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>${dependency.commons-beanutils}</version>
      </dependency>

      <!-- CVE-2025-28976 -->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-fileupload2-jakarta-servlet6</artifactId>
        <version>${dependency.commons-fileupload2}</version>
      </dependency>

    </dependencies>
  </dependencyManagement>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${plugin.compiler}</version>
          <configuration>
            <release>${java.version}</release>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>${plugin.dependency}</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>${plugin.deploy}</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${plugin.jar}</version>
          <configuration>
            <archive>
              <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>build-test-jar</id>
              <goals>
                <goal>test-jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>${plugin.javadoc}</version>
          <configuration>
            <doclint>none</doclint>
          </configuration>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>${plugin.resources}</version>
          <configuration>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.6.1</version>
        </plugin>

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

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${plugin.surefire}</version>
          <configuration>
            <argLine>@{jacocoArgLine} -javaagent:${org.mockito:mockito-core:jar} -XX:+EnableDynamicAgentLoading -Xshare:off</argLine>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>versions-maven-plugin</artifactId>
          <version>${plugin.versions}</version>
          <configuration>
            <ignoredVersions>.*[-\.]M.*,.*-[aA]lpha.*,.*-[bB]eta.*,.*-RC.*,.*rc.*</ignoredVersions>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.cyclonedx</groupId>
          <artifactId>cyclonedx-maven-plugin</artifactId>
          <version>${plugin.cyclonedx}</version>
          <executions>
            <execution>
              <id>build-sbom-cyclonedx</id>
              <phase>package</phase>
              <goals>
                <goal>makeAggregateBom</goal>
              </goals>
            </execution>
          </executions>
          <configuration>
            <skipNotDeployed>false</skipNotDeployed> <!-- Forces SBOM generation -->
            <outputName>${project.artifactId}-${project.version}-bom</outputName>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <version>${plugin.gpg}</version>
        <executions>
          <execution>
            <goals>
              <goal>sign</goal>
            </goals>
            <phase>verify</phase>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.cyclonedx</groupId>
        <artifactId>cyclonedx-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.sonatype.central</groupId>
        <artifactId>central-publishing-maven-plugin</artifactId>
        <version>${plugin.central}</version>
        <extensions>true</extensions>
        <configuration>
          <publishingServerId>central</publishingServerId>
          <autoPublish>true</autoPublish>
          <waitUntil>published</waitUntil>
          <waitMaxTime>3600</waitMaxTime>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${plugin.jacoco}</version>
        <configuration>
          <propertyName>jacocoArgLine</propertyName>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <execution>
            <id>report</id>
            <phase>verify</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <distributionManagement>
    <snapshotRepository>
      <id>central</id>
      <name>Maven Central Snapshots</name>
      <url>https://central.sonatype.com/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

  <profiles>
    <profile>
      <id>docker</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <os>
          <family>!Windows</family>
        </os>
      </activation>
    </profile>
  </profiles>
</project>
