Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Image RemovedImage Added

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
languagebash
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.