<!--
 * 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 file primarily, contains instructions to the person(s) who shall be making a XalanJ release
for distribution, along with the instructions about how to test XalanJ release before recommending
the release for distribution.

(1) Steps to build the XalanJ release

1) Do a git clone, of the relevant XalanJ branches:

git clone --single-branch https://gitbox.apache.org/repos/asf/xalan-java.git -b xalan-j_2_7_1_maint
git clone https://gitbox.apache.org/repos/asf/xalan-test.git

This creates two folders: xalan-java and xalan-test

2) Set JAVA_HOME environment variable, for example:

set JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-8.0.352.8-hotspot\

3) Run the command, "build clean fulldist" from folder xalan-java. This shall produce the following jars, 
relevant for testing the XalanJ build : xalan.jar, serializer.jar. [1]

(2) Steps to run the XalanJ tests, on XalanJ implementation

1) Go to the XalanJ tests repos:
cd ..\xalan-test

2) Run the command "build clean jar" from folder xalan-test. This produces
the file testxsl.jar within folder xalan-test/java/build.

3) Create a folder xalanjrelease_jardir somewhere on file system.
Copy the jar file testxsl.jar produced within the previous step, to the folder 
xalanjrelease_jardir. Copy the jars xalan.jar, serializer.jar [1] to this 
folder. From the folder xalan-java/lib/endorsed, copy jars xercesImpl.jar, 
xml-apis.jar to the folder xalanjrelease_jardir. Copy the jar Tidy.jar 
from folder xalan-test/tools to the folder xalanjrelease_jardir. Now 
the folder xalanjrelease_jardir, has the XalanJ jar xalan.jar that 
needs to be tested, and all the supporting jars needed for testing.

For example, on Windows, from xalan-test:

copy /Y java\build\testxsl.jar "%JARDIR%"
copy /Y tools\Tidy.jar "%JARDIR%"

copy /Y ..\xalan-java\build\xalan.jar "%JARDIR%"
copy /Y ..\xalan-java\build\serializer.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\bsf.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\commons-logging-1.2.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\regexp.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\rhino-1.7.14.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\endorsed\xercesImpl.jar "%JARDIR%"
copy /Y ..\xalan-java\lib\endorsed\xml-apis.jar "%JARDIR%"

4) Set JARDIR environment variable, pointing to the folder "xalanjrelease_jardir".

5) Run the necessary XalanJ tests as follows,

The tests described below within points 6.1, 6.2 and 6.3 need to be run from folder xalan-test. 

5.1 Run the ant target "smoketest", using following two commands in sequence shown below

build extensions

build smoketest

The output of the command "build smoketest" should be following, and without any other build errors,

smoketest-pass:
     [echo]  [minitest] CONGRATULATIONS! The Smoketest passed!

5.2 Run the ant target "smoketest.xsltc", using following three commands in sequence shown below 

build conf.xsltc

build accept.xsltc

build smoketest.xsltc

The output of the command "build smoketest.xsltc" should be following, and without any other build errors,

smoketest.xsltc-pass:
     [echo]  [minitest] CONGRATULATIONS! The Smoketest passed!

5.3 Run the ant target "smoketest.dev", using following two commands in sequence shown below

build extensions

build smoketest.dev

The output of the command "build smoketest.dev" should be following, and without any other build errors,

smoketest-pass:
     [echo]  [minitest] CONGRATULATIONS! The Smoketest passed!
     
5.4 From folder xalan-test/tests/xsltc_integer_truncation, run the batch file 
xsltc_int_truncation_test.bat (provided for Windows platform) to run test for, 
testing "XalanJ integer truncation bug fix, when using XSLTC".    
     