Core libraries of the GUTTA API evolution approach presented in our paper "Continuous API Evolution in Heterogenous Enterprise Software Systems" (https://doi.org/10.1109/ICSA51549.2021.00014).
Please note that this is work-in-progress, as we are currently improving, documenting and consolidating our initial prototype.
This project currently consists of the following components:
- The core library
gutta-apievolution-core
, which contains the basic elements and algorithms for API our evolution approach, - the component
gutta-apievolution-customerexample
, which implements the customer example from the paper using several technologies, - the domain-specific language for specifying API definitions, contained in
gutta-apievolution-dsl
, - a library
gutta-apievolution-fixedformat
, which provides support for fixed-format communication such as employed in COBOL, - a library
gutta-apievolution-inprocess
, which implements our approach for in-process communication by means of dynamic proxies and object mapping, - a Maven plugin
gutta-apievolution-java-codegen-plugin
, which illustrates how code for the internal representation can be generated, gutta-apievolution-json
, which shows how the approach can be applied to JSON-based communication,gutta-apievolution-inprocess
, which shows how the approach can be applied to in-process invocations in Javagutta-apievolution-fixedformat
, which shows how the approach can be applied to fixed-format communication such as used by in-process COBOL communication,gutta-apievolution-repository
, a simple repository implementation built with Quarkus,- and JMH benchmarks for performance impact evaluation in
gutta-apievolution-jmh
, - and several tools in the component
gutta-apievolution-tools
.
Furthermore, a proof-of-concept for COBOL is contained in the gutta-apievolution-cobol
directory.
For our performance benchmarks, we use Podman images to facilitate running the benchmarks on different machines. The steps for building these images are described below.
The JMH benchmarks require a Java VM.
This requirement may be satisfied by either using an available image that already contains a Java VM, or by creating one.
The latter is useful if a particular Java version or base image is desired.
A sample Containerfile
for such an image is contained in the gutta-apievolution-jmh/podman/java
, and can be used as follows to build an image:
- Download a JDK, such as Temurin
- Navigate to
gutta-apievolution-jmh/podman/java
- Extract the JDK.
This usually creates a new directory, e.g.,
jdk-21.0.1+12
- Build the image, passing the version part of the directory name as the build argument
jdkVersion
(i.e.,21.0.1+12
for the directoryjdk-21.0.1+12
). It is also useful to immediately tag the image. The following command builds the image and tags it asjava:21
:podman build -t java:21 --build-arg jdkVersion=21.0.1+12 .
The following steps are required for building the image for the JMH benchmarks:
- Build the Java components by running
./mvnw install
in the root directory - Copy the file
gutta-apievolution-jmh/target/gutta-apievolution-jmh*.jar
togutta-apievolution-jmh/podman/gutta-jmh-benchmarks
- Navigate to
gutta-apievolution-jmh/podman/gutta-jmh-benchmarks
- Build the image by running
podman build -t gutta-jmh-benchmarks:latest .
The following steps are required for building the image for the COBOL benchmarks:
- Install GNU COBOL (usually by installing the package
gnucobol
). - Navigate to
gutta-apievolution-cobol
- Build the COBOL components by running
./build.sh
- Copy the following files to
gutta-apievolution-cobol/podman/dist
:APICONV
,*.dat
, and*.so
- Navigate to
gutta-apievolution-cobol/podman
- Build the image by running
podman build -t gutta-cobol-benchmarks:latest .
The benchmarks can be run by simply running the respective images.
Both images provide parameters for finer control over the benchmark execution, which are described below.
All parameters are environment variables, which can be passed to the container by the -e
option.
The JMH benchmarks image provides the following parameters:
FORKS
: The number of JVM forks that JMH will perform (default:3
)WARMUP_ITERATIONS
: The number of warmup iterations that JMH will perform for each benchmark (default:30
). Note that the number of iterations required is mostly determined by the "large" benchmarks (500 fields), and may need to be considerably larger for stable results on slow machines like a Raspberry Pi.ITERATIONS
: The number of timed iterations that JMH will perform for each benchmarkFORMAT
: The output format that JMH will use (default:csv
)BENCHMARKS
: A regular expression selecting the names of the benchmarks JMH will perform (default:.*
for all benchmarks). Note that the benchmark names have size suffixes (such asshort
).
The COBOL benchmarks image provides the following parameters:
FORKS
: The number of times the benchmarks will be run