pom.xml dependencies

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 Poppy): Bottom row on day 1, second row from bottom on day 2, etc.

The color indicates the development team, see 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.

Why are mod-configuration and several other mod-* modules shown? A released mod-configuration version always consists of two maven sub-modules: mod-configuration-server (the actual back-end module) and mod-configuration-client, a code library used by many other modules to access mod-configuration-server.

Generate graph

How to generate the dependency graph:

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 -Dverbose "-Dincludes=org.folio,org.folio.*,org.olf,org.olf.*"
    fi
    cd ..
  done
}

convert() {
  grep -E ' \(?(org\.folio|org\.folio\.[^:]+|org.olf|org\.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' \
    | 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}- [^: ]+:([^:]+):/, 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.