<?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>
  <parent>
    <groupId>io.jenkins.tools</groupId>
    <artifactId>bridge-method-injector-parent</artifactId>
    <version>1.32</version>
  </parent>

  <artifactId>bridge-method-injector</artifactId>
  <packaging>maven-plugin</packaging>
  <name>bridge-method-injector</name>
  <description>Evolve your classes without breaking compatibility</description>

  <prerequisites>
    <maven>${maven.version}</maven>
  </prerequisites>

  <properties>
    <asm.version>9.8</asm.version>
    <maven-plugin-tools.version>3.15.1</maven-plugin-tools.version>
    <maven.version>3.9.6</maven.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>bridge-method-annotation</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs-annotations</artifactId>
      <version>4.9.4</version>
      <optional>true</optional>
      <exclusions>
        <exclusion>
          <groupId>com.google.code.findbugs</groupId>
          <artifactId>jsr305</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.ow2.asm</groupId>
      <artifactId>asm</artifactId>
      <version>${asm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.ow2.asm</groupId>
      <artifactId>asm-commons</artifactId>
      <version>${asm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>${maven.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>${maven-plugin-tools.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>${maven-plugin-tools.version}</version>
        <configuration>
          <goalPrefix>bridge-method-injector</goalPrefix>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>test</phase>
            <configuration>
              <target>
                <delete dir="target/test-classes" />
                <mkdir dir="target/test-classes/v1" />
                <mkdir dir="target/test-classes/v2" />
                <mkdir dir="target/test-classes/client" />
                <mkdir dir="target/test-classes/synthetics" />

                <!-- basic sanity. unmodified client and v1 should work as expected -->
                <javac destdir="target/test-classes/v1" includeantruntime="false" release="${maven.compiler.release}" srcdir="src/test/v1" />
                <javac classpath="target/test-classes/v1" destdir="target/test-classes/client" includeantruntime="false" release="${maven.compiler.release}" srcdir="src/test/client" />
                <java classname="Main" failonerror="true" fork="true">
                  <sysproperty key="java.security.manager" value="allow" />
                  <arg value="foo" />
                  <classpath>
                    <pathelement path="target/test-classes/v1" />
                    <pathelement path="target/test-classes/client" />
                  </classpath>
                </java>

                <!-- compile v2 -->
                <javac classpath="${maven.compile.classpath}" destdir="target/test-classes/v2" includeantruntime="false" release="${maven.compiler.release}" srcdir="src/test/v2">
                  <compilerarg value="-XprintProcessorInfo" />
                  <classpath>
                    <pathelement path="target/classes" />
                    <path refid="maven.compile.classpath" />
                  </classpath>
                </javac>

                <!-- post process v2 -->
                <java classname="com.infradna.tool.bridge_method_injector.MethodInjector" failonerror="true" fork="true">
                  <sysproperty key="java.security.manager" value="allow" />
                  <arg value="${project.basedir}/target/test-classes/v2" />
                  <classpath refid="maven.compile.classpath" />
                </java>

                <!-- verify that unmodified client code continue to work with v2 binary -->
                <java classname="Main" failonerror="true" fork="true">
                  <sysproperty key="java.security.manager" value="allow" />
                  <arg value="bar" />
                  <classpath>
                    <pathelement path="target/test-classes/v2" />
                    <pathelement path="target/test-classes/client" />
                  </classpath>
                </java>

                <!-- compile synthetics -->
                <javac classpath="${maven.compile.classpath}" destdir="target/test-classes/synthetics" includeantruntime="false" release="${maven.compiler.release}" srcdir="src/test/synthetics">
                  <compilerarg value="-XprintProcessorInfo" />
                  <classpath>
                    <pathelement path="target/classes" />
                    <path refid="maven.compile.classpath" />
                  </classpath>
                </javac>

                <!-- post process synthetics -->
                <java classname="com.infradna.tool.bridge_method_injector.MethodInjector" failonerror="true" fork="true">
                  <sysproperty key="java.security.manager" value="allow" />
                  <arg value="${project.basedir}/target/test-classes/synthetics" />
                  <classpath refid="maven.compile.classpath" />
                </java>

                <!-- was testing source compatibility, but with widening change it won't work anymore -->
                <!--
                <mkdir dir="target/test-classes/client-on-v2" />
                <javac release="${maven.compiler.release}" srcdir="src/test/client" destdir="target/test-classes/client-on-v2" includeantruntime="false">
                  <classpath>
                    <pathelement path="target/test-classes/v2" />
                  </classpath>
                </javac>
                <java classname="Main" failonerror="true" fork="true">
                  <sysproperty key="java.security.manager" value="allow" />
                  <arg value="bar" />
                  <classpath>
                    <pathelement path="target/test-classes/v2" />
                    <pathelement path="target/test-classes/client-on-v2" />
                  </classpath>
                </java>
                -->
              </target>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
