#!/bin/bash -e

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# This is a general bash script to build a datasketches-memory-X.jar
# with multi-release functionality.  The sources, test-sources, tests and
# javadoc jars are also included in the output.
# It does use git and also uses the script getGitProperties.sh.
#
# NOTE: This script assumes that `mvn package` has been run prior to invocation.
#       By default, it is called from the maven exec-plugin.

#  Required Input Parameters:
#  \$1 = absolute path of JDK home directory
#  \$2 = Git Version Tag for this deployment
#       Example tag for SNAPSHOT         : 1.0.0-SNAPSHOT
#       Example tag for Release Candidate: 1.0.0-RC1
#       Example tag for Release          : 1.0.0
#  \$3 = absolute path of project.basedir
#  For example:  $ <this script>.sh $JAVA_HOME 2.1.0 .

if [ -z "$1" ]; then echo "Missing JDK home";            exit 1; fi
if [ -z "$2" ]; then echo "Missing Git Tag";             exit 1; fi
if [ -z "$3" ]; then echo "Missing project.basedir";     exit 1; fi

#### Extract JDKHome, Version and ProjectBaseDir from input parameters ####
JDKHome=$1
GitTag=$2
ProjectBaseDir=$3 #this must be an absolute path

#### Setup absolute directory references ####
ProjectArtifactId="datasketches-memory"
ScriptsDir=${ProjectBaseDir}/tools/scripts/

#### Initialise path dependent variables ####
OutputDir=target
OutputMrJar=${OutputDir}/datasketches-memory-${GitTag}.jar
OutputTests=${OutputDir}/datasketches-memory-${GitTag}-tests.jar
OutputJavaDoc=${OutputDir}/datasketches-memory-${GitTag}-javadoc.jar
OutputSources=${OutputDir}/datasketches-memory-${GitTag}-sources.jar
OutputTestSources=${OutputDir}/datasketches-memory-${GitTag}-test-sources.jar

ArchiveDir=${OutputDir}/archive-tmp
PackageSources=${ArchiveDir}/sources
PackageTestSources=${ArchiveDir}/test-sources
PackageTests=${ArchiveDir}/tests
PackageJavaDoc=${ArchiveDir}/javadoc
PackageMrJar=${ArchiveDir}/jar

#### Move to project directory ####
cd ${ProjectBaseDir}

#### Use JAVA_HOME to set required executables ####
if [[ -n "$JDKHome" ]] && [[ -x "${JDKHome}/bin/jar" ]];     then Jar_="${JDKHome}/bin/jar";         else echo "No jar version could be found.";     exit 1; fi

MemoryJava8Classes=datasketches-memory-java8/target/classes
MemoryJava8TestClasses=datasketches-memory-java8/target/test-classes
MemoryJava8Sources=datasketches-memory-java8/src/main/java
MemoryJava8TestSources=datasketches-memory-java8/src/test/java
MemoryJava8Docs=datasketches-memory-java8/target/apidocs/
MemoryJava11Classes=datasketches-memory-java11/target/classes
MemoryJava11Sources=datasketches-memory-java11/src/main/java
MemoryJava8Docs=datasketches-memory-java8/target/apidocs/
MavenArchiver=target/maven-archiver

if ! [[ -x "${MemoryJava8Classes}" ]];        then echo "No compiled classes - run mvn package first.";        exit 1; fi
if ! [[ -x "${MemoryJava8TestClasses}" ]];    then echo "No compiled test classes - run mvn package first.";   exit 1; fi
if ! [[ -x "${MemoryJava11Classes}" ]];       then echo "No compiled classes - run mvn package first.";        exit 1; fi
if ! [[ -x "${MemoryJava8Docs}" ]];           then echo "No javadocs - run mvn package first.";                exit 1; fi
if ! [[ -x "${MavenArchiver}" ]];             then echo "No maven archiver - run mvn package first.";          exit 1; fi

