<!--
 * 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.
-->
Apache Xalan-Java Build, Test, and Release Notes
Copyright 1999-2023 The Apache Software Foundation

Authors:
   Gary Gregory <ggregory@apache.org>
   Joe Kesselman <jkesselm@apache.org>
   Mukul Gandhi <mukulg@apache.org>

This document's primarily focused on building artifacts for production
releases of the Apache Xalan-J XSLT processor, but may be helpful for
others working with Xalan's source.

(0) Prerequisites

Official Xalan builds are currently being performed using Maven
version 6.3.6 and a Java 1.8 Development Kit. We recommend Eclipse
Temurun for the latter; it is available from
https://adoptium.net/temurin/releases/?version=8. Be sure to install
the JDK, not just the JRE.

The xalan tests, however, are still relying on Apache Ant. You can
obtain this from https://ant.apache.org/bindownload.cgi. I have been
testing with Ant 1.10.12, but have successfully built with 1.9.16 as
well.


(1) Steps to build the XalanJ release

1.1) Obtain the source for XalanJ and its test package.

"Source Distribution" jarfiles are available which contain a snapshot
of a particular release of the source code; extracting them with "jar
-xf" will yield the xalan-java and xalan-test directories.

Or (usually preferred) you can use "git clone" to obtain these from
either github.com. or gitbox.apache.org. New development takes place
on the branch currently called "master", which git will fetch by default:

  git clone https://github.com/apache/xalan-java.git
  git clone https://github.com/apache/xalan-test.git

(In the past this code was hosted at gitbox.apache.org, but that now
redirects to the github copy.)

If you want to build a specific release rather than the development
version, you can obtain that by adding the release's branch name to
the git clone operation. For example, to get the code released as
version 2.7.1, you would issue the command

  git clone https://github.com/apache/xalan-java.git --single-branch --branch xalan-j_2_7_1

There will also usually be a _maint branch, which is used for development and testing of "hot fixes" that will be made available as new point releases (for example, 2.7.1.1). You would access this as

  git clone https://github.com/apache/xalan-java.git --single-branch --branch xalan-j_2_7_1_maint

Whether you perform the git clone operations or unpack the source
distribution jarfiles, each produces its own folder: xalan-java and
xalan-test. Since xalan-test looks for code to be tested via the path
../xalan-java, these will need to be children of the same parent
directory for the tests to run.


1.2) Set JAVA_HOME and ANT_HOME environment variable. On Linux, assuming
a standard installation of the JDK with the "alternatives" tooling,
the easiest way to be sure you have the right JDK may be to use the
command

  export ANT_HOME=/usr/share/ant	
  export JAVA_HOME=$(readlink -f /etc/alternatives/java_sdk_1.8.0)

On Windows, you will probably need to set these more explicitly, and add them to your PATH:

  set ANT_HOME=C:\path\to\your\installed\apache-ant-
  set JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-8.0.352.8-hotspot\
  set PATH=%JAVA_HOME%;%ANT_HOME%;%PATH%


1.3) Go to the xalan-java source directory (i.e, from the source
distribution folder, which contains folders "src", "tools" etc), and
from there run the clean-and-distribution-build command:

   On Linux, run ./mvnbuild.sh
   On Windows, run ./mvnbuild.bat

This will build:
   ./target/site/apidocs: Javadoc for the Xalan code base

   ./target/site/design: Architecture documentation for Xalan
     (probably outdated)

   ./target/site/xsltc: Architecture documentation for the Xalan bytecode
     compilation operations (probably outdated)

   ./build/*.jar: Executable jarfiles for the XML Serializer, the Xalan
     XSLT Processor, some old xsltc samples and the @xsl.usage taglet
     we used in producing the Javadoc/apidocs (see above).

1.4) IMPORTANT: Until we get xalan-test updated, you will need to go to the
xalan-java/build directory and manually copy or rename the jarfiles to
remove the version number:

       Linux: 
           mv xalan-*.jar xalan.jar
	   mv serializer-*.jar serializer.jar
       Windows: 
           ren xalan-*.jar xalan.jar
	   ren serializer-*.jar serializer.jar


(2) Steps to run the XalanJ tests, assuming you have already build
xalan-java as discussed above:

2.1) Go to the xalan-tests local folder. If you have cloned xalan-java
and xalan-test from Git, it will be a sibling of xalan-java.

BUT: For XalanJ source distribution users, the xalan-test folder is
shipped as a child of the xalan-java source folder (i.e, parallel to
folders "src", "tools" etc within the main XalanJ codebase folder
location). In theory you *should* be able to run the tests directly
from here, but if you run into trouble try moving xalan-test up to be
a sibling of xalan-java.

2.2) Ensure the JAVA_HOME, ANT_HOME, and (on Windows) PATH environment
variables have been set as discussed above.

2.3) Go to the xalan-test folder, and from there run a clean source
build. Unfortunately we don't currently have a single target for this,
so you need to spell out some of the supporting packages:

  Linux: ./build.sh clean jar extensions.classes bugzilla.classes jira.classes
  Windows: build clean jar extensions.classes bugzilla.classes jira.classes

The jar target builds the main XalanJ test driver, testxsl.jar, which
acts as main XalanJ test driver. The .classes targets build supporting
code specific to testing XSLT Extensions or some old issues reported
via Bugzilla or (more recently) Jira.


2.4) From the xalan-test directory, you can run the necessary XalanJ
tests as follows:

2.4.1) The most important test set is smoketest. This exercises all
the testcases known to work in Apache Xalan-J, while avoiding some
which have open issues against them.

Make sure you have built the jar and extensions.classes, as
above. Then, from the xalan-test directory:

  Linux: ./build.sh smoketest
  Windows: build smoketest

At the end of the test run, smoketest should report:

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


2.4.2) Run the ant target "apitest", using following command

  Linux: ./build.sh apitest
  Windows: build apitest

At the end of the test run, apitest should report:

apitest-pass-file-check:
     [echo]  [minitest] CONGRATULATIONS! The api tests passed!     


2.4.3) Run the ant target "conf.xsltc", using the following command 

  Linux: ./build.sh conf.xsltc
  Windows: build conf.xsltc

At the end of the test run, conf.xsltc should report:

[echo]  [minitest] CONGRATULATIONS! The conf.xsltc tests passed!

PLEASE NOTE that XSLTC has some known issues, which will cause FAIL
reports during this test. These are not considered regressions, and
are specialcased so conf.xsltc reports "passed" despite them. There
are Jira tickets open to address these bugs, and when fixes become
available we will again insist that these tests pass.

   output63         https://issues.apache.org/jira/browse/XALANJ-2642
   idkey49          https://issues.apache.org/jira/browse/XALANJ-2640
   math111          https://issues.apache.org/jira/browse/XALANJ-2641
   whitespace35     https://issues.apache.org/jira/browse/XALANJ-2643

2.4.4) Other test targets exist, which are either subsets of the above
or are considered less essential for regression testing. You may want
to read through the build.xml file to find them. NOTE that one target,
"api", is currently missing, which causes the "all" target to fail; we
need to clean that up at some point.

2.5) When bugs are reported, tests should be added (at least to the
jira test set) to demonstrate the problem. When bugs are fixed, those
tests should be migrated either to the appropriate category or to the
"contrib" bucket if they don't fit nicely anywhere else. If the bug report was in error, the test demonstrating the (correct but unexpected) behavior may be either discarded, or moved as above if we think it's a useful illustration.