This dependency graph shows all FOLIO software libraries that are referenced from at least one pom.xml file of the platform-complete modules. An arrow X → Y means that module X depends on module Y. Last updated: February 2023.
It lists all maven/pom.xml based FOLIO code libraries and suggests in which order they should be released for a platform flower release (for example NolanaPoppy): Bottom row on day 1, second row from bottom on day 2, etc.
The color indicates the development team, see Team vs module FOLIO Module/JIRA project-Team-PO-Dev Lead responsibility matrix.
Why are many modules missing from the graph? It only shows code libraries to reduce the noise. It doesn't shows modules that only use FOLIO code libraries but don't provide some FOLIO code library.
...
| Code Block | ||
|---|---|---|
| ||
set -e
get-install() {
wget https://raw.githubusercontent.com/folio-org/platform-complete/master/install.json -O install.json
}
modules() {
MODULES=`
cat install.json \
| jq '.[].id' \
| sed '/^"folio_/d; # remove front-end modules
s/"//; # remove heading quote
s/-[[:digit:]].*// ; # remove the version number suffix '
`
}
pull() {
ln -s Net-Z3950-FOLIO mod-z3950 >/dev/null 2>&1 || true
for MODULE in $MODULES ; do
echo $MODULE
cd $MODULE
git checkout master
git pull
cd ..
done
}
dependencytrees() {
for MODULE in $MODULES ; do
cd $MODULE
if [ -e pom.xml ]
then
echo "$MODULE" >&2
# -Dverbose disables -DoutputType=dot so we cannot use the latter
mvn dependency:tree -B -DoutputType=dotDverbose "-Dincludes=org.folio,org.folio.*,org.okapiolf,org.olf.*"
fi
cd ..
done
}
convert() {
grep -E '" \(?(org\.folio|org\.folio\.okapi[^:]+|org.olf):.* -> "(org.folio|org\.folio.okapi|org.olf)olf\.[^:]+):[^:]+:jar:' \
| sed -E 's/"org.folio:(cql2pgjson|cql2pgjson-cli|dbschema|domain-models-api-aspects|domain-models-api-interfaces|domain-models-interface-extensions|domain-models-maven-plugin|domain-models-runtime|domain-models-runtime-it|postgres-runner|postgres-testing|rules|testing|util):/"org.folio:RMB:/g' \
| sed -E 's/org.folio:(vertx-lib|vertx-lib-pg-testing|mod-example):/org.folio:folio-vertx-lib:/g' \
| sed -E 's/:okapi-[^:]+:/:okapi:/g' \
| sed -E 's/:([^:]+)-(server|client):/:\1:/g' \
| sed -E 's/:(mod-erm-usage-counter|mod-erm-usage-harvester|folio-service-tools)[^:]+:/:\1:/g' \
| sed -E -n '/^[^: gawk 'match($0, /^[^:]{6} [^: ]+:([^:]+):/, arr) { L1 = "\"" arr[1] "\"" }
match($0, /^[^:]{8}- [^: ]+:([^:]+):/, arr) { L2 = "\"" arr[1] "\""; print L1 " -> " L2 }
match($0, /^[^:]{11}- [^: ]+:([^:]+):/, arr) { L3 = "\"" arr[1] "\""; print L2 " -> " L3 }
match($0, /^[^:]{14}- [^: ]+:([^:]+):/, arr) { L4 = "\"" arr[1] "\""; print L3 " -> " L4 }
match($0, /^[^:]{17}- [^: ]+:([^:]+:.* "[^:):/, arr) { L5 = "\"" arr[1] "\""; print L4 " -> " L5 }
match($0, /^[^:]{20}- [^: ]+:([^:]+):.*/s//"\1" -> "\2"/p/, arr) { L6 = "\"" arr[1] "\""; print L5 " -> " L6 }
match($0, /^[^:]{23}- [^: ]+:([^:]+):/, arr) { L7 = "\"" arr[1] "\""; print L6 " -> " L7 }
match($0, /^[^:]{26}- [^: ]+:([^:]+):/, arr) { L8 = "\"" arr[1] "\""; print L7 " -> " L8 }
match($0, /^[^:]{29}- [^: ]+:([^:]+):/, arr) { L9 = "\"" arr[1] "\""; print L8 " -> " L9 }' \
| grep -v -E '"([^"]+)" -> "\1"' \
| sed 's/"data-import-processing-core"/"data-import-\\nprocessing-core"/g' \
| sed 's/"data-import-utils"/"data-import-\\nutils"/g' \
| sed 's/"edge-common-spring"/"edge-common-\\nspring"/g' \
| sed 's/"folio-custom-fields"/"folio-custom-\\nfields"/g' \
| sed 's/"folio-di-support"/"folio-di-\\nsupport"/g' \
| sed 's/"folio-holdingsiq"/"folio-\\nholdingsiq"/g' \
| sed 's/"folio-kafka-wrapper"/"folio-kafka-\\nwrapper"/g' \
| sed 's/"folio-liquibase-util"/"folio-liquibase-\\nutil"/g' \
| sed 's/"folio-service-tools"/"folio-service-\\ntools"/g' \
| sed 's/"folio-vertx-lib"/"folio-\\nvertx-lib"/g' \
| sed 's/"mod-configuration"/"mod-\\nconfiguration"/g' \
| sed 's/"mod-data-import-converter-storage"/"mod-data-import-\\nconverter-storage"/g' \
| sed 's/"mod-di-converter-storage"/"mod-di-converter-\\nstorage"/g' \
| sed 's/"mod-source-record-storage"/"mod-source-\\nrecord-storage"/g' \
| sed 's/"mod-source-record-manager"/"mod-source-\\nrecord-manager"/g' \
| sort -u
}
# Filter reused libraries, we don't want modules that are not used by any other module
filter() {
DEPENDENCIES=`cat`
LIBRARIES=`echo "$DEPENDENCIES" | sed -E 's/.* -> ("[^"]+").*/\1 ->/' | sort -u`
echo "$DEPENDENCIES" | grep -F -f <(echo "$LIBRARIES")
}
wrap() {
echo "digraph {"
echo "graph [ rankdir=TB ]"
echo "node [ shape=rectagle ]"
cat
echo "}"
}
get-install
modules
pull
dependencytrees > dependencytrees
cat dependencytrees | convert | filter | wrap > complete.graphviz |
Use Graphviz to generate the visualisation, for example https://dreampuf.github.io/GraphvizOnline
Use https://www.yworks.com/yed-live/ to manually move nodes and add color.

