Thrift Java Software Library

License
=======

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.

Building and installing from source
===================================

When using a CMake build from the source distribution on Linux the
easiest way to build and install is this simple command line:

    make all && sudo make install/fast

It is important to use the install/fast option to eliminate
the automatic rebuild by dependency that causes issues because
the build tooling is designed to work with cached files in the
user home directory during the build process. Instead this builds
the code in the expected local build tree and then uses CMake
install code to copy to the target destination.

Building Thrift with Gradle without CMake/Autoconf
==================================================

The Thrift Java source is not build using the GNU tools, but rather uses
the Gradle build system, which tends to be predominant amongst Java
developers.

Currently we use gradle 8.0 to build the Thrift Java source. The usual way to setup gradle
project is to include the gradle-wrapper.jar in the project and then run the gradle wrapper to
bootstrap setting up gradle binaries. However to avoid putting binary files into the source tree we
have ignored the gradle wrapper files. You are expected to install it manually, as described in
the [gradle documentation](https://docs.gradle.org/current/userguide/installation.html), or
following this step (which is also done in the travis CI docker images):

```bash
export GRADLE_VERSION="8.0.2"
# install dependencies
apt-get install -y --no-install-recommends openjdk-17-jdk-headless wget unzip
# download gradle distribution
wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip
# check binary integrity
echo "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -
# unzip and install
unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip
mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle
ln -s /usr/local/gradle/bin/gradle /usr/local/bin
```

After the above step, `gradle` binary will be available in `/usr/local/bin/`. You can further choose
to locally create the gradle wrapper (even if they are ignored) using:

```bash
gradle wrapper --gradle-version $GRADLE_VERSION
```

To compile the Java Thrift libraries, simply do the following:

```bash
gradle
```

Yep, that's easy. Look for `libthrift-<version>.jar` in the build/libs directory.

The default build will run the unit tests which expect a usable
Thrift compiler to exist on the system. You have two choices for
that.

* Build the Thrift executable from source at the default
  location in the source tree. The project is configured
  to look for it there.
* Install the published binary distribution to have Thrift
  executable in a known location and add the path to the
  ~/.gradle/gradle.properties file using the property name
  "thrift.compiler". For example this would set the path in
  a Windows box if Thrift was installed under C:\Thrift

    thrift.compiler=C:/Thrift/thrift.exe

To just build the library without running unit tests you simply do this.

```bash
gradle assemble
```

To install the library in the local Maven repository location
where other Maven or Gradle builds can reference it simply do this.

```bash
gradle publishToMavenLocal
```

The library will be placed in your home directory under .m2/repository

To include Thrift in your applications simply add libthrift.jar to your
classpath, or install if in your default system classpath of choice.


Build Thrift behind a proxy:


```bash
gradle -Dhttp.proxyHost=myproxyhost -Dhttp.proxyPort=8080 -Dhttp.proxyUser=thriftuser -Dhttp.proxyPassword=topsecret
```

or via

```bash
./configure --with-java GRADLE_OPTS='-Dhttp.proxyHost=myproxyhost -Dhttp.proxyPort=8080 -Dhttp.proxyUser=thriftuser -Dhttp.proxyPassword=topsecret'
```

Unit Test HTML Reports
======================

The build will automatically generate an HTML Unit Test report. This can be found
under build/reports/tests/test/index.html. It can be viewed with a browser
directly from that location.


Clover Code Coverage for Thrift
===============================

The build will optionally generate Clover Code coverage if the Gradle property
`cloverEnabled=true` is set in ~/.gradle/gradle.properties or on the command line
via `-PcloverEnabled=true`. The generated report can be found under the location
build/reports/clover/html/index.html. It can be viewed with a browser
directly from that location. Additionally, a PDF report is generated and is found
under the location build/reports/clover/clover.pdf.

The following command will build, unit test, and generate Clover reports:

```bash
gradle -PcloverEnabled=true
```

Publishing Maven Artifacts to Maven Central
===========================================

The Automake build generates a Makefile that provides the correct parameters
when you run the build provided the configure.ac has been set with the correct
version number. The Gradle build will receive the correct value for the build.
The same applies to the CMake build, the value from the configure.ac file will
be used if you execute these commands:

```bash
make maven-publish   -- This is for an Automake Linux build
make MavenPublish    -- This is for a CMake generated build
```

The `publish` task in Gradle is preconfigured with all necessary details
to sign and publish the artifacts from the build to the Apache Maven staging
repository. The task requires the following externally provided properties to
authenticate to the repository and sign the artifacts. The preferred approach
is to create or edit the ~/.gradle/gradle.properties file and add the following
properties to it.

```properties
# Signing key information for artifacts PGP signature (values are examples)
signing.keyId=24875D73
signing.password=secret
signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg

# Apache Maven staging repository user credentials
mavenUser=meMyselfAndI
mavenPassword=MySuperAwesomeSecretPassword
```

NOTE: If you do not have a secring.gpg file, see the
[gradle signing docs](https://docs.gradle.org/current/userguide/signing_plugin.html)
for instructions on how to generate it.

It is also possible to manually publish using the Gradle build directly.
With the key information and credentials in place the following will generate
if needed the build artifacts and proceed to publish the results.

```bash
gradle -Prelease=true publish
```

It is also possible to override the target repository for the Maven Publication
by using a Gradle property, for example you can publish signed JAR files to your
company internal server if you add this to the command line or in the
~/.gradle/gradle.properties file. The URL below assumes a Nexus Repository.

```properties
maven-repository-url=https://my.company.com/service/local/staging/deploy/maven2
```

Or the same on the command line:

```bash
gradle -Pmaven-repository-url=https://my.company.com/service/local/staging/deploy/maven2 -Prelease=true -Pthrift.version=0.11.0 publish
```


Dependencies
============

Gradle
http://gradle.org/

# Breaking Changes

## 0.13.0

* The signature of the 'process' method in TAsyncProcessor and TProcessor has
changed to remove the boolean return type and instead rely on Exceptions.

* Per THRIFT-4805, TSaslTransportException has been removed. The same condition
is now covered by TTansportException, where `TTransportException.getType() == END_OF_FILE`.

## 0.12.0

The access modifier of the AutoExpandingBuffer class has been changed from
public to default (package) and will no longer be accessible by third-party
libraries.

The access modifier of the ShortStack class has been changed from
public to default (package) and will no longer be accessible by third-party
libraries.

