<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.imagingbook</groupId>
	<artifactId>imagingbook-parent-pom</artifactId>
	<version>7.2.0</version>
	<packaging>pom</packaging>

	<name>${project.groupId}:${project.artifactId}</name>
	<description>
		Parent POM (Project Object Model) for general (non-plugin) imagingbook artifacts.
		This code is part of the imagingbook software suite accompanying the
		image processing textbooks by W. Burger and M.J. Burge (Springer 2006-2022).
	</description>
	<inceptionYear>2006</inceptionYear>
	<url>http://www.imagingbook.com</url>

	<developers>
		<developer>
			<name>Wilhelm Burger</name>
		</developer>
		<developer>
			<name>Mark J. Burge</name>
		</developer>
	</developers>

	<licenses>
		<license>
			<name>BSD 2-Clause "Simplified" License</name>
			<url>http://opensource.org/licenses/BSD-2-Clause</url>
		</license>
	</licenses>

	<scm>
		<connection>scm:git:git://github.com/imagingbook/imagingbook-public.git</connection>
		<developerConnection>scm:git:ssh://github.com:imagingbook/imagingbook-public.git.git</developerConnection>
		<url>http://github.com/imagingbook/imagingbook-public.git/tree/master</url>
	</scm>

	<properties>
		<directory-up-1>${project.basedir}${file.separator}..</directory-up-1>
		<directory-up-2>${project.basedir}${file.separator}..${file.separator}..</directory-up-2>
		<directory-up-3>${project.basedir}${file.separator}..${file.separator}..${file.separator}..</directory-up-3>

		<imagingbook.rootdir>${directory-up-1}</imagingbook.rootdir>   <!-- to be modified by nested projects -->
		<imagingbook.deploydir>DEPLOY</imagingbook.deploydir>
		<imagingbook.docdir>${project.basedir}</imagingbook.docdir>
		<imagingbook.buildprofile>DefaultProfile</imagingbook.buildprofile>

		<java.version>17</java.version>	<!-- need to step to 11 to make Javadoc API linking work! -->
		<imagej.version>1.54p</imagej.version> <!-- see https://mvnrepository.com/artifact/net.imagej/ij -->
		<!-- <imagej.apilink>https://javadoc.io/doc/net.imagej/ij</imagej.apilink> -->
		<imagej.apilink>https://imagej.net/ij/developer/api/</imagej.apilink>

		<commons-math3.version>3.6.1</commons-math3.version>
		<commons-math3.apilink>https://javadoc.io/doc/org.apache.commons/commons-math3/3.6.1</commons-math3.apilink>

		<junit.version>4.13.2</junit.version>

		<jtransforms.version>3.1</jtransforms.version>
		<jtransforms.apilink>https://javadoc.io/doc/com.github.wendykierp/JTransforms</jtransforms.apilink>

		<openpdf.version>1.4.2</openpdf.version> <!-- was 1.3.30 -->
		<openpdf.apilink>https://javadoc.io/doc/com.github.librepdf/openpdf/1.4.2</openpdf.apilink>

		<maven.compiler.target>${java.version}</maven.compiler.target>
	    <maven.compiler.source>${java.version}</maven.compiler.source>

		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<imagingbook.skipdeploy>false</imagingbook.skipdeploy>	<!-- set true in downstream POMS to exclude from deployment -->
		<!--<imagingbook.gpgSkip>true</imagingbook.gpgSkip>-->	<!-- set false on command line for deploy only: -->

		<!--   *************** JavDoc related items ****************** -->
		<imagingbook.skipjavadoc>true</imagingbook.skipjavadoc>
		<imagingbook.doctitle>EMPTY DOCTITLE (undefined imagingbook.doctitle)</imagingbook.doctitle>
		<imagingbook.header>
			<![CDATA[<br><font face="verdana"><B>]]>${project.name} ${project.version}<![CDATA[</B></font>]]>
		</imagingbook.header>
		<imagingbook.bottom>Build Date: ${maven.build.timestamp}</imagingbook.bottom>
	</properties>

	<distributionManagement>
	 	<!-- used during 'mvn deploy' -->
        <snapshotRepository>
            <id>local-deploy</id>
            <url>file:${imagingbook.deploydir}</url>
            <!-- <url>https://oss.sonatype.org/content/repositories/snapshots</url> -->
        </snapshotRepository>

        <!-- Release repo -->
		<repository>
			<id>ossrh</id>
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
		</repository>
	</distributionManagement>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>net.imagej</groupId>
				<artifactId>ij</artifactId>
				<version>${imagej.version}</version>
			</dependency>

			<dependency>
				<groupId>org.apache.commons</groupId>
				<artifactId>commons-math3</artifactId>
				<version>${commons-math3.version}</version>
			</dependency>

			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-clean-plugin</artifactId>
					<version>3.5.0</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-resources-plugin</artifactId>
					<version>3.3.1</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-dependency-plugin</artifactId>
					<version>3.9.0</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-surefire-plugin</artifactId>
					<version>3.5.4</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-release-plugin</artifactId>
					<version>3.1.1</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-antrun-plugin</artifactId>
					<version>3.2.0</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-jar-plugin</artifactId>
					<version>3.4.2</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-source-plugin</artifactId>
					<version>3.3.1</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-javadoc-plugin</artifactId>
					<version>3.12.0</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-project-info-reports-plugin</artifactId>
					<version>3.9.0</version>
				</plugin>

				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.14.1</version>
				</plugin>

				<plugin>
					<groupId>org.codehaus.mojo</groupId>
					<artifactId>versions-maven-plugin</artifactId>
					<version>2.19.1</version>
				</plugin>


			</plugins>
		</pluginManagement>

		<!-- End of pluginManagement -->

		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-clean-plugin</artifactId>
				<configuration>
					<!-- avoid removing the cleaned directories themselves, delete content only: -->
					<excludeDefaultDirectories>true</excludeDefaultDirectories>
					<filesets>
						<!-- because excludeDefaultDirectories=true, target doesn't get cleaned by default -->
						<fileset>
							<directory>${project.basedir}/target</directory>
							<includes><include>**/*</include></includes>
						</fileset>
						<fileset>
							<directory>${project.basedir}/${imagingbook.deploydir}</directory>
							<includes><include>**/*</include></includes>
						</fileset>
                        <!--JavaDoc is always placed in './apidocs'-->
						<fileset>
                            <directory>${project.basedir}/apidocs</directory>
							<includes><include>**/*</include></includes>
						</fileset>
					</filesets>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
					<!-- disables automatic module-path for non-modular projects -->
					<release>${java.version}</release>
					<!-- <compilerArgs>
						<arg>-Xpkginfo:nonempty</arg>
					</compilerArgs> -->
                    <!--<compilerArgs>
                        <arg>-Xpkginfo:nonempty</arg>
                        <arg>-Xlint:all</arg>
                    </compilerArgs>-->
                    <parameters>true</parameters>
                    <showWarnings>false</showWarnings> <!-- hides only Maven’s pre-compile checks -->
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<configuration>
					<goals>deploy</goals>
					<autoVersionSubmodules>true</autoVersionSubmodules>
				</configuration>
			</plugin>

			<!-- Output the value of certain variables for debugging -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-antrun-plugin</artifactId>
				<executions>
					<execution>
						<id>echo</id>
						<phase>initialize</phase>
						<goals>
							<goal>run</goal>
						</goals>
						<configuration>
							<target>
								<!-- output some status information -->
								<echo level="info">**** imagingbook.buildprofile = ${imagingbook.buildprofile}</echo>
								<echo level="info">**** imagingbook.rootdir = ${imagingbook.rootdir}</echo>
								<echo level="info">**** project.reporting.outputDirectory = ${project.reporting.outputDirectory}</echo>
								<echo level="info">**** imagingbook.docdir = ${imagingbook.docdir}</echo>
								<echo level="info">**** imagingbook.skipjavadoc = ${imagingbook.skipjavadoc}</echo>
								<!--<echo level="info">**** imagingbook.gpgSkip = ${imagingbook.gpgSkip}</echo>-->
                                <echo level="info">**** imagingbook.skipdeploy = ${imagingbook.skipdeploy}</echo>
								<echo level="info">**** imagingbook.deploydir = ${project.basedir}/${imagingbook.deploydir}</echo>
								<echo level="info">**** maven.compiler.source = ${maven.compiler.source}</echo>
								<!--<echo level="info">**** maven.multiModuleProjectDirectory = ${maven.multiModuleProjectDirectory}</echo>-->
							</target>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>  <!-- add more properties to MANIFEST file -->
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<!-- <skip>true</skip> -->
					<!-- <useDefaultManifestFile>true</useDefaultManifestFile> --> <!-- not available since version 3.0.0 -->
					<archive>
						<manifest>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
						</manifest>
						<manifestEntries>
							<!-- <Build-Date>${buildDate}</Build-Date> -->
							<Build-Time>${maven.build.timestamp}</Build-Time>
						</manifestEntries>
					</archive>
				</configuration>

                <!-- how to add aggregated javadoc to pom-type parent project -->
                <!-- https://stackoverflow.com/questions/53706943/how-to-upload-an-artifact-to-maven-central-with-an-empty-javadoc-jar-or-empty-s -->
                <!-- CHECK version 7.1 for additional javadoc executions! -->
			</plugin>

			<plugin>  <!-- generate a separate jar file with source code -->
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
				<configuration>
					<!--generally exclude resources from source jars -->
					<excludeResources>true</excludeResources>
				</configuration>
				<executions>
					<execution>
						<id>attach-sources</id>
						<goals>
							<goal>jar-no-fork</goal>	<!-- was "jar" only -->
						</goals>
					</execution>
				</executions>
			</plugin>

            <!-- Javadoc generation, see https://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html -->
            <!-- https://docs.geotools.org/latest/userguide/build/maven/javadocs.html -->
            <!-- To run on command line:
                mvn clean install javadoc:aggregate
                mvn javadoc:javadoc -Dimagingbook.skipjavadoc=false
                mvn javadoc:aggregate -Dimagingbook.skipjavadoc=false
            -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<configuration>
					<skip>${imagingbook.skipjavadoc}</skip>
                    <source>${java.version}</source>
                    <encoding>UTF-8</encoding>
                    <charset>UTF-8</charset>
                    <docencoding>UTF-8</docencoding>
                    <linksource>true</linksource>
                    <show>protected</show>
                    <failOnError>false</failOnError>
                    <doclint>all,-missing</doclint>
                    <excludePackageNames>*.DATA:*.DATA.*</excludePackageNames>
                    <detectJavaApiLink>true</detectJavaApiLink>
					<links>
						<link>${imagej.apilink}</link>
						<link>${commons-math3.apilink}</link>
						<link>${jtransforms.apilink}</link>
						<link>${openpdf.apilink}</link>
						<!--<link>https://javadoc.io/doc/com.imagingbook/imagingbook-core/latest</link>
						<link>https://javadoc.io/doc/com.imagingbook/imagingbook-common/latest</link>
						<link>https://javadoc.io/doc/com.imagingbook/imagingbook-spectral/latest</link>
						<link>https://javadoc.io/doc/com.imagingbook/imagingbook-pdf/latest</link>
						<link>https://javadoc.io/doc/com.imagingbook/imagingbook-spectral/latest</link>
						<link>https://javadoc.io/doc/com.imagingbook/sample-images/latest</link>-->
					</links>
                    <doctitle>${imagingbook.doctitle}</doctitle>
                    <header>${imagingbook.header}</header>
                    <bottom>${imagingbook.bottom}</bottom>
                    <packagesheader>${project.name}</packagesheader>
                    <nohelp>true</nohelp>
                    <author>false</author>
				</configuration>

				<executions>
					<!-- see https://maven.apache.org/plugins/maven-javadoc-plugin/examples/aggregate.html -->
					<execution>
						<id>aggregate-javadoc</id>
						<goals>
							<goal>aggregate</goal>
						</goals>
                        <phase>package</phase>
						<configuration>
                            <skippedModules>imagingbook-testing</skippedModules>
                            <!-- Override aggregate output directory (JavaDoc is always placed in ./apidocs) -->
                            <outputDirectory>${project.basedir}</outputDirectory>
						</configuration>
					</execution>

                    <execution>
                        <id>aggregate-jar</id>
                        <goals>
                            <goal>aggregate-jar</goal>
                        </goals>
                        <configuration>
                        </configuration>
                    </execution>

				</executions>
			</plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-gpg-plugin</artifactId>
                <version>3.2.8</version>
                <configuration>
                    <useAgent>false</useAgent>
                    <passphraseServerId>gpg.passphrase</passphraseServerId>  <!-- as named in ~/.m2/settings.xml -->
                    <gpgArguments>
                        <arg>--batch</arg>
                        <arg>--pinentry-mode</arg>
                        <arg>loopback</arg>
                    </gpgArguments>
                </configuration>
                <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>0.9.0</version>
                <extensions>true</extensions>
                <configuration>
                    <publishingServerId>central</publishingServerId>
                    <autoPublish>true</autoPublish>
                    <waitUntil>validated</waitUntil>
                </configuration>
            </plugin>

		</plugins>
	</build>

	<profiles>
		<!-- ****************************************************************************
			This is a special build profile for ImageJ plugin projects. If the project
			base directory contains an 'ImageJ' sub-folder it is assumed that the project
			defines ImageJ plugins. This sets the output directory to 'ImageJ/plugins',
			i.e., all project-related .class files are stored there, whereas all
			dependencies are copied to the 'ImageJ/jars' folder.
			File 'ImageJ/ij.jar' is also updated to the specified version if necessary.
			Directories ImageJ/plugins and jars are cleared during the maven 'clean' phase.
			***************************************************************************** -->
		<profile>
			<id>ij-plugins-build</id>
			<activation>
				<file> <!-- activates this profile if directory ${project.basedir}/ImageJ exists -->
					<exists>ImageJ</exists>
				</file>
			</activation>
			<properties>
				<imagingbook.buildprofile>IjPluginsProfile</imagingbook.buildprofile>
				<outputDirectory>${project.basedir}/ImageJ/plugins</outputDirectory>
				<pluginConfigFile>plugins.config</pluginConfigFile>
				<!-- future use to specify general plugins path: -->
				<pluginPrefix>"Plugins&gt;B&amp;B "</pluginPrefix>
				<imagingbook.libs>imagingbook-core,imagingbook-common,imagingbook-spectral,imagingbook-pdf,imagingbook-sample-images,imagingbook-calibrate-lib</imagingbook.libs>
			</properties>

			<build>
				<plugins>
					<!-- empty the ImageJ/plugins and ImageJ/jars directories at clean -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-clean-plugin</artifactId>
						<configuration>
							<!-- avoid removing the cleaned directories themselves, delete content only: -->
							<excludeDefaultDirectories>true</excludeDefaultDirectories>
							<filesets>
								<fileset> <!-- clean ImageJ/ij.jar  -->
									<directory>${project.basedir}/ImageJ</directory>
									<includes>
										<include>**/ij.jar</include>
									</includes>
                                    <excludes>
                                        <exclude>.gitignore</exclude>
                                    </excludes>
								</fileset>
								<fileset> <!-- clean ImageJ/jars/  -->
									<directory>${project.basedir}/ImageJ/jars</directory>
									<includes>
										<include>**/*</include>
									</includes>
								</fileset>
								<!-- because excludeDefaultDirectories=true, target doesn't get cleaned by default -->
								<fileset>
									<directory>${project.basedir}/target</directory>
									<includes>
										<include>**/*</include>
									</includes>
								</fileset>
								<fileset>
									<directory>${project.basedir}/${imagingbook.deploydir}</directory>
									<includes><include>**/*</include></includes>
								</fileset>
								<fileset>
                                    <!-- Override aggregate output directory (JavaDoc is always placed in ./apidocs) -->
                                    <directory>${project.basedir}/apidocs</directory>
									<includes><include>**/*</include></includes>
								</fileset>
							</filesets>
						</configuration>
					</plugin>

					<!-- Copy dependencies into different places of ImageJ project:
						see https://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-dependency-plugin</artifactId>
						<executions>
							<execution>
								<!-- copy ij.jar into ImageJ/ -->
								<id>copy-ij-jar</id>
								<phase>package</phase>
								<goals>
									<goal>copy</goal>
								</goals>
								<configuration>
									<artifactItems>
										<artifactItem>
											<groupId>net.imagej</groupId>
											<artifactId>ij</artifactId>
											<outputDirectory>${project.basedir}/ImageJ</outputDirectory>
											<destFileName>ij.jar</destFileName>
										</artifactItem>
									</artifactItems>
									<overWriteSnapshots>true</overWriteSnapshots>
									<!--<excludeScope>test</excludeScope>-->
								</configuration>
							</execution>

							<execution>
								<!-- copy imagingbook plugins (but not library JARs) into ImageJ/plugins/ -->
								<id>copy-imagingbook-dependencies</id>
								<phase>package</phase>
								<goals>
									<goal>copy-dependencies</goal>
								</goals>
								<configuration>
									<includeGroupIds>com.imagingbook</includeGroupIds>
									<excludeArtifactIds>${imagingbook.libs}</excludeArtifactIds>
									<outputDirectory>${project.basedir}/ImageJ/plugins</outputDirectory>
									<overWriteSnapshots>true</overWriteSnapshots>
								</configuration>
							</execution>

							<execution>
								<!-- copy imagingbook libraries (not plugin JARs) into ImageJ/jars/ -->
								<id>copy-imagingbook-common</id>
								<phase>package</phase>
								<goals>
									<goal>copy-dependencies</goal>
								</goals>
								<configuration>
									<includeGroupIds>com.imagingbook</includeGroupIds>
									<includeArtifactIds>${imagingbook.libs}</includeArtifactIds>
									<outputDirectory>${project.basedir}/ImageJ/jars</outputDirectory>
									<overWriteSnapshots>true</overWriteSnapshots>
								</configuration>
							</execution>

							<execution>
								<!-- copy all other dependencies into ImageJ/jars/ -->
								<id>copy-other-dependencies</id>
								<phase>package</phase>
								<goals>
									<goal>copy-dependencies</goal>
								</goals>
								<configuration>
									<excludeGroupIds>com.imagingbook,net.imagej</excludeGroupIds>
									<excludeArtifactIds>ij</excludeArtifactIds>
									<outputDirectory>${project.basedir}/ImageJ/jars</outputDirectory>
									<overWriteSnapshots>true</overWriteSnapshots>
								</configuration>
							</execution>

						</executions>
					</plugin>
					<!-- end of copy -->

					<!-- Run a Java program to build plugins.config file in output directory (to be included in output JAR) -->
					<plugin>
						<groupId>org.codehaus.mojo</groupId>
						<artifactId>exec-maven-plugin</artifactId>
						<version>3.0.0</version>
						<executions>
							<execution>
								<id>codegeneration</id>
								<!-- <phase>generate-resources</phase>  -->
								<!-- <phase>process-classes</phase>  -->
								<phase>prepare-package</phase>
								<goals>
									<goal>java</goal>
								</goals>
								<configuration>
									<mainClass>imagingbook.core.plugin.PluginsConfigBuilder</mainClass>
									<arguments>
										<argument>${project.build.outputDirectory}</argument>
										<argument>${project.name}</argument>
										<argument>${pluginPrefix}</argument> <!-- reserved for future use -->
									</arguments>
								</configuration>
							</execution>
						</executions>
					</plugin>

				</plugins>

				<resources>
					<!-- add plugins.config to the project's JAR -->
					<resource>
						<directory>src/main/java</directory>
						<includes>
							<include>**/${pluginConfigFile}</include>
						</includes>
					</resource>
				</resources>
			</build>
		</profile>

		<!-- To skip maven-jar-plugin in POM-only (no-source) modules -->
		<!-- Activates only for modules that lack a source folder -->
		<!-- <profile>
			<id>skip-build-plugins-if-no-src</id>
			<activation>
			  <file>
				<missing>src</missing>
			  </file>
			</activation>
			<properties>
			  <skip.jar>false</skip.jar>
			  <skip.javadoc>true</skip.javadoc>
			  <skip.source>true</skip.source>
			</properties>
		</profile> -->

	</profiles>

</project>