#### Cleanup and setup output directories ####
echo
if [ -d "$OutputDir" ]; then rm -f $OutputDir/*.jar; fi
if [ -d "$ArchiveDir" ]; then rm -r $ArchiveDir; fi

mkdir -p $PackageSources
mkdir -p $PackageTestSources
mkdir -p $PackageTests
mkdir -p $PackageJavaDoc
mkdir -p $PackageMrJar

#### JAR Metadata function
prepare_jar () {
  JarBase=$1
  JarMeta=${JarBase}/META-INF
  JarMaven=${JarMeta}/maven/org.apache.datasketches/datasketches-memory

  mkdir -p ${JarMeta}/versions/11
  mkdir -p ${JarMaven}
  
  #### Generate DEPENDENCIES ####
 cat >> ${JarMeta}/DEPENDENCIES<< EOF
// ------------------------------------------------------------------
// Transitive dependencies of this project determined from the
// maven pom organized by organization.
// ------------------------------------------------------------------
EOF
  
  #### Copy LICENSE and NOTICE ####
  cp LICENSE $JarMeta
  cp NOTICE $JarMeta
  
  #### Copy pom.properties
  cp ${MavenArchiver}/pom.properties $JarMaven
  cp pom.xml $JarMaven
  
}

#### Generate MANIFEST.MF ####
cat >> ${ArchiveDir}/MANIFEST.MF<< EOF
Manifest-Version: 1.0
Created-By: Apache Datasketches Memory package-mr-jar.sh
Multi-Release: true
EOF
#### Generate git.properties file ####
echo "$($ScriptsDir/getGitProperties.sh $ProjectBaseDir $ProjectArtifactId $GitTag)" >> ${ArchiveDir}/MANIFEST.MF

###########################
#### MULTI-RELEASE JAR ####
###########################
prepare_jar $PackageMrJar
#### Copy java 8 compiled classes to target/jar
rsync -q -a -I --filter="- .*" ${MemoryJava8Classes}/org $PackageMrJar
#### Copy java 11 compiled classes to target/jar/META-INF/versions/11
rsync -q -a -I --filter="- .*" ${MemoryJava11Classes}/org ${PackageMrJar}/META-INF/versions/11
cp ${MemoryJava11Classes}/module-info.class ${PackageMrJar}/META-INF/versions/11

${Jar_} cfm $OutputMrJar ${ArchiveDir}/MANIFEST.MF -C $PackageMrJar .
echo "Created multi-release jar ${OutputMrJar}"

###########################
####     TESTS JAR     ####
###########################
prepare_jar $PackageTests
#### Copy java 8 compiled test classes to target/jar
rsync -q -a -I --filter="- .*" ${MemoryJava8TestClasses}/org $PackageTests

${Jar_} cfm $OutputTests ${ArchiveDir}/MANIFEST.MF -C $PackageTests .
echo "Created tests jar ${OutputTests}"

###########################
####    SOURCES JAR    ####
###########################
prepare_jar $PackageSources
#### Copy java 8 source files to target/sources
rsync -q -a -I --filter="- .*" ${MemoryJava8Sources}/org $PackageSources
#### Copy java 11 source files to target/sources/META-INF/versions/11
rsync -q -a -I --filter="- .*" ${MemoryJava11Sources}/org ${PackageSources}/META-INF/versions/11
cp ${MemoryJava11Sources}/module-info.java ${PackageSources}/META-INF/versions/11

${Jar_} cfm $OutputSources ${ArchiveDir}/MANIFEST.MF -C $PackageSources .
echo "Created sources jar ${OutputSources}"

###########################
####  TEST SOURCES JAR ####
###########################
prepare_jar $PackageTestSources
#### Copy java 8 test source files to target/test-sources
rsync -q -a -I --filter="- .*" ${MemoryJava8TestSources}/org $PackageTestSources

${Jar_} cfm $OutputTestSources ${ArchiveDir}/MANIFEST.MF -C $PackageTestSources .
echo "Created test sources jar ${OutputTestSources}"

###########################
####    JAVADOC JAR    ####
###########################
prepare_jar $PackageJavaDoc

rsync -q -a -I --filter="- .*" ${MemoryJava8Docs} $PackageJavaDoc
${Jar_} cfm $OutputJavaDoc ${ArchiveDir}/MANIFEST.MF -C $PackageJavaDoc .
echo "Created javadoc jar ${OutputJavaDoc}"
